OpenPoseをPythonで使う

## 1. はじめに
Windows環境でOpenPoseのインストールから，pythonモジュールを生成するまでの解説記事です．
同じように苦戦する人がちらほらいるようですね<sup>[[1]](http://twinklesmile.blog42.fc2.com/blog-entry-397.html)[[2]](https://www.threads.net/@oda_toshiaki/post/C9VyntnTp2G)</sup>......
OpenPose自体が初学者なので勉強しながら記事を編集しています．

この公式の手順に乗っ取ればおおよそは進みます．（罠あり）

https://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/master/doc/installation/0_index.md#compiling-and-running-openpose-from-source

## 2. 環境
- OpenPose ~~v1.7.0 (Nov, 2020)~~ → 最新のソースコード (Aug, 2024)
- pybind11-2.13.6
- CMake 3.31.5
- CUDA 12.8.0
- cuDNN v8.9.7
- Visual Studio 2022
- python3.7 (OpenPose v1.7.0指定)
- Windows 11 Pro
- CPU: intel core i9-14900KF
- GPU: Geforce RTX4090 & Geforce GT1030

## 3. 手順
### (0) 全体の流れ
![openpose_cmake_system_image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2654082/a1f78bc4-4c8c-12e5-2e2c-79071f73bfab.png)

### (1) CUDAインストール
CUDAはNVIDIAが開発したプログラムでGPUを使うためのツールです．

CMakeでビルドするときにCUDA ToolkitとcnDNNが必要です．
CMakeのConfigureで依存関係やモデルをダウンロードした次の段階でエラーが発生します．

ということで，CUDA Toolkit 12.8.0をダウンロード．
※私は，Versionの意味を勘違いしてWindows 11 PCなのに10を選択しましたが，OpenPoseを動かす分には問題なさそうです．
|項目|選択|
|--|--|
|Operating System|Windows|
Architecture| x84_64|
Version|Windowsのバージョンに合わせる|
Installer Type| 通信環境に応じて好きな方|

https://developer.nvidia.com/cuda-downloads?target_os=Windows&target_arch=x86_64&target_version=11&target_type=exe_local

### (2) cuDNNインストール
cnDNNはNVIDIAが提供する深層学習用のライブラリです．
CUDA 12.8対応のバージョンをダウンロードします．
（cuDNNはなくてもビルドは通ります．OpenPose自体が動かないかも？（要確認））
`cuDNN v8.9.7 for CUDA 12.x > Local Installer for Windows (Zip)`

https://developer.nvidia.com/rdp/cudnn-archive

このサイト通りに環境設定すればおしまいです．
where cudnn64_7.dllの部分は，cnDNNのバージョンが記事より上がっているので
where cudnn64_8.dllに置き換えてください．

https://qiita.com/TrashBoxx/items/2e884998cd1193f73e2f


### (3) OpenPoseダウンロード
~~現時点で最新Releaseのv1.7.0~~GitHubから最新のファイルをインストールします．
~~source.zipをダウンロード~~
プロジェクトのホームの<>Code▼からdownload zipでzipをダウンロード．
openpose-~~1.7.0.zip~~master.zipがダウンロードされると思います．
解凍したらopenpose-~~-1.7.0~~masterフォルダをCドライブ直下に置きます．
pathが長すぎるとVSでのビルド時にMSB3491エラーが発生するので注意してください．

↓ちなみに，これらはCPU/GPUにそれぞれ対応したポータブル版らしいです．
（cmakeフォルダが存在しない）
batファイルを実行してもRetryingの嵐で何もダウンロードできなそう...
2021年までは使えていたみたい[[5]](https://nokixa.hatenablog.com/entry/2023/08/31/071343)
openpose-1.7.0-binaries-win64-cpu-python3.7-flir-3d.zip
openpose-1.7.0-binaries-win64-gpu-python3.7-flir-3d_recommended.zip

https://github.com/CMU-Perceptual-Computing-Lab/openpose/releases/tag/v1.7.0

### (4) pybind11
pybind11をダウンロード＆解凍し，pybind11-2.13.6以下のすべてのファイルを
`C:\openpose-1.7.0\3rdparty\pybind11\`に投入．

https://github.com/pybind/pybind11/releases/tag/v2.13.6

### (5) Visual Studioのダウンロード
ここではVisual Studio 2022で話を進めていきます．
「C++によるデスクトップ開発」パッケージをダウンロードしておきましょう．
ここで一端再起動．

### (6) CMakeダウンロード
現時点での最新版(バージョン3.31.5)のWindows x64 Installerをダウンロード．
cmake-3.31.5-windows-x86_64.smi

https://cmake.org/download/

ここまではうまくいくんですよね......

### (7) CMake実行
:::note warn
CMakeが一筋縄でいかないので注意！
:::
CUIで実行する手法もある<sup>[[5]](https://www.kkaneko.jp/ai/win/openpose_buildout.html)</sup>ようですが，CMake GUIを使った手法で解説します．

**設定入力**
以下のように入力します．
Where is the source code: C:/openpose
Where to build the banaries: C:/openpose/build
※buildフォルダがなかったら新規フォルダとして作成しましょう．

<!--
不要かもしれませんが，
Add Entryで
PYTHON_EXECUTABLE
C:\Users\sryun\AppData\Local\Programs\Python\Python37
-->

ポップアップウィンドウが出るので以下の設定でFinishボタンを押します．
|||
|-|-|
|Secifiy the generator for this project| Visual Studio 17 2022|
|Optional platform for generator(if empty, generator uses: x64)| x64|
|Optional toolset to use (argument to -T)| 選択なし|
|Use default native compilers|checked|

**Configure (1回目)**
その後Configureボタンを押します．

**リストにチェック**
追加で以下の項目にチェックを入れます．※デフォルトでは入っていません．
- DOWNLOAD_BODY_COCO_MODEL
現時点ではダウンロード可能．
- ~~DOWNLOAD_BODY_MPI_MODEL~~
リンクがダウンしているので外した方が無難．別ルートで直接ダウンロードしましょう．
CUIでCMakeを実行するとNetwork Readエラーみたいなのが出ます．timeoutですね．
- BUILD_PYTHON
PythonのAPIを利用したいならチェック．

**Configure(2回目)**
そしてもう一度Configureボタンを押します．
緑のプログレスバーが100%あたりで止まり，
Configureボタンを押してしばらく待っても一向にOpen Projectボタンが押せないのでログをよく見てみると...
```
Downloading body (MPI) model...
NOTE: This process might take several minutes depending on your internet connection.
```
調べてみる限りダウンロード先のページがダウンしているんだとか．
`models\pose\mpi\pose_iter_160000.caffemodel`というファイルが0 KBのままなのでどうやらこれがダウンロードできていないらしい．

**MPIモデルファイルを外部でダウンロード**
外部からダウンロードしようと探したところ，
ファイル名から推測するに旧モデル(?)pose_iter_102000.caffemodelをkaggleにて発見．

https://www.kaggle.com/datasets/changethetuneman/openpose-model

いや，でも本当に探しているのはこれではない...
どうやらlearnopencvというgithubプロジェクトの中にダウンロード先があるとのこと[[4]](
https://miyashinblog.com/openpose/#toc6)．
（OpenPose用の便利ツール集なのでこれはこれで使えそう）
恐らく，有志の方がDropboxに置いてくれているだけなので，そのうちアクセスできなくなる気もしています．（ありがたい限りです）

https://www.dropbox.com/scl/fi/1lvodrc6m9kpsdp2emix0/pose_iter_160000.caffemodel?rlkey=8f60q3sd3qkjnurzcosbxvbt9&e=1&st=r1tfog9o

（ちなみにCOCOモデルファイルもネットに放流してくれている方がいます．）
https://github.com/foss-for-synopsys-dwc-arc-processors/synopsys-caffe-models/blob/master/caffe_models/openpose/caffe_model/pose_iter_440000.caffemodel

ゲットしたpose_iter_160000.caffemodelを`models\pose\mpi`に上書きします．

**Configure(3回目)**
下はConfigureがうまくいき(下から2行目)，Generateもうまくいった(最下行)例です．
gitはなくても問題ありませんでしたが，インストールしていればgit認識されていない問題は解決するかと．
```
Downloading body (MPI) model...
Model already exists.
Downloading face model...
Model already exists.
Downloading hand model...
Model already exists.
Models Downloaded.
'git' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

pybind11 v2.14.0 dev1
Found PythonInterp: C:/Users/sryun/AppData/Local/Microsoft/WindowsApps/python3.exe (found suitable version "3.10.11", minimum required is "3.8")
Found PythonLibs: C:/Program Files/WindowsApps/PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0/libs/python310.lib
Performing Test HAS_MSVC_GL_LTCG
Performing Test HAS_MSVC_GL_LTCG - Success
Configuring done (2.1s)
Generating done (0.3s)
```

**Generate**
Generateボタンを押すと，`C:/openpose/build/OpenPose.sln`が生成されます．

※最初OpenPoseのGitHubのroot直下をcloneしたらうまくいったのにRelease v1.7.0版からダウンロードしたOpenPoseだとGenerateできないエラーが...
3rdparty/windowsの中のzipを展開する必要があるとのこと[[11]](https://github.com/CMU-Perceptual-Computing-Lab/openpose/issues/2227)．でもそのzipの中身が空っぽ...
こちらも必要な3rdpartyのファイル群をまとめてくれている人がいるのでダウンロードできます．([11]の記事周辺参照)
ただ，ダウンロードしてから空になっているファイルを置き換えてみたもののうまくいかず...結局v1.7.0を使うのやめました．

**Projectを開く**
slnファイルをVisual Studio 2022で開きます．
CMakeのOpen Projectボタンから，もしくはbuildフォルダのslnをダブルクリックで開いてください．

**ビルド**
上部メニューの`ビルド > ソリューションのビルド(B)`を実行します．
ビルド成功すれば終了です．

しかし，初回のビルドで先人の記事に記載されているやり方でビルドするとエラー出力＆
Releaseフォルダは生成されたが，中身が空っぽな状態に...

エラー一覧を見る限りある行周辺に問題があるみたい...?
と思ってコードに手を加えてみるも次の構文エラーが出てきて...となんか違う気がして一旦手を止め．

手順を忘れたが，エラーなしでビルド完了したが，ビルド後のexeを実行するとUTF-8以外の文字があると怒られたり...手ごたえはあるようだと試行錯誤をした結果...
(確かにビルド中にコンソール表示が一部文字化けしていた．shift-jis?)
~~どうも，python3.7をビルド対象として明示的に選択していないのが問題？~~
そもそもOpenPoseはPython3.7が対応しているらしいので，公式サイトからPython3.7をインストールしてから再度同じ手順を踏むとーーなんとビルド成功！

これとは別に，他のPCで検証したらすんなりビルド成功しました．
インストール済みのアプリにPython3.7.8が存在し，以下のパスに本体があるとのこと．
`C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\`
こちらのPCではVisual Studio 2019のPython開発パッケージを以前インストールしていたからだと判明．

<font color=#FF00000>Python3.7あたりに解決の糸口があるみたいです．</font>
[試行錯誤中] とりあえず動けるものが入手できたのでOpenPoseのCMake, VS2022とPython3.7がどう関連していたかの解明は一旦保留．

<!--
(試行錯誤中)ビルドのオプションを弄ってみます．
```
cmake -S . -B ./build　　←　オプション選択必要
```
opencv, caffe3rdparty, caffeのダウンロードが始まります．
-- Adding Example ...がずらーっと並んで
-- Downloading BODY_25 model...
-->

### (8) デモexe実行
一端ビルドが成功しているか確認をします．
次のサイト[4][8]を参考にOpenPoseDemo.exeを実行してみてください．
動画ファイルを使わない場合は[4]の内容＋Webカメラがあれば動きます．
動画の連番画像を使った推定については，サンプル素材はこのサイト[[8]](https://nokixa.hatenablog.com/entry/2023/08/31/071343)を参考に素材データをall download (1.6GB)

openposeフォルダにて以下のコマンドを実行．
ちなみに，CPUモードで動かすとボーンの線が表示されませんでした．
--image_dirの指定先のフォルダには連番の写真を格納．
--num_gpu X X=0:CPU mode 1:GPU mode
--num_gpu_start Y グラボ2枚刺さっている場合に切り替えY=0: GPU0 Y=1: GPU1 
--net_resolution "-1x960" 解像度を小さくする　ウィンドウが小さくなるわけではない？
```
.\bin\OpenPoseDemo.exe --image_dir ../../MOT16/train/Mot16-09/img1/ --num_gpu 1 --num_gpu_start 0 --net_resolution "-1x960"
```

一端ここまで．

### (9) Python用ファイルを使う
後日．

## 4. (おまけ) ポータブル版
後日ポータブル版について簡単な説明を入れます．

## 5. おわりに
紆余曲折して面倒な長旅でしたね．
MediaPipeというpythonライブラリもあるみたいなのでpythonでお手軽に骨格推定をするならそちらの方がいいかもしれませんね．

## 参考文献
[1] komix, "OpenPose をソースからビルドしてみる（断念）", FC2 Blog,
※ポータブル版は問題なく使えるのでそっちにシフトするのも手．

http://twinklesmile.blog42.fc2.com/blog-entry-397.html
___

[2] Toshiaki Oda, "こりゃ大変。学生の研究に関係してopenposeを使えるように準備したけどえらく時間がかかった。", Threads, 
※Ubuntuなら比較的構築しやすいのかもしれませんね．

https://www.threads.net/@oda_toshiaki/post/C9VyntnTp2G
___
[3] hacchi_, "【Windows】PythonでOpenposeを動かすための環境構築", Qiita,
※Windowsでの導入の流れは◎．GPUの説明なし＆CMakeがこの通りにはならない．

https://qiita.com/hacchi_/items/0e6f910a9b463438fa81
___
[4] Black_kitten092のブログ, "【導入方法】cmake-guiでopenposeを導入（windows）", Hatena Blog,
※CMakeの説明が良いが，やはりこの通りにならない．ビルド後のデモを実行する手順が◎

https://black-kitten092.hatenablog.com/entry/2020/08/04/173615
___
[5] 金子邦彦研究室, "OpenPose 最新版のインストール，デモの実行（ソースコードを使用）（Windows 上）",
※やはり研究室の記事は質が高いが，CMake周りのエラーなどの説明は省略．

https://www.kkaneko.jp/ai/win/openpose_buildout.html
___
[6] みやしんのプログラミングスキル通信, "Python OpenCVで骨格検出AI OpenPose",
※pose_iter_160000.caffemodelをダウンロードする手法

https://miyashinblog.com/openpose/#toc6
___

[7] , "WindowsでOpenPose (v1.5.1) をPythonあり・CPU版でビルドする", Hatena Blog,
※Python.exeに何か問題があると気づいたのはこのサイト

https://eqseqs.hatenablog.com/entry/2019/11/05/231026
___
[8] 勉強しないとな～blog, "OpenPoseやってみる - 2", Hatena Blog
※ポータブル版のDemoを実行するならこのサイト

https://nokixa.hatenablog.com/entry/2023/08/31/071343
___
[9] mksamba, "【初心者】OpenPose 1.7.0 を使ってみる", Qiita,

https://qiita.com/mksamba/items/eadb290e800215bceecf
___
[10] k-keita(K K), "【Python】骨格推定の概要、様々な骨格推定パターンの実装", Qiita,

https://qiita.com/k-keita/items/4546396fa5b7c242c4df
___
[11] GitHub, "[MSVC] OpenPose failed to download windows dependencies #2227",

https://github.com/CMU-Perceptual-Computing-Lab/openpose/issues/2227
___