motpyのサンプルをROS2に実装してみた(motpy_ros) - えいあーる・れいの技術日記の続きです。
前回のプログラムでは、motpyを使用したサンプルプログラムを動かしただけですが、これをROS2に移植して終わりだと、作者の考える本来の使い方を無視しているなーと感じ、プラグインのような感覚で使用できるようにしたいと考えました。
私がよく使用しているリアルタイム物体検出はDarknet(darknet_ros)ですが、darknetは単眼カメラ追跡はできていない(気がします)。そこで、darknet_rosの出力を使用してオブジェクトトラッキングを実装しようと思いました。
ソースコードは以下のリポジトリにあります。ROS-Foxyでの動作を確認しています。
遷移図
次に遷移図を示します。
darknet_rosは画像を入力し、BoundingBoxesメッセージを出力します。motpyはボックスの情報をもとにトラッキングデータを返却するので、darknet_trackingプログラムはBoundingBoxesと入力画像に対してコールバック関数を呼び出す必要があります。motpyはボックスのデータを使用してidを割り振ります。(このプログラムを作成するまで気づかなかったのですが、motpy自体は画像処理を一切してないです。)
id振り分け後はBoundingBoxesのフォーマットに直して再パブリッシュします。また、表示用に描画を行い、Imshowで画像を表示します。
入力と出力はどちらもdarknet_ros_msgsのBoundingBoxesなので、darknet_rosと互換性のあるプログラムならプラグイン感覚で使用することができます。Webカメラでこれが実現してしまうのすごい!
デモ(ツイートを参照)
動画はニコニ・コモンズの素材を使用しています。
YOLO v3の出力(左)をmotpyを使用してトラッキングを行うプログラムを作成。
— Ar-Ray (@Ray255Ar) 2021年3月24日
枠がブレると少しずれるけどちゃんとトラッキングはできている🚚 pic.twitter.com/xAP9bDKzcG
おわりに
この記事ではmotpyをdarknet_rosに対応させました。単眼物体追跡をここまでシンプルな入力で実現してしまうことを知り、ソフトウェアの力ってすげーと改めて感じました。設定項目をパラメータ化したりする作業があるので、まだまだ改良していきます。