3D PoseEstimation (Multi-Person) by OpenVINO + Corei7 CPU only [14 FPS-18 FPS]

<a href="https://github.com/PINTO0309/OpenVINO-bin"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/PINTO0309/OpenVINO-bin.png" width="460px"></a>
# １．Introduction
OpenVINO を使用して **`3D PoseEstimation`** を **`CPU only`** で実行します。 プログラムも何も作らずにビルドだけ通してすぐに味見することができます。 一応、 複数人の同時検出が可能なモデルです。 全ての作業は 10分〜15分ほどで実施可能です。 注意点は、最新の **`OpenVINO 2020 R1`** を導入しておくこと、ぐらいです。 日本国内からであれば、上のニコチャンマークの先の私のリポジトリ経由でインストーラを高速にダウンロード可能です。 ~~ちなみに皆さんはよくご存知かと思いますが、 **`GPU`** を使用したほうが遅いです。 シングルパーソン＋動画撮影なし、の条件で11FPSほどしか出ません。~~　GPU + FP16指定で 18FPS でした。 あまりメリットは無いですね。

# ２．Environment
- Ubuntu 18.04 x86_64, CPU only
- **[OpenVINO 2020 R1](https://github.com/PINTO0309/OpenVINO-bin.git)**
- OpenCV 4.x
- Numpy
- Python 3.6

# ３．Procedure
端的に言うと、トレーニング済みモデルをダウンロードして、一部の部品を自力ビルドして実行するだけ、です。

```console:3D骨格検出モデルのダウンロード
$ cd ~
$ mkdir git && cd git
$ git clone --depth 1 https://github.com/opencv/open_model_zoo.git
$ cd open_model_zoo/tools/downloader
$ ./downloader.py --name human-pose-estimation-3d-0001
```

```console:ダウンロード結果
################|| Downloading models ||################

========== Downloading ${HOME}/git/open_model_zoo/tools/downloader/public/human-pose-estimation-3d-0001/human-pose-estimation-3d-0001.tar.gz
... 100%, 17990 KB, 12013 KB/s, 1 seconds passed

################|| Post-processing ||################

========== Unpacking ${HOME}/git/open_model_zoo/tools/downloader/public/human-pose-estimation-3d-0001/human-pose-estimation-3d-0001.tar.gz
```
![Screenshot 2020-03-21 10:44:56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194769/32d7b761-e162-2616-68a3-e2840d122aec.png)

ダウンロードされてくるモデルは **`Pytorch`** のモデル **`.pth`** ですので、 **`OpenVINO`** の **`IRモデル`** へ変換します。 といってもコマンド一行ではい終わり、という感じです。 苦戦する部分は何もありません。

```console:Pytorch_to_IRmodel
$ ./converter.py --name human-pose-estimation-3d-0001
```

```console:コンバート結果
========= Converting human-pose-estimation-3d-0001 to IR (FP16)
Conversion command: /usr/bin/python3 -- /opt/intel/openvino_2020.1.023/deployment_tools/model_optimizer/mo.py --framework=onnx --data_type=FP16 --output_dir=${HOME}/git/open_model_zoo/tools/downloader/public/human-pose-estimation-3d-0001/FP16 --model_name=human-pose-estimation-3d-0001 --input=data '--mean_values=data[128.0,128.0,128.0]' '--scale_values=data[255.0,255.0,255.0]' --output=features,heatmaps,pafs --input_model=${HOME}/git/open_model_zoo/tools/downloader/public/human-pose-estimation-3d-0001/human-pose-estimation-3d-0001.onnx

Model Optimizer arguments:
Common parameters:
	- Path to the Input Model: 	${HOME}/git/open_model_zoo/tools/downloader/public/human-pose-estimation-3d-0001/human-pose-estimation-3d-0001.onnx
	- Path for generated IR: 	${HOME}/git/open_model_zoo/tools/downloader/public/human-pose-estimation-3d-0001/FP16
	- IR output name: 	human-pose-estimation-3d-0001
	- Log level: 	ERROR
	- Batch: 	Not specified, inherited from the model
	- Input layers: 	data
	- Output layers: 	features,heatmaps,pafs
	- Input shapes: 	Not specified, inherited from the model
	- Mean values: 	data[128.0,128.0,128.0]
	- Scale values: 	data[255.0,255.0,255.0]
	- Scale factor: 	Not specified
	- Precision of IR: 	FP16
	- Enable fusing: 	True
	- Enable grouped convolutions fusing: 	True
	- Move mean values to preprocess section: 	False
	- Reverse input channels: 	False
ONNX specific parameters:
Model Optimizer version: 	2020.1.0-61-gd349c3ba4a

[ SUCCESS ] Generated IR version 10 model.
[ SUCCESS ] XML file: ${HOME}/git/open_model_zoo/tools/downloader/public/human-pose-estimation-3d-0001/FP16/human-pose-estimation-3d-0001.xml
[ SUCCESS ] BIN file: ${HOME}/git/open_model_zoo/tools/downloader/public/human-pose-estimation-3d-0001/FP16/human-pose-estimation-3d-0001.bin
[ SUCCESS ] Total execution time: 14.10 seconds. 
[ SUCCESS ] Memory consumed: 187 MB. 

========= Converting human-pose-estimation-3d-0001 to IR (FP32)
Conversion command: /usr/bin/python3 -- /opt/intel/openvino_2020.1.023/deployment_tools/model_optimizer/mo.py --framework=onnx --data_type=FP32 --output_dir=${HOME}/git/open_model_zoo/tools/downloader/public/human-pose-estimation-3d-0001/FP32 --model_name=human-pose-estimation-3d-0001 --input=data '--mean_values=data[128.0,128.0,128.0]' '--scale_values=data[255.0,255.0,255.0]' --output=features,heatmaps,pafs --input_model=${HOME}/git/open_model_zoo/tools/downloader/public/human-pose-estimation-3d-0001/human-pose-estimation-3d-0001.onnx

Model Optimizer arguments:
Common parameters:
	- Path to the Input Model: 	${HOME}/git/open_model_zoo/tools/downloader/public/human-pose-estimation-3d-0001/human-pose-estimation-3d-0001.onnx
	- Path for generated IR: 	${HOME}/git/open_model_zoo/tools/downloader/public/human-pose-estimation-3d-0001/FP32
	- IR output name: 	human-pose-estimation-3d-0001
	- Log level: 	ERROR
	- Batch: 	Not specified, inherited from the model
	- Input layers: 	data
	- Output layers: 	features,heatmaps,pafs
	- Input shapes: 	Not specified, inherited from the model
	- Mean values: 	data[128.0,128.0,128.0]
	- Scale values: 	data[255.0,255.0,255.0]
	- Scale factor: 	Not specified
	- Precision of IR: 	FP32
	- Enable fusing: 	True
	- Enable grouped convolutions fusing: 	True
	- Move mean values to preprocess section: 	False
	- Reverse input channels: 	False

ONNX specific parameters:
Model Optimizer version: 	2020.1.0-61-gd349c3ba4a

[ SUCCESS ] Generated IR version 10 model.
[ SUCCESS ] XML file: ${HOME}/git/open_model_zoo/tools/downloader/public/human-pose-estimation-3d-0001/FP32/human-pose-estimation-3d-0001.xml
[ SUCCESS ] BIN file: ${HOME}/git/open_model_zoo/tools/downloader/public/human-pose-estimation-3d-0001/FP32/human-pose-estimation-3d-0001.bin
[ SUCCESS ] Total execution time: 14.66 seconds. 
[ SUCCESS ] Memory consumed: 188 MB. 
```
![Screenshot 2020-03-21 10:50:23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194769/e304f5cb-4714-e5b2-af1e-ecf28a57b947.png)

Post-Process の処理部分だけは処理高速化のために C++ で設計されています。 また、OpenVINOの公式チュートリアルには何も書かれていませんが、C++の部品のみ自力でコンパイルしなければなりません。 ただ、踏むべき手順はたったの下記だけですのですぐに終わります。 **`Python.h`** と **`Numpy`** のヘッダーファイルのincludeが必要ですので、 **`CMakeLists.txt`** を若干調整します。 **`/usr/include/python3.6m`** の部分はお使いのPythonのバージョンによってパスが異なる可能性がありますので、各自調整してください。

```console:Post-Processの部品をビルド
$ cd ${HOME}/git/open_model_zoo/demos/python_demos/human_pose_estimation_3d_demo
$ export PYTHONPATH=$PYTHONPATH:${PWD}

$ nano pose_extractor/CMakeLists.txt
execute_process(
    #COMMAND "${PYTHON_EXECUTABLE}" -c "import numpy; print(numpy.get_include())"
    COMMAND python3 -c "import numpy; print(numpy.get_include())"

#target_include_directories(${target_name} PRIVATE src/ ${PYTHON_INCLUDE_DIRS} ${NUMPY_INCLUDE_DIR} ${OpenCV_INCLUDE_DIRS})
target_include_directories(${target_name} PRIVATE src/ ${PYTHON_INCLUDE_DIRS} ${NUMPY_INCLUDE_DIR} ${OpenCV_INCLUDE_DIRS} /usr/include/python3.6m)

$ sudo apt install python3-dev
$ sudo pip3 install numpy
$ mkdir -p pose_extractor/build && \
  cd pose_extractor/build && \
  cmake .. && \
  make -j8

$ cp pose_extractor.so ../.. && cd ../..
```

最後にサンプルプログラムを実行します。 Pythonプログラムを改造せずにそのまま実行した場合、 **`720p(HD, 1280x720)`** という高解像度で起動してしまうため動作が若干モッサリします。 低解像度で高速に動作させたい場合は自力でOpenCVのUSB Camera撮影解像度を調整してください。

```console:3D_PoseEstimationの実行
$ python3 human_pose_estimation_3d_demo.py \
  -m ${HOME}/git/open_model_zoo/tools/downloader/public/human-pose-estimation-3d-0001/FP32/human-pose-estimation-3d-0001.xml \
  -d CPU \
  -i 0
```
**Youtube： https://youtu.be/DgKw0Ty22PE**
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">3D PoseEstimation+OpenVINO+Corei7 CPU only+720p USB Camera [推論スピード 18 FPS相当]<br>yukihiko-chan には勝てません。 が、CPU onlyかつHD 画質でこのパフォーマンスが出ます。 録画とUI表示にパフォーマンスを持って行かれています。 3Dモデリングはきついと思います。<a href="https://t.co/rvZC00Olrl">https://t.co/rvZC00Olrl</a></p>&mdash; Super PINTO (@PINTO03091) <a href="https://twitter.com/PINTO03091/status/1241209560917893125?ref_src=twsrc%5Etfw">March 21, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# ４．Finally
またつまらない記事を量産してしまいました。。。
記事作成時間：10分 :upside_down: