複数センサを一気に学習！Uber Multi-Task Multi-Sensor Fusion 自動運転３D物体検出！

今回は、自動運転の３D物体検出のアルゴリズムを紹介するぞ。

自動運転の認識では一般的に複数のセンサが用いられるんだってさ。
そりゃ単眼カメラだけだったら距離情報わからないし、
LIDARだけだったら点だけ出てきて、高解像度な物の見た目や色がわからないよね。
じゃ、カメラやLIDAR,レーダー、複数タイプのセンサの結果を合体させてよりよい認識結果を得よう、
というのがセンサフュージョンの考え方。

今までは人間が、このタスクにはこのセンサを使おう、と決めていたわけだが、
そこに一石を投じる論文を見つけてしまったので、今回はそれを見ていくぞ！

紹介する[Multi-Task Multi-Sensor Fusion for 3D Object Detection](http://www.cs.toronto.edu/~byang/papers/mmf.pdf)は、複数のセンサを複数タスクのために、一気にまとめて学習させる、というもの。

”複数センサ＆複数タスクを一気にまとめて学習させる”ことがどれだけ有効なのか、知りたくってさ！


![Screenshot from 2019-11-24 10-54-32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388647/968da3da-6209-45aa-a018-95f1275c8967.png)




## この記事ですること
* Multi-Task Multi-Sensor Fusion for 3D Object Detectionの解説(CVPR2019)
    * Introduction
    * Related Works
    * Multi-Task Multi-Sensor Detector
        * Fully Fused Multi-Sensor Detector
        * Multi-Task Learning for 3D Detection
        * Joint Training
    * まとめ

※論文に沿って原理、仕組みを解説していきます
※紹介する手法は”MMF"と略します
※本論文には付随するコードがないため、実装や再現は試みません、多分


## Introduction
この論文では、複数のタスクを複数のセンサで一気に学習することで、１タスク１センサよりもより良い特徴量と良い検出結果につながることを提案する。

マルチセンサ

* カメラ
* LIDAR

マルチタスク

* マッピング：地面推定
* ３D検出：物体を３D矩形で囲む
* ２D検出：物体を２D矩形で囲む
* 距離補完：カメラ画像上のピクセルに対して距離を推定する、本来の点群で得られたものよりもより濃い点群へ補完


![Screenshot from 2019-11-24 10-00-32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388647/320a485c-9373-da5f-4647-8c4b40854a74.png)

上記のタスクをマルチセンサからの入力に対して、End-to-Endで認識する。
マルチタスクは２種類で表現される。

* Point-wise: 興味のある点をLIDAR点群から選択する
* ROI-wise: センサ情報上に矩形を指定する

マッピングのタスクでは、地面推定を行う。
地面推定の情報は、交通参加者の動く範囲を指定するので３D物体検出の助けになる。
また、距離補完では異なるセンサの情報で点をより濃く補完するタスクを行う。

我々の提案するMMFはKITTIやTOR4Dのベンチマーク上で他のSOTA手法に対してより良い結果とリアルタイム性を持つ。（１０Hz)

TOR4D...どうやらUber社内専用のデータセットらしい

## Related Works

### 3D detection from single modality 単体センサを使った３D検出
カメラから距離推定する研究は試みられたが、距離推定の精度が悪く３Dローカリゼーションには使えなかった。
また、PixorやVoxelNetなどの３D点群から物体検出をするアルゴリズムは観測点が非常に疎で見た目の情報が使えず、物体のクラス分類が非常に難しかった。

### Multisensor fusion for 3D detection マルチセンサを使った３D検出

F-PointNetがカメラとLIDARを使うセンサフュージョンの手法として挙げられる。
はじめに２D画像上で物体検出が行われ、PointNetが検出された２D空間上の３D点から物体検出を行う。
このフレームワークでは、全体のパフォーマンスは個々のセンサで段階的に制限されてしまう。
またこのフレームワークでは、遠方にある物体から得られる点が非常に少なく遠方の物体や遮蔽された物体に弱い。

その他の、MV3D, AVODなどその他の手法もあるが、どれも点群が疎になると性能が非常に悪くなる。
そのためMMFでは、点の補完もタスクとして行う。

### 3D detection from multi-task learning マルチタスク学習からの３D検出

HDNETやSBNetでは地面推定を行うことで、３D検出の速度が２倍以上になることがわかっている。
これら前例と異なるのは、地面推定と３D検出のタスクを分けて学習するのではなく、全て一気に学習すること。
そのためend-to-endで訓練可能なネットワークができあがる。

## Multi-Task Multi-Sensor Detector
![Screenshot from 2019-11-24 10-50-37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388647/d46ff518-fcf6-3a60-94d2-a1640c8fd6fd.png)

MMFは３つの特徴を持っている

* point-wiseとROI-wiseのマルチセンサアーキテクチャ
* 地面推定がアーキテクチャの中に入っている
* 距離補完を行うので、より密な情報に対して検出できる

細かい話に入る前に上記画像から解説する
点線が、データ投影を意味し、実線がデータフローを意味する

入力LIDAR点群は、地面推定ネットワークに入力され、地面推定結果を出力する。
地面推定結果と入力点群はLIDARネットワークに入力され、クラス分類と物体検出のタスクを行う。
またLIDAR点群は距離画像へ変換され、カメラ画像と合体し、画像ネットワークに入力される。
画像ネットワークは同時に、距離画像を出力し、距離画像から擬似補完点群を出力する。

画像中央のDenseFusionでは、３D物体検出の精度を向上させるために

* 地面推定結果
* 画像ネットワークの中間結果
* 疑似点群の補完結果
* 画像上での物体検出結果

がLIDARネットワークの中間層に入力される。

LIDARネットワーク、画像ネットワークの結果から３D検出結果を出力し、
双方のネットワークのROI情報からボックスを生成するネットワークを介して、最終結果である
２D検出結果＋３D検出結果が出力される。

...超絶複雑なネットワークだぞ、これは。
[KITTI結果](http://www.cvlibs.net/datasets/kitti/eval_object_detail.php?&result=faed80ee835f02c18820bfd60cd5e91acb5ff23b)では80msecで動作するとのこと。使用しているGPU　@2.5GHzというのが気になる。
GPUは何を積んでいるのか、CPUは何コアなのか...
演算量がかなり気になるが、複数タスクをやってのけているのも考慮しなくてはならない。

確かに、画像のみ、LIDARのみ、という考え方はなく
お互い同時に保管しあったネットワークを二重で持っていて、その出力を統合する仕組みになっている。
カメラネットワークには点群情報が入るし
LIDARネットワークには、地面推定、疑似点群、カメラの中間層の結果が入っている。
ネットワークの比重としてはLIDAR寄りになっているように見える。

しっかしこれ考えた人はすごいな...
この全てが一つのネットワークになっていて、end-to-endで訓練ができる
これは強いぜ。

気を取り直して解説に戻ろう

### Fully Fused Multi-Sensor Detector
multi-sensor detectorでは、LIDA点群とRGB画像を入力としている。
バックボーンネットワークは２つある

* 画像からfeature mapを抽出する画像ネットワーク
* LIDAR　BEV feature mapを抽出するLIDARネットワーク

![Screenshot from 2019-11-24 13-16-30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388647/2fc1a808-5e2f-bb60-58a7-c64d5cecf521.png)


LIDARネットワークの出力は２D畳み込みから、３D検出結果のボクセルを推定する。
LIDARネットワークではボクセル検出が行われており、BEV視点での検出のみを行う。
下記の手法を使用

```Ming Liang, Bin Yang, Shenlong Wang, and Raquel Urtasun.Deep continuous fusion for multi-sensor 3d object detection.InECCV, 2018```


画像ネットワークの２D検出結果と合わせ、３Dと２D検出結果のrefinementを行う。
画像ネットワークでは、ResNet-18が第４ブロックまで使用されている。（上記画像では５ブロック確認できる）
一つのブロックはresidual layerを２つ備えており、feature mapのサイズは６４から５１２へ線形的に増える

LIDARネットワークでは画像ネットと比べて細く、深いネットワークを採用した。
ResNet-18のマイナーチェンジ版を採用しており、
第４ブロックまでは、２，４，６，６のresidual layerを備えており
feature mapのサイズは64,128,192,256となっている。

両方のネットワークの最後にはFPN(feature pyramid network）が採用されている。

２つのネットワークの出力は、最終的にrefinement networkに入力され正確な２D,3D検出を行う。

上記画像のように、画像ネットワークからLIDARネットワークへ向かってfusionが行われている。
これを、Point-wise feature fusionと呼ぶ。
画像のfeature map情報をBEVネットワークに追加することができる。

どのように特徴を追加するかというと、
点群の点と、画像ピクセルをマッチングさせており、LIDARネットワークで使用されている点に対して対応するピクセルに所属している特徴マップの特徴を画像ネットワークに食わせる。
この場合、点群は疎になってしまうため、後述の距離補完ネットワークが疎な点群を擬似点によって保管して、より多くの画像特徴をLIDAR点にエンコードすることが出来ている。

２つのネットワークの出力は、２D,3D物体それぞれのROIを出力する。
これを統合する処理をROI-wise feature fusionと呼ぶ。

![Screenshot from 2019-11-24 13-37-40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388647/4490ddf9-960b-2c9e-3845-470fc4e2475b.png)

２つのネットワークで出力した矩形の、向きを推定してrefineを行う。

### Ground Estimation
![Screenshot from 2019-11-24 14-18-38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388647/cc8a7e8d-8360-4fde-08f8-15a8668e9930.png)

リアルタイムで路面を空いているするネットワークがサブタスクとして含まれている
BEV点群をボクセルで区切り、ボクセルごとの高さを推定する
RANSACを用いた平面推定を選択しなかったのは、カーブ道路や遠方までの道路を一つの平面で表現できないケースが多かった。

U-Netを使って推論を行う(8msec/frame)
推論を行ったあとは、点群の座標変換を行う
具体的には、Z値を地面からのオフセット値に変更することで、後段の物体検出の精度を上げることが出来た。

### Depth Completion
LIDAR点群は正確に３次元情報を出力するが、情報の密度が低い。
LIDAR点群をより濃くするための手法を提案する。

まずは、LIDAR点群を３チャネル画像（X,Y,Z)に変換しカメラ画像上に投影する
距離情報をピクセル上に投影する。
点が存在しないピクセルには０をいれておく。

RGB画像と、距離画像を上述の画像ネットワークへ入力し
出力としてRGB画像の全てに距離情報を埋め込んだ疑似点群画像を生成したものを
LIDARネットワークへと入力する

### Joint Training
マルチタスクの結果に対するマルチロスを計算する
出力として下記がある

* 3D物体検出
* 2D物体検出
* マッピング
* 距離補完

用意するラベルは、３D検出結果と、距離のラベル
（距離ラベルはどうやって出したんだろうか...)
地面推定に関しては、３D検出結果に結果が含まれている。
（３D検出結果は地面に対する座標で行われているため、ここのZ値のロスが地面推定にフィードバックされる）

![Screenshot from 2019-11-24 14-51-30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388647/ac9f5546-303c-96e4-0bc6-e86096b1a101.png)

左から
* classification loss: cross entropy
* 3D box estimation loss
* 2D box refinement loss: l1 loss, (x,y,z, log(w), log(l), log(h), theta)^2
* 3D box refinement loss: l1 loss, (x,y,log(w), log(h))
* depth prediction loss: l1 loss for all pixels

訓練時にはSGDとadam optimizerを使用

































## まとめ
以上がMMF論文の解説でした。
評価結果の中では、dense fusionや、距離補完を行った場合のほうが３D検出結果の精度が上がる、とのこと。
特にLIDAR点群とカメラの解像度が大きく違う場合に特に距離補完の寄与度が高いらしい。


簡単にまとめると

* カメラとLIDARを入力として、３D検出、２D検出、地面推定、点群補完の４つのタスクを同時に行うネットワーク
* メインはLIDARとカメラそれぞれのネットワークでの物体検出
* 地面推定は、交通参加者のいる領域を限定できるのと、地面高さ推定により３D検出への寄与度が高い
* 点群補完は、遠方で疎になりがちな点群情報を画像を使って補完し、LIDARネットワークに食わせる
* カメラ、LIDARネットワークそれぞれで物体検出結果のROIを出力し後段のrefinementネットワークで向き推定とより正確な位置を推定する

まとめて学習させる、というコンセプトは[Waymo ChauffeurNet](https://arxiv.org/pdf/1812.03079.pdf)でも提案されていましたね。こちらの論文は自動運転のプランニングをすべて２D画像ベースで学習し推定をするというものですが、学習のネットワークの中には、プランニングとセンシング両方をすべて同時にend-to-endで学習させるアーキテクチャを提案していました。

![Screenshot from 2019-11-24 15-16-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388647/ee95feaf-2f70-4eed-838d-7e2cf5eebba7.png)

従来のセンサフュージョンはどちらかというと人間がセンサにタスクを割り振っていた。
例えば、mercedes-benzと組んでいるUdacityでは下記のようなfusionシステムが使われている。


![Screenshot from 2019-11-24 15-19-43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388647/0037d47e-c242-0a9f-d9fd-830de23d552c.png)

カメラ画像上で２D検出＆検出結果の特徴トラッキングを行う。
さらにLIDARで３D物体検出を行い２D結果と３D結果をマッチングさせ、特徴トラッキングで物体IDを追跡する。
こうしたカメラを起点としたフュージョンは、MMF論文の中では、スケーリングの問題がありMMFを使った統合的な検出のほうがよい、と提案している。

MMFもChaufeurNetも、論文発表から時間が立っているが、
複数センサを統合的にend-to-endで訓練する、というのが次代のスタンダードかもしれない。
（Waymoはそのアーキテクチャにプランニングも含めてしまっている）

...にしてもWaymoにしろUberにしろ
データセットの取得から複数タスクの統合訓練とネットワークアーキテクチャ策定までを企画して実行に移す部隊がいるのはかなりパワフル。この論文を読んで、ひたすら感じたのは

”これ考えたやつすげえな！！！”

この記事を気に入ってくれたらlike, ストックお願いいたします。
コメントあればぜひ！

それでは〜