ラズパイで将棋駒の物体検出　ーMovidiusのインストール編ー

※こちらは[Pythonデータ分析勉強会＃03](https://pythondata.connpass.com/event/110341/)の発表資料です。

前回、前々回とYOLOv3を使った物体検出をやってきました。

+ [物体検出でパトライトの監視（YOLOv3）](https://qiita.com/shinmura0/items/dc0d02dc1e716b912932)
+ [用意した画像は一枚だけ！？物体検出で将棋駒の認識](https://qiita.com/shinmura0/items/f818bcbb92d5fff5279d)

今回から、ラズパイで将棋駒を物体検出するチャレンジを開始します。

※本記事は古い内容が含まれます。NCSDKは現在はあまり使われていないものと思われます。
　2019/1/25現在の情報は、[こちら](https://qiita.com/shinmura0/items/967e9eb02724639a7624)をご参照ください。

![PC040002.jpg](https://qiita-image-store.s3.amazonaws.com/0/264781/6311cbfc-b071-59f0-ab5c-8ecbf0a25a17.jpeg)

#最終目標
最終的に「**ラズパイで**将棋駒を**高速に**物体検出させる」ことを目標にします。
高速に動かすために、USB型のGPUであるMovidiusを使用します。

ただ、このMovidius、なかなか一筋縄ではいかない曲者です。
以下に、目標達成までの手順を示します。

（手順）
**1.ラズパイにMovidiusをインストール**
**2.ラズパイで標準のYOLOを動かしてみる**
3.自作のYOLOv3（kerasモデル）を用意する（←済）
4.自作のYOLOv3をMovidiusで動くようにする（←難題）
5.ラズパイで将棋駒を高速に認識させる

本稿では、とりあえず**太字**部分を行います。

4.については、次回以降[Intel-Movidius-NCS-Keras](https://github.com/ardamavi/Intel-Movidius-NCS-Keras)使って、kerasモデルをgraphモデルに変換します。
ただ、失敗しそうな気配満載なので、最終的に5.まで到達しないかもしれません。

#Movidiusについて
MovidiusはUSB型のGPUで、ラズパイに装着すればある程度速く
ディープラーニングモデルを動かすことができます。

最近、[「Neural Compute Stick v2」](https://www.switch-science.com/catalog/4104/
)が発売されましたが、
今回は従来品の「Neural Compute Stick v1」を使います。

また、以下の記事によると、「LattePanda Alpha 864」を使えば
「Neural Compute Stick v2」を使わなくても、高速に演算できるらしいです。

+ https://qiita.com/PINTO/items/5ac8f4395e190d06cfab

#NCSDK(v1)のインストール

Movidiusを動かすためには、NCSDKをインストールする必要があります。
最新版はv2ですが、諸事情によりv1をインストールしました。

諸事情が気になる方は「おまけ」をご覧ください。

NCSDK(v1)のインストールは以下の記事を参考に進めました。

https://karaage.hatenadiary.jp/entry/2018/05/23/073000

#yoloNCSのインストール
YOLOもバージョンがありますが、NCSDK(v1)対応を考えると
YOLOv1（yoloNCS）をインストールすることにしました。

以下のリンクを見ればインストールできますが、ちょっと変更が必要でした。
https://nonnoise.github.io/MovidiusSetting/Sphinx/build/html/rst/Yolo_Caffe_NCS.html

リンク内で、「Caffe ModelをNCS用にコンパイル」の後にできた「graph」ファイルを
yoloNCS/py_examples ディレクトリに移す必要がありました。

#yoloNCSの実行結果
yoloNCSインストール後は、USBカメラをラズパイに装着して以下のコマンドを打ちます。

```
cd yoloNCs/py_examples
```

次のコマンドを打てば、リアルタイムで物体検出が始まります。

```
python3 object_detection_app.py
```

![7crag-mqvhs.gif](https://qiita-image-store.s3.amazonaws.com/0/264781/df724ddd-fce4-66af-6e90-98c0eff6145f.gif)


#おまけ

Movidiusは全然まともに動きませんでした。今回は紆余曲折を経て、ようやくYOLOv1が動きました。
ここでは、ボツ案をご紹介します。誰かの参考になれば幸いです。

##【ボツ案1】OpenVINOのインストール

[こちら](https://qiita.com/PINTO/items/5ac8f4395e190d06cfab#-%E6%9C%AC%E6%97%A5%E3%81%AE%E3%81%BE%E3%81%A8%E3%82%81)によるとNCSDK v1 / v2 はバグだらけで、まともに動かないモデルも存在するとのこと。
しかし、OpenVINOを使えば動くこともあるらしいです。

意気揚々とラズパイでインストールを進めると、エラーが出て止まりました。

以下のリンクによると、ラズパイではインストールできないようです。残念。
https://software.intel.com/en-us/forums/computer-vision/topic/781076

##【ボツ案2】NCSDK(v2)のインストール

NCSDKの最新版はv2です。一応、以下のコマンドでインストールはできました。
※結論を先に書くと、YoloV2NCSが動かなかったため、v2は不採用となりました。

まずは、スワップサイズを大きくします。

```
$ sudo nano /etc/dphys-swapfile
CONF_SWAPSIZE=2048
```
その後、ラズパイを再起動し、以下のコマンドでmvnc(v2)をインストールします。

```
$ git clone -b ncsdk2 http://github.com/Movidius/ncsdk && cd ncsdk && make install && make examples
```
ここは、6時間くらいかかります。

```
$ sudo nano /etc/dphys-swapfile
CONF_SWAPSIZE=100
```
スワップサイズを元に戻して、ラズパイを再起動すればインストール完了です。

###サンプルを動かす
サンプルを動かしてみます。

```
$ cd ncsdk/examples/tensorflow/inception_v3
$ python3 run.py
```

以下のようにエレキギターと出たら、インストールは完了しています。

```
Number of categories: 1001
Start download to NCS...
*******************************************************************************
inception-v3 on NCS
*******************************************************************************
547 electric guitar 0.98828
403 acoustic guitar 0.0077209
715 pick, plectrum, plectron 0.0015087
421 banjo 0.00092602
820 stage 0.00065947
*******************************************************************************
Finished
```

###YoloV2NCSのインストール

**問題はココです。**

YoloV2NCSはNCSDK(v2)に対応しているとのことで、以下のリンクを見てインストールを進めました。
https://github.com/ctchuang/YoloV2NCS

しかし、Cafeeモデルをgraphモデルに変換しようとしたところ、以下のエラーが出て止まりました。

```
[Error 44] Toolkit Error: Unsupported: Multiple graph inputs or Malformed graph connections
```

あえなく断念。

#まとめ

+ Movidiusは闇が深いとは聞いていたが、**想像以上に深かった。**エラーが出まくりです。
+ 現状はNCSDK v1で動かしていますが、今後、自作のYOLOv3モデルが動くかどうか非常に不安です。
+ 「NCSDK v1だと絶対に無理！」等、見識がある方がいらっしゃれば、**ご助言をお願いします。**