MobileNet-SSD-RealSense
#◆ 前回記事
デプスカメラRealSenseD435で "紫色のイカ" や "オレンジ色の玉ねぎ" を切り取ったり "金髪の人" を追っかけて距離を測る(1) with Ubuntu16.04 の続き
#◆ はじめに
[2018/07/05] 手順を大幅に更改
どうも。 ギャンブルジャンキー改め、ハードウェアジャンキーです。
前回は、ありきたりな Ubuntu16.04 + C++
で環境を構築して味見をした。
今回はエッジコンピューティングを見越して RaspberryPi3 + Raspbian Stretch + Python
の環境を構築する。
Raspbianでは、aptコマンドで導入できないため、ソースをビルドして導入する。
やっていることは前回と変わらないので、うまくいった手順を簡潔に記載。
なお、MobileNet-SSDの実装は更に次回取り組もうと思う。
※ 海外の方からヘルプのコメントをいただいたため、急いで仕上げた。
【注意点】 OpenGL Driver を有効にすると、OpenCVの 「imshow」 メソッドが正常に動作しなくなる点を受け入れる必要がある。 こちらの記事の実装 のように、OpenCVの 「imshow」 メソッドに頼らないでOpenGLの描画系メソッドだけで描画処理を実装しなくてはならない点に注意。
#◆ 参考にさせていただいた記事、謝辞
【Intel公式】 RaspberryPi3 Install (Ubuntu MATE)
#◆ 環境
1.RaspberryPi3 + Raspbian Stretch (with USB2.0 Port)
2.Intel RealSense D435
3.Intel Movidius Neural Compute Stick (展開スピードを優先するため、一旦保留)
4.OpenCV3.4.x
5.TBB (Intel Threading Building Blocks)
6.OpenGL Driver
7.HDMIディスプレイ
#◆ 作業に掛かる前の前提条件
Raspbian Stretch+NCS(Neural Compute Stick)+YoloV2+Webカメラ+ROSによるリアルタイム複数動体検知環境の構築 の記事を参考に、作業を実施済みであることを前提とする。
#◆ RaspberryPi3 + Raspbian Stretch環境への導入
1.HDMIディスプレイを接続する
2.RealSense D435はプラグアウトしておく
3.必要なパッケージのバージョンを確認する
$ uname -a
Linux raspberrypi 4.14.34-v7+ #1110 SMP Mon Apr 16 15:18:51 BST 2018 armv7l GNU/Linux
$ sudo apt update;sudo apt upgrade
$ sudo reboot
$ uname -a
Linux raspberrypi 4.14.50-v7+ #1122 SMP Tue Jun 19 12:26:26 BST 2018 armv7l GNU/Linux
$ gcc -v
gcc version 6.3.0 20170516 (Raspbian 6.3.0-18+rpi1+deb9u1)
$ cmake --version
cmake version 3.7.2
4.SWAP領域を最大の2GBまで拡張する
$ sudo nano /etc/dphys-swapfile
CONF_SWAPSIZE=2048
$ sudo /etc/init.d/dphys-swapfile restart swapon -s
5.追加パッケージのインストールとudevルールの更新
$ sudo pip3 install pillow lxml jupyter matplotlib cython
$ sudo apt install -y git libssl-dev libusb-1.0-0-dev pkg-config libgtk-3-dev \
libglfw3-dev at-spi2-core libdrm* python-tk libjpeg-dev libtiff5-dev \
libjasper-dev libpng12-dev libavcodec-dev libavformat-dev \
libswscale-dev libv4l-dev libxvidcore-dev libx264-dev qt4-dev-tools \
autoconf automake libtool curl libatlas-base-dev mesa-utils* \
libglu1* libgles2-mesa-dev libopenal-dev cmake-curses-gui
$ sudo apt update;sudo apt upgrade
$ cd /etc/udev/rules.d/
$ sudo wget https://raw.githubusercontent.com/IntelRealSense/librealsense/master/config/99-realsense-libusb.rules
$ sudo udevadm control --reload-rules && udevadm trigger
6.cmakeのバージョンが 3.7.2
と古かったため、一時的に 3.11.4
へバージョンアップする。 ターミナルを閉じると元のバージョンに戻る。
$ cd ~
$ wget https://cmake.org/files/v3.11/cmake-3.11.4.tar.gz
$ tar -zxvf cmake-3.11.4.tar.gz;rm cmake-3.11.4.tar.gz
$ cd cmake-3.11.4
$ ./configure --prefix=/home/pi/cmake-3.11.4
$ make -j1
$ sudo make install
$ export PATH=/home/pi/cmake-3.11.4/bin:$PATH
$ source ~/.bashrc
$ cmake --version
cmake version 3.11.4
7.LD_LIBRARY_PATHを登録する
$ nano ~/.bashrc
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
$ source ~/.bashrc
8.Google の protobufパッケージ v3.5.1
を導入する
$ cd ~
$ git clone --depth=1 -b v3.5.1 https://github.com/google/protobuf.git
$ cd protbuf
$ ./autogen.sh
$ ./configure
$ make -j1
$ sudo make install
$ cd python
$ export LD_LIBRARY_PATH=../src/.libs
$ python3 setup.py build --cpp_implementation
$ python3 setup.py test --cpp_implementation
$ sudo python3 setup.py install --cpp_implementation
$ export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=cpp
$ export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION_VERSION=3
$ sudo ldconfig
$ protoc --version
9.Intel の TBB
を導入する
$ cd ~
$ wget https://github.com/PINTO0309/TBBonARMv7/raw/master/libtbb-dev_2018U2_armhf.deb
$ sudo dpkg -i ~/libtbb-dev_2018U2_armhf.deb
$ sudo ldconfig
$ rm libtbb-dev_2018U2_armhf.deb
10.古いOpenCVをアンインストールする
$ cd ~/opencv-3.x.x/build
$ sudo make uninstall
$ cd ~
$ rm -r -f opencv-3.x.x
$ rm -r -f opencv_contrib-3.x.x
11.OpenGLやDNNやTBBを有効にした OpenCV 3.4.1
を再導入する(3時間30分必要)
$ cd ~
$ wget -O opencv.zip https://github.com/Itseez/opencv/archive/3.4.1.zip
$ unzip opencv.zip;rm opencv.zip
$ wget -O opencv_contrib.zip https://github.com/Itseez/opencv_contrib/archive/3.4.1.zip
$ unzip opencv_contrib.zip;rm opencv_contrib.zip
$ cd ~/opencv-3.4.1/;mkdir build;cd build
$ cmake -D CMAKE_CXX_FLAGS="-DTBB_USE_GCC_BUILTINS=1 -D__TBB_64BIT_ATOMICS=0" \
-D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D INSTALL_PYTHON_EXAMPLES=OFF \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.4.1/modules \
-D BUILD_EXAMPLES=OFF \
-D PYTHON_DEFAULT_EXECUTABLE=$(which python3) \
-D INSTALL_PYTHON_EXAMPLES=OFF \
-D BUILD_opencv_python2=ON \
-D BUILD_opencv_python3=ON \
-D WITH_OPENCL=OFF \
-D WITH_OPENGL=ON \
-D WITH_TBB=ON \
-D BUILD_TBB=OFF \
-D WITH_CUDA=OFF \
-D ENABLE_NEON:BOOL=ON \
-D WITH_QT=OFF \
-D BUILD_TESTS=OFF ..
$ make -j1
$ sudo make install
$ sudo ldconfig
12.Intel® RealSense™ SDK 2.0をインストールする
$ cd ~
$ git clone https://github.com/IntelRealSense/librealsense.git
$ cd ~/librealsense;mkdir build;cd build
$ cmake .. -DBUILD_EXAMPLES=true -DCMAKE_BUILD_TYPE=Release
又は
$ cmake .. -DBUILD_EXAMPLES=true
$ make -j1
$ sudo make install
13.RealSenseとOpenCVの連携サンプルをビルドする
$ cd ~/librealsense/wrappers/opencv;mkdir build;cd build
$ cmake ..
$ nano ../latency-tool/CMakeLists.txt
target_link_libraries(rs-latency-tool ${DEPENDENCIES})
↓下記のように変更して保存
target_link_libraries(rs-latency-tool ${DEPENDENCIES} pthread)
$ make -j $(($(nproc) + 1))
$ sudo make install
14.RealSenseのPythonラッパーをビルドする
$ cd ~/librealsense/build
#Python3.x系で使用するとき
$ cmake .. -DBUILD_PYTHON_BINDINGS=bool:true -DPYTHON_EXECUTABLE=$(which python3)
又は
#Python2.x系で使用するとき
$ cmake .. -DBUILD_PYTHON_BINDINGS=bool:true -DPYTHON_EXECUTABLE=$(which python)
$ make -j1
$ sudo make install
15.PYTHONPATH環境変数を追加
$ nano ~/.bashrc
export PYTHONPATH=$PYTHONPATH:/usr/local/lib
$ source ~/.bashrc
16.Python3によるpyrealsense2ライブラリのインポート確認
$ python3
Python 3.5.3 (default, Jan 19 2017, 14:11:04)
[GCC 6.3.0 20170124] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pyrealsense2
>>> exit()
17.OpenGLドライバーを有効にする
$ sudo apt-get install python-opengl
$ sudo -H pip3 install pyopengl
$ sudo -H pip3 install pyopengl_accelerate
$ sudo raspi-config
"7.Advanced Options" - "A7 GL Driver" - "G2 GL (Fake KMS)"
18.RaspberryPiを再起動する
$ sudo reboot
19.SWAP領域をデフォルトサイズに戻す
$ sudo nano /etc/dphys-swapfile
CONF_SWAPSIZE=100
$ sudo /etc/init.d/dphys-swapfile restart swapon -s
20.RealSense D435をUSBポートに接続する
#◆ RealSenseの素の動作を味見
$ realsense-viewer
Corei7 から ARM へ移行したはずなのに、想像していたよりも動きが普通過ぎて拍子抜けですな。
DNN なら Neural Compute Stick が無いと話にならないとは思うけど。
#◆ 深度を利用した背景透過サンプルを味見
$ sudo raspi-config
"7.Advanced Options" - "A7 GL Driver" - "G3 Legacy"
$ cd ~/librealsense/wrappers/opencv/build/grabcuts
$ rs-grabcuts
こいつは苦しい・・・OpenGLでレンダリングしないとモッサリすぎる・・・。
【YouTube動画】 https://youtu.be/HZZZUfvAupw
#◆ 深度カメラ画像をUIに表示するだけのサンプルを味見
$ sudo raspi-config
"7.Advanced Options" - "A7 GL Driver" - "G3 Legacy"
$ cd ~/librealsense/wrappers/opencv/build/imshow
$ rs-imshow
いたって普通。
【YouTube動画】 https://youtu.be/dMCyTzKQEhk
#◆ MobileNet-SSD+物体までの距離測定のサンプルを味見(Neural Compute Stick無し)
$ sudo raspi-config
"7.Advanced Options" - "A7 GL Driver" - "G3 Legacy"
$ cd ~/librealsense/wrappers/opencv/build/dnn
$ rs-dnn
こいつも苦しい・・・。
【YouTube動画】 https://youtu.be/OuJ1BnZvgP8
#◆ MobileNet-SSD+物体までの距離測定(with Neural Compute Stick)
Neural Compute Stickの使用準備 と Intel®RealSense™SDK2.0の導入 と OpenGLの導入 は終わったため、またの機会にPythonで実装しようと思う。
#◆ 本日のまとめ
- メーカー非公式のRaspbian環境ながら普通に動いた
- 失敗も無く無事成功
- カーネルの更新は不要
- RaspberryPi上でソースをビルドすることにだいぶ小慣れてきた感
- 作業に着手してから導入完了まで8時間ほど掛かった
- OpenGLで画面描画を実装しつつ Neural Compute Stick に頼らないと、凝ったことをするのは少々厳しい
- ビルドに失敗するのが嫌なら、
SWAP領域は最大
にして、make は -j1
指定にしましょう - Pythonのプログラム組み始める前に、ちょっとだけ一息入れよう。。。