ROS2 Foxy + YOLO v4 の実装(darknet_ros)


 ROS2 + darknet_ros の組み合わせは過去のQiita記事で解説しましたが、それはYOLO v3までのサポートでした。

 私はよくYOLO v4-tinyのモデルを使用するので、ROS2でもYOLO v4をサポートしていないかなーーと思い探して見たものの見当たらなかったので、実装しました。

 ここでは従来のdarknet_rosとの違いと使い方について簡単に説明します。コレがあればYOLO v4による物体検出のROS2移行も心配ないですね!(?)

 今回使用するリポジトリのリンクを貼っておきます。気づいた点やバグがあればぜひコメント・issueを送ってもらえるとありがたいです。

従来のdarknet_rosとの違い(修正点)

 将来のROSやOpenCVに対応させたいと思う人が出てくると思うので、どんな感じにdarknet_rosを修正したのかを簡単ではありますが示します。

Submoduleについて

 darknet_rosのFoxy実装で使用しているdarknetはpjreddie氏実装のもので、YOLO v3までのサポートです。一方で、YOLO v4の対応はAlexeyAB氏の実装が必要です。そのため、submoduleへのリンク先を変えました。

Darknet APIについて

 Darknet APIという言葉自体は無いですが、ROSに対応させるためにいくつか関数やメソッドを用意してあるため、APIと表記します。

 pjreddie/darknet_rosとAlexeyAB/darknetのYOLOのサポートが異なるということは前述したとおりですが、AlexeyAB/darknetの方はOpenCV4に対応しています。OpenCV3からOpenCV4への移行過程でIPLという型が廃止されてしまいます。そして、pjreddie/darknetにおいてはIPLを使っています。
 Darknetの環境構築において「OpenCVは3.??以下を使ってください」という注意書きがあるサイトを見たことがあると思いますが、おそらくIPL依存のライブラリであることが原因です。そのため、AlexeyAB/darknetのAPIではIPLをcv::Mat型に変更する必要があります。ROS-FoxyではOpenCV4.2がデフォルトのバージョンなので、そちらのほうを使ったほうが環境構築も楽です。

leggedrobotics/darknet_ros:foxyでもOpenCV4は使えますが、それは__pjreddie/darknetの方__をMat対応させているからです。foxyのサブモジュールであるkunaltyagi/darknetのdiffを確認してみてください。個人的には、サブモジュールはやむを得ない場合を除いて本家のものをそのまま引っ張ってくるほうがいいと思っているので、darknet_rosの方を変更する方針にしました。

 結果、submoduleのリンク先とAPIに修正を加えた形になりました。

 変更箇所については、先日開いたプルリクのdiffを参考にしてください。

AlexeyAB/darknetのCMakeLists.txtの削除

 AlexeyAB/darknetにはCMakeLists.txtが含まれています。コレを放置していると、$ colcon buildなどでビルドしたときにエラーになります。しかも、darknet_rosよりも先にビルドされてしまうため、darknet_ros側で対処することができませんでした。そのため、darknetのCMakeLists.txtを消すスクリプトを作成しました。CMakeLists.txtが含まれるdarknetを使うときは必ずCMakeLists.txtを消しておきましょう。

rm_darknet_CMakeLists.sh
#!/bin/sh
SCRIPT_DIR=$(cd $(dirname $0); pwd)
rm $SCRIPT_DIR/darknet/CMakeLists.txt

CUDA11での注意点(CMakeLists.txt)

 CUDA10とCUDA11では破壊的な変更はあまりなかったようでそのままプログラムが動作しますが、CUDA11では動作するアーキテクチャが異なるので注意が必要です。CUDA11ではKeplerのGPUがサポートされていません。

CMakeLists.txt(一部)
  set(
    CUDA_NVCC_FLAGS
    ${CUDA_NVCC_FLAGS};
    -O3
    # -gencode arch=compute_30,code=sm_30
    # -gencode arch=compute_35,code=sm_35
    -gencode arch=compute_50,code=[sm_50,compute_50]
    -gencode arch=compute_52,code=[sm_52,compute_52]
    -gencode arch=compute_61,code=sm_61
    -gencode arch=compute_62,code=sm_62
  )

インストール

 環境構築は過去にQiitaに上げた記事と同じです。CUDA11.2+OpenCV4+ROS-Foxyのセットアップを終わらせたところからスタートです。

 ワークスペースの構築とビルドの手順を示します。

$ sudo apt install ros-foxy-v4l2-camera
$ source /opt/ros/foxy/setup.bash
$ mkdir -p ~/ros2_ws/src
$ cd ~/ros2_ws/src
$ git clone --recursive https://github.com/Ar-Ray-code/darknet_ros_yolov4.git
$ darknet_ros_yolov4/darknet_ros/rm_darknet_CMakeLists.sh
$ cd ~/ros2_ws
$ colcon build --symlink-install

実行方法

 ターミナル1の実行前にWebカメラを接続して/dev/video0を使えるようにしてください。

ターミナル1

$ source /opt/ros/foxy/setup.bash
$ source ~/ros2_ws/install/local_setup.bash
$ ros2 run v4l2_camera v4l2_camera_node --ros-args -r __ns:=/camera/rgb

ターミナル2

$ source /opt/ros/foxy/setup.bash
$ source ~/ros2_ws/install/local_setup.bash
$ ros2 launch darknet_ros yolov4.launch.py

実行環境とパフォーマンス

 yolov4.weightsは非常に重たいモデルなので、十分なスペックのGPUを用意するかyolov4-tinyを使用することをおすすめします。

動作環境(ハードウェア)

項目 スペック
CPU Ryzen7 2700X (@3.7GHz x 16)
RAM 16GB DDR4
GPU NVIDIA GeForce RTX 2080 Ti (GDDR6 11GB)

動作環境(ドライバ)

項目 バージョン
Driver 460.32.03
CUDA 11.2
OpenCV 4.2
CUDA 11.2
ROS version Foxy (Ubuntu 20.04 LTS)

パフォーマンス

項目 スピード メモリ使用量
YOLO v3 67 fps (72 ~ 62 fps) 1781MB
YOLO v4 29 fps (27 ~ 30.5 fps) 3963MB

リンク

 このdarknet_rosの実装にあたってとても参考になったリポジトリです。