【Intel】OpenVINOをPythonで便利に使えるライブラリ【pyvino】

# はじめに
こんにちは。はんぺんです。
OpenVINOをpythonで便利に使える[pyvino](https://github.com/hampen2929/pyvino)を作りましたので、紹介させていただきます。

# OpenVINO
[OpenVINO](https://www.intel.co.jp/content/www/jp/ja/internet-of-things/solution-briefs/openvino-toolkit-product-brief.html)はIntel社が出している、機械学習向けのツールキットです。

>OpenVINO™ ツールキットは、高性能なコンピューター・ビジョンやディープラーニングを短期間でビジョン・アプリケーションに組み込めるように、開発者やデータ・サイエンティストを支援します。

サポートはIntelのCPUでのみですが、その分パフォーマンスを上げるために徹底的にチューニングされており、推論に特化しております。

主に画像系のモデルが多いですが、[最近のアップデート](https://software.intel.com/en-us/articles/OpenVINO-RelNotes)で自然言語処理も扱えるようになり、現在非常に注目を浴びています。

# pyvino
OpenVINOは非常に優れたツールキットであるので、それをもっと使いやすくしたらいいのではと考え、pyvinoを作りました。
現在(2019年8月)は顔の検出、感情認識、顔の方向認識、身体の検出、姿勢推定、領域検出の合計６タスクについてサポートしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223279/d6c6354f-6e68-bc6f-df4f-83af453f1548.png)

以下がタスクとIntelが公開しているモデルの対応表になります。

|task                    |model                                     |
|------------------------|------------------------------------|
|detect_face             |face-detection-adas-0001            |
|emotion_recognition     |emotions-recognition-retail-0003    |
|estimate_headpose       |head-pose-estimation-adas-0001      |
|detect_body             |person-detection-retail-0013        |
|estimate_humanpose      |human-pose-estimation-0001          |
|detect_segmentation     |instance-segmentation-seurity-0050  |


# サンプルコードの実行
ではサンプルコードを実行してみましょう。
pyvinoのインストールは[こちら](https://github.com/hampen2929/pyvino/blob/master/INSTALL.md)を参照してください。

[person1.jpg](https://github.com/hampen2929/pyvino/blob/master/data/test/person1.jpg)のダウンロードをしてtest_script.pyと同じディレクトリに置きます。

```test_script.py
from pyvino.model.model import Model
from pyvino.util.image import imshow, cv2pil
import cv2
import numpy as np

test_image = 'person1.jpg'
# カラータイプはBGRを推奨
frame = cv2.imread(test_image)
    
# taskの指定とmodelの呼び出し
task = "detect_face"
model = Model(task)
# 画像に対して推論して描画し、結果の画像を返す
new_frame = model.compute(frame)
new_frame = np.asarray(cv2pil(new_frame))
imshow(new_frame)

# 推論結果を返す
# result = model.predict(frame)
# print(result)

```

スクリプトを実行します。

```
python test_script.py
```

推論が成功したら以下の画像が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223279/160fd430-0952-fd1f-83c4-02376c2fd67b.png)

"q"を押して画面を消してください。

`task = "detect_face"`となっていますが、他にも`"emotion_recognition", "estimate_headpose", "detect_body", "estimate_humanpose", "detect_segmentation"`と指定することで、他のモデルへと容易に切り替えることができるのが特徴です。

また、画像を表示するだけでなく、`predict`を用いることで、推論の結果を画像ではなく値として返すこともできます。

```python
# 推論結果を返す
result = model.predict(frame, frame_flag=False)
print(result)
{0: {'label': 1.0, 'conf': 1.0, 'bbox': (162, 149, 199, 201)}, 1: {'label': 1.0, 'conf': 0.9999565, 'bbox': (266, 137, 302, 190)}}
```

ちなみに`frame_flag=True`にすることで、画像と推論の値の両方を返すようになります。

画像が欲しい、結果の値だけ欲しい、両方欲しいなど、データ分析やモデリングでの要望は多岐に渡りますが、そのどれにも対応できるようにしたため、個人的には使い勝手が良いと思っています。

# まとめ
OpenVINOをPythonで便利に使える[pyvino](https://github.com/hampen2929/pyvino)を作りました。
今回はこちらでは紹介しませんでしたが、Gitに[Jupyter Notebookのサンプル](https://github.com/hampen2929/pyvino/tree/master/notebook)もあげているので、気になる人は確認していただければです。
最後まで読んでいただき、ありがとうございました。

# Reference
[OpenVINO](https://www.intel.co.jp/content/www/jp/ja/internet-of-things/solution-briefs/openvino-toolkit-product-brief.html)

[Github pyvino](https://github.com/hampen2929/pyvino)