MotoJapan's Tech-Memo

技術めも

【行動認識 #7】OpenPoseのBodyParts推定をCPU実行してみた雑感

今回は、今年のCVPR2017でも報告されている何かと話題のOpenPoseの内、人体部位-BodyParts-推定をCPUで動かしてみた。

下記のセンサー入力周りとは文脈が変わるが、画像から行動を特定するタスクもあるという点では関連性があるテーマなので今回取り扱う。
【行動認識 #6】tensorflowでCAE(Convolutional Auto-Encoder)を実装してみた - MotoJapan's Tech-Memo

もし、Ubuntu 16.04 x tensorflow x CPUで動かしたい人がいれば次回#8(17/08/29)の記事が参考になるかも。

そもそも、OpenPoseの全体像は、BodyParts推定(18点)からボトムアップ手法で複数人2次元ポーズ推定を実現している模様。
そのうち、BodyParts推定は深層学習で行われており、BodyParts推定だけでも動かして、どんなものなのか把握してみたい。

OpenPoseのCVPR2017 paperを知りたい人は下記。(面白かったです)
[1611.08050] Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields

ライセンス上の注意ですが、「非商用研究目的での使用ということ」、「派生物や改変は可能であるが、派生物や改変は非営利の内部的研究目的でのみ使用すること」に気を付けてください。
商用で利用したい場合、別途契約が必要です。
OpenPose - Realtime Multiperson 2D Keypoint Detection from Video | Flintbox

参考記事

学習済みモデル

最近、本家からportable OpenPose demo 1.0.1.がリリースされている。
例えば、この中にある pose_deploy_linevec.prototxt(モデル情報)、pose_iter_440000.caffemodel(重み情報)が格納されているので、これを駆使するとForward処理ができたりする。
細かい環境、手順はまた今度、纏めようと思う。

一応実行環境としては、

で動かしてみた。

動かしてみて

結構いろいろできそうで面白い。

【画像上に人物が1人の場合】

(左画像)入力画像
(中央画像)ある程度確率の高い結果の上位3座標を取り出してみた
(右画像)適当に関節をつないでみるとポーズ推定っぽい感じになる

f:id:motojapan:20170820213829p:plain

詳細の出力は以下。
関節データの出力は、各関節の座標ではなくピクセル毎のヒートマップとなる。
ポイントは、BodyParts18点+backgroundの19枚のヒートマップが出力されるという点。

雑感ですが、

  • 期待する人物付近で期待通り反応する
  • 期待箇所付近だけでなく、"RHip"、"RKnee"、RAnkle"、"LHip"、LKnee" (id: 8~12) は木の枝の複雑なクロス部分にも微弱に反応している
  • OpenPoseは論文を読むとわかるが、ボトムアップ手法なので深層学習で積極的に人を認識しているようではなさそうという印象







































画像は左上から次の順でBodyParts出力(本家記載)

    POSE_COCO_BODY_PARTS {
        {0,  "Nose"},
        {1,  "Neck"},
        {2,  "RShoulder"},
        {3,  "RElbow"},
        {4,  "RWrist"},
        {5,  "LShoulder"},
        {6,  "LElbow"},
        {7,  "LWrist"},
        {8,  "RHip"},
        {9,  "RKnee"},
        {10, "RAnkle"},
        {11, "LHip"},
        {12, "LKnee"},
        {13, "LAnkle"},
        {14, "REye"},
        {15, "LEye"},
        {16, "REar"},
        {17, "LEar"},
        {18, "Bkg"},
    }

【画像上に人物が複数人の場合】

(左画像)入力画像
(右画像)ある程度確率の高い結果をプロット
f:id:motojapan:20170820222253p:plain

出力ヒートマップは例えば、LShoulder、hip、backgroundはこんな感じ。

雑感ですが、

  • LShoulderは、3人が写る画像上で、特徴的に3箇所強い反応
  • hipは、斜め後ろ向きの女性において、少し弱い反応(他の2人に比べて)
  • 男性2人の輪郭がぼやけていても認識が割とできている(すごい)
  • 同一部位に対して複数検出するヒートマップを、ボトムアップに上手く複数人ポーズ推定ができるのがOpenPoseの強みということかな(OpenPoseすごい)







スループット

画像サイズにも依るが、320 x 240 で 2秒、640 x 480 で 10秒程度だった。
あと同じ画像サイズでも人数が増えると、スループットが変化した。(たまたまか?)
iOS stand-aloneでは機種にも依るが、320 x 320であれば5秒程度。

CPUでもいろいろ出来そうだなぁという印象。

おわりに

近々、手元のノートPC windows 8/10 でも動かしてみたな。
本家では、windowsでも実行できるバイナリも提供され始めたので、おもしろそう。

根気強く頑張れば、Tensorflowでも動くしね。

以上。