人物が写った画像からその姿勢に合わせたopenposeのkeypointとsmplxのモデルを復元する。
以前smplについては書いた
pytorch3dのTextureUVでSMPLのmeshにtextureを貼る - MEMOcho-
smplxは上記の拡張版のモデルであり、smplに加えて顔の表情と手の形まで表現できるようboneやmeshが拡張されている。詳しくはこちらのrepoや論文を見るのがよいがdescriptionだけ引用しておく
SMPL-X (SMPL eXpressive) is a unified body model with shape parameters trained jointly for the face, hands and body. SMPL-X uses standard vertex based linear blend skinning with learned corrective blend shapes, has N = 10, 475 vertices and K = 54 joints, which include joints for the neck, jaw, eyeballs and fingers. SMPL-X is defined by a function M(θ, β, ψ), where θ is the pose parameters, β the shape parameters and ψ the facial expression
こちらのモデルを画像にあわせて復元する手法として同論文内でsmplify-xが提示されており、こちらのrepoに実装がある
GitHub - vchoutas/smplify-x: Expressive Body Capture: 3D Hands, Face, and Body from a Single Image
これを動かそうとして環境構築してみたところ、5年前に公開されたものだけあって使っているものが少し古くいまの手元の環境と合わなかった
The code has been tested with Python 3.6, CUDA 10.0, CuDNN 7.3 and PyTorch 1.0 on Ubuntu 18.04.
ひとまず上記の古いversionは気にせずに新しいもので動くか試してみたが、依存してるpackage側で最新だと変わってるものもあり案の定すんなりとは動かず。また、smplify-xの前にそれに必要なopenposeなども別途いれる必要があってちょっと面倒
where the DATA_FOLDER should contain two subfolders, images, where the images are located, and keypoints, where the OpenPose output should be stored.
で、実際に動かした記事などないか少し調べたところ、こういう実装を上げてくれている人がいた
中を見てみると元のsmplify-xの実装は基本的にそのままで、新しい環境用に動かない部分だけ修正してある模様。また、openposeを入れる部分に関してもカバーしてあって全体をgoogle colabのnotebookとして上げてくれており大変助かる。
https://colab.research.google.com/drive/1OoGEg8doFA3-3f_5XkA895C9xR9nf-ob?usp=sharing
colabで動かすのでもよいのが、次回使う際にまだopenposeのビルドもやるというのも時間がかかってしまうため手元の環境で動かせるよう環境構築と実行用のスクリプトを作っておいた。
https://github.com/y-kamiya/Smplify-X-Perfect-Implementation/pull/1
実行方法はreadmeに
smpl-xのpose parameterなどは data/smplifyx_results/results
にpklとして出力される
https://github.com/y-kamiya/Smplify-X-Perfect-Implementation/blob/abcf4d935c8b4eb7e6e87864dfb30e2ae9dc4df5/smplifyx/fit_single_frame.py#L490
注意点
Dockerfileを作ったのはopenposeのビルドのために必要なpackageをhostから分離しておきたかったためで、cuda12.1やtorch2.2.2のような新しいものが必ず必要というわけではない。colabで実行時には既存でinstall済みのために必要なかったいくつかのpackageを追加で入れている(boostとか)
また、openposeのビルド時の設定としてcuDNNを利用しないフラグを足している。cmake .. -DUSE_CUDNN=OFF
の部分。
これはcolab上で実行してみても同じだったが、cuDNN関連のエラーが出て実行時エラーとなってしまったため。おそらくcuDNNのversionを合わせるのが正しい解法なのだと思うが、今回はリアルタイムや大量にbatch処理したいという話ではないため簡単のためにoffにしてビルドしてしまうことにした。
smplify-xの部分に関して、run_smplifyx.sh
はopenposeのdocker container上で実行するとrendering結果が生成されず、以下のようなwarningが出る状態だったためcontainer上ではなくhost上で実行している。
libEGL warning: MESA-LOADER: failed to open swrast: /usr/lib/dri/swrast_dri.so: cannot open shared object file: No such file or directory (search paths /usr/lib/x86_64-linux-gnu/dri:\$${ORIGIN}/dri:/usr/lib/dri, suffix _dri)
発生元はここ
必要なsoをinstallした上で簡単に試したところ、さらに別のsoを要求されるという状態。おそらくdocker container上でgpuを通したGUI用の環境設定が必要で、本題とは別なのと追うのが面倒な部分なのでhost上で実行(幸いsmplify-xの部分はpython packageへの依存のみなので)
一応ちょっと調べた参考情報はメモしておく。
How can i deal with 'libGL error: failed to load driver: swrast.' · Issue #509 · openai/gym · GitHub libEGL warning: MESA-LOADER: failed to open DRI library - snapcraft - snapcraft.io DockerでGUIを表示するときの仕組みについて #Docker - Qiita Dockerコンテナの中でGUIアプリケーションを起動させる | Unskilled?