Intel Movidius(Neural Compute Stick)を用いたObject Detectionのページ

Intel® Movidius™ Neural Compute Stick(NCS)は、AIプログラミングを習得できるように設計された、ディープ・ラーニング(DNN)用のUSBスティックです。Movidius NCSは、より低い消費電力で作動する高い性能のMovidius™ビジュアル処理ユニット(VPU)を内蔵しています 。ビジュアル処理ユニット(VPU)は、すでに、膨大な個数のスマート・セキュリティ・カメラ、制御用ドローン、産業用視覚機器などに搭載されています。NCSは600 MHz Myriad-2 SoC (128ビットVLIW SHAVEベクトルプロセッサ x 12基搭載) • 転送速度400 Gbpsのオンチップメモリ2 MBを搭載しています。

  Neural Compute Stick(NCS)は対応するAPIであるIntel Movidius Neural Compute SDK を使用することで、低電力でリアルタイムで物体検出を可能とするConvolutional Neural Network (CNN)を作成し、訓練し、実用化することができます。  こうして、Movidius™のNeural Network Compute Stickは、スーパーコンピュータなどを必要とせずに、ディープニューラルネットワーク(DNN)の開発を可能にします。単純にMovidiusスティックの100 Gflopsの演算力で、DNNのプロトタイピングとチューニングを行います。クラウド接続は要りません。USBスティック形状なのでホストコンピュータ(PCなど)に簡単に接続できます。単一のUSB Type-Aポートで提供される電源を用いて、同じプラットフォーム上で複数のNCSを接続して、実行することもできます。

NCS.jpg
Intel® Movidius™ Neural Compute Stick

 最小システム要件は:
x86-64 computer with Ubuntu 16.04 Desktop、または、Raspberry Pi with Raspbian Stretch Desktop 4.9
USB 2.0 Type-Aポート(USB 3.0を推奨)
1GB RAM
 

 このページでは、Raspberry Pi 3( Raspbian Stretch Desktop) に Intel® Movidius™ Neural Compute StickをUSB接続して、ライブ映像での物体検出プログラムの実装を行います。Movidius™ Neural Compute SDKをインストールするためには、micro SDはメモリサイズ32Gが必要です。16Gサイズですと、失敗します。さらに、スワップサイズを拡張しておくことも必要です。説明は以下にあります。

  Movidius NCS なしのケースは、ラズパイに人工知能を組み入れる にあります。

 

Last updated: 2018.7.15


関連記事
Raspbian Stretch OS のインストール
ラズパイに人工知能を組み入れる
PyTorchでObject Detection
TensorflowでObject Detection
Ubuntu 16.04のインストール/Raspi
ROS(Robot Operating System)/ubuntu
Raspberry Pi Mouseロボットでの操作の実際
著者のGitHub repositories

**************************************************************
Movidius NCS SDKのインストールと関連環境構築
**************************************************************


 Movidiusを使ってリアルタイム物体検出を行うときに使用するハードウェアは
RaspberryPi 3
Movidius™ Neural Compute Stick
LOGICOOL ウェブカム C270
です。
 必要とされるソフトウェアは
RASPBIAN STRETCH WITH DESKTOP 4.9
Python 3.5.3
pip 10.0.0
TensorFlow 1.3.1
Intel® Movidius™ Neural Compute SDK 1.12.00.01
です。Intel Movidius の公式ホームページはこちらです。

 Software Development Kit for the Neural Compute Stick(C/C++, or, Python3 Language API)、単純化した名称でNCSDK には、以下の2種類の使用法があります。
1. NCSDKで提供されているツールを使って、ホストシステム上でDNNモデルをプロファイリング、チューニング、及びコンパイルをする。
2. NCAPI(NCAPI v1, NCAPI v2)を使ったDNN推測の速度を加速化するために、NCSにアクセスして、ホストシステム上でユーザーアプリケーションをプロトタイピングする。
 この一連の流れは以下のワークフローの通りです。
ncs_workflow.jpg

 Neural Compute Stickはスイッチサイエンスから購入しました。インストール関連記事はスイッチサイエンスマガジンになります。NCSDKをインストールする前に環境設定をしておきます。

 最初に、pip3をインストールします。python2.7バージョンは使用しません。

$ sudo apt-get update
$ sudo apt-get install python3-pip python3-dev

 次に、Tensorflowをインストールします。Raspberry Pi ARM用のTensorFlowのインストールが必要です。

$ 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分足らずでインストールは完了します。

 2018年7月12日現在、Tensorflow 公式ホームページはRaspbian Stretch (Devian 9)をサポートするようになりました。TensorFlowの公式ホームページによれば、Tensorflowのインストールは以下の通りです。pip3 version 8.1 or higher が必要です。

$ sudo apt-get install python3-pip python3-dev
$ sudo apt install libatlas-base-dev
$ pip3 install tensorflow     
 

Atlas (libatlas-base-dev) はNumpyを用いた線形代数用のライブラリーで、Tensoflowの前にインストールします。

 Movidiusのためのncsdkをインストールする前に、スワップファイルのサイズを増大させておきます。デフォルトだとスワップファイルの設定が小さく、ncsdkのように規模が大きいソフトウェアのビルドをすると、失敗する確率が高くなります。スワップファイルを増加しておくのが必須です。修正が必要なswapfileは '/etc/dphys-swapfile' というファイルです。このファイルを開いて、以下の箇所を
CONF_SWAPSIZE=100
 以下のように増加変更します。
CONF_SWAPSIZE=1024
 変更後は以下のコマンドで再起動します。

$ sudo shutdown -r now


 再起動後、以下のコマンドで設定されているか確認します。

$ free -m


 以下のようにSwapが 1023になっていればOKです。
                  total       used       free     shared    buffers     cached
Mem:           862        818         43         15         19        643
-/+ buffers/cache:        156        705
Swap:         1023          0       1023

 それでは、MovidiusのSDKを公式サイトにある手順通りインストールします。最新バージョンはNCSDK2.xですが、Raspberry PiへのNCSDK 2のmake&install でエラーが発生して、正常に成功しませんでした。ここではNCSDK1.12をインストールしました。

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


 インストールに2時間以上かります。1時間経過したころに、OpenCVのインストールを続けるかどうか聞いてきますが、相当に時間がかかるので、'n' とします。他の仕事をしながら、コーヒーブレイクして待ちましょう。2時間程度でインストールは終了します。

 次に、上でインストールを省略したOpenCV3をRaspberry Piにインストールします。通常の手続きでOpenCVビルドをRaspberry Piでやると数時間かかってしまうので、以下のコマンドでバイナリパッケージでインストールします。数分でインストールできます。

$ 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

パッケージNCSDKは'/home/pi/ncsdk/' にインストールされます。利用可能な付属ネットワークのexamplesは以下の通りです。NCSDKのインストール後(make examplesの実行後)、すぐに使用可能になります。
Apps
 hello_ncs_py
 hello_ncs_cpp
 multistick_cpp
Caffe
 GoogLeNet
 AlexNet
 SqueezeNet
TensorFlow
 Inception_v1
 Inception_v3

 Intel Movidiusのテストをします。Movidius NCS が正常に動くか確認します。ncsdkの中には、Caffe、TensorFlowの学習済みモデルをMovidius用に変換したもの(graphファイルと呼びます)が入っています。GoogleのInceptionV3モデルを実行してみましょう。


$ cd ~/ncsdk/examples/tensorflow/inception_v3
(/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


成功です。
ElectricGuitar.jpg
サンプルの画像を「electric guitar」として認識しているのが分かります。

**************************************************************
Movidius NCS を用いたリアルタイム物体検出
**************************************************************


Movidiusが動く状態になったら、tiny-yoloモデルを使ってみます。 以下のコマンドでYoloNCSをダウンロードします。

$ git clone https://github.com/gudovskiy/yoloNCS.git
 
 

 学習モデルはyolo_tiny.caffemodelを使用します。重みのファイルは172MBあります。学習モデルの重みを保存するフォルダを作成しましょう。

$ mkdir  -p ~/yoloNCS/weights
 
 

 ダウンロードが完了したら、上記で作成したweightsフォルダ内に保存します。 学習モデルの重みの保存が完了したら、以下のコマンドでgraphバイナリーファイルを作成する必要があります。

$ cd yoloNCS
(yoloNCS)$ mvNCCompile prototxt/yolo_tiny_deploy.prototxt -w weights/yolo_tiny.caffemodel -s 12
 
 

'mvNCCompile' が重みファイルをgraphファイルに変換するコマンドです。あとは実行するだけです。アプリの終了は 'q' または 'Ctrl+c' を入力します。

(yoloNCS)$ python3 py_examples/object_detection_app.py
 
 

 無事カメラ映像が表示できれば成功です。このYOLOモデルが認識できる画像は
["aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", "cow", "diningtable", "dog", "horse", "motorbike", "person", "pottedplant", "sheep", "sofa", "train","tvmonitor"]
の20種類(Pascal VOC classes)だけです。laptop pcなどは検出できません。ちょっと粗雑な検出です。'q'を入力して、表示を終了します。最新のYOLOv2になると9000種類の認識が可能です。YOLOv2はCaffeには対応していません。Tensorflow あるいは Pytorch のフレームワーク上では、YOLOv2及びYOLOv3モデルを使用できますが、Caffeにはまだ対応するprototxtアプリが準備されていません。

---------------
寄り道をして、yolo_tinyを用いた画像識別を試みましょう。以下のようなコマンドでCaffe ModelをNCS用にコンパイルする必要がありますが、
(yoloNCS/py_examples)$ mvNCCompile -w yolo_tiny.caffemodel -s 12 ../prototxt/yolo_tiny_deploy.prototxt
すでに上の例で実行済みです。ここでは必要ありません。すでに、py_examplesディレクトリに graphが存在します。
Yolo_tiny (Caffe_model)を試してみます。

(yoloNCS/py_examples)$ python3 yolo_example.py ../images/dog.jpg


自転車とトラックは認識されましたが、犬は検出されていません。検出の精度は低いです。

ライブ映像からの物体検出:例2

OpenCVがインストールされているので、USB接続したWebカメラで読み込んだ映像から物体を検出して、推測結果を画面に表示します。
以下コマンドで、 @pon_dat さん作成のスクリプトをダウンロードします。

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

 以下のコマンドを実行すると物体検出が動きます。アプリの終了は表示画面上で 'q' またはターミナル上で 'Ctrl+c' を入力します。

(~/ncsdk/examples/tensorflow/inception_v3)$ python3 app.py Number of categories: 1001 Start download to NCS... ******************************************************************************* inception-v3 on NCS ******************************************************************************* 621 laptop, laptop computer 0.42847 625 library 0.1084 738 pop bottle, soda bottle 0.068054 682 notebook, notebook computer 0.066223 899 water bottle 0.055756 ******************************************************************************* Finished ----

web cameraからの映像の上部に検出された物体の名称が表示されます。物体検出のカテゴリー数は1000種類となっています。物体の検出枠取りはされていません。Movidiusのおかげで、検出速度は相当早いです。

上でダウンロードしたNCSDKの 'examples' 以外にも、Movidius NCSで利用できるDNNが多数提供されています。Neural Compute App Zoo GitHub repositoryと呼ばれるユーザーアプリケーションのリポジトリが利用できます。このリポジトリを以下のようにダウンロードします。

$ git clone https://github.com/movidius/ncappzoo.git
$ cd ncappzoo && make install 

'ncappzoo' という名称のディレクトリが作成され、そこにインストールされます。この後、各モデルを利用するために、それぞれ(apps, caffe, tensorflow)ディレクトリごとに 'make all' コマンドを入力します。詳細は、'MAKEFILE_GUIDANCE.md' を読んでください。とりあえず、'apps、caffe、 tensorflow' ディレクトリごとに'make all' しておきましょう。

$ cd /home/pi/ncappzoo/apps/
(/home/pi/ncappzoo/apps)$make all

$ cd /home/pi/ncappzoo/caffe/
(/home/pi/ncappzoo/caffe)$make all

$ cd /home/pi/ncappzoo/tensorflow/
(/home/pi/ncappzoo/tensorflow)$make all


いくつかのマイナーなエラー表示が出ますが、無視してください。

 最初に、'apps' で提供されているプログラムを活用します。'ssd-object-detector'を利用しましょう。以下のように入力します。

(ncappzoo/apps) $ cd ssd-object-detector
(ncappzoo/apps/ssd-object-detector) $ make run

 (以下のような表示が出ます)
making MobileNet SSD
(cd ../../caffe/SSD_MobileNet; test -f graph || make compile;)

Running ssd-object-detector.py
python3 ssd-object-detector.py
==============================================================
I found these objects in pic_064.jpg
Execution time: 80.2747ms
--------------------------------------------------------------
99.0%	12: dog: Top Left: (51, 47) Bottom Right: (179, 182)
==============================================================

犬の画像が表示されています。検出した画像を使うときは、その画像ファイル名を

$ python3 ssd-object-detector.py --image ../../data/images/pic_053.jpg


のように指定します。

 動画ファイルを用いた物体検出の方法について説明します。'video_objects'に配置されているスクリプトを使用します。最初に、対応する'graph'を作成するために、'make7 をします。

$ cd ncappzoo/apps/video_objects
$ make all



と入力します。video サンプルもインストールされます。ここで、

$ python3 video_objects.py


と打って、動画からの物体検出の事例が表示されます。使用されているCNNは、SSD + MobileNet です。

 ライブ映像からの物体検出のプログラムを実行してみましょう。実行用ファイルは 'live-object-detector.py' です。'graph' がないというエラーが出たら、'make all' をしてください。

$ cd /home/pi/ncappzoo/apps/live-object-detector
(/home/pi/ncappzoo/apps/live-object-detector)$ python3 live-object-detector.py

  ...
I found these objects in  ( 80.56 ms ):
96.0%	5: bottle: Top Left: (106, 459) Bottom Right: (481, 598)
95.0%	15: person: Top Left: (4, 407) Bottom Right: (455, 631)
79.0%	20: tvmonitor: Top Left: (99, 246) Bottom Right: (186, 355)


   ....

と実行すると、web cameraからの映像でリアルタイムの物体検出が行われます。このライブ映像の物体検出では、Tiny Yolo を用いて物体検出を行い、その切り取られた物体画像を GoogLeNet に送って、さらなる分類機器にかけています。 他に利用できるアプリとして、street_cam などがありますが、これらは2個のNCSを必要とします。詳しくは、README.mdファイルを読んでください。

 次に、Tensorflowのモデルを使用しましょう。分類は、ISVRC 1000 categoriesです。Tensorflowのモデルで使用可能な学習済みモデルは以下の通りとなっています。
facenet
inception_v1, inception_v2, inception_resnet_v2, inception_v3, inception_v4
mobilenets
MNIST

 例えば、'inception_v4'モデルを使いたい時の準備として、/tensorflow/inception_v4/で 'make all' をします。tensorflowのネットワークの重みファイルを 'graph' ファイルに変換します。この 'make all' 処理には結構時間がかかります。モデル 'inception_v4' が使用可能な状態になります。実行用スクリプトは 'run.py' です。

$ cd /home/pi/ncappzoo/tensorflow/inception_v4
(home/pi/ncappzoo/tensorflow/inception_v4)$ make all
(home/pi/ncappzoo/tensorflow/inception_v4)$ python3 run.py


NCSDKの項で説明した通り、electric guitarの検出結果が以下の通り表示されます。

Number of categories: 1001
Start download to NCS...
*******************************************************************************
inception-v4 on NCS
*******************************************************************************
547 electric guitar 0.9873
403 acoustic guitar 0.0091705
421 banjo 0.0015497
715 pick, plectrum, plectron 0.00080442
820 stage 0.00027895
***********************************************
Finished


 Caffeのモデルを利用するときも同様です。Tensorflowと異なり、各モデルに対する'make all' 処理は必要ないと思われます。以下のモデルが提供されています。
AgeNet   
AlexNet  
GenderNet     
GoogLeNet   
ResNet-18      
SqueezeNet
SSD_MobileNet  
TinyYolo

 Caffeにある各ネットワーク・モデルは1000種類の物体を分類・識別するCNNですが、これらのパッケージはライブ映像からの物体検出機能を組み込んではいません。ただし、SSD_MobileNet と TinyYolo はVOCの20クラス分類に対応します。
***** 以下、準備中 ****  

トップページに戻る