Intel Movidius + TensorFlowでRaspberry Piでもサクサク画像認識

f:id:karaage:20180516223453j:plain:w640

Intel Movidius(Movidius Neural Compute Stick NCS)とは

 Intelが出したAIに特化したプロセッサです。これをつければ、Raspberry Piでもサクサクとディープラーニングでの画像認識が動くという優れものです。「欲しいなぁ」と思い悩んでいたら、ディープラーニングおじさんがポイっとくれたので、早速夜中に家でゴソゴソ試してみました。

f:id:karaage:20180516013818j:plain:w640

f:id:karaage:20180516013830j:plain:w640

 また、カメラは、Open CVから呼び出しやすいUSBのWebカメラを使います。私が使ったのは、以下ですが多分どの機種でも大丈夫だと思います。

 ネットに情報も出回っていたので楽勝だと思っていたのですが、案の定色々詰まったので自分へのメモとしてセットアップ方法残しておきます。誰かの役に立つことを願います。

Raspberry PiのIntel Movidius用セットアップ

 ディープラーニングではいつものことですが、バージョンが重要です。特にncsdk(MovidiusのSDK)とTensorFlowとKerasのバージョンは超重要です。うまく動かない場合は、バージョンダウンする勇気(?)を持つことも大切かもしれません。

 今回は以下のバージョンでセットアップしました。

python==3.5.3
ncsdk==1.12
tensorflow==1.4.1
keras==2.1.2
opencv==3.4.0

 主な流れは以下です。

  • Raspberry Piの基本セットアップ
  • TensorFlow + Kerasインストール
  • Intel Movidius Neural Compute SDKセットアップ
  • Open CV3 インストール

Raspberry Piの基本セットアップ

 使用するOSはRaspbian StretchでOKです。てっきりUbuntu入れないとダメだと思っていたのですが、Raspbian Stretch Desktopに正式対応したみたいです。Raspbianのセットアップに関しては下記記事参照下さい。

 注意点としては、以下2点です。

  • SDカードの容量は32GB以上にする
  • 上記事の「スワップファイル増大」の項目を必ず実施する

 偉大なる先人の知恵に感謝です。スワップファイルは、上記の記事では1GBに設定していますが、成功している人は大体2GBの設定にしているようだったので、以下のとおりに設定しました。

CONF_SWAPSIZE=2048

TensorFlow + Kerasインストール

 以下のとおりコマンド実行してインストールします。TensorFlowはバイナリパッケージを使うので、10分もあればインストールできます。Kerasは、Intel Movidiusには対応していないので、入れなくても良いです(今回は、Intel Movidius無しの場合との比較に使うために入れています)。

$ pip3 install numpy==1.13
$ sudo apt-get install libblas-dev liblapack-dev python3-dev libatlas-base-dev gfortran python3-setuptools
$ sudo pip3 install https://github.com/lhelontra/tensorflow-on-arm/releases/download/v1.4.1/tensorflow-1.4.1-cp35-none-linux_armv7l.whl
$ sudo apt-get install python3-h5py
$ sudo pip3 install keras==2.1.2
$ pip3 install -U numpy

 インストールできたかの確認は以下のようにライブラリをインポートして確認しましょう。

$ python3
Python 3.5.3 (default, Jan 19 2017, 14:11:04) 
[GCC 6.3.0 20170124] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow
/usr/lib/python3/dist-packages/h5py/__init__.py:34: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.
  from ._conv import register_converters as _register_converters
>>> import keras
Using TensorFlow backend.
>>> 

 上記のようにエラーでなければOKです(warningは出ますが、無視して良いそうです)。

Intel Movidius Neural Compute SDKセットアップ

 以下コマンドでSDKをインストールできます。3行目は実行するとビルドが始まり、終わるまでに4時間くらいかかります。リモートだと切断してしまう可能性があるので、Raspberry Pi本体のターミナルで実行するのが良いでしょう。byobuなどの仮想端末使っても良いかもしれませんね。

$ git clone http://github.com/Movidius/ncsdk
$ cd ncsdk
$ make install && make examples

OpenCV3インストール

 参考サイトによると、Intel MovidiusのSDKをインストールすると、一緒にOpenCV3のインストールされると書いてありましたが、そんなことは無かったです。SDKのリポジトリに./install-opencv.shというファイルがあるので、このスクリプトを実行してインストールするように仕様が変わったのかもしれません。

 ただ、OpenCVビルドをRaspberry Piでやるとまた数時間かかってしまうので、今回は以下コマンドでバイナリパッケージでインストールしました、。ものの2,3分でインストールできます。

$ wget https://github.com/mt08xx/files/raw/master/opencv-rpi/libopencv3_3.4.0-20180115.1_armhf.deb
$ sudo apt install -y ./libopencv3_3.4.0-20180115.1_armhf.deb
$ sudo ldconfig

Intel Movidiusのテスト

 Intel Movidiusがちゃんと動くか確認します。以下実行します。

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

 以下のように electric guitar が認識されればOKです。

Number of categories: 1001
Start download to NCS...
*******************************************************************************
inception-v3 on NCS
*******************************************************************************
547 electric guitar 0.9883
403 acoustic guitar 0.00772
715 pick, plectrum, plectron 0.001509
421 banjo 0.000926
820 stage 0.0006595
*******************************************************************************
Finished

Intel Movidius有り無しでRaspberry Piでの画像認識性能の比較

Intel Movidius無し

 まずは、Intel Movidius無しの状態で試してみましょう。

f:id:karaage:20180516223519j:plain:w640
 Intel Movidius無し

 試すのは、以下と同じ内容ですね。

 以下コマンド実行すると、画像認識が動きます。

$ git clone https://github.com/karaage0703/tensorflow-pi
$ cd tensorflow-pi
$ python3 inspect_camera.py

f:id:karaage:20180516231209g:plain:w640
 あくびが出るくらい遅い(2倍速程度の速さです)

Intel Movidius有り

 次にIntel Movidius有りの状態で試してみましょう。

f:id:karaage:20180516223453j:plain:w640  Intel Movidius有り

 以下コマンドで、@pon_dat さん作成のスクリプトをダウンロードします。

$ cd cd ~/ncsdk/examples/tensorflow/inception_v3
$ wget https://gist.githubusercontent.com/PonDad/bc185bdf81735dfd018bda6ce0b37fea/raw/85652b5b2b03dd6c37fc5b5de220546d431be444/app.py

 以下実行すると画像認識が動きます。

$ python3 app.py

f:id:karaage:20180516231735g:plain:w640
 めっちゃ早い。というか認識速度にカメラ表示がついてこれない感じ(2倍速程度の速さです)

まとめ

 Intel Movidiusを使ってRaspberry Piで画像認識を試してみました。Intel Movidiusで画像認識自体はかなり高速化されましたが、カメラの表示など他の部分がついてこれないので、使いどころは限られてきそうだなという印象です。また、高速化のためにはモデルの変換や、プログラムの修正が必要で、USBを刺したら自動的に高速化というわけではないので注意が必要です。ここらへんはハードウェアのアクセラレータなので、当たり前といえば当たり前なのですが、普通のPCでのGPU使用の有無のようにもっと簡単に切り替えられると楽なのになと思いました。

 Intel Movidiusを使えば、ラズパイで高速に「ヒューマンシーケンサー2.0」を動かせるかなと目論んでいたのですが、ソフトを変更するのが中々大変そうなのと、映像表示などの部分がボトルネックになりそうなので、一旦ペンディングしたいと思います。

参考リンク

Movidius で画像認識高速化 for ラズパイ | AI coordinator

MovidiusをRaspberryPi3で動かしてみた(執筆途中) - Qiita

Raspbian Jessie+ROS Kinetic+samba4.2.14+Python3.4.7+Tensorflow1.3.0+Keras2.1.2+OpenCV3.3.1+Jupyter Notebook+Single Shot Multibox Detector(SSD)環境の構築 - Qiita

Accessing the Raspberry Pi Camera with OpenCV and Python - PyImageSearch

関連記事