motpyのROS実装(高速オブジェクトトラッキング)


 高速オブジェクトトラッキングアルゴリズムのmotpyをROS1/ROS2に実装したので投稿します。この記事には個人ブログやROS Japan UGでも発表したものも含まれます。

motpyとは?

 motpyとは、カルマンフィルタを用いてバウンディングボックスを追跡するオブジェクトトラッキングアルゴリズムです。デプスイメージを使わずともWebカメラのみの画像でもトラッキングが可能で、矩形のみの情報で追跡するため、Raspberry Piなどでも高速オブジェクトトラッキングを実現することができます。

 この手法自体はそれほど珍しくはないですが、motpyは、他と異なりPythonライブラリとして提供されているため、あらゆるPython実装の物体検出アルゴリズムに組み込むことができます。

私は、このアルゴリズムをDarknet_rosに組み込みたいと思っていましたが、darknet自体はC++とCで実装されているのでイマイチ使いにくい…

 そこで、motpy自体をROS1/ROS2ノードにしました。

処理フロー

 追跡方法について処理フローを以下に示します。

  1. Webカメラから画像トピックを送信します(usb_cam)
  2. darknet_rosによって物体検出を行います(darknet_ros)
  3. motpy_rosによってdarknet_ros由来のBoundingBoxesを入力からトラッキングID付きのBoundingBoxesに変換します(motpy_ros)
  4. 表示専用ノードで表示します(ROS1の場合、mosaic_bbox)

 現時点では、motpy自体にクラス名が実装されていないため、motpy_rosの出力には「Person」や「Bus」などの区別が付けられません。

インストール

 ここでは、ROS1での環境構築と実行について示します。依存環境は以下のとおりです。

  • ROS1 Noetic
  • OpenCV4
  • darknet_ros_msgs
  • ros-noetic-usb_cam
  • motpy
# Create workspace
$ source /opt/ros/noetic/setup.bash
$ cd ~
$ mkdir -p ros1_ws/src
$ cd ros1_ws/src

# Clone repository
$ git clone --branch ros1-noetic https://github.com/Ar-Ray-code/motpy_ros.git
$ cd motpy_ros
$ pip3 install -r requirements.txt

$ cd ~/ros1_ws/src
$ catkin_make

実行

 WebカメラをPCに接続して、以下のコマンドを入力します。

$ source /opt/ros/noetic/setup.bash
$ source ~/ros1_ws/devel/setup.bash
$ roslaunch motpy_ros example_mosaic.launch

 トラッキングの様子です。物体を移動させたあとも認識した顔に対してIDを追跡しています。


 Rqt-graphの表示は次のようになっているはずです。

 ノートPCのCPU(Core i5 10210U)でも十分に追跡できるため、かなり実用的なトラッキングノードだと思います。

 バグなど気づいた点があれば、ぜひissueやPRを送ってもらえると嬉しいです。