論文を実装しようとしたらOSの違いに苦しんだ話


 色々な体形やポーズの人体を自由に生成する研究というものがありまして、(登録制ですが)Pythonで動くプログラムを配布しております。

 READMEには、

System Requirements:
====================
Operating system: OSX, Linux

 とあるので、Windowsは想定されていません。とはいってもまあ動くやろタハハと思って、結局は私の環境(Windows10 64bit)で動かせたのですが、色々と苦労したという話です。

トラップ1 パスを通す必要がある

 これは個人的にはノートラップでしたが一応。独自のモジュールをローカルに保存しているので、そこにPATHを通す必要があります。READMEに書かれている通り、Macではホームディレクトリにある.bash_profileの末尾に

SMPL_LOCATION=~/smpl
export PYTHONPATH=$PYTHONPATH:$SMPL_LOCATION

 という文字を付け加えます。

 Windowsではコントロール パネル>ユーザー アカウント>ユーザー アカウントと進んだところにある(なんでこんな変な場所に……)「環境変数の変更」で独自に設定する必要があります。

トラップ2 Python系列が2

 これは一瞬で解決できましたが一応トラップ。プログラムの文がPython2系列なので使用する実行するPython環境も2系列にする必要があります。バージョンが違う場合、そもそもprint文の形式が違うし、そういう些末な問題以前にモジュールが揃わなかったりするので、そのまま実行できることは極めて稀です。

SyntaxError: Missing parentheses in call to 'print'. Did you mean print(…)?

 というエラーが出る場合は2系列のプログラムを3系列のPythonで動かしている可能性が高いでしょう。

トラップ3 モジュールの名前が微妙に違う

 READMEにNumpyScipyChumpyOpenCVが必要とあって、当然pipでインストールすることになるのですが、最後のOpenCVはヒットしません。そのまま実行するとcv2というモジュールがないとダメと言われるので、cv2で打ってみてもダメ。結果的には、

pip install opencv-python

 と打つのが正解でした。まあ、界隈では常識なのかもしれないですが……。

トラップ4 EOFError

 今までのは前哨戦みたいなものでしたが、これからが本当のトラップです。無事環境をそろえてさあ実行……と思ったら以下のようなエラーが出ます。

Traceback (most recent call last):
  File "hello_smpl.py", line 48, in <module>
    m = load_model( '../../models/basicModel_f_lbs_10_207_0_v1.0.0.pkl' )
  File "C:\Users\~~~\smpl\smpl_webuser\serialization.py", line 116, in load_model
    dd = ready_arguments(fname_or_dict)
  File "C:\Users\~~~\smpl\smpl_webuser\serialization.py", line 80, in ready_arguments
    dd = pickle.load(open(fname_or_dict))
EOFError

 EOFErrorでググると空のファイルを読み込んだ時に出てくる警告とありますが、ファイルはちゃんと指定できています。またエラーメッセージも症例に出てくるものとは微妙に異なっています。どうやらファイルが空かどうかはあまり関係がなさそうです。これはどういうことかと暫く悩んでおりましたが、その後調査を進めると、

Windowsでは、pickleモジュールでバイナリファイルを扱う時には、文字を入れてそのように指定する必要がある、

 ということらしいです。(参考記事)
 具体的には、同梱されているserialization.py中にある

dd = pickle.load(open(fname_or_dict))

 という文を

dd = pickle.load(open(fname_or_dict,`rb`))

 にする必要があります。これでやっと実行できます。少なくとも私の環境では。

 後日MacBookProで検証したところ、MacOSXではこのような問題は起こりませんでした。OSの違い……。

解けなかったトラップ opendr

 別のサンプルプログラムを実行しようとするとopendrというモジュールがないと言われます。じゃあpipするぜ……と思ったけれどもエラー。エラーメッセージを読むとC++のコンパイラを入れてねと言われたので入れてリトライ。しかし、

    LINK : warning LNK4044: オプション '/lstdc++' は無効です無視されます
    LINK : fatal error LNK1181: 入力ファイル 'OSMesa.lib' を開けません
    error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\link.exe' failed with exit status 1181

 検索すると似たような症例はあるのですが、問題となっているファイル(OSMesa.lib)が違うので流用はできなさそう。そしてこのOSMesaというものを調べるとLinuxには搭載されているライブラリであるということがわかる。

 MacBookProでやってみたところノーエラー。3D上のビューワーを表示するためのモジュールだったようです。しかしここでもOSの違い……。

思ったこと

 もうバージョンやOSの違いはたくさんだ……。