MoveMirror matches your movements with images from around the world. Built with TensorFlow.js and #PoseNet.
— TensorFlow (@TensorFlow) 2018年7月19日
Learn more here→ https://t.co/w6l4OPPu6G pic.twitter.com/gohe515f04
ポーズをとると似た姿勢を探してくれるブラウザベースのアプリ。面白いなぁ。あと、ブラウザだけでできるのも良いなぁ。
姿勢の推定に使われているのは、Googleの研究チームが発表した論文が基になってます。 さくっと読んでみた内容メモです。
[1701.01779] Towards Accurate Multi-person Pose Estimation in the Wild
どのようなアルゴリズム?
いわゆるTop-down方式の姿勢推定。Top-down方式は、最初に人の矩形を検出しておき、その中から関節を検出する。それに対してBottom-up方式があり、こちらは画像全体から関節を検出し、検出された関節同士を関連度マップなどに基づいて対応付けしていく方式。OpenPoseはBottom-up方式。
処理の全体像
Top-down方式なのでStage1で人の検出、Stage2で関節の検出、となるのだけど、もう少し詳しく記述すると次のような処理を行う。
- Stage1では、ResNet101 + atrous convolutionのFaster RCNNで人の矩形を検出。矩形を検出したら、Stage2の矩形アスペクト比に合うように幅もしくは高さを伸ばし、かつランダムに矩形枠を広げた後、353h x 257wにリサイズ。
- Stage2もResNet101を使って、heatmaps(K joints)とoffset maps(xとyの2ch * K joints)を生成。最後に、heatmapsとoffset mapsを統合して、より正確なjointを表現するmapsを出力。
Stage2で使うResNet101 + atrous convolution with stride 8は、最終層を1x1 convで3 x K個のFeature mapsを出力するように置き換え(Kは関節数で、ここではK=17)、最後にbilinear upsamplingで入力と同じサイズにリサイズされる。
heatmapとoffset heatmapによる関節のdetection and localization
Stage2の関節推定で、HeatmapとOffset mapを使うのが、この論文の新しいアイデア。
Heatmapは、関節位置から一定範囲内のピクセルが1、それ以外が0となるmap。もう一つのOffset mapは、関節位置から一定範囲内のピクセルについて、関節位置に対するオフセットを保持するmap。
学習においては、ResNetの出力する3xKのfeature mapsについて、heatmapの出力mapにsigmoidを適用し、関節毎に各ピクセルのlogistic lossの総和をとったものと、XとYのoffsetの出力feature mapに対して、ground truthとの差を計算したHuber lossとの重み付き和が全体のロスとなる。(論文の式(3)を参照)
真ん中の図が、左肘のheatmapで赤が1の領域を表している。一番右の図が、対応するoffset mapで、L2ノルムをgrayscaleで表しているので中心に行くほど値が小さくなっていて、外側の方が値が大きくなっていることがわかる。赤い矢印は、offsetベクトルを示している。
このように二つにわけて学習しているのは、Faster RCNNなどの物体検出の枠組みから着想を得たとのこと。キーポイントを推定する一つの方法は、DeepPoseのようなRegressionのネットワークを使う方法があるが、矩形に複数人物がいた場合には、一人分の関節数しか出力できない問題がある。また、関節毎のactivation mapを出力するネットワークを使う方法があるが、関節位置の正確さが出力のmapサイズに依存する。そこで、ピクセル単位で関節の近傍か否か(関節か)の分類と、関節位置をリファインするオフセット値の回帰に分けて、全身の関節位置推定という難しい問題を学習しやすくしている。
Heatmapとoffset mapから関節位置の決定
heatmapとoffset mapが得られたら、関節位置をどのように計算するのか?
heatmapの各点に対して、
- offset mapの値を使って、オフセット値を加えた位置を計算
- 関節毎にその位置で重みを累積
下の図は、すべての関節を一枚の画像で表した状態。オフセットによって、より関節候補位置がsureになっている様子がわかる。
activation mapで最もスコアの高い位置を、各関節位置として求めることができる。
結果
このようなheatmapとoffsetを使った関節位置推定の精度はどうなのか?
COCO Keypointのtest-devとtest-standard setsで2016年のCOCO keypoints challengeのwinnerを超える結果となった。