前提
- PIFuHD を Google Colab ではなくローカルPCで試したい
- ローカルPC の GPU が Intel(NVIDIA でも AMD でもない)
- PCスペック:Intel Core i7-4770 3.4GHz 4コア、メモリ 24GB、Intel HD Graphics 4600
引用:https://github.com/facebookresearch/pifuhd
結論
- PIFuHD の demo.sh は動作しなかった(obj が生成されない)
- batch_openpose.py → simple_test → render_turntable は動作した
手順
エラーをどのように対処したのか記録しておきたいので、素直にやってハマった順に解説していく。
PIFuHD の手順通りにやってみる
Anaconda が入ってない方は以下を参照。
WSLの場合:WSL2 に Anaconda経由で JupyterLab環境を構築する手順
Linuxの場合:エックスサーバー(xserver.ne.jp)に Anaconda, Flask を入れる手順
# PIFuHD なるAnaconda仮想環境を作成 conda create -n PIFuHD python=3.8 # 仮想環境に入る conda activate PIFuHD
PIFuHD の通り、以下を実行。
# home直下に PIFuHDディレクトリを用意 mkdir -p ~/PIFuHD && cd ~/PIFuHD # プロジェクトを取得 git clone https://github.com/facebookresearch/pifuhd.git # 初期化とデモ実行 pip install -r requirements.txt sh ./scripts/download_trained_model.sh sh ./scripts/demo.sh
すると、以下のエラーが出力された。
Compilation failure for vertex shader: b'0:1(10): error: GLSL 3.30 is not supported. Supported versions are: 1.10, 1.20, 1.30, 1.40, 1.00 ES, and 3.00 ES
GL_2_0.py", line 430, in glGetUniformLocation
OpenGL.error.GLError: GLError
OpenGL 2.0 が使用されていることが原因っぽい。
https://issueantenna.com/repo/facebookresearch/pifuhd/issues/106 にあるように、MESA_GL_VERSION_OVERRIDE で OpenGL バージョンを指定する。
export MESA_GL_VERSION_OVERRIDE=3.3
すると、次は以下のエラーが出力された。
freeglut (foo): failed to open display
Linux でのGUIアプリのディスプレイ設定が出来ていないようなので、VcXsrv をセットアップし、起動しておく。
ファイアウォールのパブリック許可については以下を参考に。
Windows10 – アプリにファイアウォール経由の通信を許可/不許可
VcXsrv が表示されない場合は、「別アプリの許可」から追加。
再度、以下を実行しても result_test_512.obj は生成されない。
sh ./scripts/demo.sh
PIFuHD の Testing を見ると、
python apps/batch_openpose.py -d {openpose_root_path} -i {path_of_images} -o {path_of_images}
とあり、OpenPose のインストールが必要な模様。
OpenPose をインストールするには cmake のインストールが必要な模様。
cmake をインストール
# home直下に cmake-3.21.5.tar.gz をダウンロード cd ~ wget https://github.com/Kitware/CMake/releases/tag/v3.21.5/cmake-3.21.5.tar.gz # 解凍 tar xzvf cmake-3.21.5.tar.gz # ビルド設定 cd cmake-3.21.5 ./configure --qt-gui ./bootstrap # ビルド make -j4 # インストール sudo make install
OpenPose をインストール
# home直下にoponposeディレクトリを用意 mkdir -p ~/openpose && cd ~/openpose # openposeソースコードをgitから取得 git clone https://github.com/CMU-Perceptual-Computing-Lab/openpose.git # ビルド準備 cd ~/openpose sudo bash ./scripts/ubuntu/install_deps.sh mkdir openpose/build cd openpose/build cmake -D GPU_MODE=CPU_ONLY WITH_FLIR_CAMERA=1 WITH_OPENCV_WITH_OPENGL=1 ..
上記の cmake で以下のエラーが出力された。
Spinnaker not found. Either turn off the `WITH_FLIR_CAMERA` option or specify the path to the Spinnaker includes and libs.
FLIR_CAMERA を使用するには Spinnaker なるライブラリが必要とのこと。
Spinnaker SDK の「今すぐダウンロード」-「Linux」-「自分のUbuntu」-「自分のアーキテクチャ」で tar.gz を取得。
(例:bash で arch すると x86-64 or amd64 の場合は、AMD の spinnaker-2.6.0.156-Ubuntu20.04-amd64-pkg.tar.gz)
tar.gz をhome直下に手動コピーします。
cd ~ tar -zxvf spinnaker-2.6.0.156-Ubuntu20.04-amd64-pkg.tar.gz
tar.gz を解凍した中にある README を見ながら、「2. SPINNAKER INSTALLATION」までの手順を行う。
これで cmake 成功するので、make して install まで行う。
cmake -D GPU_MODE=CPU_ONLY \ -D WITH_FLIR_CAMERA=1 \ -D WITH_OPENCV_WITH_OPENGL=1 .. make -j4 sudo make install
~/openpose/build/examples/openpose/openpose.bin に実体が生成され、OpenPose インストール完了。
~/PIFuHD/sample_images の test.png を ~/PIFuHD/test にコピーして、テストしてみる。
cd ~/PIFuHD python apps/batch_openpose.py -d ~/openpose -i ~/PIFuHD/test -o ~/PIFuHD/test
batch_openpose.py を実行すると、以下のエラー。
Error:
OpenCV(4.2.0) ../modules/highgui/src/window_gtk.cpp:1065: error: (-218:No OpenGL support) Library was built without OpenGL support in function 'cvNamedWindow'
どうやら、OpenCV を OpenGL support にしてビルドする必要がある模様。
OpenCV をインストール
Ubuntu 20.04 LTSにOpenCV 4.2.0をインストールする の手順で「opencv_version
と打って,4.2.0
と表示されたら,成功!」まで行う。
ただし、Anaconda を使用しているので virtualenv での仮想環境まわりの設定は行わない。
bashコマンドでいうと、「sudo pip3 install virtualenv virtualenvwrapper」から「mkvirtualenv cv -p python3」は行わない。
cmake 時のコマンドは以下。
ちなみに、手順紹介ページでは PYTHON_EXECUTABLE だが、PYTHON3_EXECUTABLE が正しい。
cd ~/opencv/opencv-4.2.0 mkdir build && cd build # OPENCV_PYTHON3_INSTALL_PATH, OPENCV_EXTRA_MODULES_PATH, PYTHON3_EXECUTABLE は自分の環境に合わせる cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_C_COMPILER=/usr/bin/gcc \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D INSTALL_PYTHON_EXAMPLES=ON \ -D INSTALL_C_EXAMPLES=OFF \ -D WITH_TBB=ON \ -D WITH_CUDA=OFF \ -D BUILD_opencv_cudacodec=OFF \ -D ENABLE_FAST_MATH=1 \ -D CUDA_FAST_MATH=1 \ -D WITH_CUBLAS=1 \ -D WITH_V4L=ON \ -D WITH_QT=OFF \ -D WITH_OPENGL=ON \ -D WITH_GSTREAMER=ON \ -D OPENCV_GENERATE_PKGCONFIG=ON \ -D OPENCV_PC_FILE_NAME=opencv.pc \ -D OPENCV_ENABLE_NONFREE=ON \ -D OPENCV_PYTHON3_INSTALL_PATH=~/anaconda3/envs/PIFuHD/lib/python3.8/site-packages \ -D OPENCV_EXTRA_MODULES_PATH=~/opencv/opencv_contrib-4.2.0/modules \ -D PYTHON3_EXECUTABLE=~/anaconda3/envs/PIFuHD/bin/python \ -D BUILD_EXAMPLES=ON ..
これで、OpenCV のインストール完了。
ただ、PIFuHD に戻り、batch_openpose.py を実行すると依然として No OpenGL support エラーになる。
OpenCV の cmake 時の出力にて、OpenGL support: NO となっているが原因ぽい。
自分のOpenGLを見てみると、usr/include/x86_64-linux-gnu/qt5 となっている。
OpenCV の cmake のオプションにて WITH_QT=ON にした。
cd ~/opencv/opencv-4.2.0 # OPENCV_PYTHON3_INSTALL_PATH, OPENCV_EXTRA_MODULES_PATH, PYTHON3_EXECUTABLE は自分の環境に合わせる cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_C_COMPILER=/usr/bin/gcc \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D INSTALL_PYTHON_EXAMPLES=ON \ -D INSTALL_C_EXAMPLES=OFF \ -D WITH_TBB=ON \ -D WITH_CUDA=OFF \ -D BUILD_opencv_cudacodec=OFF \ -D ENABLE_FAST_MATH=1 \ -D CUDA_FAST_MATH=1 \ -D WITH_CUBLAS=1 \ -D WITH_V4L=ON \ -D WITH_QT=ON \ -D WITH_OPENGL=ON \ -D WITH_GSTREAMER=ON \ -D OPENCV_GENERATE_PKGCONFIG=ON \ -D OPENCV_PC_FILE_NAME=opencv.pc \ -D OPENCV_ENABLE_NONFREE=ON \ -D OPENCV_PYTHON3_INSTALL_PATH=~/anaconda3/envs/PIFuHD/lib/python3.8/site-packages \ -D OPENCV_EXTRA_MODULES_PATH=~/opencv/opencv_contrib-4.2.0/modules \ -D PYTHON3_EXECUTABLE=~/anaconda3/envs/PIFuHD/bin/python \ -D BUILD_EXAMPLES=ON ..
cmake出力は以下のようになっており、OpenGL が認識されていそう。
-- GUI: -- QT: YES (ver 5.9.7) -- QT OpenGL support: YES (Qt5::OpenGL 5.9.7) -- GTK+: NO -- OpenGL support: YES (/usr/lib/x86_64-linux-gnu/libGL.so /usr/lib/x86_64-linux-gnu/libGLU.so) -- VTK support: NO
ただし、make -j4 すると以下エラー。
/usr/bin/ld: ../../lib/libopencv_imgcodecs.so.4.2.0: undefined reference to `TIFFReadRGBAStrip@LIBTIFF_4.0' /usr/bin/ld: ../../lib/libopencv_imgcodecs.so.4.2.0: undefined reference to `TIFFReadDirectory@LIBTIFF_4.0' /usr/bin/ld: ../../lib/libopencv_imgcodecs.so.4.2.0: undefined reference to `TIFFWriteEncodedStrip@LIBTIFF_4.0' /usr/bin/ld: ../../lib/libopencv_imgcodecs.so.4.2.0: undefined reference to `TIFFIsTiled@LIBTIFF_4.0' /usr/bin/ld: ../../lib/libopencv_imgcodecs.so.4.2.0: undefined reference to `TIFFWriteScanline@LIBTIFF_4.0' /usr/bin/ld: ../../lib/libopencv_imgcodecs.so.4.2.0: undefined reference to `TIFFGetField@LIBTIFF_4.0' /usr/bin/ld: ../../lib/libopencv_imgcodecs.so.4.2.0: undefined reference to `TIFFScanlineSize@LIBTIFF_4.0' /usr/bin/ld: ../../lib/libopencv_imgcodecs.so.4.2.0: undefined reference to `TIFFWriteDirectory@LIBTIFF_4.0' /usr/bin/ld: ../../lib/libopencv_imgcodecs.so.4.2.0: undefined reference to `TIFFReadEncodedTile@LIBTIFF_4.0' /usr/bin/ld: ../../lib/libopencv_imgcodecs.so.4.2.0: undefined reference to `TIFFReadRGBATile@LIBTIFF_4.0' /usr/bin/ld: ../../lib/libopencv_imgcodecs.so.4.2.0: undefined reference to `TIFFClose@LIBTIFF_4.0' /usr/bin/ld: ../../lib/libopencv_imgcodecs.so.4.2.0: undefined reference to `TIFFClientOpen@LIBTIFF_4.0' /usr/bin/ld: ../../lib/libopencv_imgcodecs.so.4.2.0: undefined reference to `TIFFRGBAImageOK@LIBTIFF_4.0' /usr/bin/ld: ../../lib/libopencv_imgcodecs.so.4.2.0: undefined reference to `TIFFOpen@LIBTIFF_4.0' /usr/bin/ld: ../../lib/libopencv_imgcodecs.so.4.2.0: undefined reference to `TIFFReadEncodedStrip@LIBTIFF_4.0' /usr/bin/ld: ../../lib/libopencv_imgcodecs.so.4.2.0: undefined reference to `TIFFSetField@LIBTIFF_4.0' /usr/bin/ld: ../../lib/libopencv_imgcodecs.so.4.2.0: undefined reference to `TIFFSetWarningHandler@LIBTIFF_4.0' /usr/bin/ld: ../../lib/libopencv_imgcodecs.so.4.2.0: undefined reference to `TIFFSetErrorHandler@LIBTIFF_4.0' collect2: error: ld returned 1 exit status make[2]: *** [apps/annotation/CMakeFiles/opencv_annotation.dir/build.make:106: bin/opencv_annotation] Error 1 make[1]: *** [CMakeFiles/Makefile2:16327: apps/annotation/CMakeFiles/opencv_annotation.dir/all] Error 2 make[1]: *** Waiting for unfinished jobs....
調べると、conda uninstall libtiff、anacondaパスを削除、という情報がある。
conda uninstall libtiff を実行し、bash_profile, bashrc の anaconda 関連をコメントアウトし、WSLターミナルを再起動。
anaconda 仮想環境に入っていない状態(conda deactivate の状態)で、素の python で OpenCVインストールを試みる。
また、setup_vars_opencv4.sh で自前のOpenCVを使うように設定。
cd ~/opencv/opencv-4.2.0 source build/CMakeFiles/install/setup_vars_opencv4.sh # OPENCV_PYTHON3_INSTALL_PATH, PYTHON3_EXECUTABLE は素のPyehonを指定 # 警告が出ていたので WITH_CUBLAS=0 にする # 念のため OpenGL_GL_PREFERENCE=LEGACY を設定 CC=/usr/bin/gcc-9 CXX=/usr/bin/g++-9 cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_C_COMPILER=/usr/bin/gcc \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D INSTALL_PYTHON_EXAMPLES=ON \ -D INSTALL_C_EXAMPLES=OFF \ -D WITH_TBB=ON \ -D WITH_CUDA=OFF \ -D BUILD_opencv_cudacodec=OFF \ -D ENABLE_FAST_MATH=1 \ -D CUDA_FAST_MATH=1 \ -D WITH_CUBLAS=0 \ -D WITH_V4L=ON \ -D WITH_QT=ON \ -D WITH_OPENGL=ON \ -D WITH_GSTREAMER=ON \ -D OPENCV_GENERATE_PKGCONFIG=ON \ -D OPENCV_PC_FILE_NAME=opencv.pc \ -D OPENCV_ENABLE_NONFREE=ON \ -D OPENCV_PYTHON3_INSTALL_PATH=/usr/lib/python3/dist-packages \ -D OPENCV_EXTRA_MODULES_PATH=~/opencv/opencv_contrib-4.2.0/modules \ -D PYTHON3_EXECUTABLE=/usr/bin/python3 \ -D BUILD_EXAMPLES=ON \ -D OpenGL_GL_PREFERENCE=LEGACY \ -D OpenCV_DIR=~/opencv/opencv-4.2.0/build ..
cmake は成功したので make -j4 すると undefined reference to `g_option_group_unref' のエラーになった。
~\anaconda3\lib の libgio-2.0.so, libgio-2.0.so.0, libgio-2.0.so.0.6901.0 を _libgio-2.0.so, _libgio-2.0.so.0, _libgio-2.0.so.0.6901.0 にリネームし、
usr/lib/x86_64-linux-gnu/ 以下の libgio が使用されるように変更した。
make成功したので、sudo make install で今度こそ OpenCVインストールに成功。
ただ、PIFuHD に戻り、batch_openpose.py を実行すると依然として No OpenGL support エラーになる。
opencvをビルドしたので、openposeをビルドし直す必要がありそう。
OpenPose をリビルド
自分でビルドした OpenCV を OpenPose が参照するように、OpenPose をビルドする。
~\openpose\CMakeLists.txt の -DOpenCV_DIR=${OpenCV_DIR} がコメントアウトされているので有効化し、以下のように cmake。
cd ~/openpose cmake -D GPU_MODE=CPU_ONLY \ -D WITH_FLIR_CAMERA=1 \ -D WITH_OPENCV_WITH_OPENGL=1 \ -D OpenCV_DIR=~/opencv/opencv-4.2.0/build/CMakeFiles/Export/lib/cmake/opencv4 .. make -j4 sudo make install
openpose.bin の更新日時も変わっているので、自前の OpenCV を参照する OpenPose をインストール完了。
PIFuHD の Testing を再度実行する
cd ~/PIFuHD python apps/batch_openpose.py -d ~/openpose -i ~/PIFuHD/test -o ~/PIFuHD/test
bath_openpose.py すると、以下エラー。
Error:
You need to compile OpenPose with CUDA support in order to use GPU resize.
上記の原因は、batch_openpose.py 内の --render_pose 2 --face --face_render 2 --hand --hand_render 2 が GPUモード の設定になっているため。
以下のように編集すると CPUモードで実行できる。
cmd = "cd {0}; ./build/examples/openpose/openpose.bin --image_dir {1} --write_json {2} --render_pose 0 --face --face_render 1 --hand --hand_render 1".format(op_dir, input_path, out_json_path)
batch_openpose.py を実行すると、ようやく成功し、~/PIFuHD/test以下に test_keypoints.json が出力された。
次に、simple_test を実行する。
python -m apps.simple_test --input_path ~/PIFuHD/test --out_path ~/PIFuHD/test
すると、error cannot marching cubes のエラーが出る。
~\PIFuHD\lib\mesh_util.py の marching_cubes_lewiner を marching_cubes に変更する。
simple_test を再度実行すると、~/PIFuHD/test/pifuhd_final/recon以下に result_test_512.obj が出力された。
次に、render_turntable を実行する。
python -m apps.render_turntable -f ~/PIFuHD/test/pifuhd_final/recon -ww 512 -hh 512
すると、以下のエラー。
Linker failure: b"error: vertex shader lacks `main'\n" Traceback (most recent call last): File "/home/ユーザー名/anaconda3/envs/PIFuHD/lib/python3.8/runpy.py", line 194, in _run_module_as_main return _run_code(code, main_globals, None, File "/home/ユーザー名/anaconda3/envs/PIFuHD/lib/python3.8/runpy.py", line 87, in _run_code exec(code, run_globals) File "/home/ユーザー名/Project/PIFuHD/apps/render_turntable.py", line 69, in <module> renderer = ColorRender(width=args.width, height=args.height) File "/home/ユーザー名/Project/PIFuHD/lib/render/gl/color_render.py", line 34, in __init__ CamRender.__init__(self, width, height, name, program_files=program_files) File "/home/ユーザー名/Project/PIFuHD/lib/render/gl/cam_render.py", line 32, in __init__ Render.__init__(self, width, height, name, program_files, color_size, ms_rate) File "/home/ユーザー名/Project/PIFuHD/lib/render/gl/render.py", line 72, in __init__ self.model_mat_unif = glGetUniformLocation(self.program, 'ModelMat') File "/home/ユーザー名/anaconda3/envs/PIFuHD/lib/python3.8/site-packages/OpenGL/latebind.py", line 63, in __call__ return self.wrapperFunction( self.baseFunction, *args, **named ) File "/home/ユーザー名/anaconda3/envs/PIFuHD/lib/python3.8/site-packages/OpenGL/GL/VERSION/GL_2_0.py", line 430, in glGetUniformLocation return baseOperation( program, name ) File "/home/ユーザー名/anaconda3/envs/PIFuHD/lib/python3.8/site-packages/OpenGL/platform/baseplatform.py", line 415, in __call__ return self( *args, **named ) File "/home/ユーザー名/anaconda3/envs/PIFuHD/lib/python3.8/site-packages/OpenGL/error.py", line 230, in glCheckError raise self._errorClass( OpenGL.error.GLError: GLError( err = 1282, description = b'invalid operation', baseOperation = glGetUniformLocation, cArguments = (3, b'ModelMat\x00'), result = -1 )
ターミナルを再起動したので、環境変数 MESA_GL_VERSION_OVERRIDE が切れていたことが原因。
~/PIFuHD/apps/render_turntable.py の import os の直後に os.environ['MESA_GL_VERSION_OVERRIDE'] = '3.3' を追加。
render_turntable を実行すると、成功して XServer に3Dモデルが描画されたが、ffmpeg: not found のエラーで動画ファイルは生成されず。
以下のように、 ffmpeg をインストールする。
sudo apt-get update sudo apt-get -y install ffmpeg
render_turntable を実行すると、ようやく ~/PIFuHD/test/pifuhd_final/recon/result_test_512.mp4 が出力された。
めでたしめでたし。
備考
- 「Could not connect to display」というエラーが出る場合は、VcXsrv などのディスプレイアプリを起動すれば解決
- PC再起動後にディスプレイアプリの起動を忘れがち