こんにちは。 訳あって最近は点群による3次元物体検出の勉強をしています。
この3次元物体検出、意外と面白いんですよね笑
入力データは、画像(運転のカメラをばらしたもの)とLIDARというレーダーによるデータが組み合わさっています。
LIDARは(x, y, z, d, r)の4次元のデータで、3次元座標(x, y, z)とその点におけるレーザーの反射強度(r)から成り立ってます。この点が大量に集まったものがLIDARのデータになる訳です。
LIDARの特徴は
・凹凸などの表面の情報が拾える ・物体の裏側はまるっきりみえない ・とてもスパースなデータ(隙間の大きい)である
こんな感じ
そして画像をやってきた人間からするととても興味深いのは、「LIDARだけ」の方が「画像 + LIDAR」よりも普通に良い精度を残していること。ちなみに画像にLIDAR組み合わせた方が処理早い。うん、不思議
さて、LIDARはどう処理されるかって話ですが、まず実装上の問題として、どんな機械学習モデルでも、「入力の形は揃えなければならない」という制約があったりします。EDはないけど。で、点群はフレームによって、点の数が違うんですねぇ。さぁ困った。どう入力しようってことでここを工夫するのが点群ネットワークの特徴です。例えば
・3D点群を鳥俯瞰の上から見たものとすると2次元に落とせる。あとは、適当にピクセルを定義してその中の点の輝度値の平均にすれば、画像っぽくなる。そしたらCNNベースの物体検出が使えるよ
ってものがある。 2Dで成功した検出器を用いることができる一方で、奥行き情報など3Dの情報を生かしきれなくなってしまう。
ここで登場したのが、PointNet。PointNetの詳細はこの辺のページをみてください。点全体を入力とした全結合層をしたのち、max poolingして特徴量をとりますよって流れです。point形式のデータは順不同の特などの特徴があって、なんやかんやmax poolingするとその辺を満たせるそうです。
ただ、ネットワーク構造みると「これでいいんか…」と誰もがなるシンプルさ。
大丈夫かこれ、と思うが、冷静に考えると結構強烈な性質をもっています。
このネットワークの特徴は
(n, 3) –> (m, 3)
nは点の数、mは任意の次元に変換できるって点
今一度あった問題として、点群は場所によって点の数が違うから点を全て入力にしようとすると、場所によって入力点数が変わってしまうって問題がありました
このPointNetは点の個数に関係なく、m次元の出力をすることができるのが特徴
そうすると、モデルの入力はm次元でよくなるんですね。
点を点のまま、入力可能な特徴量に変換するネットワークということで、強烈なのかなと考えています。
つまりこんなことができます。
・3次元のデータを(H,W,D)の3次元のマスに区切ります。そのマスの中は当然、点がたくさんあったりなかったりする訳です。しかし、ボクセルの中でなのこの点があったとしても、PointNetを使うと任意の次元(例,m次元)に変換できるので、シンプルにデータ全体を(H,W,D,m)にすることができ、inputが整えられます。これでモデルに入れられるようになりますね
ただ、一般の物体検出モデルは3Dよりかは2Dなので、ボクセルだとあまり都合よくないんですよね
そこで登場するのがPointPillarsです。参考になった記事
PointPillarsはボクセルではなく、柱状にします。なぜ柱かというと、鳥俯瞰映像ちっくに処理する感じです。上から見て、(W,H)にくぎり柱状にします。柱状にすると、柱の中には多数の点がありますね。その点たちをPontNetにいれると、柱ごとにm次元の特徴になります。(H,W,m)、これは画像と似た形なんですよね。画像は(H,W,3)なので。あとは、2Dの物体検出モデルのSSDで処理するとうまくいきましたと言うような形です。
シンプル、かつ最強らしいんですよね。これが。
というわけで、こんな感じで。