Re:ゼロから始めるML生活

ミスよりグズを嫌え

【論文メモ:OpenPose】OpenPose: Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields

いつもとは若干嗜好を変えてみます。

こちらが面白そうだったので、その論文のメモです。

f:id:nogawanogawa:20190201192018g:plain

難しそうな数学の式がいっぱい出てきますが、頑張って読んでみます。。。

論文

[1812.08008] OpenPose: Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields

著者

Zhe Cao, Gines Hidalgo, Tomas Simon, Shih-En Wei, Yaser Sheikh

背景

2Dの静止画や動画から人間の姿勢を理解することは、重要な要素技術である。 人間の姿勢の推定には、不特定多数の人間の部位を特定し、それらを包括的に焦点を当てて推定していくことになる。

従来の手法ではTop-down approachBottom-up approachが知られている。 Top-down approachでは、

  1. 画像の中から人間を検出する(Human detector)
  2. 各人で人間の姿勢推定器を作用させる(single person pose estimation)

の手順で行うことが一般的である。 この方法だと、特に人間が密集した状態だと人間の検出がうまくいかないことが多い。

これに対し、Bottom-up approachではポイントとなる箇所を全て洗い出してからその関係性を見出す。 この手法では、画像全体の文脈を読むことが難しく、画像全体の関係性を見出すための推論を行うと1画像につき数分の時間がかかるほど処理が大きくなってしまう。

このように、不特定多数の人間の姿勢の推論には、下記ような問題がある。

  • 各画像に何人の人間が、どのような姿勢・大きさで写り込んでいるかわからない
  • 物体の接触、四肢の関節など、複雑な物理法則が内在している
  • 写り込んでいる人間の数に応じて計算負荷が増大し、リアルタイム処理が難しい

目的とアプローチ

目的

  • 高精度な姿勢の推論と、計算コストの削減の両立

アプローチ

  • OpenPose
    • Part Affinity Fields (PAFs)による関連性スコアによって部位を表現

提案手法

提案手法の概要について下記に示す。

f:id:nogawanogawa:20190201193306j:plain:w750

提案手法では、入力画像から部位の位置の推定(S, Part Confidence Map)と部位の連関を表す2Dベクトル(L, PAF)を算出する。 その後、SとLの集合から同じ人物の部位を組み合わせ、姿勢の状態を出力する。

提案手法によって姿勢の推論がなされた様子を下記に示す。

f:id:nogawanogawa:20190201225729j:plain:w500

各部位は上の図のように2Dのベクトルで表現されている。

その後、信頼性マップとaffinity fieldsがgreedy 推定により解析され、2Dの重要部位の推定結果が出力される。

Network 概要

ネットワークアーキテクチャの概要を下記に示す。

f:id:nogawanogawa:20190201230352j:plain:w500

青の領域では、Affinity field(部位と部位の連関)を推定し、ベージュの領域では信頼性マップ(confidence map)を検出している。

ネットワークは当初7×7の畳み込みを使用していたが、現在では3×3の畳み込みを使用している。 これにより、計算量は97 -> 51へと削減している。

検出と関連付け処理の概要

ネットワークでは、はじめにCNNによって解析されて特徴マップFが生成され、このFが第1ステージの入力となる。 (はじめ10層はVGG-19で初期化され、チューニングされている)

第1ステージでは、PAFs (part affinity fields)であるLを生成する。

L ^1 = \phi ^1 (F)

ここで\phi ^1はステージ1におけるCNNによる推論を表している。

後続のステージでは前のステージの出力Lともともとの特徴マップFを元に、下記の式によってPAFを推定する。

L ^t = \phi ^t (F,L^{t−1}), \forall 2≤t≤T_P,

PAFステージ全体(T_P)まで繰り返す。

その後、同様にして信頼性マップ(confidence map)であるSの推定を行う。 推定に使用する式は下記のようになる。

S ^{T_P} = \rho ^t (F,L^{T_P}), \forall t=T_P,

S ^t = \rho ^t (F,L^{T_P}, S ^{t-1}), \forall T_P≤t≤T_P + T_C,

ここで\rho ^tはCNNの推論を表している。

この手法は先行研究とは異なり、PAFと信頼性マップの生成に関する調整を各ステージごとに行うため、 先行研究の半分の計算量で済むため高速化が可能である。

ステージを経るごとにPAFが改善されていく様子を下記に示す。

f:id:nogawanogawa:20190202094145j:plain:w500

円で囲まれた箇所(腕)の推定が段階的に改善されていることが確認出来る。

Confidence Mapsは2Dのベクトルで、最も調整されたPAFの推定箇所を指し示し、信頼性マップの推定の段階との間でPAFの推定箇所に違いはほとんど無い。 はじめのステージでのPAFの推定と次のステージでの信頼性マップの推定を繰り返すため、損失関数の計算を各ステージの最後に設置する。

損失関数には、背景と推定箇所との差分を使用する。 損失関数を下記に示す。

 f ^{t_i}_{L} = \sum ^C_{c=1} \sum _{p} W(p) \cdot || L ^{t_i}_{c}(p) - L ^{*}_{c}(p) || ^2_2

 f ^{t_k}_{S} = \sum ^J_{j=1} \sum _{p} W(p) \cdot || S ^{t_k}_{j}(p) - S ^{*}_{j}(p) || ^2_2

 L ^{*}_{c}は背景のPAF推定位置を示し、 S ^{*}_{j}は背景の信頼性マップを表す。 Wはバイナリマスクを表し、 W(p) = 0の場合は位置pにおいてアノテーションが欠落していることを表している。 このマスクを使用することで、True-positiveの予測が反映されなくなることを回避する。

全体としての損失関数は、下記のようになる。

 f = \sum ^{T_P} _{t=1} f ^t _L + \sum ^{T_P + T_C}_{t= T_P + 1} f ^t_S

Confidence Maps

信頼性マップのLossを学習できるようにするために、背景のConfidence Map (S*)を作成した。 信頼性マップは、何らかの部位が二次元平面上に存在する確率を示したものである。 特定の部位が画像に写っている場合信頼性マップは極値をとる。 複数人の場合、それぞれの人の部位を検出する。

これを実現するために、各人の信頼性マップを個別に検出する。  x_{j,k} \in R ^2をk番目の人のj番目の部位の画像中の座標としたとき、画像中の位置pにおける信頼性マップSは下記のように表現される。

 S ^{*}_{j, k} (p) = exp(- \frac{||p - x_{j,k}|| ^2_2}{\sigma ^2})

ここで、 \sigma極値の分散を調整するための定数としている。 ネットワークによって推定された信頼性マップの位置は最大値関数によって一つに集約される。 信頼性マップについて、下記のような複数のピークを精度良く見分けるため、平均ではなく最大値によって信頼性マップは集約される。

f:id:nogawanogawa:20190203150406j:plain:w500

Part Affinity Fields

信頼性マップの使用によって、下記のように(a)、体の部位の位置が与えられたとする。

f:id:nogawanogawa:20190202094220j:plain:w400

姿勢推定ではこの後、これらを組み合わせて人間の姿勢を形成する必要があり、そのために各部位の関連性を測定する必要がある。 この方法にはいくつか考えられるが、中間点を新たに生成し、それとの組み合わせの妥当性を検出する方法がある。(b)

しかしこの手法では、人間が密集した領域では追加で加えた中間点が誤った推定を助長する恐れがある。 このような誤検知は(1)方向を含まない位置のみを使用して四肢を表現し、(2)一点に関連する領域を狭めてしまっているときに発生する。

PAFを使用することでこの問題を解決する。 PAFでは2点間の方向を保持するので、一方から他方への関連をPAFを使用することで補うことが出来る。

以下のような状況を考える。

f:id:nogawanogawa:20190203150424j:plain:w400

k番目の人のc番目の部位の画像中の座標をpとしたとき、PAF(L)は x_{j_1, k} x_{j_2, k}から算出される単位ベクトルで表される。

pがk番目の人のc番目の部位を表す時

 L ^{*}_{j, k} (p) = v

となり、それ以外の場合はPAF (L)は0となる。 その上で、推定が妥当かどうかを判定するのにしきい値を使用する。

 0 ≤ v\cdot (p - x_{j_1 ,k}) ≤ l_{c, k}   and   |v_{\perp} \cdot (p-{x_{j_1}} ,k)|≤ \sigma_l ,

 \sigma x_{j_1, k} x_{j_2, k}の幅を表しており、二点の間に推定値pが存在するように制約を設けている。 これを画像中の人間全員の対象部位に対して適用し、平均をとった値を代表値とする。

 L ^{*}_{c} (p) = \frac{1}{n_c(p)} \sum_k L ^{*}_{c, k}(p)

評価の際には、部位の推定位置とPAFを使用した推定位置との距離を測定する。 これらの関係性は下記の式によって算出する。

 E = \int_{u=0}^{u=1} L_c (p(u)) \cdot \frac{d_{j_2} - d_{j_1}}{||d_{j_2} - d_{j_1}||_2} du

ここで、

 p(u) = (1-u) d_{j_1} + u d_{j_2}

を満たす。

PAFによる複数人の判別

信頼性マップの算出時に圧縮を行っていないため、各部位はどこの部位とつながるか、下記図の(b)に示すように候補は多数存在することになる。

f:id:nogawanogawa:20190202094309j:plain:w500

すべての点の候補を全探索して最適なものを見つけるのは、NP困難な問題に帰着するため、非常に効率が悪い。 これを効率化するために先に紹介したEの式を使用して下記の式を解く。

 max_{Z_c} E_c = max _{Z_c} \sum _{m \in D_{j1}} \sum_{n \in D_{j2}} E_{mn} \cdot z^{mn}_{j_1 j_2}

ここでzは2点が結合するかどうかを{0, 1}で表現している。  E_cは部位の種類cに関する適合性の総和、Z_cはcに関するZ、 E_{mn}はPAFを表している。

この式を特にあたり、NP困難を緩和するために本研究では2つの最適化手法を適用する。

  1. グラフ全体を使用するのではなく、人間の姿勢を考慮した最小の候補だけを使用する(参考:上図(c))
  2. 問題を更に細分化し、ツリーの結合をそれぞれ独立に計算する小問題に切り分ける(参考:上図(d))

これにより、上式は下記のように書き換えられる。

 max_{Z} E = \sum _{c=1} ^C max _{Z_c} E_c

これにより、計算量を削減する。 計算アルゴリズムの違いについて下記の図に示す。

f:id:nogawanogawa:20190202094344j:plain:w400

冗長な計算が削減され、精度まで向上していることが確認出来る。

OpenPose

本研究の成果をOpenPoseとして公開している。 OpenPoseでは、下記の画像のように、リアルタイムに複数人の体、足、手、表情の要点を検出可能である。

f:id:nogawanogawa:20190202094355j:plain:w400

システム構成

従来の姿勢推定ソフトウェアでは、frame readerや結果表示など、それぞれ独自のシステムパイプラインを使用する必要があり、動作する環境に制約があった。 さらに、既存の顔や部位のポイントに関する検出器と組み合わせることができないなど、動作する環境に自由度が低いという問題があった。

OpenPoseでは、これらの問題を解決している。 異なるOS(WindowsLinuxOSX)をはじめ、組込みシステム上でも動作する。 また、ハードウェア構成についても自由度があり、CUDAやOpenCLを使用するGPU環境や、CPU単体の環境など、可搬性が高い。 入力機器については静止画からwebcam、IP camaraなどが使用可能で、検出器も体や手足などで変更が可能である。

現在、OpenPoseは下記の3つの機能を組み合わせて構成されている。

  • 体+足検出
  • 手検出
  • 顔検出

COCOとMPIIを使用して学習された姿勢推定器をそれぞれ使用する。 表情検出では、体検出器の出力を元に目や鼻の大体の位置を推定することで顔のバウンディングボックスを取得する。 手検出では、腕の要素の大体の位置を推定することで手のバウンディングボックス取得する。 この手法はTop-down Approachに基づいており、二次元の画像から三角測量によって位置を推定している。

実行速度としては、Nvidia GTX 1080 Tiを使用して約22FPSで動作する。

足の姿勢推定

既存の姿勢推定器では、四肢のポイントが限られており、残念ながら足に関しては足首のみが検出されるようになっている。 一方で、ポイントの位置から形状を復元しようとする場合には、つま先とかかとの位置が必要になる。 この問題を解決するために、15000件の人間の足のデータセットを構築した。 このデータセットを使用して検出器を作り、下記(a)のように足について6点のポイントを追加で検出可能になった。

f:id:nogawanogawa:20190202094424j:plain:w400

これにより、(b)のように足首しか検出されなかったものが、(c)のようにより正確に足首の位置を推定できるようになっている。

下記に、既存手法とOpenPoseで使用するデータセットでのポイントの推定の結果を示す。

f:id:nogawanogawa:20190202094435j:plain:w400

(a)COCOだけや(b)MPIIだけでは足首までしか検出できていないが、(c)提案手法ではつま先からかかとまで検出できていることがわかる。 これにより、より復元性の高い検出が可能になっている。

評価

提案手法に関する評価を行う。 データセットには下記の3点について実施する。

  1. MPII human multi-person dataset
    • 検出点:14
    • 学習データ:3844
    • テストデータ:1758
  2. COCO keypoint challenge dataset
    • 検出点:17(四肢:15、顔:5)
  3. foot dataset (original)
    • annotation : 15K

MPII Multi-Person Dataset に関する評価

MPIIに関する評価には、mean Average Precision (mAP)を使用する。 また、位置秒あたりの推定に要する時間を(sec)に関しても評価する。 評価結果を下記に示す。

f:id:nogawanogawa:20190202094548j:plain:w550

テストセットの中の特定の288のサブセットについてみた時、bottom up approachの先行研究に対して8.5% mAPで改善されている。 テストセット画像全体でみた時でも、DeeperCutに比べてスケーリングなしで13%の精度向上を達成している。 スケーリングを加えると75.6%のmAPを達成し、非常に効率よく体の部位を表現できていることが確認できる。

下記の画像のようなスケルトン構造について評価する。

f:id:nogawanogawa:20190202094309j:plain:w500

MPIIの学習セットから343画像を抽出し、テストセットとした。 グラフを元に全結合を行った結果(b)、最小木構造の結果(c)、二部構成グラフ(d)を使用して学習を行う。 評価結果を下記に示す。

f:id:nogawanogawa:20190202094600j:plain:w500

我々の提案手法(d)は既存の空いてアルゴリズムより精度を向上させるだけでなく、計算効率を高めている事がわかる。

アブレーション解析の結果を下記(a)に示す。

f:id:nogawanogawa:20190202094610j:plain:w550

PAFを使用すると、中間点を1つ使用する方法より精度が2.9%、2つ使用する場合より2.3%向上している。 バイナリマスクを使用すると更に2.3%精度が向上している。 提案手法全体では、88.4%の精度に達する。 GT connection を使用すると81.6%まで低下している。 このことからPAFが正しい関連の推定に有効であることがわかる。

(b)にステージごとの精度を示す。 ステージごとに精度が向上していることがわかる。

COCOデータセットに関する結果

COCOデータセットに関する平均精度(AP)の結果を下記に示す。

f:id:nogawanogawa:20190202094619j:plain:w400

この評価では提案手法が精度が悪くなっている。 その他、提案手法内の評価結果を下記に示す。

f:id:nogawanogawa:20190202094633j:plain:w400

CPMを使用したtop-down approachの時が最も精度が高くSingle Shot MultiBox Detector (SSD) を使用した場合と比較して10%向上している。 この結果からわかることは、top-down approachは人物の検出に強く依存しているということである。 それに対し、我々の先行研究のBottom up approachは58.4%を達成しており、CPMを併用すれば61%まで精度は向上する。 今回の手法は更に精度は向上し、同時にスピードは45%向上する。

提案手法内部でのPAFの影響によるの精度の変化を下記に示す。

f:id:nogawanogawa:20190202094709j:plain:w500

本研究ではステージの最大数は6としている。 結果からわかることは、

  1. PAFを使用して精度を出すにはより多くのステージが必要になる
  2. PAFステージの数を増やしていくに連れて、true-positiveの精度が向上していくが、信頼性マップステージは局所的な精度を向上させる
  3. PAFを優先的にステージを増やしたほうが精度が向上する

の3点がわかる。

ランタイムに関する分析

ランタイムの評価を行う。 比較対象としては

  • OpenPose
  • Mask R-CNN
  • Alpha- Pose

を使用する。

画像中の人間の数と、推定に要する所要時間を下記に示す。

f:id:nogawanogawa:20190202155201j:plain:w400

Mask R-CNNはNVIDIA GPUが使用可能であるので、そちらを利用した形で評価する。

top down approachを使用する関係でMask R-CNN、Alpha-Poseは人数に伴い時間も増大する。 一方、bottom up approachの提案手法は、人数に依らず一定である。 提案手法ではCNNと解析の2つのタスクが所要時間を占めるが、9人の画像を使用した時CNNが41msに対し、解析が0.58msとCNNが所要時間の大部分を占めるためである。

モデルによる実行時間の違いを下記に示す。

f:id:nogawanogawa:20190202094729j:plain:w350

提案手法(Body+foot model)では、精度が向上するだけでなく、GPU使用時に速度も45%向上している。 一方、CPUだけの場合だとステージの数が増加しているため、メモリ使用率が大きくなり性能は大幅に低下している。

足に関する推定

足のポイントに関する評価を行う。 評価結果を下記に示す。

f:id:nogawanogawa:20190202155342j:plain:w500

教師データに欠損があるため、実際にはアノテーションが無い部分まで推定していることによって精度が低くなっているが、 定性的にも、体の推定よりもエラー率が大きかった。 これは学習データが少なかったことだと予想されるので、学習データを増やせば改善されると思われる。

下記に、足の推定の有無による精度の違いを示す。

f:id:nogawanogawa:20190202094812j:plain:w500

こちらは足の推定の精度が悪かったにもかかわらずほとんど同じ精度を達成している。

乗り物に関する推定

本提案手法の適用範囲は人間や足に限定されず、どんな物体であっても適用可能である。 乗り物に関する評価結果を下記に示す。

f:id:nogawanogawa:20190202094824j:plain:w500

平均精度は人間の場合よりも高いことがわかるが、人間の場合と比べてシンプルなデータセットを使用したためだと考えられる。

19台のカメラのうち18台のカメラの画像にアノテーションを付けて学習用に使用し、1台をテスト用として使用した。

参考までに、推定結果を下記に示す。

f:id:nogawanogawa:20190202094719j:plain

誤認識に関する分析

下記に人間の姿勢推定に失敗している主なケースを示す。

f:id:nogawanogawa:20190202094750j:plain

また、下記に足の推定に失敗しているケースを示す。

f:id:nogawanogawa:20190202094800j:plain

上図(a)のように上下逆さまのケースは常に失敗することがわかった。 回転を加えればこのケースの推定は正しくなるが、その他の事例を含めると全体として5%精度が低下してしまう。 特に密集しているようなケースでは誤認識が発生しやすい。 また、動物や銅像なども誤認識の原因となりやすい。 このような問題を回避するためには、人間と人間以外のモノのケースを区別して学習していくことが有望と考えられる。

結論

リアルタイムに2D画像から複数人の姿勢を推定することは、機械が人間と強調していく上で重要な要素技術である。 本研究では人間の四肢といった主要部位を明示的な数値表現を使用することなく表現する手法について紹介した。 次に、段階的に四肢の検出と連関に対する学習するアーキテクチャを考案し、これを用いて解析することで高精度で体の姿勢を推定することに成功した。 その中で、PAFの改善がPAFと四肢の関連性の改善より重要ということを示した。 評価により、体と足の推定に関し、精度が向上し、同時に計算速度が向上していることを確認した。

コードはこちら(Pytorch版)

github.com

その他 (参考記事)

本家(ライセンス等)

flintbox.com

日本語記事

ledge.ai

qiita.com

感想

あんまり細かいところはわかりませんでしたが、要するに

  • 部位の点を見つけ出すだけでは不十分
  • どの点と点が結合するか判別しようとすると、複数人いたときに処理が膨大になるか間違える
  • 部位の位置とは別に、点と関連する部位に向かうベクトルも推定する
  • 2種類の推定を総合的に使用することで、効率よく精度よく姿勢の推定が可能

ってことですかね。

その他、足のデータを足してみたら精度良くなったとかそんな話ですね。

ロボットと人間が協業することとか考えると、こういう技術が大事になるんですかね。 そうじゃなくてもセンサーが不要で姿勢の推定が出来るのはいろいろ応用が効きそうですね。

論文とは関係無いんですけど、はてなブログってgifも貼れるんですね。知らなかったっす。。。