Python
RaspberryPi
MachineLearning
DeepLearning
OpenVINO

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

今回から「手の動き」シリーズを開始します。

このシリーズでは、手の動きを検出して役立つツールを作ります。

gif1.gif


概要


  • 今年の夏に「ディープラーニングガジェット品評会(仮)」を開催する予定です。

  • この記事は、品評会のネタ作りの記事です。

  • 肝心のネタの第一弾は「手の物体検出」のリポジトリをOpenVINO化して、高速化しました。


謝辞

この記事は@PINTOさんのおかげで作成することができました。

というか、ほとんど、@PINTOさんの功績といって過言ではないです。

この場をお借りして御礼申し上げます。

本当に助かりました。ありがとうございました。


品評会について

今年の夏頃に「ディープラーニングガジェット品評会(仮)」を開催する予定です。

開催場所は名古屋で、発表者枠を5名設ける予定です。

発表したいという方がいらっしゃいましたら、是非ご連絡ください。

発表者の事前予約を承っております。私のメールアドレスはプロフィールに書いてあります。

内容はディープラーニング✖画像に限定させていただきます。

今のところ、発表15分、質疑応答5分、デモ&雑談1時間を予定しております。


品評会のネタ

私の品評会のネタは「手の物体検出」を使って何か作れないかと考えています。

「手の物体検出」は、既に先人の方が凄いものを作っています。

そこで、本稿ではこのリポジトリをOpenVINOで高速化してみました。

全体はこちらに置きました。


実行結果

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


環境


  • Raspberry Pi 3

  • USB camera

  • NCS2(高速化後)


高速化前

gif1.gif

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


高速化後

gif1.gifgif3.gif

(NCS2を装着)

10~15FPSの速度が出ています。

これならリアルタイムの処理ができそうです。


使い方

python3 main.py -wd 640 -ht 480


TensorFlowモデル --> OpenVINOモデルへの変換

本家のリポジトリでは、TensorFlowモデルが提供されています。

このモデルをOpenVINOモデルへ変換するには、以下のコードが必要でした。(@PINTOさんに感謝!)

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

と表示が・・・こちらによると、まだvesion 5は実行未対応とのこと。

「変換」は対応済で、「実行」は未対応って・・・

「順序が逆でしょ」

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


OpenVINOの罠 その2

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

既に問題として取り上げられているようですが、一部のモデルは変換可能なようで

混乱を招く要因となりました。

さすが、INTEL。闇が深いぜ!


handtrackingの罠

本家のリポジトリにはTensorFlowモデルが二つあります。


  • hand_inference_graph/frozen_inference_graph.pb

  • model-checkpoint/ssdlitemobilenetv2/frozen_inference_graph.pb

通常起動させると、一つ目のモデルが呼び出されるのですが、こちらは検出精度が

悪い気がします。こちらの記事で出た検出結果は、オリジナルの方が今回

(私が学習させたモデルの結果)より悪い気がします。

sum1.png

ただ、二つ目のモデルを使うと、検出精度がもの凄く良いです。

従って、精度としては以下の関係になっています。

二つ目 > 一つ目

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

ちなみに私のリポジトリにもssd-mobilenetV1-model/frozen_inference_graph.pbが

存在しますが、学習途中のものを諸事情によりアップして、消し方が分からなくて

放置してありますので、絶対に使用しないでください。精度は劣悪です。


まとめ


  • OpenVINOでhandtrackingを高速化しました。

  • 10~15FPSの速度が出ます。