機械学習によるポーズ推定ツール・MocapNETをWSLで試してみる

高価なモーションキャプチャーツールを使うことなく、映像や写真に写っている人体から、その3Dポーズを推定するプロジェクトがGithubにはいくつかあります。今回は、最近メジャーアップデートしたMocapNETをWindowsから活用するための環境構築の手順を紹介します。

まずはWindows10でWindows Subsystem for Linuxを有効にし、アプリストアよりWSL向けUbuntuを導入し、Ubuntuを起動したら、以下のコマンドでシステムやビルドのためのツールをインストールします。
sudo update sudo upgrade sudo apt install python3-pip python3 -m pip install --user netron sudo apt-get install build-essential cmake libopencv-dev libjpeg-dev libpng-dev libglew-dev libpthread-stubs0-dev
続いて、"git clone"でプロジェクトファイル一式をダウンロードし、その中に含まれているシェルスクリプトより、MocapNETを動作させるのに必要な外部ツールの導入をはじめとした初期化を行います。
cd MocapNET ./initialize.sh
初期化が滞りなく完了したら、ソースのビルドを実行します。
cd build cmake .. make cd ..
これで環境構築は完了です。WSLは基本的にCUIベースでウィンドウを表示させることができないので、データ生成を実行するときには「--novisualization」のオプションが必須です。
./MocapNET2LiveWebcamDemo --from video.mp4 --novisualization


OpenPoseとの連携

このプロジェクトには、OpenPoseで生成した2次元データをもとに3次元データを推定するツールが提供されており、プロジェクトチームによると、よりモデル精度が上がるそうです。

OpenPoseはコンパイル済みのWindows実行ファイルを直接提供しており、また、CUDAも直接扱えるので、Windows版を使ってみることにします。

OpenPoseのGithubリリースページへ行き、binariesと表記されたzipファイルをダウンロード、展開します。
Windowsのコマンドプロンプトを起動し、学習モデルデータをダウンロードします。容量は約800MBです。
cd openpose cd models getModels.bat
それでは、映像ファイルからJSONデータを書き出させてみましょう。"video"パラメーターには対象の映像ファイルのパス、"net_resolution"にはプログラムに渡す際の画像の解像度(16の倍数)を指定します。解像度が高いと精度が上がりますが、数値が高すぎるとメモリーエラーの原因となります。生成されたJSONの出力先フォルダーは、"write_json"で指定します。
bin\OpenPoseDemo.exe --video examples\media\video.mp4 -number_people_max 1 -net_resolution 640x480 --write_json ./res_json/
このフォルダー(ここでは"res_json")をWSL上のMocapNETフォルダー内にコピーし、JSONファイルを単一のCSVファイルにまとめるツールを実行します。生成フォルダーには「video_000000000001_keypoints.json」のような連番ファイルが保存されているのですが、このパスの法則をツールに渡さなくてはいけません。ここでの法則は「連番の桁数(seriallength)」と「連番の前にある文字列(label)」を指し、ファイル名に合わせて逐一値を変更する必要がある点に注意しましょう(元となる映像ファイルのファイル名を同じにしておけば、パラメーターを変更する手間が省けます)。結合されたファイルの出力先は"-o"のパラメーターとして指定します。
./convertOpenPoseJSONToCSV --from ./res_json --label video_ --seriallength 12 --size 640 480 -o .
最後にCSVデータを基にしたBHVファイルを出力します。delayオプションはフレーム同士の間隔を意味します。前述同様、GUIは使えないため、"novisualization"のオプションを追加しています。
./MocapNET2CSV --from 2dJoints_v1.4.csv --novisualization --delay 30
いろいろ設定を変えて出力してみましたが、OpenPoseを介してもあまり結果は変わりませんでした。処理時間は早いものの、個人的は「hmr」によるポーズ推定のほうが精度が高い気がしました。
2020/11/17