単眼カメラによる人物の3次元姿勢推論する方法に関して調べてみた
事の発端
こんにちは、wadaです。
最近、人体の姿勢を推論する手法に触れる機会がありました。
流行りの OpenPose と言う物です。
OpenPoseは、基本的には単眼カメラによる2次元画像を元に、そこに映っている人物の姿勢を推論する手法になります。
ざっくり言ってしまうと、画像に映っている人物のキーポイント(肩とか肘とかの決められた位置)が2次元座標上の何処に存在しているかを見つけ出す事が出来ます。
調査段階で、基本データセットとWebカメラを利用して試しに実行してみたところ、簡単に人物の姿勢を検出する事が出来ました。
訓練されたインスタグラマーが常にインスタ映えする物を求めて彷徨っているかの如く、 訓練されたiPX社員である自分は、瞬時に姿勢推論した結果を応用して来訪者に合わせて動くデモに仕立てたら展示会映えするんじゃないか?と思いつきました。
実際に、展示会のテーマに採用されるかどうかは別として、日々の情報収集は大事です。
Openposeで何が出来るのか、更には2Dの姿勢推論だけではなく3Dの姿勢推論が出来ないものか?と言ったあたりを調べてみました。
ひとまず論文読んでみた
こちらが、かの有名な(?)OpenPoseの論文です。
[1812.08008] OpenPose: Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields
細かい解説は書いているとそれだけでブログの記事数本分になってしまうので、自分より文章の上手い先達に譲るとしまして、
誤解を恐れずざっくりとまとめます。
- 画像内に存在する人体のパーツ毎の位置を推論する (Part Confidence Maps)
- パーツ間の関係性を表す2次元ベクトルマップを推論する (Part Affinity Fields)
- 2つの推論結果を合わせて人体の姿勢を算出する
こういった手法で姿勢推論を行う事で、画像に映っている複数人の姿勢を高速に高い精度で推論する事が出来ます。
3次元の姿勢を求めるには?
OpenPoseの出力は、あくまで2次元映像上の各キーポイントなので、そのままでは姿勢を3次元空間に表す事はできません。
しかしデモに応用するなら、2Dでのデモより3Dのデモの方が映え映え間違いありません。
さて、どうしたものか。
パッと思いつくレベルでは、人間の各関節ごとの長さなんてそこまで大きな差は無いし、
カメラの画角とか分かってればルールベースでも計算出来そうです。
いや、どうせ誰かやってるでしょ。
と、言う事でまた論文を漁ってみます。
3d pose baseline
まず真っ先に見つかるのが 3d-pose-baseline です。
[1705.03098] A simple yet effective baseline for 3d human pose estimation
これを元にして、MMDでキャラを動かす方法が公開されていたりするので、Youtubeとかで検索すると色々な動画が上がっています。
これもざっくりとまとめます。
- 入力は2Dの姿勢情報
- 3D姿勢情報を教師データとした教師あり学習
画像を入力とせず、2D座標から3D座標を推論するというシンプルなアプローチ故に処理が高速なのが特徴的なようです。
3d pose gan
次に面白いアプローチの仕方をしている物を見つけました。 こちらはドワンゴさんが発表した論文になります。
[1803.08244] Unsupervised Adversarial Learning of 3D Human Pose from 2D Joint Locations
同じくざっくりまとめると
- 3D姿勢情報を教師データとして必要としない、GANを利用した3D姿勢推論
- 2D姿勢を入力として、Generatorが3D姿勢情報を生成
- 2D姿勢情報をGround truthとして、生成した3次元姿勢情報を「回転→2次元投影」した物をDiscriminatorが判断する
このアプローチの大前提となっているのが「正しい3D姿勢情報はどの方向から投影しても正しい2D姿勢情報になる」と言う考えです。
なるほど。目から鱗でした。
言われてみるとそりゃそうだなんですが、流石の着眼点です。
最後に
と、言う訳で単眼カメラによる3次元姿勢推論する方法を色々調べてみました。
もちろん、そのまま使った物を展示してもあまり意味がないので、自社の売りとなる技術とどう組み合わせて見せて行くかと言う事が大事になります。
色々な物が組み合わさって、スパークして、最終的に物が動いた時ってやっぱり楽しいんですよね。
その為にも、常にセンサーを広げて引き出しを増やしていきたいなと思って過ごしてます。