ROSでIntel RealSense D435iとYOLO V3を用いて物体認識をしよう！

# 本記事の目的
本記事では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に変えないとデバイス認識してくれないので注意してください

https://kb.vmware.com/s/article/2128105?lang=ja

![IntelRealSense D435i](https://user-images.githubusercontent.com/52307432/111782788-c9942f00-88fc-11eb-9f22-ce3db644f5c8.jpg)

![RGB](https://user-images.githubusercontent.com/52307432/111743521-2d9eff00-88cd-11eb-8188-6cf65140c1c1.png)

![Stereo](https://user-images.githubusercontent.com/52307432/111743525-2ed02c00-88cd-11eb-922c-1c22c34aba8f.png)

## パッケージのアップグレード
パッケージのグレードアップも同時に行ってしまいましょう

```
$ 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
```

以下の画像のように表示されれば成功！
![3次元点群](https://user-images.githubusercontent.com/52307432/111766824-4f0de400-88e9-11eb-9ebd-c29395c71e4f.png)

次にカメラ画像を出力してみます

```
$ 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を選択して、下のように画像が表示されれば成功！
![画像](https://user-images.githubusercontent.com/52307432/111766818-4ddcb700-88e9-11eb-9473-3c3a920a1bfb.png)

出力されているトピックは以下のデータです

```shell=
/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のアルゴリズムを分かりやすく解説してくれています。

https://www.renom.jp/ja/notebooks/tutorial/image_processing/yolo/notebook.html

## 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接続については以下のサイトを参照してください。

https://qiita.com/Ramune6110/items/c4790372c62a509f8f32

## 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**を修正します。

![Vscode](https://user-images.githubusercontent.com/52307432/111863307-3dd2df00-899e-11eb-8828-77f372a63bfc.png)

## 動作確認

以下のコマンドを順に実行します。

- 一つ目のターミナル

```
$ roslaunch realsense2_camera rs_camera.launch
```

- 二つ目のターミナル

```
$ roslaunch darknet_ros darknet_ros.launch
```
- 三つ目のターミナル

```
$ rosrun rqt_image_view rqt_image_view
```

上手く動作すれば、以下のように物体認識が出来ると思います。

![YOLO](https://user-images.githubusercontent.com/52307432/111863308-3e6b7580-899e-11eb-8fc1-552c5f641ed4.png)

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を行い、もう一度実行した結果が以下になります。

![YOLO](https://user-images.githubusercontent.com/52307432/111863935-aa031200-89a1-11eb-8469-894f7b797ffb.png)

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を使用したらどうなるかを検証します

# 参考記事

https://demura.net/robot/16525.html

https://demura.net/misc/14263.html

https://naonaorange.hatenablog.com/entry/2018/11/04/174745

https://blog.lineo.co.jp/archives/1370

https://qiita.com/karaage0703/items/cb9bbe1b4f2504f8ad0d

http://ogimotokin.hatenablog.com/entry/2019/07/01/230701

https://demura.net/misc/14494.html

https://github.com/leggedrobotics/darknet_ros

https://github.com/IntelRealSense/realsense-ros

https://github.com/IntelRealSense/librealsense/blob/master/doc/distribution_linux.md