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


今回から「手の動き」シリーズを開始します。
このシリーズでは、手の動きを検出して役立つツールを作ります。

概要

  • 今年の夏に「ディープラーニングガジェット品評会(仮)」を開催する予定です。
  • この記事は、品評会のネタ作りの記事です。
  • 肝心のネタの第一弾は「手の物体検出」のリポジトリをOpenVINO化して、高速化しました。

謝辞

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

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

品評会について

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

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

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

品評会のネタ

私の品評会のネタは「手の物体検出」を使って何か作れないかと考えています。
「手の物体検出」は、既に先人の方が凄いものを作っています。

そこで、本稿ではこのリポジトリをOpenVINOで高速化してみました。
全体はこちらに置きました。

実行結果

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

環境

  • Raspberry Pi 3
  • USB camera
  • NCS2(高速化後)

高速化前

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

高速化後


(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

通常起動させると、一つ目のモデルが呼び出されるのですが、こちらは検出精度が
悪い気がします。こちらの記事で出た検出結果は、オリジナルの方が今回
(私が学習させたモデルの結果)より悪い気がします。

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

二つ目 > 一つ目

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

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

まとめ

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