技術メモ

ラズパイ×カメラモジュール × Movidius Neural Compute StickでリアルタイムObjectDetection(物体検出)

ラズパイでカメラを使ったリアルタイム物体検知(具体的には人とイノシシ)がやりたかったのですが、最近機械学習が流行りに流行りすぎてネットの記事が色々ありすぎてどれを参考にすればいいのか分からなすぎたので、まとめました。

「誰」ではなくて「何」を検知したい場合はぜひ参考になさってください。

※例えば、「ゴールデンレトリーバー」じゃなくて「dog」、「太郎さん」じゃなくて「person」として検知したい時です。

1.ラズパイセットアップ

ラズパイのOSをセットアップします。この手順は他サイトに山ほど情報がありますのでここでは記載しません。

なお、その際にカメラをONの設定にしておいてください。

また、USBカメラではなくラズパイのカメラモジュールを使う場合には、↓のように「CAMERA」に接続しましょう!自分はこれを間違えて何時間もハマりました(-_-)  思い込みってコワい。。

2.pip3インストール

pip3をインストールします。

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

3.TensorFlowインストール

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
$ sudo apt install libatlas-base-dev
$ pip3 install tensorflow

4.swapサイズ増やす

Movidius Neural Compute Stick を使用するにはデフォルトのスワップサイズだとエラーが発生する場合があるみたい。

swapサイズを増やします。

変更するファイル : /etc/dphys-swapfile

CONF_SWAPSIZE=2048

再起動します。

sudo reboot

変更されているか確認します。

free -m

5.カメラを使えるようにします

ラズパイのOSインストール時にカメラをONにしても、以下のコマンドでV4L2ドライバをロードしてやらないと/dev/video0が作成されません。

sudo modprobe bcm2835-v4l2

このままだと再起動時にまた/dev/video0が消えてしまいます。

ラズパイ起動時に毎回ロードされるようにするため、/etc/modules に以下を追加します。

bcm2835-v4l2

6.Caffeインストール

Neural Compute StickのSDKのサンプルを使うにはCaffeが必要なのでインストールします。

sudo apt install caffe-cpu

7.Neural Compute StickのSDKをインストール

すんごく長いです。2時間くらいはかかります。途中1時間くらいでOpenCVをインストールするか聞いてくるので、「n」とします。

※OpenCVは、次項で早い方法でインストールします。

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

8.OpenCVをインストール

$ 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 

9.試してみる

SDKのサンプルはこんな感じです。

Apps
 hello_ncs_py
 hello_ncs_cpp
 multistick_cpp
Caffe
 GoogLeNet
 AlexNet
 SqueezeNet
TensorFlow
 Inception_v1
 Inception_v3

試しに物体検知の学習済みモデルで1000種類を識別できるTensorFlowの「Inception_v3」が動くか試してみます。

$ 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

10.リアルタイム物体検出してみる

@pon_dat さんのスクリプトをダウンロードします。

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

ラズパイで実行します。

python3 app.py

これでカメラの映像とともに検出結果が出ます。

・・・でもこの「Inception_v3」、イノシシ(wild boar, boar, Sus scrofa)は検出できても、「person」がない(T_T)

11.リアルタイム物体検出してみる(person)

ダウンロードしたNCSDKの「examples」以外にも、Movidius NCSで利用できるDNNが提供されています。Neural Compute Application Zoo (NC App Zoo)と呼ばれるGitHubリポジトリが利用できます。

このリポジトリをダウンロード、ビルドします。(ディレクトリはお好きなところへ変更してください)

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

ディレクトリごとにビルドします。

$ cd ncappzoo/apps/
(ncappzoo/apps)$sudo make all

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

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

リアルタイム物体検出してみます。

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

・・・これはpersonは検出できるけど、イノシシは検出できません。。。

12.おわりに

今回は、学習済みモデルを使ってカメラの映像をリアルタイムに物体検出するサンプルを動かす手順をまとめました。

今回やりたかった「人とイノシシを検出」は一撃ではできませんでしたが、今後転移学習や独自学習モデルを生成してMovidius Compute Stickで動かすってのをやってみようと思います。