「手の動き」を高速検出　－OpenVINOモデルへの変換ー

今回から「手の動き」シリーズを開始します。
この[シリーズ](https://qiita.com/shinmura0/items/be91d0fcf186ba287515)では、手の動きを検出して役立つツールを作ります。

![gif1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/e7b714ad-722d-ed9c-2200-7fa20ae0bece.gif)

#概要
+ 今年の夏に「ディープラーニングガジェット品評会（仮）」を開催する予定です。
+ この記事は、品評会のネタ作りの記事です。
+ 肝心のネタの第一弾は[「手の物体検出」のリポジトリ](https://github.com/victordibia/handtracking)をOpenVINO化して、高速化しました。

#謝辞
この記事は@PINTOさんのおかげで作成することができました。
というか、ほとんど、@PINTOさんの功績といって過言ではないです。

この場をお借りして御礼申し上げます。
本当に助かりました。ありがとうございました。

#品評会について

今年の夏頃に「ディープラーニングガジェット品評会（仮）」を開催する予定です。
開催場所は名古屋で、発表者枠を5名設ける予定です。

発表したいという方がいらっしゃいましたら、是非ご連絡ください。
発表者の事前予約を承っております。私のメールアドレスはプロフィールに書いてあります。

内容はディープラーニング✖画像に限定させていただきます。
今のところ、発表15分、質疑応答5分、デモ&雑談1時間を予定しております。

#品評会のネタ

私の品評会のネタは「手の物体検出」を使って何か作れないかと考えています。
「手の物体検出」は、既に先人の方が[凄いもの](https://github.com/victordibia/handtracking)を作っています。

そこで、本稿ではこのリポジトリをOpenVINOで高速化してみました。
全体は[こちら](https://github.com/shinmura0/handtracking-OpenVINO)に置きました。

##実行結果
まずは、結果をご覧ください。

###環境
+ Raspberry Pi 3
+ USB camera
+ NCS2(高速化後)

###高速化前
![gif1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/99df41d9-503e-6809-3518-6a7b926addb3.gif)

1FPSくらいで、リアルタイムの検出はできません。

###高速化後
![gif1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/e7b714ad-722d-ed9c-2200-7fa20ae0bece.gif)![gif3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/50c8d0ef-e36b-759e-3ea2-1dea9109cbaf.gif)
(NCS2を装着)

10～15FPSの速度が出ています。
これならリアルタイムの処理ができそうです。

##使い方
+ OpenVINOを[インストール](https://qiita.com/shinmura0/items/318c775544fae64ae0db)
+ こちらの[リポジトリ](https://github.com/shinmura0/handtracking-OpenVINO)をダウンロード
+ NCS2もしくはMovidiusを装着
+ あとは以下のようにコマンド

```
python3 main.py -wd 640 -ht 480
```

##TensorFlowモデル --> OpenVINOモデルへの変換
本家のリポジトリでは、TensorFlowモデルが提供されています。
このモデルをOpenVINOモデルへ変換するには、以下のコードが必要でした。（@PINTOさんに感謝！）

```{convertion_script_sample_2018R5}
run mo_tf.py \
--input_model frozen_inference_graph.pb \
--tensorflow_object_detection_api_pipeline_config pipeline.config \
--tensorflow_use_custom_operations_config ssd_v2_support.json \
--output=detection_boxes,detection_scores,num_detections \
--input_shape [1,300,300,3] \
--data_type FP16 \
--reverse_input_channels
```

後述しますが、Windows10では変換できなかったため、**Colaboratory(Ubuntu)で実行しました。**


#闇の世界
最後に失敗談を書いておきます。

##OpenVINOの罠　その1
OpenVINOモデルへの変換でバタバタしました。

一つ目は```OpenVINO toolkit 2019 R1```の罠です。
こちらを使うと「変換」はできるのですが、「実行」は現在のバージョンで不可能のようです。

変換後のOpenVINOモデルを読み込ませたところ

```
[ ERROR ] Error reading network: cannot parse future versions: 5
```

と表示が・・・[こちら](https://github.com/opencv/dldt/issues/113)によると、まだvesion 5は実行未対応とのこと。
「変換」は対応済で、「実行」は未対応って・・・

「順序が逆でしょ」

さすが、INTEL。**やってくれるぜ！**

##OpenVINOの罠　その2
二つ目は、Windows10を使うとOpenVINOへの変換ができませんでした。

既に問題として取り上げられているようですが、一部のモデルは変換可能なようで
混乱を招く要因となりました。

さすが、INTEL。**闇が深いぜ！**

## handtrackingの罠
本家の[リポジトリ](https://github.com/victordibia/handtracking)にはTensorFlowモデルが二つあります。

+ hand_inference_graph/frozen_inference_graph.pb
+ model-checkpoint/ssdlitemobilenetv2/frozen_inference_graph.pb

通常起動させると、一つ目のモデルが呼び出されるのですが、こちらは検出精度が
悪い気がします。[こちらの記事](https://qiita.com/shinmura0/items/7abeca8db5c66cb001ff)で出た検出結果は、オリジナルの方が今回
（私が学習させたモデルの結果）より悪い気がします。

![sum1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/7f10197e-c6ff-d0df-a8bb-8b6141b3b50e.png)

ただ、二つ目のモデルを使うと、検出精度がもの凄く良いです。
従って、精度としては以下の関係になっています。

二つ目　＞　一つ目

本稿では二つ目のモデルをOpenVINO化していますので、ご安心ください。

ちなみに私のリポジトリにもssd-mobilenetV1-model/frozen_inference_graph.pbが
存在しますが、学習途中のものを諸事情によりアップして、消し方が分からなくて
放置してありますので、**絶対に使用しないでください。**精度は劣悪です。

#まとめ
+ OpenVINOでhandtrackingを高速化しました。
+ 10~15FPSの速度が出ます。