以前に、こちらで「ラズパイで将棋駒を物体検出する」プロジェクトを開始しました。
その後、とんでもない間違いをしていたことに気が付きました。
今回はプロジェクトを仕切り直して、再開したいと思います。
#物体検出方法の選定ミス
以前に、こちらで将棋駒の検出をやりましたが、物体検出方法は適当に選んでいました。
その結果、検出精度がイマイチでした。
##YOLOv3-tiny
このとき使った検出器はYOLOv3-tinyでした。tinyモデルを使った理由はこのシステムを
ラズパイに搭載したかったからです。
ところが、このYOLOv3-tiny、調べてみるとスペックがかなり悪いものでした。
YOLOv3の論文には出てきませんが、darknetのサイトに載っています。
mAP50 | mAP(推測値) | |
---|---|---|
YOLOv3-tiny | 33.1 | 19.9 |
なお、サイトではmPAという表記になっていますが、論文と照らし合わせるとmAP50の
ことだと思われます。mAPについて、詳しく知りたい方は以下のリンクを参照してください。
https://note.mu/seishin55/n/n542b2b682721
https://qiita.com/panchokyutech/items/2c972ede2bc883597a87
mAP50をmAPに直接変換することはできませんが、他の手法を見てみると、mAPは高くても
mAP50の6割ほどしか出ていません。従って、上の表では推測値を記入しました。
なお、YOLOv3-tinyの推論速度は爆速です。速さは以下の記事で実感できるはずです。
https://qiita.com/PINTO/items/526d2f35d5271d353f20#-%E7%B5%90%E6%9E%9C
##MobileNET + SSDLite
そして、YOLOv3-tinyの対抗馬となるのが、MobileNET(v1/v2) + SSDLiteです。
こちらのスペックは論文にありました。
特筆すべきは、MobileNet v1 + SSDLiteは、フルモデルのYOLOv2に対し精度でも
モデルサイズでも、(恐らく)推論速度でも上回っているということです!
正に、「早い!安い!うまい!」の3拍子が揃っています。
ちなみに、「SSDLite」は通常のSSDに対し、深さ方向のフィルタについてサイズを1に
変更して計算コストを下げたモデルだそうです。
物体検出方法はSSD以外にもたくさんあります。気になる方は以下のサイトをご覧ください。
https://github.com/hoya012/deep_learning_object_detection
##どちらの検出方法にすべきか?
以上をまとめると、以下の表になります。
精度(mAP) | ラズパイの動作速度 | |
---|---|---|
YOLOv3-tiny | 19.9 | 爆速 |
YOLOv2 | 21.6 | 遅い |
MobileNet v1 + SSDLite | 22.2 | 通常 |
YOLOv3 | 33.0 | 非常に遅い |
どこまでも速さを追い求めるなら、YOLOv3-tinyでしょう。
しかし、今回はUSB型GPUを使って、計算速度を補完できるため、「MobileNET v1 +
**SSDLite」を使います。**これにより、速度と精度が両立できるでしょう。
最終的に目指す姿は、以下の記事のようにサクサク動く感じです!
https://qiita.com/PINTO/items/fc1fcecce4d5600c20bb#-%E7%B5%90%E6%9E%9C
ちなみに、YOLOv3をラズパイで動かすのは至難の業のようです。
https://qiita.com/PINTO/items/c766ac9614052f4d6304
#使うモジュールの選定ミス
今回は、USB型GPUにMovidiusを使います。
Movidiusのモジュールは、従来NCSDKという悪名高きものが用意されていました。
このモジュールはv2まで更新されましたが、バグだらけで全然収集がつかない状態でした。
その後、OpenVINOが登場してIntelボードだけではなく、ラズパイでも動作できる
ようになり、NCSDKにとって代わり、だいぶ開発環境が改善されたと聞きます。
次回以降は、OpenVINOのインストールから進めたいと思います。
#まとめ
- ラズパイで物体検出するなら、「MobileNET v1 +SSDLite」が無難。精度と速度が両立できます(まだやってないけど)。
- Movidiusの開発はOpenVINOを使いましょう。