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のインストール方法は下記記事を参照ください。

https://rb-station.com/blogs/article/nvidia-deepstream-sdk-on-jetson-installation

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度画像に物体認識をかける

Deepstream