1. 程式人生 > 其它 >【論文閱讀】CVPR2022: Learning from all vehicles

【論文閱讀】CVPR2022: Learning from all vehicles

Column: March 23, 2022 1:08 PM
Last edited time: March 23, 2022 11:13 PM
Sensor/組織: 現leaderboard第一名,RC上總分94分 前無古人後無來者
Status: Reading
Summary: IL; 輸出 中間層 map再去學
Type: CVPR
Year: 2022

碎碎念: 第一眼看上去真的好像特斯拉AI day介紹的方案,提取相關照片,特斯拉AI day記錄後面發吧

b站有中文字幕版

1. Motivation

來源於 carla leaderboard 自動駕駛排行榜,主要任務:就是通過得到的感測器資訊來操控車輛的執行,可 端到端學習 也可以 傳統方案

問題場景

現實生活中,可能大家開車10000個小時 都不會遇到一次事故,但是我們一定見到過事故現場,由此啟發:learning-based 也可以從log中的其他車輛行為學習到經驗 (故事能力 max)

學習其他車輛的軌跡(也可以說是預測其他車輛軌跡)有助於我們自車的sample efficiency 而且也可以幫助我們see more interesting scenarios,同時也可以幫助我們避免碰撞

但是問題是:對於其他車輛來說 是不像本身一樣有所有感測器資料的,對於我們來說是一種 partial observation 所以需要一種 中間的表達態 來表示周圍資訊以代替感測器資料,然後所有可觀測的車輸出這樣的資料 到網路中

Contribution

文章裡沒有總結contribution... 以下為簡述方法

LAV 就是用來解決上述問題的,通過對perception and motion的部分觀測 設計一個能用於識別、預測和規劃的整體框架。(類似於特斯拉AI day介紹的:先進行解耦 multi-task,然後合起來 輸出中間的vector map,然後只把vector map輸入到規劃中去)

主要部分類似於 lbc 裡 privileged distillation approach 來解耦 perception 和 action 兩個部分,也就是先做感知的模組然後再action

  1. 先用 3D detection 和 分割任務學習出 感知模組,輸出a viewpoint invariant representation

    在這個模組中 並不區分場景中自車和其他車(應該是指viewpoint上有自車資訊)

  2. 與前一步同時進行的還有motion planner,不同於之前 action的輸出,這裡僅輸出future waypoints 來表示motion plan,整個planner預測周圍所有車的軌跡和他們的high-level commands(label形式 後面有詳細介紹)

  3. 最後把他們合起來成joint framework 然後用privileged distillation來提取出

整個網路最後輸出的是一層蒸餾後的用perception module對所有車進行預測輸出view point invariant vsion features,然後給到motion prediction module進行軌跡輸出

2. Method

整個訓練完成後,方法步驟是三層:

  1. perception 將 sensor data 轉為 map-view feature
  2. 使用perception輸出的features,對所有車執行motion planner,輸出軌跡和high-level command
  3. 使用兩個PID對自車輸出的軌跡進行跟隨

2.1 框架

2.2 Perception Model

使用三個相機 合起來,和wor裡的操作是一樣的,為了獲得更廣的視角(但是這樣紅綠燈也會更小不好識別)

照片示意圖(右側為Telephoto 在2.3 c會用到)

\(\mathbf{I}_{t}=\left\{I_{t}^{1}, I_{t}^{2}, I_{t}^{3}\right\}\) 分別代表三個相機,\(L_t\) 代表鐳射雷達點雲,兩個的combine方法來自 point-painting [46] 將 RGB 和 a light-weight center-point [47] with pointpillars[27] 處理後的點雲進行融合

經過處理後這層框架輸出的是map-view feature representation \(f \in \mathbb{R}^{W \times H \times C}\) 其中 W寬,H高,C為通道數

網路框架細節

使用pointpillars with pointpainting進行多模態 3D perception backbone \(P_B\)

  • 使用ERFNet 對每個相機輸出的圖片進行計算semantic segmentation scores的計算,分割的label包含:背景、車輛、road 道路、lane markings和行人

  • pointpillars 方面,先用FC-32-32 with batch norm作為point net層,然後對鐳射雷達點雲在:\(x \in [-10m,70m],y\in [-40m,40m]\) 進行create pillars,每個pillars表示 \(0.25m \times 0.25m\)的空間範圍,使用預設的2D CNN multi-scale features去獲取spatical features \(\phi_{t} \in \mathbb{R}^{192 \times 160 \times 160}\) with 0.5x resolution of the original pillars

    其中和pointpillars本身直接使用超引數build dense pillars,本文選擇sparesly represent,使用一個spare PointNet去梳理sparese pillar features

  • 對於融合圖片分割和點雲檢測輸出BEV feature則是使用簡單版的one-stage centerpoint。預測兩個centerness maps,一個為車,一個為行人

  • 溫馨連結:

    [27] pointpillars很不錯的一篇 工業界也常用的點雲檢測框架,部落格園不錯的解釋部落格:

    點雲3d檢測模型pointpillar

2.3 plan motion

首先需要注意的是隻有ego car有明確的GNSS的目標點 \(g\in \mathbb R^2\),其他npc沒有目標點的,其次 high level command也是隻有ego car有,所以其他車輛預測時是需要單獨infer的

整個這個motion planner 內部也有兩步:

a. 標準的RNN \(M(\hat f,c)\)

預測未來 \(n=10\) 的路徑點 waypoints,使用的是:high level commnd \(c\) (包含:左轉,右轉,直行,跟隨,換左道,換右道)

根據前情提要,我們就得分為兩個部分loss,然後訓練這個網路時 是兩部分loss相加:一個ego 有真值的 \(\hat c\),一個其他npc 需要infer的 \(c\)

\[\mathcal{L}_{M}^{e g o}=\mathrm{E}_{\hat{f}, y, \hat{c}}\left[\|y-M(\hat{f}, \hat{c})\|_{1}\right]\tag{1} \] \[\mathcal{L}_{M}^{\text {other }}=\mathrm{E}_{\hat{f}, y}\left[\min _{c}\|y-M(\hat{f}, c)\|_{1}\right] \]

b. refine RNN \(M'(\hat f, g, \tilde y)\)

在a輸出後,使用a輸出的 \(\tilde y\) 作為輸入,然後結合 map-view feature \(\hat f\) 和 GNSS給出的goal 來為ego car輸出相對目標點

\[\mathcal{L}_{M}^{\text {refine }}=\mathrm{E}_{\hat{f}, y, \tilde{y}, \hat{g}}\left[\left\|\tilde{y}+M^{\prime}(\hat{f}, \hat{g}, \tilde{y})-y\right\|_{1}\right] \tag{3} \]

這一部分的loss backpropagating 同樣也會傳回到perception backbone內,所以此時perception model也可以attend to the low-level details

網路框架細節

首先得到了ego car和其他車的detection,然後針對每輛車的位置和yaw角度,擷取ROI 感興趣的區域輸入到一個CNN 對於車輛 \(i\) 輸出一個embedding \(z^i\),這個\(z^i\) 是在 \(M,M'\)間共享的

  • \(M\) 對於每個High-level command 都使用了一個GRU,the GRU rolled out n次去輸出連續路徑點之間的offset
  • \(M'\) 使用了兩個種類的recursions和rollouts,針對waypoints的rollouts,針對refinement iterations的rollouts

這裡對GRU輸出相對位置有點像transfuser NEAT裡的那樣,看來是預測那邊遷移task過來的

問題區:

  • 對於其他車輛的預測軌跡

    we observe their future trajectory to obtain supervision for future waypoints y

  • 原文寫的是:We instead allow the model to infer the high-level command directly and optimize the plan for the most fitting high-level command.

    然而... 咋fitting出來的呢 emmm 後面看程式碼把

c. controller

當輸出了相對目標點,還需要進行一層控制,因為目標點並不能直接給車,CARLA內 車接受的是油門,方向盤和剎車指令。這裡作者和其他的transfuser NEAT 之類的用的是一樣的 兩個PID 控制。有意思的是(和我 前幾天和同學討論的brake最好外加一個network只做brake響應 這樣應該能降低事故率)沒想到想一塊了 簡直了 hhhh

也就是雖然PID會根據motion plan的相對座標輸出油門、方向盤,但是這裡多加了對剎車的neural network calssifier專門對交通燈和危險場景進行剎停

這個分類器的輸入是前面的三個相機外加一個遠距相機 類似於前面說面的照片 右邊那張,也就說整體系統是四個相機,只是前面用了三個,這裡用的四個

網路框架細節

網路使用的是Resnet18輸出fixed sized embedding然後concatenate到一起 放入一個線性層去預測binary brake(也就是剎車還是不剎車 二值)

然後對於輸出的軌跡 進行一層判斷,如下圖邏輯,如果該軌跡會導致碰撞就調整一下

總結

所以我們先用3D detection和分割任務學習了perception model,然後plan motion進行軌跡預測再往回傳到perception進行loss,最後這兩者輸出map-view feature帶motion plan預測的軌跡,然後用high-level command likelihodd thereshold 來檢查是否碰撞

  • 這裡的檢查碰撞沒看懂?

3. 實驗部分

這一部分 看下線上排行榜 RC方面達到了驚人的94分 真的是令人敬佩,做過這個任務的就知道 RC打到80分以上已經算是突破了,然後扣完分也有61分,甩現在的 March 23, 2022 第二名十分了,詞窮只能再說一句 牛掰!

這裡就貼一下表格,因為我做過這個任務... 所以基本不用看文字 我都知道這些指標是些啥 好壞與否hhh,主要就貼消融實驗裡的部分了

之所以開頭說和特斯拉 AI day說的很像是因為下面這幅效果圖 hhh 真的太像了,果然這個作者的效果圖都超酷hhh WOR也是

4. Conclusion

沒啥好conclusion了,一句話 牛掰,這個作者我著實佩服,按著每年一篇的速度(還基本上是一個人在做)引領 CARLA 這個自動駕駛任務的方向!【從lbc, wor 再到現在的lav】佩服!

就貼一下原文的討論把,雖然我覺得這已經是到頭了 真的是厲害

碎碎念

前段時間趕完論文後,又看了一遍WOR的程式碼和評估,當時和這個作者在github 交流了好久 發現我竟然沒follow,隨手一個follow 第二天看的時候發現啊,大佬回follow我了 這就像你偶像關注你一樣 hhh 太奇妙了

另外 有意思的是,我做的這個任務的時候 到後面 我一直以為瓶頸在專家資料,LAV這篇絲毫沒提這個,而... 程式碼也沒po 他是如何收集資料的,比如transfuser, lbc 和mmfn 都會進行說明資料如果進行收集,不過從開出來的資料集400多G 再瞅瞅我的 100G hhh 知道了 差距,此點的相關issue


程式碼執行相關,好像程式碼沒po全還有些小問題,

PS 相關包的下載可能會出現的問題,請通過以下命令

conda install pytorch-scatter -c pyg

記得下載 git-lfs