OpenPoseはCVPR2017で発表された(その前にArXivにはありましたが)、深層学習を用いて姿勢推定を行うアルゴリズムで、最近注目がかなり高まっている姿勢推定手法です。
論文は「Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields」というタイトルで、カーネギーメロン大学から出ています。
ただ、今回は論文の専門的な内容を掘り下げようというのが主題ではなく、手っ取り早く使って、試してみるというところを目指します。
Windows、Linuxのどちらでもできるはずですが、今回はWindows10環境で実施します。
本記事の目標としては、
画像や動画にOpenPoseを適用して、実際に骨格抽出した画像(映像)を出力する
ことにしました。
目次
今回の環境
・OS : Windows10(64bit)
・GPU: GeForce GTX 950
・Visual Studio Community 2015 (インストール済)
・CUDA 9.1
手順
(1) OpenPoseのビルド済ファイル一式をダウンロード
細かいところを変更したり、研究的にもっと掘り下げたいとかではなく、まずはOpenPoseを使ってみたいということであれば、ビルド済のDemoバージョンを使うのが楽です。
以下からダウンロードが可能です。
外部サイト(Github):Releases · CMU-Perceptual-Computing-Lab/openpose
CPUバージョンとGPUバージョンがありますが、GPUバージョンの方を落としてみました。
GPUバージョンを使う場合はCUDAの使えるGPUが必要なはずなので、条件を満たしているかに応じてCPU版とGPU版を選択してください。
基本的にはGPU版の方が速く計算ができると思います。
(2) ダウンロードしたファイルを適当なフォルダに解凍
ダウンロードしたファイルを適当な場所に解凍してください。
私はDドライブにOpenPoseというフォルダを作り、そこにダウンロードしました。
(3) モデルの入手
認識に使うCaffeモデルを入手する必要があります。
解凍したフォルダのmodelsファイルを開き、その中にある「getModels.bat」を叩くことで自動でモデルがダウンロードされます。
(4) CUDAとcuDNNのインストール
ビルド済のバイナリを使う場合に必要なのかどうかわかりませんが、一応CUDAとcuDNNが設定されている方がいいような気がします(自分は必須だと思っていたのですが、現PCはcuDNNなしのはずなんですが、一応動いている)。
一応公式見たら
- Highly recommended: cuDNN.
Highly recommendedらしいのでなくても動くのかも。
CUDAとcuDNNをゼロから入れてみたい方は以下をご参考に。
過去記事①:CUDA 8.0の導入と環境構築(Windows 10) | 技術的特異点
過去記事②:Tensorflow導入に向けたcuDNN環境構築(Windows 10) | 技術的特異点
(5) 「OpenPoseDemo.exe」を実行
最後はbinフォルダの中にある「OpenPoseDemo.exe」を実行すれば、OpenPoseの実行ができちゃいますが、面倒なのでバッチを書いてみました。
サンプル動画・画像は既にexamplesフォルダの中に入っているので、それを使っちゃいましょう。
以下のように、「openpose.bat」を書いてみました。
最初に実行ファイル名を指定し、その後に「–video」オプションを指定し、その後にOpenPoseを掛けたい動画を指定します。
.\bin\OpenPoseDemo.exe --video .\examples\media\video.avi pause
このバッチファイルを叩いてみます。
エラーしました。 「Check failed: error == cudaSuccess (2 vs. 0) out of memory」と出たのでメモリ不足っぽい?
GTX950なんで別に驚きもないですが、OpenPoseの1.3.0まではこれで動いていた気がしたんだけどな……ってことで、取りあえず今回は動かすことが目的なので、動かす方法を模索してみました。
(-) 「Check failed: error == cudaSuccess (2 vs. 0) out of memory」が出た場合
特に上記のエラーが出ず、正常に動画が再生されるようであれば読み飛ばしてください。
バッチファイルを、
.\bin\OpenPoseDemo.exe --net_resolution "320x240" --video .\examples\media\video.avi
pause
と変更したところ、動くようにはなりました。
ただ、これは解像度を落としているので、精度が低下すると思います。極力ならば使いたくない手段ではありますね。
もし、エラーが出るようであれば、この「–net_resolution」の値を弄って、解像度を調節してメモリ不足に引っかからないようにする必要がありそうです。
以下のように、人が認識されていることがわかりますが、後ろにいる人とかはあまり認識されていませんね。
(6) 結果の画像や関節位置情報をファイルに出力してみる
では、このOpenPoseDemoのいくつかの使い方を紹介しましょう。
(a) 動画や画像のファイル名を指定してOpenPoseを使う
.\bin\OpenPoseDemo.exe --video .\examples\media\video.avi pause
「–video」オプションでファイル名を指定してやるだけです。
動画でも画像でも「–video」オプションで使用可能です。これで、自分が用意した動画や画像のファイル名を指定すれば、それに対してOpenPose可能になります。
(b) 結果の画像を保存する
「–write_images」オプションを使えばOKです。
.\bin\OpenPoseDemo.exe --video .\examples\media\video.avi --write_images .\output_folder\ pause
–write_imagesの後に、画像を保存したいフォルダの名前を指定してください。動画の場合は全てのフレームの結果が保存されます。
(c) フォルダ内の全ての画像にOpenPoseする
大量のファイルにOpenPoseを掛けたい場合です。
「–video」の代わりに「–image_dir」をオプションで指定します。
.\bin\OpenPoseDemo.exe --image_dir .\examples\media\ --write_images .\output_folder\ pause
(d) 取得した骨格位置などのデータを数値として出力する
「–write_keypoint」や「–write_json」で認識結果を数値データとして吐き出すことができます。他のアプリケーションで使いたい場合などには有効な手段でしょう。
★ YML形式で出力
.\bin\OpenPoseDemo.exe --video .\examples\media\video.avi --write_keypoint .\output_keypoint\ pause
★ JSON形式で出力
.\bin\OpenPoseDemo.exe --video .\examples\media\video.avi --write_json .\output_keypoint\ pause
他にもいろいろなオプションがあるはずなので、調べてみてください。取りあえず、使うことが多そうなものを紹介しました。
まとめ
今回はOpenPoseを使って動画や画像に認識を施したり、認識結果を数値データとして吐き出したりするところをやってみました。
上手く使いこなすことで、強力な武器になるかもしれません。
いずれはビルドやソースコードリーディングなどもやってみたいですね。