AnacondaでHMR2.0環境をつくってみる

参考にしたのはこちら
russoale/hmr2.0

前回HMRを試してみたのですがpython2.7で環境を作りました
サポートされていないのでやはりpython3で試してみたくなり、こちらを発見しました

実行環境

・MacBook Pro10.14.4
・Anaconda3
・python3.6.10

結論

環境はつくれませんでした
SMPLのTFRecordが作れずうまくいきませんでした
トレーニング方法も記載してくれていたのですが作れず、、
時間がかかってしまったので断念することにしました

注意点

今回はpython3で試すことが目的でしたが、SMPLのデータセットがfor python2.7になってるのが気になります
また容量の少ないPCでやっているため、何をするにもディスクがいっぱいになってしまって辛かったので
容量は確保してやるべきでした
MPIIのデータセットダウンロードには何時間かかかったので注意です

推奨通りにvirtualenv+python3.x環境

Python > 3.6
が推奨されていますので、3.7で試してみました
3.8もありますが、安定しているのは3.7らしいので3.7をvirtualenvでいれてみたところ
エラーが発生しました

エラー

どうやら前回作ったanaconda環境と競合が発生したようです
参考リンク - pyenvとanacondaを共存させる時のactivate衝突問題の回避策3種類

Anacondaの環境は残しておきたかったのでAnacondaで環境をつくってみます

Anaconda3で環境作り

conda環境でpython3.8でHMR2.0を試してみましたがこちらもできませんでした
pythonを3.8にした理由は新しいからというだけです
Recomendが3.xなので新しい方が良いだろうという安易な判断です

conda install matplotlib==3.1.2

こちらが異常に時間がかかり、はいりません
どうやらpythonのバージョンを落とす必要があります
参考リンク

python3.6に変更することでmatplotlibは入りました!

他にも入らないものが、、

  • opendr==0.77
  • deepdish[version='>=0.3']
  • opencv-python
  • ipdb

ダウンロード先チャンネルを追加することで2つは入るようになりました

conda config --append conda-forge

残った2つをどう入れるのか。。
- opendr==0.77
- opencv-python

condaとpipは混在NGですが、pipだと入るみたいなので入れてみました

× conda install opencv-python
○ pip install opencv-python==4.1.2.30
とりあえず今のところ問題なく入ってるのでopendrの解消を目指します

こちらを参考に進めますがダウンロードが長い!
入らない気がするので中断します
こちらを参考にtensorflowを入れます

conda install -c conda-forge tensorflow

We recommend you use --use-feature=2020-resolver to test your packages with the new resolver before it becomes the default.  

と言われることがあるので、その時は言われた通り --use-feature=2020-resolver をつけてあげれば大丈夫です

この後もまだtensorflowをいれるためにエラーが発生します

ERROR: awscli 1.16.144 requires botocore==1.12.134, which is not installed.  
awscli 1.16.144 requires docutils>=0.10, which is not installed.  
awscli 1.16.144 requires s3transfer<0.3.0,>=0.2.0, which is not installed.  
awscli 1.16.144 requires rsa<=3.5.0,>=3.1.2, but you’ll have rsa 4.6 which is incompatible.   

そしてawscliを入れるとbotocore、s3transfer、、とないものが続きます
必要なものはいれていき、requirements.txtに書かれているものは入れてしまいます

名称 バージョン
matplotlib 3.1.2
numpy 1.18.1
scipy 1.4.1
opencv-python 4.1.2.30
pycocotools 2.0.2
trimesh 3.8.5
tqdm 4.48.2

デモを実行

環境が整ったはずなので手順通りにlogsフォルダの作成をしてパッケージを解凍します
解凍したらデモの実行をします

cd src/notebooks
python trimesh_renderer.py

ここからまだまだエラーが続きます
実行した流れの通りに記載します

importエラー

デモ実行後、importエラーが発生しました

Traceback (most recent call last):
File "trimesh_renderer.py", line 8, in
from main.local import LocalConfig
ModuleNotFoundError: No module named 'main'

どうやらlocalのimportに失敗しているのでパスを通してみます

import sys
sys.path.append(os.path.join('..', 'main'))
import local

実行するとエラー内容が変わりました

PermissionError

mkdir(name, mode)
PermissionError: [Errno 13] Permission denied: '/data'

mkdirに失敗しているようです
main/config.py
の中でフォルダ作成されているようです

ROOT_DATA_DIR = os.path.join('/', 'data', 'ssd1', 'russales')

パスの場所を自分で管理できる場所にしたいので
os.path.join の第一引数の場所を適当に自分のわかる場所に変更してしまします

そしてデモを実行

Configurations:

と表示されて情報が表示されていきます、、、
building model...
Downloading data、、、、、
、、、、、、、、、、、、、、
いけそうでしたが エラー発生です

AttributeError

...main/model.py", line 434, in detect
AttributeError: 'Model' object has no attribute 'restore_check'

ソースを確認してみると↓でひっかかっているようです

if self.restore_check is None:
raise RuntimeError('restore did not succeed, pleas check if you set config.LOG_DIR correctly')

checkpoint_manager.latest_checkpointNoneとなっているため、self.restore_checkがNoneになるようです
公式の例文をみるとcheckpoint_manager.latest_checkpointは取得できそうなので調べてみます
ちなみにcheckpoint_manager.checkpointsも[]でした

初め、matplotlib==3.3.1、numpy==1.19.1を入れていたので推奨通りに入れなおしましたがエラーに変化はありませんでした

checkpoint.save()を呼ぶことでself.checkpoint_manager.latest_checkpointが作成され、restoreに成功しましたが、ドキュメントをみるとここでsaveする必要がなさそうに感じますが、restoreできなければ次へ進めないのでsaveすることにしました
とりあえず次のエラーが出たので解消します

ModuleNotFoundError : networkx, pyglet

ModuleNotFoundError: No module named 'networkx'
ModuleNotFoundError: No module named 'pyglet'

conda install によって解消しました

名称 バージョン
networkx 2.5
pyglet 1.5.7
ValueError

ValueError: operands could not be broadcast together with shapes (448,448) (224,224)

for c in range(0, 3):  
        img[y1:y2, x1:x2, c] = (alpha_mesh * image[:, :, c] + alpha_image * img[y1:y2, x1:x2, c])  

imageとimgのサイズが違うのでこのエラーがでているようです
調べてみると引数にあたるresolutionとは解像度なようです
渡しているh, wは画像のサイズのようなのでいい感じに同じサイズにしてくれるというわけではなさそうでした

image_bytes = scene.save_image(resolution=(h, w), background=bg_color, visible=True)

save_imageでなんとかできるのかもしれないのですが、見つからず
opencvでリサイズすることにしました

image2 = cv2.imdecode(np.frombuffer(image_bytes, np.uint8), -1)
image = cv2.resize(image2 , (w, h))

デコード後にリサイズします
ここでやっとデモが動きました!
f:id:filot_nextd2:20200925153902p:plain

ただこれはデモの結果として理想としているものとは違います
このissueはclosedになっていたのでさっそく試してみます

トレーニング

  • データセットをダウンロードしてdatasets_preprocessing/convert_datasets.shのパスを書き換えます
  • data/ssd1/russalesdatasets/xxxtfrecords_with_toes/xxxフォルダを作成しスクリプトを実行します

  • HMR2のREADME.mdにしたがってjupyterをいれます

    conda install jupyter

名称 バージョン
jupyter 1.0.0
jupyter_client 6.1.6
jupyter_console 6.2.0
jupyter_core 4.6.3
  • 実行します

    jupyter nbconvert inspect_dataset.ipynb --to python

[NbConvertApp] Converting notebook inspect_dataset.ipynb to python  
[NbConvertApp] Writing 3368 bytes to inspect_dataset.py  

これでpyファイルが作成されたはずです

python model.py
を実行しましたが、エラーです

six.raise_from(core._status_to_exception(e.code, message), None)
File "", line 3, in raise_from
tensorflow.python.framework.errors_impl.InvalidArgumentError: buffer_size must be greater than zero. [Op:ShuffleDatasetV2]

smplデータセットが無いことが原因なようです
またrussalesの下にtfrecordsフォルダも必要なようです

pklファイルをデータセットの下に置く必要がありますが、このファイルがどれにあたるものなのかがわからず、ここで断念することにしました

keypoint_markerフォルダ内にあるpklファイルを使ってみたところ

key = 'poses' if 'poses' in res.keys() else 'new_poses'  

というところでエラーがでました
確かにpklファイル内部にposesというキーもnew_posesというキーもありません
SMPL公式ページからファイルをダウンロードしても同じようにキーがありませんでした

そこでlsplsp_extをダウンロードしてTFRecordファイルを作成します

こちらは説明通りTFRecordファイルの作成ができます
SMPLのTFRecordもmodel.pyの実行に必要なのですが、どう作れば良いのかわからず
ここでどうやって進めれば良いのかがわからなくなり作業が止まってしまいました
model.pyファイルの途中でsaveが悪影響になっているのではないかとも思いました
時間をかけすぎてしまったのでちょっとここら辺でストップして他の作業をしながら空いた時間で引き続きみていきたいと思います

あとちょっとでできそうなのに。。

pklファイルの中身をterminalでみる

python -m pickle [filename]