1. peisuke

    Posted

    peisuke
Changes in title
+Rasberrypi3でMovidiusのサンプルまでを動かしてみた
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,242 @@
+
+# 概要
+
+AI流行っていますね。そんな中、IntelがUSBで動くDeep Learningスティック、[Movidius](https://www.movidius.com/)の販売を開始しました。このスティックは、Caffeのネットワークモデルの計算だけスティックで高速に実行するというものです。今年度の[CVPR2017](http://cvpr2017.thecvf.com/)で先行販売されたので、早速購入してきました。ちなみに余談ですが、僕が先頭に並んでいたので、世界で最も最初にこの製品を手にしました。
+
+![スクリーンショット 2017-07-31 2.52.29.png](https://qiita-image-store.s3.amazonaws.com/0/146529/322f7bfd-4713-736e-cdae-a595bf7458c0.png "スクリーンショット 2017-07-31 2.52.29.png")
+
+
+本記事では、取り敢えずMovidiusをRasberrypi3で動かすまでの手順について紹介します。本当はRealTimePoseMachineとかで姿勢推定までやりたかったですが、時間が足りなかったので近々実施します。実はこの記事の前に、できればMacで動かしたいという気持ちでVirtualBoxで試したり色々動かなかったという作業を永遠とやっていたので、もし動いたら教えて欲しいです・・・!
+
+![スクリーンショット 2017-07-31 2.51.18.png](https://qiita-image-store.s3.amazonaws.com/0/146529/f262bb7f-100c-f475-38eb-dfc375dd4724.png "スクリーンショット 2017-07-31 2.51.18.png")
+
+
+# Rasberrypi3へのUbuntuインストール
+
+ラズパイで遊ぶといえば、OSは大抵Rasbianですが、MovidiusはUbuntuのみ対応ですので、Ubuntuをインストールします。今回はラズパイ3をターゲットにしていますが、仕様的にはZEROや2でも大丈夫に見えます。こちらも時間があったら調査したい気持ちは少しあります。
+
+まずは、OSのインストールの手順。OSを[ここ](https://wiki.ubuntu.com/ARM/RaspberryPi)からダウンロードしてきます。なお、この作業はMac上で行うことを前提としておきます。
+
+```
+$ wget http://www.finnie.org/software/raspberrypi/ubuntu-rpi3/ubuntu-16.04-preinstalled-server-armhf+raspi3.img.xz
+```
+
+まず、OSを入れるmicroSDを用意ます。PCにmicroSDをセットし、
+
+```
+diskutil list
+```
+
+などでディレクトリを確認し、
+
+```
+diskutil umountDisk /dev/disk2
+```
+
+でアンマウントしておきましょう。
+次に、先ほどダウンロードしたOSイメージを解凍してmicroSDに焼き込みます。Macの場合は、xzを扱うためにツールをインストールしておきます。
+
+```
+$ brew install xz
+$ xzcat ubuntu-16.04-preinstalled-server-armhf+rasPi 3.img.xz | sudo dd of=/dev/disk2
+```
+
+1〜2時間ほど待つと焼き終わると思います。ここでの作業は、これで終了ですのでmicroSDを抜いてラズパイ側にセットしましょう。
+
+# Rasberrypi3の準備
+
+大した作業ではないですが、リモートで作業できたほうが良いですので、簡単なセットアップをします。
+
+```
+sudo apt-get update
+sudo apt-get install avahi-daemon
+```
+
+以降、別マシンから```ssh ubuntu@ubuntu.local```でログインできるようになります。
+
+# Movidiusのセットアップ
+
+ここからが、Movidiusの準備です。と言っても、一箇所を除き[公式動画](https://www.youtube.com/watch?v=ZtgBTk7HuJU)をそのまま動かすだけですが・・・。作業はラズパイにsshで入って、適当な場所で行います。僕はホーム直下でそのままやっちゃっています。
+
+まずは、SDKをダウンロードおよび解凍します。
+
+```
+$ wget https://ncs-forum-uploads.s3.amazonaws.com/ncsdk/MvNC_SDK_01_07_07/MvNC_SDK_1.07.07.tgz
+$ tar xvf MvNC_SDK_1.07.07.tgz
+$ tar xvf MvNC_API-1.07.07.tgz
+$ tar xvf MvNC_Toolkit-1.07.06.tgz
+```
+
+続いてインストール作業を行います。まずは、caffe環境をラズパイに入れます。これが結構長く、数時間待ちですので、気長に待ちます。
+
+```
+cd bin
+seup.sh
+```
+
+ここで、環境変数の再読込みなど色々あるので、一旦ログアウトし再度ログインします。その上で依存関係のチェックを行います。以下のコマンドで何も出なければOKです。
+
+```
+cd bin
+make check
+```
+
+次に、諸々のモデルなどのインストールです。
+
+```
+cd ncapi
+./setup.sh
+```
+
+すると、下記エラーが僕の環境では出ました。
+
+```
+Traceback (most recent call last):
+ File "/usr/local/lib/python3.5/dist-packages/mvnc/mvncapi.py", line 7, in <module>
+ f = CDLL("./libmvnc.so")
+ File "/usr/lib/python3.5/ctypes/__init__.py", line 347, in __init__
+ self._handle = _dlopen(self._name, mode)
+OSError: ./libmvnc.so: cannot open shared object file: No such file or directory
+```
+
+これは、ラズパイ用にライブラリが正常にインストールされていないと起こるようです。ラズパイ用のライブラリのインストールは下記で行います。
+
+```
+$ cd ncapi/redist/pi_jessie
+$ sudo dpkg -i *
+```
+
+再度、モデルの構築を行いますが、続きのみで良いので、
+
+```
+$ cd ncapi/tools
+$ ./convert_models.sh
+```
+
+で実行します。今度はエラーが消えたと思います。ただし、最後に
+
+```
+[Error 28] Caffe Error: MemoryError. Potential Cause: Available RAM not sufficient for Network to be loaded into Caffe
+```
+
+と出ます。ラズパイだとAlexNetは大きすぎるっぽいですね。
+
+# Movidiusの実行
+
+さて、ここからはマニュアル通りに少しずつ確認していきます。最初は上記でcompileしてできたであろうgraphファイルをチェックします。
+
+```
+$ cd bin
+$ python3 mvNCProfile.pyc ./data/lenet8.prototxt -w ./data/lenet8.caffemodel
+```
+
+出力は下記のようになります。
+
+```
+ubuntu@ubuntu:~/bin$ python3 mvNCProfile.pyc ./data/lenet8.prototxt -w ./data/lenet8.caffemodel
+mvNCProfile v02.00, Copyright @ Movidius Ltd 2016
+
+USB: Transferring Data...
+Time to Execute : 7.54 ms
+USB: Myriad Execution Finished
+Time to Execute : 6.58 ms
+USB: Myriad Execution Finished
+USB: Myriad Connection Closing.
+USB: Myriad Connection Closed.
+Network Summary
+
+Detailed Per Layer Profile
+Layer Name MFLOPs Bandwidth MB/s time(ms)
+========================================================================================
+0 conv1 5.530 258.44 1.20
+1 pool1 0.014 304.65 0.09
+2 conv2 4.301 252.09 0.91
+3 pool2 0.004 160.46 0.04
+4 ip1 0.002 2083.80 0.41
+5 ip2 0.001 481.20 0.02
+6 softmax 0.000 0.61 0.03
+----------------------------------------------------------------------------------------
+ Total inference time 2.70
+----------------------------------------------------------------------------------------
+
+Generating Profile Report 'output_report.html'...
+```
+
+これは、ネットワークを可視化するもので、```output_report.html```に結果が出力されます。以下に途中までの図を記載します。
+
+![スクリーンショット 2017-07-31 2.44.09.png](https://qiita-image-store.s3.amazonaws.com/0/146529/9e6782b7-a2db-07aa-d316-4a5164ec945c.png "スクリーンショット 2017-07-31 2.44.09.png")
+
+
+次に、ネットワークの動作チェックをします。
+
+```
+$ python3 ./mvNCCheck.pyc ./data/lenet8.prototxt -w ./data/lenet8.caffemodel -S 255 -M ./data/imagenet_mean.py
+```
+
+結果は下記となります。
+
+```
+ubuntu@ubuntu:~/bin$ python3 ./mvNCCheck.pyc ./data/lenet8.prototxt -w ./data/lenet8.caffemodel -S 255 -M ./data/imagenet_mean.py
+mvNCCheck v02.00, Copyright @ Movidius Ltd 2016
+
+USB: Transferring Data...
+USB: Myriad Execution Finished
+USB: Myriad Connection Closing.
+USB: Myriad Connection Closed.
+Result: (1, 10)
+1) 8 0.48267
+2) 2 0.34961
+3) 4 0.09375
+4) 6 0.029266
+5) 3 0.015182
+Expected: (10,)
+1) 8 0.48413
+2) 2 0.3479
+3) 4 0.09436
+4) 6 0.029251
+5) 3 0.015228
+------------------------------------------------------------
+ Obtained values
+------------------------------------------------------------
+ Obtained Min Pixel Accuracy: 0.3530004993081093% (max allowed=2%), Pass
+ Obtained Average Pixel Accuracy: 0.08027215953916311% (max allowed=1%), Pass
+ Obtained Percentage of wrong values: 0.0% (max allowed=0%), Pass
+ Obtained Pixel-wise L2 error: 0.15237264986375257% (max allowed=1%), Pass
+ Obtained Global Sum Difference: 0.0038862228393554688
+------------------------------------------------------------
+```
+
+さて、ここまで来たら、後は簡単な認識をやってみましょう。まずはプログラムをビルドします。
+
+```
+$ cd ncapi/c_examples/
+$ make
+```
+
+そしたら、compileして作成したgraphを実行してみましょう。
+
+```
+./ncs-fullcheck -c1 ../networks/GoogLeNet ../images/cat.jpg
+```
+
+![cat.jpg](https://qiita-image-store.s3.amazonaws.com/0/146529/96f60196-e025-6f5e-e5fc-d7123c8f5985.jpeg "cat.jpg")
+
+
+
+結果は下記となります。
+
+```
+ubuntu@ubuntu:~/ncapi/c_examples$ ./ncs-fullcheck -c1 ../networks/GoogLeNet ../images/cat.jpg
+OpenDevice 1.5 succeeded
+Graph allocated
+Persian cat (46.17%) Egyptian cat (17.80%) tabby, tabby cat (7.54%) lynx, catamount (7.19%) Arctic fox, white fox, Alopex lagopus (5.78%)
+Inference time: 569.193970 ms, total time 582.029392 ms
+Deallocate graph, rc=0
+Device closed, rc=0
+```
+
+速度は0.5秒とMovidiusが使えているか微妙に見える結果ですね、ラズパイとすると早いのだろうか。そして本当は```Egyptian cat```が1位に来るはずですが、うまくはいってない模様です。近々確認してみます。
+
+# まとめ
+
+今回の記事では、一先ずラズパイでMovidiusが動くところまでを実施しました。精度・速度とともに未検証なので、まずは次回はその検証を行います。実用上好きなCaffeモデルを扱う所が重要ですが、それも次々回以降に試していこうと思います。その他ラズパイに載せたカメラで認識する、Dockerで動かすなど興味は付きないので、試した分だけこちらに書いていこうと思います。