ラズパイでカメラを使ったリアルタイム物体検知(具体的には人とイノシシ)がやりたかったのですが、最近機械学習が流行りに流行りすぎてネットの記事が色々ありすぎてどれを参考にすればいいのか分からなすぎたので、まとめました。
「誰」ではなくて「何」を検知したい場合はぜひ参考になさってください。
※例えば、「ゴールデンレトリーバー」じゃなくて「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で動かすってのをやってみようと思います。