"End-to-end Recovery of Human Shape and Pose"とは?
CVPR2018にて投稿された内容で,簡単に言えば2次元画像から3次元モデルへの復元を行います.
プロジェクトページ:Human Mesh Recovery
これが中々すごい!ぜひプロジェクトページの動画を見て下さい.
どうやってるの?
私もまだざっくりとしか理解しておりませんが,
- 2D画像の入力
- 入力された2次元画像から3次元関節位置と体型の推定
- 復元された3次元モデルを”人間識別器”へ入力
- ”人間識別器”において,復元されたモデルを人間 or notの判断を下す(例えば,関節角度がおかしくないかなど)
”人間識別器”はいわゆるGANになっており,繰り返し学習を行うことでもっともらしい関節可動域や体型を学習していきます.
3次元モデルの復元にはSMPLを用いております.
プロジェクトページ:SMPL
3次元モデルを生成するうえで問題となるのは,異なる体重で同じ手足の長さをもつ場合がある点です.
ざっくりSMPLを説明すると,SMPLは関節位置が身体の3Dサーフェスとどのように関連しているかを示し,
解剖学的な関節を表現するわけではなく表面頂点の関数として表現しております.
話をHMRに戻しますが,この論文のすごいところは学習において関節位置がアノテーションされた2次元画像と3次元画像のペアを必要としないところです.
というわけで,早速デモを動かしてみましょう.
環境構築
基本は著者の方が公開されているGithubの内容でいけますが,諸々躓いた点があるので簡単に解説していきます.
Github:HMR
まずはPythonの設定
デモ自体はPython2.7が推奨されています.
Anaconda等で仮想環境を作りましょう.
conda create -n py27 python=2.7 anaconda
モデルのダウンロード
Githubの解説の通りです.
HMRのディレクトリ内でダウンロードしましょう.
cd hmr-master
wget https://people.eecs.berkeley.edu/~kanazawa/cachedir/hmr/models.tar.gz && tar -xf models.tar.gz
モジュールのインストール
とりあえず,
python -m demo --img_path data/im1954.jpg
でデモを動かしてみましょう.
色々モジュールが無いと言われると思うので,エラー文に従って入れていきます.
ここで何点か躓いたので,
Tensorflowのバージョンは1.3.0
pip install tensorflow==1.3.0
※GPUあれば
pip install tensorflow-gpu==1.3.0
Githubに書いてあったにも関わらず見落としてましたね...
TF最新版だとcontribが無くなった影響でエラーが吐かれます.
参考:Design Documentから見たTensorFlow 2.0の変更点
ちなみにPython3系だとTensorflow1.3.0は見つからないです.
あと,WindowsだとPython2系にはTensorflowが公開されておりません.
Github上でも"Windows Setup with python 3 and Anaconda"と書いてあるのが納得できます.
Opendr
ここが一番躓きました.直接Githubからとってきてもエラーでたりと...
結局,一番簡単なpip経由のインストールで通るという...
pip install opendr==0.77
デモの実行
一通りモジュール入れ終わったら,もう一度デモを実行していきましょう.
python -m demo --img_path data/im1954.jpg
恐らく,下記のようなエラーがでます(2019/10/27時点,エラー出なかったら無視でいいです).
absl.flags._exceptions.DuplicateFlagError: The flag 'log_dir' is defined twice. First from absl.logging, Second from src.config.
Description from first occurrence: directory to write logfiles into
log_dirというflagを2回定義していると言われているので,src/config.pyの59行目あたりにある,
flags.DEFINE_string('log_dir', 'logs', 'Where to save training models')
をコメントアウトしましょう(これでエラー回避できますが,どこに影響がでるかは調べきれていません).
また,src/tf_smpl/batch_smpl.pyでもencodingという引数は定義されていないと出ると思います.
dd = pickle.load(f, encoding="latin-1")
これ自体はpython2系で作ったモデルをpython3系で使う際に必要らしいので,
"encoding="latin-1""の部分を消せばいいです.
dd = pickle.load(f)
以上になります.
この分野はものすごい速さで発展していってて,めちゃくちゃ圧倒されますね...
