1. peisuke

    No comment

    peisuke
Changes in body
Source | HTML | Preview
@@ -1,242 +1,242 @@
# 概要
-AI流行っていますね。そんな中、IntelがUSBで動くDeep Learningスティック、[Movidius](https://www.movidius.com/)の販売を開始しました。このスティックは、Caffeのネットワークモデルの計算だけスティックで高速に実行するというものです。今年度の[CVPR2017](http://cvpr2017.thecvf.com/)で先行販売されたので、早速購入してきました。ちなみに余談ですが、僕が先頭に並んでいたので、世界で最も最初にこの製品を手にしました
+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で動かすなど興味は付きないので、試した分だけこちらに書いていこうと思います。