360度カメラは、その名の通り360度を撮影できるカメラで、魚眼レンズ(fisheye)が両側に2つ設置されている形式が一般的で、RICOH社のTHETAやInsta 360社などが有名です。今回は、360度カメラで撮影したリアルタイムの映像をDeepStream SDKで解析して、周囲の物体認識を行う手法を紹介します。

今回用いた360度カメラはUSB経由での映像取得が可能なInsta 360 airです。一般的なUSB Webカメラと同じような使い勝手なので非常に使いやすいです。

公式サイト:https://www.insta360.com/product/insta360-air

また、DeepStreamのGStreamer Pluginの仕様については、下記が公式資料となります。細かいパラメータの仕様などの確認に有用です。

https://docs.nvidia.com/metropolis/deepstream/4.0/DeepStream_Plugin_Manual.pdf

GStreamerとDeepStream SDKのインストール方法は下記記事を参照ください。

NVIDIAが提供するDeepStream SDKは、動画像処理ソフトウェアGStreamerのプラグイン集となります。本記事ではDeepStream SDKのインストール方法について解説をします。   DeepStream SDKはGStreamerのプラグインですので、GStreamerをインストールした後に、DeepStreamのプラグインをインストールする流れになります。 Quick Start Guide 上記はNVIDIAが紹介しているインストール方法で、基本的にこちらに従ってインストールを進めれば大丈夫です。 GStreamerのインストール 下記コマンドを実行することで、GStreamer本体と関連ソフトがインストー

1.まずは映像をそのまま表示

まずは、360度カメラの映像をGStreamer経由で、そのまま表示させましょう。Insta 360 airをUSB接続し、下記を実行してみてください。

ls /dev/video*

360度カメラのみを繋いだ状態で /dev/video0 と表示されれば、それが360度カメラを示しています。

gst-launch-1.0 v4l2src device=/dev/video0 ! \
video/x-h264,width=1920,height=960,framerate=30/1 ! \
nvv4l2decoder ! nvvideoconvert ! \
nveglglessink window-x=0 window-y=0 \
window-width=960 window-height=480

上記はただ映像を表示するコマンドになります。

  • video/x-h264,width=1920,height=960 : h264コーデックで1920x960のサイズで読み込み
  • nvv4l2decoder ! nvvideoconvert : v4l2で読み込んだソースをnvvideoconvertで変換
  • nveglglessink :nvidiaのウィンドウ表示用のsink。ファイルに書き出したい場合は、filesink location=output.mp4などとしてください。

コマンドを実行すると、2つの魚眼レンズが横に並んだ映像が表示されると思います。

2つの魚眼レンズが横に並ぶ映像が出力される

2. 魚眼レンズの映像をDewarp(歪み補正)

物体認識をする際、映像自体が歪んでいては、うまく認識をすることができないと考えられるため、前処理として歪んだ2つの魚眼レンズの映像の歪みを補正する必要がありそうです。DeepStream SDKには、nvdewarperという魚眼レンズの歪み補正ができるツールがあるのでこれを使いましょう。

結論としては下記のようなコマンドになりました。(長い・・!)

gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-h264,width=1920,height=960,framerate=30/1 ! nvv4l2decoder ! nvvideoconvert ! tee name=t t.src_0 ! nvdewarper config-file='./config_dewarper1.txt' ! m.sink_0 t.src_1 ! nvdewarper config-file='./config_dewarper2.txt' ! m.sink_1 t.src_2 !  nvdewarper config-file='./config_dewarper3.txt' ! m.sink_2 t.src_3 !  nvdewarper config-file='./config_dewarper4.txt' ! m.sink_3 nvstreammux name=m width=960 height=240 batch-size=8 num-surfaces-per-frame=1 ! nvmultistreamtiler columns=4 rows=1 width=960 height=240 ! nvvideoconvert ! nveglglessink window-width=960 window-height=240 sync=false

それぞれのconfigファイルについては下記レポジトリにまとめておりますので、ご参考いただければと思います。

https://github.com/Shun0750/deepstream-configs/tree/master/360-degree-dewarper

上記のコマンドでは、歪み補正をした4つの240x240の正方形を、nvmultistreamtilerを使って横に並べて960x240に変換を行うということをしています。1つのconfigファイル内にsurfaceを4つ追加する手法も試したのですが、どうしても縦に並んでしまうので4つのconfigファイルを読み込む形にしています。

このコマンドでは下記のような表示になります。360度映像の投影方式の1つであるキューブマップ( https://en.wikipedia.org/wiki/Cube_mapping )の横4つの正方形部分を生成する様なイメージになります。

dewarpを行った後の表示

3. Dewarpした映像を使って物体認識する

ここまでくれば後は簡単です。Dewarpした映像に対して、物体認識のコマンドであるnvinferをすれば物体認識を行うことが可能になります。コマンドとしては下記のようになりました。

gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-h264,width=1920,height=960,framerate=30/1 ! nvv4l2decoder ! nvvideoconvert ! tee name=t t.src_0 ! nvdewarper config-file='./config_dewarper1.txt' ! m.sink_0 t.src_1 ! nvdewarper config-file='./config_dewarper2.txt' ! m.sink_1 t.src_2 !  nvdewarper config-file='./config_dewarper3.txt' ! m.sink_2 t.src_3 !  nvdewarper config-file='./config_dewarper4.txt' ! m.sink_3 nvstreammux name=m width=960 height=240 batch-size=8 num-surfaces-per-frame=1 ! nvmultistreamtiler columns=4 rows=1 width=960 height=240 ! nvvideoconvert ! dsexample processing-width=960 processing-height=240 full-frame=1 ! nvinfer config-file-path=./dstest1_pgie_config.txt ! queue ! nvdsosd ! nvvideoconvert ! nveglglessink window-width=960 window-height=240 sync=false

dstest1_pgie_config.txtは2のセクションで記載したレポジトリの中に含まれています。nvdsosdは、検知した物体に四角形とラベルを加える処理になります。

次のように、dewarpされた360度映像を用いて物体認識ができるようになります。

dewarpした360度画像に物体認識をかける

Related Posts

Arduinoでi2cで通信できているかを確認する | i2cアドレスの確認方法
Arduinoでi2cで通信できているかを確認する | i2cアドレスの確認方法
概要 i2c通信とは、SDAとSCLの2つのピンだけで、複数のモジュールとの通信が可能なプロトコルになります。 Arduinoもi2c通信には対応していて手軽に使うことができますが、うまくi2c通信ができないこともあります。本記事で...
Read More
AWS RoboMakerでワールドを生成してシミュレーションに使う
AWS RoboMakerでワールドを生成してシミュレーションに使う
AWS RoboMakerでのワールド生成 AWS RoboMakerは、ROSのロボットアプリケーションの開発をクラウド上で行うことができる、AWSのサービスです。詳しくは下記の記事をご覧ください。 RoboStation htt...
Read More
ロボットに非常停止スイッチを取り付ける
ロボットに非常停止スイッチを取り付ける
概要 ロボットが予期せぬ動作をし、危害を及ぼしそうになった場合に緊急停止をするスイッチをつけておくことは重要です。 その際、非常停止スイッチは必ず回路的に遮断する設計にする必要があるため、電源との間に非常停止スイッチを挟んでおいて、ス...
Read More

サイトについて

RoboStationは誰でも手軽にロボットを製作できるようにすることを目的としたEC・ハウツーサイトです。