【Movidius™NCS＆RaspberryPi】リアルタイム物体認識【TensorFlow】

RaspberryPiの様な非力なマシンでも人工知能スティックを利用することで、ディープラーニングの実行速度を上げることが出来るようになりました。

[Movidius™ Neural Compute Stick](https://developer.movidius.com/)

先日[スイッチサイエンス](https://www.switch-science.com/catalog/3501/)さんで購入することが出来ましたので早速試してみました。こんな感じ。

![MovidiusNCS&RaspberryPi.gif](https://qiita-image-store.s3.amazonaws.com/0/47128/97961827-6c7c-2c42-a19f-927cd2fefb64.gif)

画像はFPS10程度のGIFですので、動画で確認したい方は[こちら](https://www.youtube.com/watch?v=kStOMQ4cykY)をご参照ください。通常のRaspberryPiでは考えられない位（6〜7倍）高速に推測を行う事が出来ています。

## 環境

![MovidiusNCS&RaspberryPi.jpg](https://qiita-image-store.s3.amazonaws.com/0/47128/b79b3692-ec22-6bcf-2385-b77865b9a469.jpeg)

### ハードウェア
- RaspberryPi3
- Movidius™ Neural Compute Stick
- LOGICOOL ウェブカム HD画質 120万画素 C270

### ソフトウェア
- RASPBIAN STRETCH WITH DESKTOP 4.9
- Python 3.5.3
- pip 9.0.1
- TensorFlow 1.3.1
- Intel® Movidius™ Neural Compute SDK 1.10.00.02

ラズパイの上にGrovePiを取り付けていますが今回は特に使いません。（後でセンサーやモーターと連動させるため取り付けしておきました）以下のチュートリアル記事を参考に実行環境をまとめてみます。

[Neural Compute Stickを試してみよう-スイッチサイエンスマガジン](http://mag.switch-science.com/2017/10/24/try-neural-compute-stick/)

[MovidiusをRaspberryPi3で動かしてみた（執筆途中）-Qiita](https://qiita.com/UdonDa/items/deb442c9b7ffc66b7da4)


## RASPBIAN STRETCH WITH DESKTOP 4.9

Movidius（製品名はNeural Compute Stickですが、本記事ではこちらで統一します）のSDKは最新版Raspbianのみ対応しています。

[RASPBIAN STRETCH WITH DESKTOP](https://www.raspberrypi.org/downloads/raspbian/)

```bash
$ sudo apt-get update
$ sudo apt-get install python3-pip python3-dev
```
最新版（Stretch）のデフォルトのPython3バージョンが3.5.3となっています。これが少々曲者で、バージョン違いで[以前](https://qiita.com/PonDad/items/9fbdf4d694f825dd1b6e)の方法ではTensorFlowがインストール出来ません。

## TensorFlow 1.3.1

ARM用のTensorFlowをビルドしてみたのですが、エラーが出てしまい途方に暮れていました。色々調べてみたところ以下のレポジトリにコンパイル済みバイナリが公開されていました。（スイッチサイエンスマガジンさんで紹介されています）

[lhelontra/tensorflow-on-arm](https://github.com/lhelontra/tensorflow-on-arm/releases)

```bash
$ wget https://github.com/lhelontra/tensorflow-on-arm/releases/download/v1.3.1/tensorflow-1.3.1-cp35-none-linux_armv7l.whl
$ sudo pip3 install tensorflow-1.3.1-cp35-none-linux_armv7l.whl 
```
自分でビルドすると一晩掛かりますが、10分足らずでインストール出来ます。

## Intel® Movidius™ Neural Compute SDK 1.10.00.02

MovidiusのSDKは公式サイトにある手順通りワンライナーでインストール出来ます。

[Movidius™ Neural Compute SDK](https://movidius.github.io/ncsdk/install.html)

```bash
$ git clone http://github.com/Movidius/ncsdk && cd ncsdk && make install && make examples
```
インストールに3〜4時間掛かりますので気長に待ちましょう。

このSDK、最新版のOpenCV3.3が同梱されています。やったことがある方はわかると思うのですが、RaspPiにOpenCVをビルドしようと思うとこれまた非常にハマり易いので嬉しい仕様です。

その他NumPyやSciPy、scickit-learnなど必要なライブラリもまとめてインストールされます。

## サンプルを動かす

SDKの中にCaffe、TensorFlowの学習済みモデルをMovidius用に変換したもの（graphファイル）が入っています。

試しにGoogleのInceptionV3モデルを実行してみましょう。

```bash
$ cd ncsdk/examples/tensorflow/inception_v3
$ python3 run.py
Number of categories: 1001
Start download to NCS...
*******************************************************************************
inception-v3 on NCS
*******************************************************************************
282 tabby, tabby cat 0.58984
283 tiger cat 0.21362
286 Egyptian cat 0.045288
553 feather boa, boa 0.0065536
841 swab, swob, mop 0.0051422
*******************************************************************************
Finished
```
サンプルの猫画像を「tabby cat（トラ猫）」として認識しているのが分かります。

## リアルタイム物体認識

上記のサンプルコードを利用してリアルタイム物体認識をしてみます。

OpenCVがインストールされているので、USB接続したWebカメラで読み込んだ画像を推測し、推測結果を画面に表示させてみます。

[PonDad/app.py - Gist](https://gist.github.com/PonDad/bc185bdf81735dfd018bda6ce0b37fea)

ssh接続だとOpenCVが起動できないので、キーボードを利用するか、リモートデスクトップから起動させて下さい。

## まとめ

人工知能のエッジデバイスというと、[NVIDIA® JETSON™](http://www.nvidia.co.jp/object/embedded-systems-dev-kits-modules-jp.html) シリーズのようなものが必要だと思っていたのですが、手持ちのRaspPiでここまで高速に処理できるようになるとは驚きでした。

TensorFlowは記述がちょっと大変ですが（Kerasと比較して）、自分で転移学習させたラベルの認識も試してみたいですね。ではまた。