本記事の目的
本記事ではIntel RealSenceD435iの導入から、ROSとYOLO V3用いて物体認識を行う事を目的とした記事になっております。背景の理論的な説明はしていません。
環境
本記事は以下の環境で実験しています。
項目 | バージョン |
---|---|
Ubuntu | 18.04 |
ROS | Melodic |
IntelRealsense | D435i |
UbuntuやROSの環境構築は別途他のサイトをご覧ください.
RealSense SDKのインストール手順
- サーバーの公開鍵を登録
$ sudo apt-key adv --keyserver keys.gnupg.net --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE || sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE
- サーバーをリポジトリのリストに追加
$ sudo add-apt-repository "deb http://realsense-hw-public.s3.amazonaws.com/Debian/apt-repo bionic main" -u
- ライブラリをインストール
$ sudo apt-get install librealsense2-dkms
$ sudo apt-get install librealsense2-utils
- 必要に応じて、開発者およびデバッグパッケージをインストール
$ sudo apt-get install librealsense2-dev
$ sudo apt-get install librealsense2-dbg
- realsense viewerの起動
$ realsense-viewer
上記の作業を終えて、デバイスをUSB3.0に差し込んで、Stereo ModuleとRGB Cameraをoffからonにすると、以下の画像のように認識してくれるはずです。
ただしここで注意が必要です!!(私が躓いたポイントです...)
IntelRealSenseはUSB3.0に差し込まないと認識しません
なので必ずUSB3.0に差している事を確認してください
また私の様に仮想マシン(VMware)で動作確認を行おうと思っている人は、VMwareの設定でUSBの互換性を2.0から3.0に変えないとデバイス認識してくれないので注意してください
パッケージのアップグレード
パッケージのグレードアップも同時に行ってしまいましょう
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt --only-upgrade install librealsense2-utils librealsense2-dkms librealsense2-dev librealsense2-dbg
Realsense ROSのインストール
以下のコマンドを実行してインストールを行う
$ sudo apt install -y ros-melodic-ddynamic-reconfigure
$ cd ~/catkin_ws/src
$ git clone https://github.com/IntelRealSense/realsense-ros
$ catkin make
$ source devel/setup.bash
動作確認
以下のコマンドを実行してrviz上に3次元点群を表示する
$ roslaunch realsense2_camera demo_pointcloud.launch
次にカメラ画像を出力してみます
$ sudo apt install ros-melodic-rqt-image-view
$ roslaunch realsense2_camera rs_camera.launch
$ rosrun rqt_image_view rqt_image_view
以下のように左上の選択ボックスからトピック/camera/color/image_rawを選択して、下のように画像が表示されれば成功!
出力されているトピックは以下のデータです
/camera/color/camera_info
/camera/color/image_raw
/camera/color/image_raw/compressed
/camera/color/image_raw/compressed/parameter_descriptions
/camera/color/image_raw/compressed/parameter_updates
/camera/color/image_raw/compressedDepth
/camera/color/image_raw/compressedDepth/parameter_descriptions
/camera/color/image_raw/compressedDepth/parameter_updates
/camera/color/image_raw/theora
/camera/color/image_raw/theora/parameter_descriptions
/camera/color/image_raw/theora/parameter_updates
/camera/depth/camera_info
/camera/depth/image_rect_raw
/camera/depth/image_rect_raw/compressed
/camera/depth/image_rect_raw/compressed/parameter_descriptions
/camera/depth/image_rect_raw/compressed/parameter_updates
/camera/depth/image_rect_raw/compressedDepth
/camera/depth/image_rect_raw/compressedDepth/parameter_descriptions
/camera/depth/image_rect_raw/compressedDepth/parameter_updates
/camera/depth/image_rect_raw/theora
/camera/depth/image_rect_raw/theora/parameter_descriptions
/camera/depth/image_rect_raw/theora/parameter_updates
/camera/extrinsics/depth_to_color
/camera/extrinsics/depth_to_infra1
/camera/extrinsics/depth_to_infra2
/camera/infra1/camera_info
/camera/infra1/image_rect_raw
/camera/infra1/image_rect_raw/compressed
/camera/infra1/image_rect_raw/compressed/parameter_descriptions
/camera/infra1/image_rect_raw/compressed/parameter_updates
/camera/infra1/image_rect_raw/compressedDepth
/camera/infra1/image_rect_raw/compressedDepth/parameter_descriptions
/camera/infra1/image_rect_raw/compressedDepth/parameter_updates
/camera/infra1/image_rect_raw/theora
/camera/infra1/image_rect_raw/theora/parameter_descriptions
/camera/infra1/image_rect_raw/theora/parameter_updates
/camera/infra2/camera_info
/camera/infra2/image_rect_raw
/camera/infra2/image_rect_raw/compressed
/camera/infra2/image_rect_raw/compressed/parameter_descriptions
/camera/infra2/image_rect_raw/compressed/parameter_updates
/camera/infra2/image_rect_raw/compressedDepth
/camera/infra2/image_rect_raw/compressedDepth/parameter_descriptions
/camera/infra2/image_rect_raw/compressedDepth/parameter_updates
/camera/infra2/image_rect_raw/theora
/camera/infra2/image_rect_raw/theora/parameter_descriptions
/camera/infra2/image_rect_raw/theora/parameter_updates
/camera/realsense2_camera_manager/bond
/camera/rgb_camera/auto_exposure_roi/parameter_descriptions
/camera/rgb_camera/auto_exposure_roi/parameter_updates
/camera/rgb_camera/parameter_descriptions
/camera/rgb_camera/parameter_updates
/camera/stereo_module/auto_exposure_roi/parameter_descriptions
/camera/stereo_module/auto_exposure_roi/parameter_updates
/camera/stereo_module/parameter_descriptions
/camera/stereo_module/parameter_updates
/clicked_point
/diagnostics
/initialpose
/move_base_simple/goal
/rosout
/rosout_agg
/tf
/tf_static
YOLO V3による物体認識
YOLOはリアルタイムオブジェクト検出アルゴリズムです。YOLO(You Look Only Onse)の名前通り、このアルゴリズムでは検出窓をスライドさせるような仕組みを用いず、画像を一度CNNに通すことで、オブジェクトを検出することができます。
以下のサイトでYOLOのアルゴリズムを分かりやすく解説してくれています。
YOLO V3のインストール手順
以下のコマンドを順に実行してください。
$ cd ~/catkin_ws/src
$ git clone --recursive git@github.com:leggedrobotics/darknet_ros.git
$ cd ..
$ catkin_make -DCMAKE_BUILD_TYPE=Release
ただしここで注意が必要です!!
darknet_rosはSSH接続設定を行わないとcloneする事が出来ません
なのでSSH接続の設定を行ってからcloneするようにしてください
SSH接続については以下のサイトを参照してください。
YOLO V3のモデルのインストール
yolov2-tiny.weightsとyolov3.weightsはcatkin_makeすると自動的にダウンロードされます。
その他のモデルのダウンロード方法は以下のファイルを参照してください。
$ ~/catkin_ws/src/darknet_ros/darknet_ros/yolo_network_config/weights/how_to_download_weights.txt
設定ファイルを修正
使用するカメラのトピック名に応じて、設定ファイルを修正する必要があります。
今回は、Intel RealSense D435iなので、RGB画像のトピック名は、/camera/color/image_rawになります。なので、darknet_ros/darknet_ros/config/ros.yamlを修正します。
動作確認
以下のコマンドを順に実行します。
- 一つ目のターミナル
$ roslaunch realsense2_camera rs_camera.launch
- 二つ目のターミナル
$ roslaunch darknet_ros darknet_ros.launch
- 三つ目のターミナル
$ rosrun rqt_image_view rqt_image_view
上手く動作すれば、以下のように物体認識が出来ると思います。
fpsと精度は以下のような結果になります。
FPS:0.1
Objects:
laptop: 98%
tvmonitor: 93%
精度は良いものの、fpsがかなり低いです。(私のPCにはGPUがないため、CPUのみで動作しているためだと思われます)
動作速度を上げる
私の環境では、OpenCVとOpenMLがインストールされていたので、それらを用いて計算できるように設定を行う。darknet/Makefile を以下に変更
GPU=0
CUDNN=0
OPENCV=1
OPENMP=1
DEBUG=0
この状態に変更してcatkin makeを行い、もう一度実行した結果が以下になります。
fpsと精度は以下のような結果になります。
FPS:0.8
Objects:
tvmonitor: 74%
laptop: 53%
keyboard: 45%
fpsは0.1から0.8に上がりましたが、精度が悪くなりました。
まとめ
- Intel RealSenceD435iの導入から、ROSとYOLO V3用いて物体認識を行いました
- GPUを搭載していないマシンでは、やはりfps値がかなり低いです
- リアルタイム性の向上を狙うなら、GPU搭載のマシンを使う必要がありそうです
今後の予定
- 物体認識から様々な情報(トピック)が取得できているので、それらの値を用いて、何か面白い事をします(特定の人物を追いかけるロボットの作成など)
- 独自のオブジェクトを学習させて認識したいと思ってます
- Lidarとデプスカメラのセンサフュージョンをしたいと思ってます
- Jetson Nanoを使用したらどうなるかを検証します
参考記事