コンペの概要
- 道路に車が走っている画像が与えられ、写っている車の位置(x,y,z)と角度(roll,pitch,yaw)を予測する。
- 車の位置は,いわゆる”カメラ座標系”で与えられた
上位解法の軽いまとめ(日本語で)
1st place solution
-
概要
- ピクセルごとに車(の中心)の確信度を表すheatmapを予測 + ピクセルごとに6d-pose+α(p,y,r,x,y,z+distance)を予測
-
ソース
- [outrunnerさん]の(https://www.kaggle.com/outrunner)[discussion](https://www.kaggle.com/c/pku-autonomous-driving/discussion/127037)
- [outrunnerさん]の(https://www.kaggle.com/outrunner)[inference-kernel](https://www.kaggle.com/outrunner/autonomous-driving-1st-place-solution-inference#perspective-transform-matrix)
-
モデルについて
- outrunnerさんの上のdiscussionから拝借したネットワークの図
- coodinate-referenceはそのまま和訳すると「参照座標系」となります。恐らく画像上でのx,y座標をそのまま入れている。これで画像上で右下か右上かというような情報を入る。人気だったRuslan Baynazarovさんのkernelにmeshとして実装されていたものとほぼ同じだと思われます。(ちなみに、彼は効かなかったと言っていた)
- centernetの中身がhourglassnetwork(砂時計型ネットワーク)
-
データについて
-
TTAについて(testデータについて)
- 上図の通り、メインの画像のInputであるtransformed-Imageというところに、元の画像やPerspective transformした画像入れて、weithed-averageで値(答え)を求めていた。
- Perspective transform
- inference-kernelのTTA-genで実装されていた
- 回転の3つのパラメーターと、flipで4つの変数を入れるとその画像がgenerateされる仕組みでした。すごく使いやすそう・・・
- 左手系でy軸周りのパラメータ弄って後述のPerspective transformされた画像を作成していた。
- inference-kernelのTTA-genで実装されていた
- outrunnerさんの上のdiscussionから拝借したPerspective-transformされた画像
- Perspective-transformを使った理由について、本人はdiscussionで2点あげていた
- 画像を大きくせずに、外れ値(左右に見切れていている車など)に強いモデルを作れる(左右に見切れている車を中央に持ってこれる)
- 手前と奥での車の大きさの違いを解消できる
-
Data-augmentationについて(trainデータについて)
- disucussionによれば「data augmentation: h-flip, 3 axis rotate, color, noise, blur.」とのことです。
- outrunnerさん作成のRotation-augmentationのkernel
-
-
Metric probing and Post processing
- metricがクソほど分からないコンペだったので、いくつか実験をしてlocalCVとpublicscoreを比べ、metricを探したそうです。結論はdiscussionにのっていましたが、手法については基本的には書かれていない。
- x,y,z座標のスコアの出し方については詳しく書かれていて、「The most weird thing is that when I shift X by some pixels, the LB score change significantly. So I guess the Metric is:(abs(x-xp)/abs(x) + abs(y-yp)/abs(y) + abs(z-zp)/abs(z))/3」とある。x,y,z座標を少し変えると、スコアが大きく変わったため、上のような計算方法で算出していたのではないかということです。
-
分からなかった事
- disucssionのinferenceのあたりに「# Weighted average neighborhood
When decoding, not only use the local maximum point but also take into account
the prediction around it.」とあります。砂時計型ネットワークがdecodeするときにUnetのようにencodeの時の層をそのままとってきていて、この時一般的にはmax-poolingした後の層を取っています。「outrunnerさん場合はmaximum pointだけではなく、周りの情報も使っている」と解釈しましたが、もしそうだとしたら文脈的におかしいので違いそうです。
- disucssionのinferenceのあたりに「# Weighted average neighborhood
2nd place solution
- 概要
- 車検出→車のmask,boundingboxを予測
- 検出された部分について、x,y,z(translation)とpyrの6パラメーターをdeepで求める(bboxで囲まれた部分のみに対して行っているのか、画像全体からやっているかは不明)
- the generated mesh from rotation and translationとあったので、おそらくcenternetのようにピクセルごとにx,y,z座標とpyrを求めていたのだと思われます。
- ソース
- model
- データについて
- Appolospaceの画像も一部使ってtrainしていたそうです。
- augmentationしたらむしろスコアが下がったとの事でした。
- postprocessing
- translationのところで出てきたx,y,z座標はあまり精度がよくなく、x,yについてはbboxから画像上のx,y座標を計算し、カメラの内部パラメータを用いてx,y,z座標に変換したそうです。
5th
uiiurz1さんの解法
- 概要
- centernetで「中心点(heatmap),xy offset,z (depth)
,pose: cos(yaw), sin(yaw) cos(pitch), sin(pitch), cos(roll), sin(roll)」を予測
- centernetで「中心点(heatmap),xy offset,z (depth)
- モデル
- uiiurz1さんdisucussionより、下二つのアンサンブルでした。
- ResNet18 (pretrained ImageNet) + FPN (channels: 256->128->64)
- DLA34 (pretrained KITTI 3DOP) + FPN (channels: 256->256->256)
- data
- とにかくAugmentationを色々試していました。
- post-processing
- 「Remove mask regions from predictions by multiplying heatmap by masks.」ということで、二乗することでノイズを除去していたようです。
Shin Siangさんの解法
* 制作中