半年前寫的文章了,這半年每周都看感知團隊的BEV和BEVFomer的實際表現數據,現在看自己的判斷沒有什麽問題。
文章就不做修改了。
最近寫的少,最主要的原因是工作崗位由內向變外向,身邊同行多了,就不敢隨便說話了。
最近有一個公眾號發的文章,被很多朋友轉載,聊了Tesla和Mobileye感知的比較。裏面小一半分析和結論都是錯的,可以看出來作者並不深入了解Mobileye,也對自動駕駛演算法總體要點理解不到位。
BEV和Transformer都這麽火,這次就聊一聊。
一 BEV有什麽用
首先,鳥瞰圖並不能帶來新的功能,對規控也沒有什麽額外的好處。
從鳥瞰圖這個名詞就可以看出來,本來網絡攝影機等感知到的物體都是3D空間裏的的,投影到2D空間,只是資訊的損失,也很簡單(乘一個矩陣)。甚至是變換到ST圖上所需的,中間過程的必備一步。
怎麽能說哪個用了鳥瞰圖,哪個沒用呢。
所以,BEV可以理解為,指一個 端到端的感知架構 。
所謂端到端,就是
沒有後處理
,不需要作網絡攝影機拼接和obj融合;單個網絡攝影機內如對於道線的辨識也不需要(像之前分割的方法那樣)做後處理。
舉一個反例,記憶泊車的感知演算法,有一種做法是在AVM的圖上進行SLAM,即使這是貨真價實的在鳥瞰圖上的演算法,也沒人天天宣傳把這個叫BEV。
問題回到了感知本身。怎麽做感知效能好。
不用作後處理當然是好事,如果沒有其他缺點。只是,如果一個小球落下來,用牛頓力學一秒鐘就能算準,是否需要做1萬次實驗,然後擬合一個網絡來預測運動呢。
先說BEV優點:
再說缺點:
第一個優點,是使用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是假的。至於為啥,下次再說。
我一直認為,模型是啥,本身就不重要:
所以,只要有前進演化條件,任何構型的生物都能在智能上超越人類。
三
註意力機制
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 可以建立長距離的聯系 連「距離」這個概念都沒有。而且都是在周圍局部位置的加權。