DeepPose: Human Pose Estimation via Deep Neural Networks 発表:齋藤 俊太** **慶應義塾大学大学院理工学研究科 後期博士課程 Alexander Toshev*, Christian Szegedy* * Google
DeepPose: Human Pose Estimation via Deep Neural Networks
発表:齋藤 俊太**
**慶應義塾大学大学院理工学研究科 後期博士課程
Alexander Toshev*, Christian Szegedy* * Google
DeepCNNで姿勢推定
• ILSVRC 2014でトップだったGoogLeNetチーム(の一部の人)が書いたDeepCNNによる姿勢推定の論文 • LSP (Leeds Sports Pose) Dataset, FLIC (Frames Labeled In Cinema) Datasetを用いて学習・テスト • ILSVRC 2012でトップだったAlexNet(proposed by Alex Krizhevsky, Ilya Sutskever, Geoffrey Hinton, 全員現
Googler)のアーキテクチャをそのまま利用 • 投稿時点(arXiv初出 17 Dec 2013)ではstate-of-the-art • DeepCNNを使って回帰問題として姿勢推定を解いた最初の論文で,以降のベンチマーク的手法 • その後グラフィカルモデルと合わせてこれを改善した論文がいくつか発表されている
DeepPose: Human Pose Estimation via Deep Neural Networks
図:Toshev, A. et al., “DeepPose: Human Pose Estimation via Deep Neural Networks” より
Introduction• 人間は隠れている関節の位置も他の部位のようすやその対象人物の動きなどから推測することができる • つまり「全体的に見て推測する(holistic reasoning)」ことが重要 • Deep Neural Network (DNN) ならこの辺をうまくやってくれそう • パーツごとに検出して,あとでパーツ間の関係を考慮する手法は大量に提案されてきたが,あり得るパーツ間の相互関係のうちの小さな部分集合を考慮に入れることしかできていない
• DNNを用いると特徴量を設計しなくてよいしパーツ検出器もデザインしなくてよい上に関節間の相互関係などのモデルさえ用意しなくてよい
• DeepPoseでは複数のDNNを直列につなげる• まずおおまかに各関節の初期位置を推定するDNNを使い,推定された各関節位置のまわりの画像を元画像から取ってきなおして,その関節まわりの高解像度なパッチを次のDNNに入力する
図:Toshev, A. et al., “DeepPose: Human Pose Estimation via Deep Neural Networks” より
図:Ramanan, D. “Learning to parse images of articulated bodies” より
Related Work
• 関節構造のある物体は一般的に構成パーツのグラフとして表される • Pictorial Structureという手法ではパーツ間の位置関係の変化に対するコストと各パーツの見えに対するコストの和を最小化するように事前に定義しておいたパーツのグラフ(木構造等)をフィッティングする
• このアプローチを改善していくためにはパーツ検出器を強化するかより複雑な関節間の関係を表現できるようにするか,という2つの道しかない
• パーツ検出器をリッチにしたもの,Latent SVMとPictorial Structureを組合せてより複雑な関係を表現できるようにしたものなどが提案された
図:Huttenlocher, D. “Object Recognition Using Pictorial Structures” スライドより
人体を「パーツが連結されたもの」として考える手法
図:Yang, Y. et al. "Articulated Human Detection with Flexible Mixtures of Parts” より
Related Work
• 色々な姿勢の人を色々な視点から撮ったときの画像(exampler)を用意して関節位置のラベルをつけておく
• 新しい画像が得られたら事前に用意したexamplerのどれと近いかを調べる • これを高速化した手法や,腕だけに注目して「腕部分の姿勢」を事前に何パターンも用意しておき,腕あたりを切り出した入力画像に対して,各姿勢に該当する/しないを判断する分類器をたくさん用意しておく手法など
人体姿勢を部分に分けず全体的に推定する(=Holisticな)手法
図:Mori, G. et al. “Recovering 3d Human Body Configurations Using Shape Contexts” より図:Gkioxari, G. et al. “Articulated Pose Estimation using
Discriminative Armlet Classifiers” より
パーツベースだと終わる例 Gki
oxar
i, G
. et a
l. “A
rticu
late
d Po
se
Estim
atio
n us
ing
Dis
crim
inat
ive
Arm
let C
lass
ifier
s” より
Deep Learning Model for Pose Estimation• 姿勢は「各関節の位置座標値を一列に連結したベクトル」で表す→ • よってラベル付き画像とは「画像 x と姿勢ベクトル y 」の組となる • 普通データセット上では各関節の位置座標は画像上の絶対座標で表されているので,人物領域をくくった bounding box b の中心からの相対的な位置を表すように正規化しておく↓
y = (. . . ,yTi , . . . )
T , i 2 {1, . . . , k}
N(yi; b) =
1/bw 0
0 1/bh
!(yi � bc)
• この正規化姿勢ベクトルを N(y; b) と表し,また元画像から同じbounding boxの領域を切り出した画像を N(x; b) と書くことにする
• 以降この人物領域 box b で正規化することを N(・) と書く
データセット中の元画像(関節位置ラベルが付随する)
bh
bw
bc
yi
正規化画像 N(x; b)図:FLICデータセット より
Pose Estimation as DNN-based Regression• 元画像 x を姿勢ベクトル y に回帰する関数 を学習したい (k: 関節の数) (x; ✓) 2 R2k
• 元画像 x 中の関節位置 y* を予測するというのは,正規化画像を ψ に入れて正規化姿勢ベクトルを得て,これを元画像の座標系に変換しなおすということなので
y
⇤ = N
�1( (N(x); ✓))
• ψを事前に決めておいたサイズ(220 x 220)の3チャンネル入力画像 (=N(x)) を入力にとり,2k次元の連続値ベクトル y* を出力するDeep Convolutional Neural Networkで近似する
• DeepCNNのアーキテクチャとしてはAlexNetをそのまま使う(ただし最終層は1000 unitsではなく2k unitsにする) ➡ AlexNetは,C(55 x 55 x 96) - LRN - P - C(27 x 27 x 256) - LRN - P - C(13 x 13 x 384) - C(13 x 13 x
384) - C(13 x 13 x 256) - P - F(4096) - F(4096) - F(2k) からなる13層のアーキテクチャ.ただし学習可能パラメータを持っているのはC(convolutional)層とF(fully-connected)層だけ(パラメータ数は約4000万)なので「7層NN」
➡ 活性化関数には全てReLUを使用 ➡ C層のフィルタサイズは下から順に
11x11, 5x5, 3x3, 3x3, 3x3 • It’s truly holistic!!• 姿勢推定用のモデルを設計しなくてよい
図:Toshev, A. et al., “DeepPose: Human Pose Estimation via Deep Neural Networks” より
Training• 分類じゃないので AlexNet for ImageNet classification の場合とはロスが異なってくる • まずデータセット内のデータを全部,(正規化画像 N(x), 正規化姿勢ベクトル N(y)) に変換しておく
DN = {(N(x), N(y)|(x,y) 2 D}
• ロス関数を予測ベクトル ψ(x;θ) と正解ベクトル N(y) の間のユークリッド距離で定義する • k個の関節ごとのL2距離の合計を,全データに渡って合計した値を最小にするDCNNのパラメータθを求める
arg min✓
X
(x,y)2DN
kX
i=1
kyi
�
i
(x; ✓)k22
• θをmini-batched Stochastic Gradient Descentで最適化する • (regressionの場合learning rateは小さくしたほうが良い) • Data augmentation: ランダムcrop,左右反転 全F層でDropout ratioは0.6(AlexNetは0.5)
solverの設定
N(y)
N(x)
(x; ✓)
DCNNの出力
L2ロス(ユークリッド距離)を使う
220
220
N(yi)
bh
bw
bc
yi
Cascade of Pose Regressors• DCNNの入力が220 x 220サイズに固定されているため,DCNNは粗い画像しか見れない • 各関節の正確な位置を推定するために,同じアーキテクチャのDCNN全体を複数,直列に接続する • 同じパラメータを持つ同じDCNNではなく,違うパラメータを学習する別なものをステージごとに用意する • 第2ステージ以降の学習では一つ下のステージの予測結果をシミュレートして作ったデータを使ってData
augmentationを行う • 一つ下のステージの予測結果と正解のズレ の平均と分散を計算し,これらをパラメータとして持つ正規分布を使って生成したノイズを正解に付加したものを擬似予測結果とすることができる
(y(s�1)i � yi)
cascading
DCNN ステージ s: (N(x; bs); ✓s) (N(x; bs); ✓s)
x
逆変換:N
�1( (N(x; bs); ✓s); bs)N
�1( (N(x; bs); ✓s); bs)
元画像中の推定位置: ys+1ys+1
上の関節推定値: i-th joint
人物検出結果領域など
yy学習N(x; bs=0)
bs=0
220 x 220
N(x; bs)
bs+1i
N(x; bs+1i )
ys+1i
bs+1ibs+1i の中心
正解位置 yiyi��
s � 2s = 1�s � 2
s s+ 1
Cascade of Pose Regressors
• これをもとに次のbounding boxも計算される→ bs+1i = (ys
i ,�diam(ys),�diam(ys))
• ステージ2以降は「前のステージの予測結果をどのくらい動かせばいいか」を学習する • よって次の元画像中の推定位置は,前の予測値に現在のステージの予測結果を足して得られる
ys+1i = ys
i +N
�1( i(N(x; bs); ✓s); bs) s � 2
• diamは姿勢ベクトルのうちの左肩関節座標と右腰関節座標の距離で定義される体幹部の大きさ• つまり体の大きさのσ倍の量によって関節まわりのbounding boxの大きさが決まる
s � 2
cascading
DCNN ステージ s: (N(x; bs); ✓s) (N(x; bs); ✓s)
x
逆変換:N
�1( (N(x; bs); ✓s); bs)N
�1( (N(x; bs); ✓s); bs)
元画像中の推定位置: ys+1ys+1
上の関節推定値: i-th joint
人物検出結果領域など
yy学習N(x; bs=0)
bs=0
220 x 220
N(x; bs)
bs+1i
N(x; bs+1i )
ys+1i
bs+1ibs+1i の中心
正解位置 yiyi��
s � 2s = 1�s � 2
s s+ 1
• 検証実験のためのデータセットとしては以下の2つを用いる • Frames Labeled In Cinema (FLIC)データセット
➡ 4000枚の学習画像,1000枚のテスト画像を含む ➡ 上半身の10関節のラベルが付いている
• Leeds Sports Dataset (LSP)データセット➡ 11000枚の学習画像,1000枚のテスト画像を含む ➡ 全身の14関節のラベルが付いている
• どちらともperson-centricなラベルを持つ➡ 画像中の人物の視点での左右を反映 ➡ 例えば画像の中での位置は左側にある肘関節も,人物がこちら側を向いていたらそれは右肘としてラベル付けされる
Empirical Evaluation - Dataset
FLIC datasetLSP dataset
observer-centricなラベルでは画像中で左の方にある方を「左肩」とするため対象人物がこちらを向いていようと向こうを向いていようと「肩らしい」ものを2つ見つければラベルは一意に決まるので姿勢のバリエーションが減る
Empirical Evaluation - Metrics
➡ パーツの検出率を表す ➡ あるパーツの両端の関節の検出位置が,そのパーツの長さ(両端の関節の正解位置間の距離)の半分よりも正解に近ければ検出成功とする(PCP at 0.5)
➡ しかし見えの上で小さな大きさになっているパーツは極めて検出が難しいものとなる
➡ 例えば,腕を前に出しているときの上腕の長さは画像上では数ピクセルになるかもしれない
➡ このとき肩と肘の関節はその数ピクセルのさらに半分の誤差以下でないと検出とされないことになる
Percentage of Correct Parts (PCP)
評価指標
Percentage of Correct Parts (PCP)
Percent of Detected Joints (PDJ)
➡ PCPの問題に対処するために提案された評価指標 ➡ 検出位置と正解位置の誤差がdiam(体幹部の対角線長さ)をβ倍した長さ以内になっているときはその関節を検出成功したとする
➡ PDJでは見え方上のパーツの大きさによるパーツごとの検出難易度のばらつきを排除して比較できる
➡ さらにβの値を変えることで許容誤差を変化させたときの検出率を調べることができる
Experimental Details• FLICデータセットに対してはまず顔検出を行い,そのbounding boxを広げて全ての関節が含まれるようなラフな初期人物検出領域を作成する
• LSPデータセットの場合はもともとすでにラフな人物領域が切りだされた画像なのでデータセットの画像をそのまま初期bounding box( )として用いるb0
• 各データセットから50枚ずつ画像を取り出していくつかのハイパーパラメータを決定するのに使う • ステージ2以降のbounding boxのサイズを決める係数σ( )は
➡ FLIC datasetの場合: - 上記50枚で{0.8, 1.0, 1.2}を試した結果,σ=1.0とした
➡ LSP datasetの場合: - {1.5, 1.7, 2.0, 2.3}を試した結果,σ=2.0とした
bs+1i = (ys
i ,�diam(ys),�diam(ys))
• カスケーディングのステージ数はFLIC, LSP双方で3が最も良かった• ステージ2以降の学習に使う乱数でノイズがシミュレートされた入力パッチは,各学習データごとに40枚生成したため,LSPデータセット(関節数14)においては11000枚 x 40バージョン x 2次元(x,y) x 14関節で,1232万枚の学習データに増やしたことになる
• 学習は12core CPUだと各画像0.1sほどでできる • 100台のコンピュータを使ってステージ1の学習を3日行ったが,最終的な精度は12時間ほどの時点で達成されていた
• ステージ2以降のDCNNの学習はデータ量が40倍になるので各ステージごとに7日を要した • それでももっと大量のデータがあればより良い結果が出るだろう
Comparisons• 最も難しい4つのパーツ(上腕・下腕・脚)それぞれと,これらの平均精度で他手法と比較した
• 全てにおいてベストパフォーマンスを達成したが,特に脚が顕著だった
• 特定のパーツに特化して作られた他手法よりも優れていたのは特筆に値する
PCP metric on LSP
PDJ metric on FLIC and LSP• 全ての対抗手法を圧倒 • 許容誤差が大きいあたりで特に強い • LSPのケースで正規化距離が0.2以下のあたりで少し対抗手法に負けているのは恐らくDCNNが7層と深すぎるのとMax poolingのせい
FLIC
LSP
Effects of cascade-based refinement• ステージを重ねることでどのくらい精度が上がっていくのか? • initial stage→stage 2の間のゲインがとても大きい • stageが上がると逆にコンテキストの情報が使えない(周囲の情報から推測する,ということが難しい)ため精度向上にも限界がある
scal
etr
ansl
atio
n
Cross-dataset Generalization
• LSP(全身姿勢dataset)で学習したDeepPoseを別のデータセット(Image Parse dataset)でテストした • Image Parse datasetで学習してImage Parser datasetでテストしている他手法より良かった(衝撃)
Percentage of Correct Parts (PCP) at 0.5
Conclusion• Deep Neural Networkの応用としては初の人物姿勢推定を行った • パーツベースではなく,holistic mannerで回帰問題にした • 今回は物体認識で使われているAlexNetのアーキテクチャをそのまま用いた • AlexNetが回帰でも使えることが分かった • 姿勢推定に適したアーキテクチャがあるはずなので,探したい