ブログ

Linux(WSL) + Anaconda 環境で PIFuHD を CPU_ONLY で実行する方法

前提

  • PIFuHD を Google Colab ではなくローカルPCで試したい
  • ローカルPC の GPU が Intel(NVIDIA でも AMD でもない)
  • PCスペック:Intel Core i7-4770 3.4GHz 4コア、メモリ 24GB、Intel HD Graphics 4600

pifuhd

引用: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 をセットアップし、起動しておく。

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再起動後にディスプレイアプリの起動を忘れがち

-ブログ

© 2022 墾田ええねん! Powered by AFFINGER5