baiduまとめ


# コンペの概要
* 道路に車が走っている画像が与えられ、写っている車の位置（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さん](https://www.kaggle.com/outrunner)の上のdiscussionから拝借したネットワークの図
    * ![uFNfCFB.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530411/3887beb2-f57e-0665-b21f-bad61464b157.jpeg)
    * coodinate-referenceはそのまま和訳すると「参照座標系」となります。恐らく画像上でのx,y座標をそのまま入れている。これで画像上で右下か右上かというような情報を入る。[人気だったRuslan Baynazarovさんのkernel](https://www.kaggle.com/hocop1/centernet-baseline/output#PyTorch-Model)に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された画像を作成していた。
        * [outrunnerさん](https://www.kaggle.com/outrunner)の上のdiscussionから拝借したPerspective-transformされた画像
        * ![Xe396jz.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530411/34dad44d-61ad-42a1-7a66-926c2d58cf0d.jpeg)
        * Perspective-transformを使った理由について、本人はdiscussionで2点あげていた
            * 画像を大きくせずに、外れ値（左右に見切れていている車など）に強いモデルを作れる（左右に見切れている車を中央に持ってこれる）
            * 手前と奥での車の大きさの違いを解消できる
    
    * Data-augmentationについて（trainデータについて）
        * disucussionによれば「data augmentation: h-flip, 3 axis rotate, color, noise, blur.」とのことです。
        * [outrunnerさん作成のRotation-augmentationのkernel](https://www.kaggle.com/outrunner/rotation-augmentation)

* 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だけではなく、周りの情報も使っている」と解釈しましたが、もしそうだとしたら文脈的におかしいので違いそうです。

## 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を求めていたのだと思われます。
* ソース
    * [stevenwudi](https://www.kaggle.com/stevenwudi)さんの[discussion](https://www.kaggle.com/c/pku-autonomous-driving/discussion/127099)
* model
    * 上のdiscussionより
    * ![inbox_16463_be74039a5b29b17e735b6f209c0b7e10_system_pipeline_kaggle.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530411/0102cb5c-1cd7-e43c-03c9-e35e9cb6c1b2.png)
    * 画像上側の3-stage Hybrid Task Cascade (HTC)というものでobjectdetectoinを行っていた。
* データについて
    * Appolospaceの画像も一部使ってtrainしていたそうです。
    * augmentationしたらむしろスコアが下がったとの事でした。 
* postprocessing
    * translationのところで出てきたx,y,z座標はあまり精度がよくなく、x,yについてはbboxから画像上のx,y座標を計算し、カメラの内部パラメータを用いてx,y,z座標に変換したそうです。

## 5th 
* ソース
    * [uiiurz1さん](https://www.kaggle.com/uiiurz1)の[discussion](https://www.kaggle.com/c/pku-autonomous-driving/discussion/127065)
    * [uiiurz1さん](https://www.kaggle.com/uiiurz1)の[code](https://github.com/4uiiurz1/kaggle-pku-autonomous-driving)
    * [css919さん](https://www.kaggle.com/css919)の[discussion](https://www.kaggle.com/c/pku-autonomous-driving/discussion/127145)
### uiiurz1さんの解法
* 概要
    * centernetで「中心点（heatmap）,xy offset,z (depth)
,pose: cos(yaw), sin(yaw) cos(pitch), sin(pitch), cos(roll), sin(roll)」を予測
* モデル
    * 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さんの解法
    * 制作中

# 61st我々の解法
* 上位の方たちには遠く及びませんでしたが、[yosshi](https://www.kaggle.com/yosshi999)を中心にベクトルを用いた中心点の予測、[Johannes](https://www.kaggle.com/johannesmdr)を中心にpnp問題を解くことによるxyz,pyrの予測が行われました。他のチームはあまり試さなかった手法のようなので、一応載せておきます。（二人のお陰でコンペ中すっごく楽しかったです。ありがとう！）
* ベクトルを用いた中心点の予測
    * 車についてセグメンテーションを行い、各ピクセルが画像上の車の中心点方向のベクトル,depth,yawを予測する。予測したベクトルををクラスタリングして、車一台分の領域、画像上の車の中心点を求め、内部パラメータを用いて三次元座標に変換した。private 0.076/public 0.078
    * ![b2aae1569df0c4c44b539af4c8967ea3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530411/b2861811-3b5c-a703-add5-1900c73f08f4.jpeg)
* pnp問題を解く
    * 上の手法を用いて、車の特徴点（keypoint）の位置を予測し、pnp問題を解いて、車の位置姿勢を予測しました。
    * 制作中