🧐

LiDARデータによる物体検出を試してみた-Part3

2022/10/11に公開

今回の内容

前回作成した仕様に沿ってUnity内でLiDARを実装し、取得した仮想点群データから検出が可能か試してみる。(座標変換で心が折れたので一旦最低構成で動作の確認まで行った。気が向いたらちゃんと作って追記する予定)

システム構成

今回検証に用いた簡易構成

本来はリアルタイムに情報を行き来させるべきだがまずは動作確認ということで点群データ・検出結果ともに外部ファイルに書き出して対応

マップ作成

まずはLiDARを取得する対象となる車両オブジェクトと周辺環境を準備する。
Unity上に以下のアセットを展開して適当なシーンを作成した。
https://assetstore.unity.com/packages/3d/environments/urban/real-new-york-city-vol-1-208247
https://assetstore.unity.com/packages/3d/vehicles/land/realistic-mobile-car-demo-173467
ちなみに今回はURPで実装しているので適宜マテリアルの変換を行っている。

Unity内LiDARデータ取得

今回作成したUnityProjectは以下
https://github.com/Gyabi/LiDARObjectDetectionSim

今回は最低限データを取得することを目的とするためにメソッド実行時に1shotのみLiDARを走らせ保存するようにしている。
また、今回は車両正面から左右114度の領域に対してLiDARデータを読みに行っている。(本来は実機のカメラfovと焦点距離等からPhisicsCameraを有効にして有効角度を算出するべきだがKittiのカメラはすでに廃盤ですぐにデータが見つけられなかったので断念)

ちなみに今回の実装は単純にRayCastを大量に飛ばして距離を算出している

起動方法

Assets/LiDARObjectDetectionSim/Scenes/SampleScene

を開く。
Managerオブジェクトからセンシングモードを指定して起動。
スペースキー押下でcsv保存される。

PointPillarsの推論結果を見てみる

Unity側で生成したデータを用いて推論してみた。座標系はUnity側ですでに合わせているので単純にモデルにデータを入れるだけで終了。
コードはPart1で利用したリポジトリをForkして以下に格納している。
https://github.com/Gyabi/LiDARDetector

https://github.com/Gyabi/LiDARDetector/blob/main/lidar_detector.py
上記コードを実行すると可視化と検出結果のCSVを保存できる。

open3Dのビュアーを用いて点群に対する検出結果を確認した。
鳥瞰視点

立体視点

他にも何パターンか試したが大体同じ感じ。

  • 配置したオブジェクトはかなり精度よく検出できている
  • オブジェクトの影になって点群の取得できていない領域で2か所誤検出が生じている
    →これがUnity特有のものなのか学習段階ですでに生じている問題なのか見極める必要がある

Unity側で可視化した結果を見てみる

最後に検出結果をUnity側に戻して可視化してみる。
https://github.com/Gyabi/LiDARObjectDetectionSim
センシングに使ったシーンを開いてManagerオブジェクトからVisualizeモードを指定して起動。
(内部的にはPointPillarsの座標系→Unity内LiDAR座標系→ワールド座標系の順に戻してバウンディングボックスを作っている)

まとめ

Unity上で取得した仮想点群データを用いてPointPillarsを動作させた。
一応配置したオブジェクトの検出はできたが空白領域に対する誤検出が目立った。
画像に比べて現実と等しい情報が点群なら手に入るのでドメインシフトの影響が少なくうまく行くかなと思っていたが、なんとも言えない結果だった。
もう少しちゃんと分析して精度改善等々に取り組んでみたい。

Discussion