Intel Movidius(Neural Compute Stick)を用いたObject Detection on Mac

Intel® Movidius™ Neural Compute Stick(NCS)は、AIプログラミングを習得できるように設計された、ディープ・ラーニング(DNN)用のUSBスティックです。Movidius NCSは、より低い消費電力で作動する高い性能のMovidius™ビジュアル処理ユニット(VPU)を内蔵しています 。ビジュアル処理ユニット(VPU)は、すでに、膨大な個数のスマート・セキュリティ・カメラ、制御用ドローン、産業用視覚機器などに搭載されています。

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

NCS.jpg
Intel® Movidius™ Neural Compute Stick

 このページでは、Mac OS に Virtual Boxを使用してUbuntu 16.04をインストールして、Intel® Movidius™ Neural Compute Stickを活用します。NCSスティックをMacにUSB接続して、ビデオやライブ映像での物体検出プログラムの実装を行います。Movidius™ Neural Compute はMac OSやWindowsをサポートしていませんので、SDKをインストールするためには、MacにUbuntuをインストールする必要があります。

 

Last updated: 2018.8.10


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

************************************************************************************
MacへのVirtual BoxのインストールとUbuntu 16.04のインストール
************************************************************************************


 Movidiusを使ってリアルタイム物体検出を行うときに使用したハードウェアは

MacBook Air 4GB(MacOS Sierra)
Movidius™ Neural Compute Stick
LOGICOOL ウェブカム C270
です。

 必要するソフトウェアは

VirtualBox-5.2
Ubuntu 16.04 LTS
Python 3.5.3
pip 8.0.0 or higher
TensorFlow 1.7.1
Intel® Movidius™ Neural Compute SDK 1.12.00.01
です。

 最初に、VirtualBoxのインストール方法について説明します。まずは VirtualBox のインストーラをダウンロードします。次の URL へアクセスします。

https://www.virtualbox.org/wiki/Downloads

mac-virtualbox_1.png
最新のVirtualBox(2018年7月時点で5.2.16)をダウンロードします。OS X hostsがMac向けのファイルです。以下をクリックしても、ダウンロードできます。

VirtualBox-5.2.16-123759-OSX.dmg

以下をクリックして、Extension Packも忘れずにダウンロードしておきます。
Oracle_VM_VirtualBox_Extension_Pack-5.2.16.vbox-extpack

 ダウンロードしたdmgファイルを開くと、
mac-virtualbox_2.png
のうなウインドウが表示されます。VirtualBox.pkg をダブルクリックします。そのあとは、示された手順通りに進みます。VirtualBoxがインストールできたら、Extension Packのファイルをダブルクリックして、インストールします。

 VirtualBox5.2.16がインストールできたら、Ubuntuのイメージファイルをダウンロードします。Ubuntu 16.04のディスクイメージを入手します。Ubuntu Japanese Teamのホームページからubuntu16.04-desktop-amd64.isoファイルをダウンロードします。以下のダウンロードURLからダウンロードしてください。
ubuntulinux.jpのサイト
北陸先端科学技術大学院大学
KDDI 研究所


 次にVirtualBoxを起動しましょう。Launchpadから起動すると,次のような画面が表示されます。
mac-virtualbox_3.png
[新規]を押して,Linuxタイプの仮想マシン(VM)を以下の通りに作成しましょう。
mac-virtualbox_4.png
[続く]をクリックして、いくつかの設定をします。メモリは約2ギガ、ディスク容量は可変で約40ギガ位に設定します。
mac-virtualbox_5.png
作成した仮想マシンが左側の仮想マシン一覧に追加されて、表示されます。この作成した仮想マシンを選択し、左上の設定ボタンを押します。

 仮想マシンの設定ダイアログが表示されたら、左側のメニューから「ストレージ」を選択します。
mac-virtualbox_6.png
コントローラー:IDEの横にある[+]をクリックし、光学ドライブの追加を行います。プルダウンメニューに表示されているubuntu16.04.isoディスク(事前にダウンロードしておいたUbuntu isoファイル)を選択します。 これでUbuntu16.04をインストールするために必要な準備は完了しました。sudo rebootします。一旦、VirtualBoxを閉じます。

 再度、Virtualboxを起動して、ubuntu16.04を仮想マシンにインストールします。以下の画面が表示されますので、通常のubuntuのインストールと同じに行います。
mac-virtualbox_7.png
 20分程度でインストールは終了します。定石通りに、

$ sudo apt update
$ sudo apt upgrade
$ sudo apt install git


としておきます。インストールが終わったら,Deviceメニューの[Shared Clipboard]から[Bidirectional]も選んで起きましょう。VMをまたいでコピー&ペーストできるようになるので非常に便利です。一旦再起動してターミナルを開き,次は、Movidius SDKのインストールです。

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


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

 MovidiusをMacに接続します。接続は簡単で,USB端子に挿すだけです。次にVirtualBoxの仮想マシンの設定画面を開き,ポートのUSB設定で,USB 3.0 (xHCI) コントローラを選択します(Extension Packを入れていないと選択できないので注意)。次にUSB デバイスフィルターの右側の,プラスがついたアイコンをクリックし,Movidiusを選択します。うまく認識されていないと表示されないので,その場合は差しなおしてみて下さい。

NCSDKをインストールする前に環境設定をしておきます。以下の環境設定(tensorflowのインストールなど)は必須ではありませんので、この箇所を飛ばして、NCSDKのインストールに進んでも構いません。

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

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

 次に、Tensorflowをインストールします。

$ pip3 install tensorflow


数分足らずでインストールは完了します。

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

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


 途中で、インストールされているOpenCVのアンインストールをするかどうか聞いてきますので、[yes]とします。新たにNCS専用のopencvがインストールされます。20分程度で、インストールは終了します。

 パッケージNCSDKは'~/ncsdk/' にインストールされます。Intel Movidiusのテストをします。Movidius NCS が正常に動くか確認します。ncsdkに付属のexamples をインストールして、そのモデルを使用してテストをします。そのために、

$ make examples


とmakeします。このmakeの途中に、以下のようなエラーが出ます。
mac-virtualbox_8.png
[Error 7] Toolkit Error: USB Failure. Code: No devices found.と表示されています。これは、Movidius NCS が認識されていないことを意味します。

 VMのubuntuを終了して、VirtualBoxマネジャーの[設定]で[ポート]をクリックして、USBのプルダウンメニューでUSBフィルターを追加するをクリックして、Movidius NCSに対応するdevice名を選択します。理由は不明ですが、Movidius Ltd. Movidius MA2X5X、Movidius VSC Loopback Device、Intel Corporation VSC Loopback Device という3種類のデバイス名を持っているようです。

 一旦、VBを終了して、再度VBからVMのubuntuを再起動してください。再起動後は、make examples は正常に終了すると思います。

 make examplesが正常に終了したら、ncsdkを使用してみましょう。

$ cd ~/ncsdk/examples/apps/hello_ncs_py
(/ncsdk/examples/apps/hello_ncs_py) $ python3 hello_ncs.py


と入力します。正常に終了したら
Hello NCS! Device opened normally.
Goodbye NCS! Device closed normally.
NCS device working.

と表示されます。これで、NCSDKを用いてMovidiusが正常に動作することが確認できました。  

**************************************************************
Movidius NCS を用いた物体検出
**************************************************************


 Movidiusが動く状態になったら、ncsdkのモデルを使ってみます。 利用可能な付属ネットワークのexamplesは以下の通りです。NCSDKのインストール後(make examplesの実行後)、すぐに使用可能になります。
Apps
 hello_ncs_py
 hello_ncs_cpp
 multistick_cpp
Caffe
 GoogLeNet
 AlexNet
 SqueezeNet
TensorFlow
 Inception_v1
 Inception_v3

ncsdkの中に、Caffe、TensorFlowの学習済みモデルをMovidius用に変換したもの(graphファイルと呼びます)が作成されて、これらの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」として認識しているのが分かります。



上でダウンロードした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 ncappzoo/apps/
(ncappzoo/apps)$make all

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

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


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

 最初に、'apps' で提供されているプログラムを活用します。appsには以下のCNNが提供されています。

MultiStick_GoogLeNet
MultiStick_TF_Inception
benchmarkncs
birds
classifier-gui
gender_age_lbp
hello_ncs_py
image-classifier
live-image-classifier-PiCam
live-image-classifier
live-object-detector
log-image-classifier
rapid-image-classifier
security-cam
ssd-object-detector
stream_infer
stream_ty_gn
stream_ty_gn_threaded
street_cam
street_cam_threaded
topcoder_example
video_face_matcher
video_face_matcher_multipleFace
video_objects

 ここでは、'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'を作成するために、'make' をします。

$ cd ncappzoo/apps/video_objects
$ make all



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

$ python3 video_objects.py


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

 次に、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にある各ネットワーク・モデル(SSD_MobileNet と TinyYoloを除いた)は1000種類の物体を分類・識別するCNNです。が、これらのモデルはライブ映像からの物体検出機能を組み込んではいません。

 SSD_MobileNet と TinyYolo はVOCの20クラス分類にのみ対応しています。したがって、認識できる画像は
["aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", "cow", "diningtable", "dog", "horse", "motorbike", "person", "pottedplant", "sheep", "sofa", "train","tvmonitor"]
の20種類(Pascal VOC classes)だけです。

**********************************************************************
Movidius NCS を用いて、ライブ映像からの物体検出
**********************************************************************


 Movidius NCS を用いて、ライブ映像からの物体検出するためには、VMでWeb カメラを使用できるように設定することが必要です。Macに接続されたWeb カメラをVMで使用するために、Mac OSのターミナルで作業します。VirtualBoxをインストールすると、VBoxManageコマンドが使えるようになっています。MacのターミナルからVBoxManage list runningvmsとVBoxManage list webcamsを打って、起動中の仮想マシン名と使用するWebカメラのパスを確認します。

MacBook-Air:~ koichi$ VBoxManage list runningvms
"Ubuntu 16.04" {54d6ff17-d0e5-43d3-8e5f-e3c3a0501cf1}
MacBook-Air:~ koichi$ VBoxManage list webcams
Video Input Devices: 2
.1 "ロジテック社製カメラ"
0xfd110000046d081b
.2 "FaceTimeカメラ(内蔵)"
0xfa20000005ac850a


"Ubuntu 16.04" が、目的のゲストOSが動いている起動中の仮想マシン名、0xfd110000046d081bが使用するWebカメラパスです。Webカメラを仮想マシンにアタッチします。

MacBook-Air:~ koichi$ VBoxManage controlvm "Ubuntu 16.04" webcam attach 0xfd110000046d081b
または
MacBook-Air:~ koichi$ VBoxManage controlvm "Ubuntu 16.04" webcam attach .1


仮想マシン名とWebカメラのパスは自分の環境のものに置き換えてください。コマンドを打った後、何も出なければ成功です。

 VirtualBoxのUbuntu画面に戻り、DevicesのメニューにWebcamsが追加されているはずです。先ほどアタッチしたWebカメラを選択します。チェックがついていなかったら選択してください。(上記の 'webcam attach'をしなくても、DevicesメニューのWebcamsに使用するwebカメラが追加されていることもあります。この場合、上記の'webcam attach'のコマンドの入力は必要なく、カメラをチェックして選択するだけですみます。)

**********************************************************************


 以上の作業が終了したら、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を用いた画像識別を試みましょう。

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


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

**********************************************************************


inception_v3 を用いたライブ映像からの物体検出:

 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のおかげで、検出速度は相当早いです。

**********************************************************************


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

$ cd ncappzoo/apps/live-object-detector
(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ファイルを読んでください。

トップページに戻る