當前位置: 華文星空 > 汽車

BEV演算法的發展方向和尚待解決的問題有哪一些潛在的解決方案和論文?

2023-11-06汽車

半年前寫的文章了,這半年每周都看感知團隊的BEV和BEVFomer的實際表現數據,現在看自己的判斷沒有什麽問題。

文章就不做修改了。

最近寫的少,最主要的原因是工作崗位由內向變外向,身邊同行多了,就不敢隨便說話了。

最近有一個公眾號發的文章,被很多朋友轉載,聊了Tesla和Mobileye感知的比較。裏面小一半分析和結論都是錯的,可以看出來作者並不深入了解Mobileye,也對自動駕駛演算法總體要點理解不到位。

BEV和Transformer都這麽火,這次就聊一聊。

一 BEV有什麽用

首先,鳥瞰圖並不能帶來新的功能,對規控也沒有什麽額外的好處。

從鳥瞰圖這個名詞就可以看出來,本來網路攝影機等感知到的物體都是3D空間裏的的,投影到2D空間,只是資訊的損失,也很簡單(乘一個矩陣)。甚至是變換到ST圖上所需的,中間過程的必備一步。

怎麽能說哪個用了鳥瞰圖,哪個沒用呢。

所以,BEV可以理解為,指一個 端到端的感知架構

所謂端到端,就是 沒有後處理 ,不需要作網路攝影機拼接和obj融合;單個網路攝影機內如對於道線的辨識也不需要(像之前分割的方法那樣)做後處理。

舉一個反例,記憶泊車的感知演算法,有一種做法是在AVM的圖上進行SLAM,即使這是貨真價實的在鳥瞰圖上的演算法,也沒人天天宣傳把這個叫BEV。

問題回到了感知本身。怎麽做感知效能好。

不用作後處理當然是好事,如果沒有其他缺點。只是,如果一個小球落下來,用牛頓力學一秒鐘就能算準,是否需要做1萬次實驗,然後擬合一個網路來預測運動呢。

先說BEV優點:

  • 在網路攝影機fov的重疊區域的物體,自動match和加權,省去了後處理的人工時;
  • 跨越多個網路攝影機的物體,也就是fov邊緣物體,可以先拼接後接入網路detection;如果不這麽做,也可以再拼接一次再detection,但這樣不太優雅;
  • 數采同步由Lidar,且標註用Lidar做時,BEV的GT是現成的。而很多Mono3D網路的GT需要的2D框卻沒有現成的。
  • 再說缺點:

  • 重疊區域,雙目多視角幾何的距離等指標算的更準;
  • 感知範圍小(距離小一半),位置分表率低(投影之後分辨率為m級);
  • 不透明的處理 相機內外參 和 IMU 等輸入,類似上面牛頓力學的例子,交給網路去預測確定的公式;
  • 暫無成熟的網路可用。
  • 第一個優點,是使用BEV的核心訴求。

    所以,一般BEV的模型還帶上了如下feature:

  • 時間濾波;
  • 道線與地圖的定位融合;
  • 這些都是很好的探索,挖掘AI的套用潛力。

    二 BEV怎麽做

    BEV要做的核心事情就是一件:把2D相機視角下的feature投影到2D鳥瞰圖上。

    但是,這個投影需要知道 深度資訊 。當相機視角下,還沒做到detection回歸距離時,是只有平面的特征圖的。‘

    用AI,當然是假裝知道了深度,投影變換用一個矩陣表示,然後靠數據去學習這個矩陣。可以理解為, 把回歸距離這一步在這做一遍 。單幀影像當然可以做,靠近大遠小,車和人的尺寸都是固定的,這個規律不難學到。

    但是,細節上,想浪費時間的人且看以下:(我非常不喜歡看這些論文,但是最近看了不少):

    (CVPR) , 2019, https:// doi.org/10.1109/cvpr.20 19.00864

    第一篇,先做深度估計,再做detection,能準就怪了。當你擡頭看雲彩,覺得一多雲像草尼馬後,你才會體會到距離,再之前,你是迷茫的。

    FCOS3D: ICCVW , 2021

    第二篇,深度估計和detection分離並列,同上,求大家灌水敬業一點。

    Lift, Splat, Shoot: ECCV 2020

    第三篇,非常粗爆,直接把cnn得到的features定義為深度分布和context(語意資訊)。其中深度分度是一個41維的向量,且每個相機的每個像素點對應一個深度向量和語意向量。所以這是一個驚人大的需要去擬合的tensor。文章寫的比較敷衍,連網路定義和圖都沒有,看樣子也嫌浪費時間。

    Simple-BEV. 2022.

    第四篇,終於正常點,一個BEV點最多對應兩個相機點,也就是200*200的矩陣中,每個點對應兩個待擬合的小矩陣。比上一篇需要擬合的數少了1000倍。

    DETR3D 2021

    第五篇,用上了transformer,有網紅潛力了。右下角那個decoder的query是按obj的數量來的,obj的數量在0-100之間波動,當數量少時,變成網路瓶頸,對訓練效果以及推理的連續性肯定有影響。

    BEVFormer ECCV 2022

    第六篇,充分吸取過往經驗,名字碰瓷tesla,BEVFormer,所以真紅了。不過中間那個明明是decoder,為什麽作者要叫encoder。

    這篇和第四篇區別:1個BEV點要學習4個矩陣(4個偏置和權重),且網路深度上迴圈六次,比第四篇多10倍,可能第四篇太少了。

    這篇和第五篇區別:那個藍色的BEV queries大小固定,和BEV輸出大小一致。比第五篇多1000-10000倍。

    為什麽要用Transfomer

    先簡單說下:

    CNN 優點:
    1適合平行計算

    2適合視覺

    3參數少(比MLP)

    CNN 缺點:

    1 沒有全域聯系 只能靠最後的全連線層(MLP) 但MLP不能太深

    2 不適合做(時間)序列,不像RNN,所以濾波許麽的不擅長。

    RNN:我能做濾波啊,但RNN不適合並列(主要是訓練),考慮到卡那麽貴,還是算的快的能生存,所以被transformer淘汰了

    Transformer優點:

    1 適合平行計算(和CNN差不多)

    2 適合做(時間)序列,所以BEV有了這個能力

    3 對於大模型容易訓練 (因為參數冗余多,不容易陷入局部最優),CNN也比較容易訓練(自動駕駛適用大小的模型)。

    4 可以建立長距離的聯系 (CNN不行,MLP可以但是太臃腫)

    Transformer缺點:

    1 不適合視覺。所以backbone還是CNN

    2 沒了。

    But,上面文章中的Transformer是假的。至於為啥,下次再說。

    我一直認為,模型是啥,本身就不重要:

  • 這幾年GoogLeNet為代表的復雜模型已經被淘汰了,
  • CNN在工業界已全是最簡單的殘留誤差模型,
  • GPT的勝出也證明模型越簡單越好,
  • AutoML以及NAS(網路架構搜尋)毫無進展

  • 所以,只要有前進演化條件,任何構型的生物都能在智慧上超越人類。

    註意力機制 Transformer的核心

    大家都知道Transformer誕生的那篇google的論文叫什麽什麽is all your need。

    註意力就是不同位置之間 關聯 有多緊密的權重。

    兩個向量點積,模的最大值產生於向量夾角為0。也就是說,如果兩個word意義相近,embedding向量也就相近,那自然註意力就大。這是最簡單的一種情況,不用考慮位置向量。

    紅框裏的計算,就是在去求這個關聯的權重,得到一個方陣。毫無疑問,這就是trasformer的核心之處。

    多說一句,為什麽不直接學右邊這個矩陣,而是要學左邊這兩個矩陣呢?

    在NLP裏,句子的最大長度在100-1000這個量級,而詞向量的維度一般在10000-50000這個量級。
    分別按100和10000舉例,學左邊,要學2000000(=2*100*10000)個參數;右邊只要學10000(=100*100)個參數。相差200倍。

    這裏涉及到了AI原理性的問題,參數越少,訓練越容易陷入局部最優,而參數多了,到處都是鞍點(維度高了,所有維度的二階導都同號的機率低),很容易滑出去。

    我們來看這些BEV論文怎麽做的:

    這裏的註意力A是直接學出來的,並沒有經過左邊的乘法,而且它不是一個方陣,竟是一個純量。和Transformer願意擴充200倍參數,是完全相反的。

    看這個公式,確實只是一個b為0的單層MLP,Nkey的node,輸出q維,輸入x維。

    我們可以看到,右邊是BEV座標(q),左邊是相機座標(p),這個公式就是把相機座標對映到了BEV座標。我一直沒搞明白為什麽要分自頂向下和反過來,不就是把等式左右兩邊換一下。

    多頭 決定Transformer能力的重要維度

    關聯有多種含義,比如一個人的頭和手是關聯的,代表了同一個人;一個人的頭和另一個人的頭是關聯的,代表了都是頭。

    所以,這就是Multi-Head,多頭註意力,一個位置在 不同意義上和多個 其他位置關聯。

    此外,Multi-Head還能再多出很多倍參數。NLP裏,transformer的頭數一般是100。

    上面是一個8頭的示意,先把每個頭的輸出拼接起來,再降維(找到最突出的方向)。

    我們來看這些BEV論文怎麽做的:

    文中的Nhead是8。

    但是,這是求和,其實還是加權,只不過把A的加權維度從8提升到了64.

    所以,是單頭。

    位置編碼 Transformer的必備要素

    Transformer本身不能分辨輸入的位置,對它來說,兩個詞調換位置是無感地(只要後面地向量位置都跟著換),所以處理序列問題(位置很重要)必須要加位置編碼。包括Vit。

    我們來看這些BEV論文怎麽做的:

    位置編碼是一個學到的矩陣。

    看來,這不是位置編碼,只是叫這個名字。它們根本不關心輸入的順序。編碼都是要精心設計的,要能有區分度,而且至少不能有重復的吧。

    那為什麽會這樣呢?

    會不會是因為,CNN壓根就不需要位置編碼呢。

    六 其他

    還有很多不像的地方,比如每個encoder都有的那個不參與反向算梯度的上一時刻的輸出。

    我猜可能不這樣,梯度就傳不下去,畢竟如前所說太瘦了。

    我們回顧一下上次說的transformer的優點:

    1 適合平行計算。因為既沒有多頭,也沒有矩陣乘法,純量計算的維度也不大,所以變成了平行計算瓶頸。Transformer的特點沒有了。

    2 適合做(時間)序列,沒有位置編碼。

    3 對於大模型容易訓練 參數少。

    4 可以建立長距離的聯系 連「距離」這個概念都沒有。而且都是在周圍局部位置的加權。