この1年でさまざな画像検出プログラムをROS2に移植してきました。
しかし課題になるのが入力元の映像です。これまでPCにウェブカメラを取り付けて、フィギュアやぬいぐるみに対して物体検出を行ってきました。しかし、いちいちこれをセッティングして画像を撮影するのも面倒だし、再現も不可能…ということについては前々から気づいていました。
しかし、URLで共有可能な動画をROSでインポートできるようにすればどうでしょう?これなら、READMEを読んで手順通りに実行していくだけで対象の動画をデモとして使うことができそうです。GitHubのReleaseからwgetで持ってくるのもいいですが、ここではYouTubeから直接動画を持ってくる作戦で映像を取得してみることにしました。
YouTubeに動画をアップロードすることには次の利点があります。
- 動画をURLの共有に限定できる。
- スマートフォンなどのデバイスからもアップロードが簡単
- サーバ側が勝手に圧縮してくれる。
- 著作権が関わる場合、その旨を通知してくれるため(他の媒体よりは)安心してアップできる。
そしてYouTubeの動画をダウンロードできるフリーツールにyoutube-dlがあります。ダウンロードした動画の取扱については十分に注意する必要がありますが、使いこなせばかなり便利なツールだと思います。YouTube-dlのリポジトリは以下から見られます。
これをROS2にそのまま持ってきたものをこちらに用意しました。
使い方
インストール
git cloneで落としてきます。
mkdir -p ~/ros2_ws/src cd ~/ros2_ws/src git clone https://github.com/Ar-Ray-code/YouTube-publisher-ROS2.git ~/ros2_ws colcon build --symlink-install
ただ単に実行
YouTube-publisher-ROS2がデフォルトで指定しているYouTubeのリンク先は、安倍総理からのメッセージ Twitter ver.―令和2年9月16日です。
政府のビデオなので消されるリスクが低い&非常に多くの人が異なるアングルから映っている1分の動画です。
これをROS2で実行します。
source ~/ros2_ws/install/setup.bash ros2 launch ros2 launch youtube_publisher youtube_pub.launch.py
ダウンロードには3分以上かかってしまいます。また、ダウンロードされたビデオはmkvの拡張子になっており、このままでは扱えなかったため、ffmpegを用いて変換しています。同じURLであれば、2回目の呼び出しはキャッシュを用いて呼び出されるため時間はかかりません。異なるURLが指定されたら、キャッシュを消去して再ダウンロード&エンコードを行います。
いろいろな画像処理プログラムと組み合わせ(?)
このプログラムはYouTubeの動画をウェブカメラのROS2ラッパーのように扱うため、さまざまなアルゴリズムをテストできます。
例えば、YOLOXとYOLOv4(darknet)とOpenCV付属のSSDベースの顔検出プログラムを同時に実行…なんてこともできます。
まとめ
作ってから気づきました。
同時に検出させて比較するという用途、(少なくともROS2には)ない気がしてきました…