Help us understand the problem. What is going on with this article?

デプスカメラRealSenseD435で "紫色のイカ" や "オレンジ色の玉ねぎ" を切り取ったり "金髪の人" を追っかけて距離を測る(2) with RaspberryPi3 (Raspbian Stretch)

More than 1 year has passed since last update.

MobileNet-SSD-RealSense GitHub stars

◆ 前回記事

デプスカメラ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.必要なパッケージのバージョンを確認する

[Example]カーネルのバージョンとパッケージのバージョンを確認
$ 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まで拡張する

SWAP領域の拡張(2GB)
$ sudo nano /etc/dphys-swapfile
CONF_SWAPSIZE=2048

$ sudo /etc/init.d/dphys-swapfile restart swapon -s

5.追加パッケージのインストールとudevルールの更新

追加パッケージのインストールと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 へバージョンアップする。 ターミナルを閉じると元のバージョンに戻る。

cmake3.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を登録する

LD_LIBRARY_PATHの登録
$ nano ~/.bashrc
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

$ source ~/.bashrc

8.Google の protobufパッケージ v3.5.1 を導入する

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 を導入する

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をアンインストールする

古い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分必要)

OpenCV3.4.1のインストール
$ 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をインストールする

Intel®RealSense™SDK2.0のClone
$ cd ~
$ git clone https://github.com/IntelRealSense/librealsense.git
$ cd ~/librealsense;mkdir build;cd build
Intel®RealSense™SDK2.0のcmake
$ cmake .. -DBUILD_EXAMPLES=true -DCMAKE_BUILD_TYPE=Release

又は

$ cmake .. -DBUILD_EXAMPLES=true
Intel®RealSense™SDK2.0のビルド(大量に表示される警告は無視してもよい)
$ make -j1
$ sudo make install

13.RealSenseとOpenCVの連携サンプルをビルドする

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ラッパーをビルドする

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環境変数を追加

PYTHONPATH追加
$ nano ~/.bashrc
export PYTHONPATH=$PYTHONPATH:/usr/local/lib

$ source ~/.bashrc

16.Python3によるpyrealsense2ライブラリのインポート確認

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ドライバーを有効にする

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を再起動する

RaspberryPiの再起動
$ sudo reboot

19.SWAP領域をデフォルトサイズに戻す

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 が無いと話にならないとは思うけど。
ezgif.com-optimize (20).gif

◆ 深度を利用した背景透過サンプルを味見

深度を利用した背景透過サンプルの味見
$ 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
ezgif.com-optimize (21).gif

◆ 深度カメラ画像をUIに表示するだけのサンプルを味見

深度カメラ画像を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
ezgif.com-optimize (22).gif

◆ MobileNet-SSD+物体までの距離測定のサンプルを味見(Neural Compute Stick無し)

MobileNet-SSD+対象物までの距離測定
$ sudo raspi-config
"7.Advanced Options" - "A7 GL Driver" - "G3 Legacy"

$ cd ~/librealsense/wrappers/opencv/build/dnn
$ rs-dnn

こいつも苦しい・・・。
【YouTube動画】 https://youtu.be/OuJ1BnZvgP8
ezgif.com-optimize (23).gif

◆ 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のプログラム組み始める前に、ちょっとだけ一息入れよう。。。 :confounded:

◆ 次回記事

RaspberryPi3 (Raspbian Stretch) + Intel Movidius Neural Compute Stick(NCS) + RealSenseD435 + MobileNet-SSD で物体検出しつつ悟空やモニタまでの距離を測る へ続く

PINTO
英文の誤り、日本文の誤り、ご指摘願います。 分かりにくい部分は積極的にご質問・コメントください。 折を見て記事を修正します。 貧乏ホビープログラマ。 Intel Software Innovator Program member
http://git-awards.com/users/pinto0309
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした