同端到端自動駕駛:BEV融合與退化訓(xùn)練)
做端到端自動駕駛的人大概都經(jīng)歷過同一個尷尬時刻模型在高速跟車、標(biāo)準(zhǔn)路口直行這類場景里跑得挺穩(wěn)一進(jìn)了被大車擋住視線的無保護(hù)左轉(zhuǎn)或者小區(qū)門口那種兩側(cè)停滿車的窄路規(guī)劃出來的軌跡就開始猶豫、頓挫甚至直接原地不動。你回頭去看感知輸出發(fā)現(xiàn)不是檢測器不行是那個決定性的目標(biāo)壓根就不在自車視野里——它被擋住了被停在路邊的廂式貨車擋住了或者干脆還在幾百米外的路口另一側(cè)。這篇以《End-to-End Autonomous Driving through V2X Cooperation》為題的工作干的正是把車路協(xié)同、車車協(xié)同這條“額外視野”鏈路直接接到端到端自動駕駛模型的骨架上讓規(guī)劃模塊在決策時能看到自車傳感器看不到的那部分世界。它不是簡單的“感知加個路側(cè)相機(jī)”而是把協(xié)同信息當(dāng)成網(wǎng)絡(luò)內(nèi)部的一種可融合、可退化、可蒸餾的特征來源來處理。下面我按自己做端到端項目時的思路把這篇工作的架構(gòu)選擇、訓(xùn)練策略和工程落地里的坑一層一層拆開講。1. 單車端到端的天花板和協(xié)同鏈路真正補(bǔ)上的那半塊拼圖先把概念對齊不然后面全是空談。很多人第一次聽到“端到端自動駕駛”腦子里浮現(xiàn)的是一個大網(wǎng)絡(luò)輸入攝像頭圖像輸出油門剎車方向盤。這個理解不算錯但它只是最激進(jìn)的那一檔也是實際工程里最不好調(diào)的一檔。目前主流可落地的端到端形態(tài)是“感知到規(guī)劃的聯(lián)合優(yōu)化”——中間仍然保留 BEV 特征、Agent 查詢、地圖向量這類結(jié)構(gòu)化表示只是這些表示不再靠人工規(guī)則拼接而是由統(tǒng)一損失驅(qū)動、端到端反向傳播。理解這一點(diǎn)很關(guān)鍵因為協(xié)同信息到底該從哪個口子進(jìn)網(wǎng)絡(luò)完全取決于你把“端”畫在哪里。1.1 端到端不等于“一個網(wǎng)絡(luò)吃圖像出方向盤”我見過不少團(tuán)隊在項目初期把端到端當(dāng)成一個純模型問題覺得只要網(wǎng)絡(luò)夠大、數(shù)據(jù)夠多、損失設(shè)計夠巧規(guī)劃自然就學(xué)會處理遮擋和博弈。實際跑下來會發(fā)現(xiàn)端到端模型對“信息缺失”這件事極其敏感而且它的失敗方式很難診斷它不會告訴你“我看不見那個橫穿的行人”它只會輸出一條看起來莫名其妙的減速軌跡你在損失曲線上完全找不到對應(yīng)的異常點(diǎn)。這就引出一個很現(xiàn)實的問題端到端把中間環(huán)節(jié)的可解釋性換成了整體性能代價是錯誤歸因變難。所以在我的經(jīng)驗里凡是做端到端的團(tuán)隊最后都會老老實實把中間表示打開看——BEV 上那個位置有沒有特征、Agent 查詢有沒有激活、地圖向量有沒有斷。這篇工作把協(xié)同特征注入到 BEV 表示這一層本質(zhì)上就是承認(rèn)了“中間表示必須可檢查、可對齊、可融合”而不是硬憋一個黑箱。你在復(fù)現(xiàn)時如果一上來就想去改規(guī)劃頭的結(jié)構(gòu)方向大概率是錯的先把融合層的對齊做對收益遠(yuǎn)比換規(guī)劃頭大。另一個常被忽略的點(diǎn)是端到端模型的訓(xùn)練分布和部署分布差異比傳統(tǒng)分模塊方案大得多。分模塊方案里感知模塊的輸入永遠(yuǎn)是當(dāng)前幀圖像分布相對穩(wěn)定端到端方案里歷史幀、自車狀態(tài)、導(dǎo)航指令、協(xié)同信息全都進(jìn)了網(wǎng)絡(luò)任何一個通道的統(tǒng)計特性在部署時發(fā)生偏移都會直接污染規(guī)劃輸出。協(xié)同通道尤其脆弱因為它的可用性是有概率的——通信會斷、會延遲、會丟包。這就決定了它必須被設(shè)計成一個“可退化”的通道而不是一個“必須有”的輸入。1.2 V2X 補(bǔ)的是“看不見”而不是“看不清”我在多個項目里反復(fù)確認(rèn)過一個結(jié)論車路協(xié)同的增益絕大部分不來自“提高精度”而來自“擴(kuò)大視野”和“提前時間”。路側(cè)單元架在路口高處能看到自車被遮擋的那一側(cè)前車能提前幾百米感知到擁堵尾部這些信息的價值不在分辨率而在“自車傳感器物理上夠不到”。把這件事量化一下會更清楚。假設(shè)自車以 60 km/h約 16.7 m/s行駛前方有一輛廂式貨車遮擋自車攝像頭能看到的“有效自由空間”被壓縮到 30 米左右。這個距離對應(yīng)的反應(yīng)時間是 1.8 秒看起來夠用。但如果被遮擋區(qū)域內(nèi)有人以 1.5 m/s 橫穿從出現(xiàn)在自車可見區(qū)域到進(jìn)入自車行駛走廊可能只有 0.5 到 0.8 秒。這就是典型的“鬼探頭”場景單車智能在這個時間尺度上幾乎沒有安全余量。而路側(cè)單元在這個場景里能提前 1.5 到 3 秒看到那個行人。這個時間差才是協(xié)同真正值錢的地方。所以你在設(shè)計實驗時一定要把評估重點(diǎn)放在“遮擋類場景”和“視野受限路口”而不是在開闊直道上比較協(xié)同和非協(xié)同的 L2 誤差——開闊直道上兩者差異很小你很容易得出“協(xié)同沒用”的錯誤結(jié)論然后把這個方向砍掉。提示評估協(xié)同增益時按場景類型分組統(tǒng)計至少要單獨(dú)看“遮擋路口”“無保護(hù)左轉(zhuǎn)”“大車跟車”“視線受阻的匯入”這四類。整體平均指標(biāo)會把這些場景的增益稀釋掉。1.3 兩件事合流之后新的問題從哪冒出來端到端加上 V2X不是把兩個模塊拼起來那么簡單它會引入三類新問題而且這三類問題在純單車方案里都不存在。第一類是坐標(biāo)系問題。協(xié)同方發(fā)過來的信息是在它自己的坐標(biāo)系下表達(dá)的。路側(cè)單元有自己固定的安裝位姿其他車有實時變化的位姿。你要把這些信息搬到自車的 BEV 網(wǎng)格上中間要串起“協(xié)同方坐標(biāo)系 → 世界坐標(biāo)系 → 自車當(dāng)前幀坐標(biāo)系”這條鏈任何一環(huán)的標(biāo)定誤差或時間戳錯位都會讓融合特征“糊掉”。糊掉的特征比沒有特征更糟糕因為它會給網(wǎng)絡(luò)提供錯誤的正激勵。第二類是時間不一致問題。不同協(xié)同方的數(shù)據(jù)采集時刻不同傳輸延遲不同到達(dá)自車時的“年齡”不同。你在融合時如果把 300ms 前的他車 BEV 特征和當(dāng)前幀的自車特征直接拼接網(wǎng)絡(luò)學(xué)到的是錯位的信息關(guān)聯(lián)訓(xùn)練時 loss 可能還降得挺好看因為訓(xùn)練集里延遲分布固定一到實車就崩。第三類是可用性問題。協(xié)同通道不是永遠(yuǎn)在的。論文里這類系統(tǒng)通常會設(shè)計成“有協(xié)同就用、沒協(xié)同就退化到單車”這個退化過程必須被顯式訓(xùn)練不能指望網(wǎng)絡(luò)自己學(xué)會。這就是后面要講的教師-學(xué)生和通道丟棄策略存在的根本原因。2. 協(xié)同特征進(jìn)入網(wǎng)絡(luò)的通道設(shè)計融合發(fā)生在第幾層決定了系統(tǒng)的上限如果只讓我從這篇工作里帶走一個工程判斷那就是“融合位置的選擇比融合模塊的結(jié)構(gòu)更重要”。你在感知輸出層融合把對方的檢測框搬過來實現(xiàn)最簡單但信息損失最大而且檢測框的類別體系和不確定性完全丟失你在原始傳感器層融合把對方的圖像拼過來信息最全但帶寬和算力都承受不了標(biāo)定難度也爆表。這篇工作選的是中間那條路——在 BEV 特征層融合用通信傳特征、用位姿做對齊、用網(wǎng)絡(luò)學(xué)融合權(quán)重。2.1 三種融合位置的真實取舍別只看論文里的漂亮數(shù)字我把三種常見融合位置的實際表現(xiàn)整理成一張表這張表里的判斷來自我自己做過的對比實驗和同行交流的經(jīng)驗不是論文里的數(shù)字但方向應(yīng)該是一致的融合位置傳輸內(nèi)容單幀帶寬量級對齊難度信息保留度適合的落地階段感知結(jié)果級檢測框、跟蹤 ID、語義地圖幾 KB 到幾十 KB低只對齊位姿低丟失不確定性與細(xì)粒度幾何早期驗證、低帶寬鏈路BEV 特征級壓縮后的 BEV 特征圖幾百 KB 到幾 MB中高位姿時間特征域?qū)R中高當(dāng)前主流研究方向原始數(shù)據(jù)級圖像、點(diǎn)云幾 MB 到幾十 MB極高需精確外參與時同步最高封閉園區(qū)、固定路側(cè)為什么特征級是當(dāng)下的甜點(diǎn)區(qū)把帶寬算一遍就明白了。假設(shè) BEV 網(wǎng)格是 200×200特征通道 256用 float16 存儲單幀大小是 200×200×256×2 字節(jié)約 20.5 MB。如果按 10 Hz 傳輸就是 205 MB/s這個量級在真實車路協(xié)同鏈路上是不現(xiàn)實的。所以論文里這類方案必然要做特征壓縮通道降維256 降到 32 或 64、空間下采樣200×200 降到 50×50、感興趣區(qū)域裁剪只傳自車周圍一定范圍內(nèi)的格子、量化float16 到 int8。這幾招組合下來通常能把單幀壓到幾百 KB10 Hz 下就是幾 MB/s才算進(jìn)入可討論的區(qū)間。我自己做過一組壓縮對比結(jié)論是通道降維比空間下采樣更傷性能ROI 裁剪最劃算。原因是空間分辨率直接影響小目標(biāo)的定位精度而通道維度里有很多冗余。所以如果帶寬緊張優(yōu)先砍通道其次砍遠(yuǎn)處區(qū)域最后才動近處的空間分辨率。這個順序在論文里未必寫但工程上非常好用。2.2 BEV 特征對齊位姿鏈路里每一環(huán)誤差是怎么被放大的特征級融合最要命的一步是對齊。我給你一個可以直接抄的實現(xiàn)思路。假設(shè)協(xié)同方發(fā)來的是一張 BEV 特征圖 $F_c$附帶它生成該特征時的自車位姿 $T^{c}{t_c}$協(xié)同方在時刻 $t_c$ 的位姿包含位置和朝向以及特征圖的網(wǎng)格參數(shù)原點(diǎn)偏移、分辨率。自車當(dāng)前位姿是 $T^{e}{t_e}$。對齊分三步把協(xié)同方 BEV 網(wǎng)格上的每個格子中心按網(wǎng)格參數(shù)還原到協(xié)同方車體坐標(biāo)系下的坐標(biāo)用 $T^{c}_{t_c}$ 把這些點(diǎn)變換到世界坐標(biāo)系用 $(T^{e}_{t_e})^{-1}$ 把世界坐標(biāo)系的點(diǎn)變換到自車當(dāng)前車體坐標(biāo)系再按自車的網(wǎng)格參數(shù)落格。如果 $t_c \neq t_e$還要在中間插一步運(yùn)動補(bǔ)償用協(xié)同方在 $t_c$ 和 $t_e$ 之間的位姿變化把特征“推”到 $t_e$ 時刻。這一步在很多實現(xiàn)里被省略了然后你會看到融合特征在自車轉(zhuǎn)彎時明顯錯位。誤差放大的機(jī)制值得單獨(dú)說。假設(shè)協(xié)同方定位的橫向誤差是 0.3 米自車定位誤差也是 0.3 米兩者獨(dú)立時融合后的相對誤差大概在 0.42 米量級。如果 BEV 分辨率是 0.5 米/格這個誤差已經(jīng)接近一個格子了。而 BEV 特征圖上的物體邊界通常只有一到兩個格子的寬度誤差超過半格邊界就糊了后續(xù)的檢測頭和規(guī)劃頭拿到的就是一團(tuán)加寬、模糊的響應(yīng)。更麻煩的是這個誤差是系統(tǒng)性的不是隨機(jī)的——它會隨著兩車距離拉大而線性增長因為角度誤差乘以距離所以遠(yuǎn)處區(qū)域的融合特征基本是廢的。注意如果你的定位鏈路里用的是純 IMU 遞推加低頻全局校正那么兩次校正之間的位姿漂移會直接進(jìn)入融合環(huán)節(jié)。這種情況下寧可減小融合半徑只融合自車周圍 30 米內(nèi)的協(xié)同特征也不要強(qiáng)行融合遠(yuǎn)處。下面這段偽代碼是我自己在實驗里用的對齊 運(yùn)動補(bǔ)償骨架你可以對著改import numpy as np def align_coop_bev(coop_feat, coop_pose_tc, coop_pose_te, ego_pose_te, grid_cfg, out_hw, max_range): coop_feat: [C, Hc, Wc] 協(xié)同方發(fā)來的 BEV 特征 coop_pose_tc: 4x4 協(xié)同方在采集時刻 tc 的位姿世界系 coop_pose_te: 4x4 協(xié)同方在自車當(dāng)前時刻 te 的位姿世界系需插值得到 ego_pose_te: 4x4 自車當(dāng)前時刻位姿世界系 grid_cfg: 協(xié)同方網(wǎng)格參數(shù) {res, x0, y0} out_hw: 輸出網(wǎng)格 (H, W) max_range: 只融合自車周圍的半徑單位米 H, W out_hw res_out grid_cfg[res_out] # 1. 自車輸出網(wǎng)格的每個格子中心轉(zhuǎn)到世界系 ys, xs np.meshgrid(np.arange(H), np.arange(W), indexingij) pts_ego np.stack([ (xs - W / 2) * res_out, (ys - H / 2) * res_out, np.zeros_like(xs, dtypenp.float32), np.ones_like(xs, dtypenp.float32), ], axis-1).reshape(-1, 4) pts_world (ego_pose_te pts_ego.T).T # 2. 世界系 - 協(xié)同方在 te 時刻的車體系運(yùn)動補(bǔ)償后 pts_coop_te (np.linalg.inv(coop_pose_te) pts_world.T).T # 3. 協(xié)同方 te 時刻車體系 - 協(xié)同方 tc 時刻車體系歷史特征所在坐標(biāo)系 T_te_to_tc np.linalg.inv(coop_pose_tc) coop_pose_te pts_coop_tc (T_te_to_tc pts_coop_te.T).T # 4. 落到協(xié)同方特征圖網(wǎng)格上做雙線性采樣 u pts_coop_tc[:, 0] / grid_cfg[res] - grid_cfg[x0] v pts_coop_tc[:, 1] / grid_cfg[res] - grid_cfg[y0] valid (u 0) (u coop_feat.shape[2] - 1) \ (v 0) (v coop_feat.shape[1] - 1) # 超出 max_range 的格子不融合避免遠(yuǎn)處誤差污染 dist np.linalg.norm(pts_world[:, :2] - ego_pose_te[:2, 3], axis-1) valid dist max_range sampled bilinear_sample(coop_feat, u, v) # [N, C] out np.zeros((H * W, sampled.shape[-1]), dtypenp.float32) out[valid] sampled[valid] mask valid.reshape(H, W).astype(np.float32) return out.reshape(H, W, -1), mask這段代碼里最關(guān)鍵的不是采樣本身而是max_range和mask這兩個東西。mask一定要作為額外通道送進(jìn)融合網(wǎng)絡(luò)讓網(wǎng)絡(luò)知道哪些格子的協(xié)同特征是有效的。我吃過一次教訓(xùn)早期版本沒傳 mask網(wǎng)絡(luò)把“零填充”當(dāng)成了“那里確實沒有東西”結(jié)果在通信中斷的幀上模型對遮擋區(qū)域的判斷直接反轉(zhuǎn)規(guī)劃輸出一條朝著遮擋區(qū)加速的軌跡。加上 mask 之后同樣的中斷場景模型會退化成保守策略。2.3 通信拓?fù)浜蛶掝A(yù)算決定了你的架構(gòu)能有多“重”論文里討論協(xié)同通常會涉及通信拓?fù)涫擒囓囍边B還是車到路側(cè)再到云還是混合。這個選擇不是學(xué)術(shù)問題是工程約束問題直接決定你的融合頻率和融合范圍。車車直連的延遲最低幾十毫秒量級但覆蓋范圍隨車流密度變化車少的時候沒用路側(cè)單元覆蓋穩(wěn)定但部署稀疏出了路口就斷兩者混合能補(bǔ)上覆蓋盲區(qū)但你要處理兩套時間基準(zhǔn)和兩套坐標(biāo)系融合模塊得能吃兩種來源的特征。我在實際項目里的判斷是如果你的目標(biāo)場景是城市路口優(yōu)先路側(cè)因為路口恰恰是遮擋最嚴(yán)重、最需要協(xié)同的地方如果目標(biāo)場景是高速或快速路優(yōu)先車車因為那里沒有路側(cè)設(shè)施但車流密度高、跟車關(guān)系穩(wěn)定。帶寬預(yù)算反過來會約束你的模型設(shè)計。舉個具體的賬假設(shè)鏈路可用帶寬是 5 MB/s融合頻率 10 Hz那么每幀可用 500 KB。500 KB 除以 float16 的 2 字節(jié)是 25 萬個數(shù)值。如果 BEV 空間分辨率定在 100×100覆蓋前后 50 米、左右 50 米分辨率 1 米那通道數(shù)最多 25。這個通道數(shù)夠不夠我的經(jīng)驗是用于規(guī)劃決策的協(xié)同特征16 到 32 通道基本能保住主要信息再往上收益遞減明顯。所以如果你的架構(gòu)設(shè)計里融合通道寫的是 256那要么你的帶寬假設(shè)不現(xiàn)實要么你只在仿真里跑過。3. 訓(xùn)練期“看得全”推理期“看得少”教師-學(xué)生和退化訓(xùn)練是必需品這是我讀這篇工作時最認(rèn)同的一個設(shè)計取向協(xié)同信息在訓(xùn)練時通常是完整可得的數(shù)據(jù)集里各路側(cè)、各車的數(shù)據(jù)都存著但部署時永遠(yuǎn)是殘缺的。如果你直接拿完整協(xié)同數(shù)據(jù)訓(xùn)一個模型它在推理時遇到協(xié)同缺失性能會斷崖式下跌而且跌得毫無預(yù)兆。解決辦法在業(yè)界已經(jīng)比較統(tǒng)一了——用教師-學(xué)生框架讓“信息完整”的教師去指導(dǎo)“信息殘缺”的學(xué)生。3.1 為什么不能在訓(xùn)練時就把協(xié)同通道隨機(jī)關(guān)掉有人會問那我訓(xùn)練時直接隨機(jī)丟棄部分協(xié)同輸入不就讓模型適應(yīng)缺失了嗎這個想法方向?qū)Φ珕为?dú)用效果一般。原因在于隨機(jī)丟棄之后學(xué)生模型只能靠自己從殘缺信息里“猜”出正確答案而規(guī)劃任務(wù)的監(jiān)督信號非常稀疏往往只有一條專家軌跡模型很難從中學(xué)到“缺失的那部分應(yīng)該怎么補(bǔ)”。教師-學(xué)生的價值就在這里。教師模型在訓(xùn)練時能看到完整的協(xié)同特征它輸出的中間表示BEV 特征、Agent 查詢、規(guī)劃查詢或者軌跡分布包含了“如果信息完整世界應(yīng)該是什么樣”的知識。學(xué)生模型只看殘缺輸入但它的中間表示被拉向教師的中間表示。這樣一來學(xué)生學(xué)到的不只是“殘缺輸入 → 正確軌跡”這個映射還學(xué)到了“殘缺輸入 → 完整世界的表征”這個更有泛化性的映射。具體到損失設(shè)計我見過三種做法各有取舍蒸餾對象實現(xiàn)復(fù)雜度增益表現(xiàn)適用情況最終軌跡 / 軌跡分布低中等快速驗證階段只想看方向?qū)Σ粚EV 特征圖中較高特征是融合層直接產(chǎn)物監(jiān)督最直接中間查詢 軌跡聯(lián)合高最高有充足算力、追求極限性能我自己的經(jīng)驗是如果只做一層蒸餾選 BEV 特征如果算力允許加一層規(guī)劃查詢的蒸餾對閉環(huán)指標(biāo)的幫助比開環(huán) L2 更明顯。因為開環(huán) L2 主要考核“像不像專家軌跡”而閉環(huán)更看重“遇到?jīng)]見過的狀態(tài)能不能穩(wěn)住”后者更依賴中間表征的質(zhì)量。3.2 通道丟棄策略的細(xì)節(jié)比“隨機(jī)丟”三個字復(fù)雜得多退化訓(xùn)練的核心是“怎么丟”。我總結(jié)了幾條實操中驗證過的原則按協(xié)同源丟不按通道丟。也就是說模擬“某個路側(cè)單元掉線”或“某輛車退出協(xié)同”而不是隨機(jī)把特征圖的某些通道置零。按源丟更貼近真實故障模式網(wǎng)絡(luò)學(xué)到的退化策略也更合理。按通道丟會讓網(wǎng)絡(luò)學(xué)到“某些通道不重要”這跟實際部署時的失效模式完全不匹配。丟棄概率要分層。我的配置是全協(xié)同可用 50%部分協(xié)同可用 30%完全無協(xié)同 20%。為什么保留 50% 的全協(xié)同因為教師蒸餾需要完整的正向樣本如果全都是殘缺樣本學(xué)生會失去方向。為什么必須有 20% 的完全無協(xié)同因為這是最壞情況必須被顯式訓(xùn)練否則一旦真的斷鏈模型的表現(xiàn)會比純單車模型還差——它已經(jīng)習(xí)慣了有協(xié)同突然沒了會更慌。丟棄要跟時間相關(guān)。真實的通信中斷往往持續(xù)若干幀而不是單幀隨機(jī)丟。所以我在實現(xiàn)里用的是“馬爾可夫式”的丟棄當(dāng)前幀是否可用取決于上一幀的狀態(tài)用一個簡單的狀態(tài)轉(zhuǎn)移矩陣控制。這樣訓(xùn)練出來的模型在連續(xù)多幀斷鏈的情況下表現(xiàn)明顯更穩(wěn)。class CoopDropoutScheduler: 按協(xié)同源做馬爾可夫式丟棄模擬真實斷鏈 def __init__(self, sources, p_keep0.95, p_recover0.3): self.state {s: True for s in sources} self.p_keep p_keep # 上一幀可用 - 本幀仍可用 self.p_recover p_recover # 上一幀不可用 - 本幀恢復(fù) def step(self): for s in self.state: if self.state[s]: self.state[s] np.random.rand() self.p_keep else: self.state[s] np.random.rand() self.p_recover # 兜底保證至少 20% 的 batch 處于完全無協(xié)同狀態(tài)在 dataloader 層控制 return dict(self.state)這段邏輯不復(fù)雜但它對最終指標(biāo)的貢獻(xiàn)遠(yuǎn)超我的預(yù)期。我在一個路口左轉(zhuǎn)場景上做過消融不做退化訓(xùn)練斷鏈時碰撞率飆升加上按源的馬爾可夫丟棄后斷鏈時的表現(xiàn)基本回到純單車水平而全協(xié)同時的增益幾乎沒有損失。3.3 數(shù)據(jù)切分和時序標(biāo)簽是最容易被低估的坑協(xié)同數(shù)據(jù)集的切分不能按幀隨機(jī)切。同一段連續(xù)場景里前后幀高度相關(guān)隨機(jī)切分會讓訓(xùn)練集和驗證集“泄漏”你在驗證集上看到的漂亮數(shù)字是假的。必須按場景片段切分而且如果數(shù)據(jù)集包含多個路口、多個時段還要保證驗證集里的路口和訓(xùn)練集不重疊否則模型學(xué)到的是“這個路口的幾何特征”而不是“如何利用協(xié)同信息”。時序標(biāo)簽這塊坑更深。協(xié)同特征是有時間戳的如果你的標(biāo)簽比如未來的規(guī)劃軌跡是按自車時間軸打的時間戳而輸入特征里混著不同時刻的協(xié)同信息那么監(jiān)督信號和輸入之間就存在系統(tǒng)性的時間偏移。訓(xùn)練時模型會“學(xué)會”利用這個偏移因為偏移在訓(xùn)練集里是固定的部署時延遲分布一變就全亂了。我的處理辦法是在數(shù)據(jù)加載階段就把所有輸入對齊到統(tǒng)一的時間基準(zhǔn)自車當(dāng)前幀并在配置文件里顯式記錄每個來源的原始時間戳方便后續(xù)排查。4. 復(fù)現(xiàn)時最耗時間的四類故障一份按現(xiàn)象索引的排查鏈路論文里的架構(gòu)圖看起來干凈實際復(fù)現(xiàn)的時候你會有大量時間花在“為什么指標(biāo)不漲”“為什么訓(xùn)練集收斂驗證集不收斂”這類問題上。我把踩過的坑按現(xiàn)象整理成一份排查索引你可以直接拿去對照。4.1 指標(biāo)不漲反跌先查時間對齊別急著改模型協(xié)同方案剛跑通、指標(biāo)反而比純單車基線差這是最常見的第一個坎。我的排查順序是固定的第一步關(guān)掉協(xié)同通道只跑純單車基線確認(rèn)基線本身沒問題。聽起來很傻但我遇到過兩次最后發(fā)現(xiàn)是基線復(fù)現(xiàn)的配置文件被改壞了跟協(xié)同模塊一點(diǎn)關(guān)系沒有。第二步檢查時間戳對齊。具體做法是把協(xié)同特征和自車特征分別可視化到同一張 BEV 圖上找一個靜止的顯著目標(biāo)比如路口的桿子、建筑角點(diǎn)看兩邊是否重合。如果不重合量一下偏移方向和幅度通常是幾十毫秒的時間錯位造成的。60 km/h 下50 ms 就是 0.83 米的位移在 BEV 上超過一個格子。第三步檢查坐標(biāo)系符號。這個錯誤極其常見不同來源的坐標(biāo)系有的是右手系、有的是左手系y 軸朝向、角度正方向都可能不同。我在一個項目里排查了整整兩天最后發(fā)現(xiàn)是某個來源的朝向角用了順時針為正而我們默認(rèn)逆時針。加一個yaw_sign配置項就解決了但那兩天真的很難受。第四步檢查 mask 有沒有傳。前面說過零填充必須和“無效”區(qū)分開。這四步走完八成的問題能定位。如果還是不行再去看融合模塊的結(jié)構(gòu)和初始化。4.2 協(xié)同增益只在直道出現(xiàn)彎道和路口全無這個現(xiàn)象特別有診斷價值它幾乎總是指向位姿漂移或者運(yùn)動補(bǔ)償缺失。直道上兩車相對位姿變化小歷史特征直接搬過來誤差不大一進(jìn)彎道幾十毫秒前采集的特征在自車坐標(biāo)系里已經(jīng)轉(zhuǎn)了好幾度你不做補(bǔ)償融合特征就是旋著糊上去的。我的驗證方法是在彎道場景里把運(yùn)動補(bǔ)償開關(guān)做成可配置項分別跑一遍。如果開了補(bǔ)償指標(biāo)明顯回升問題就確認(rèn)了。補(bǔ)償本身不難難的是你拿不到精確的中間位姿——如果協(xié)同方只發(fā)特征和“當(dāng)前位姿”你就沒法插值出采集時刻到當(dāng)前時刻之間的運(yùn)動。解決辦法是在數(shù)據(jù)協(xié)議里要求協(xié)同方附帶位姿序列或者速度、橫擺角速度讓接收端自己積分。這個協(xié)議設(shè)計在項目早期定后期改起來很痛苦。另一個隱蔽原因是外參標(biāo)定誤差在彎道被放大。路側(cè)單元的安裝外參如果朝向角差 1 度在 100 米外就是 1.7 米的橫向誤差直道上這個誤差表現(xiàn)為整體偏移網(wǎng)絡(luò)能部分適應(yīng)彎道上表現(xiàn)為局部形變網(wǎng)絡(luò)學(xué)不會。所以路側(cè)外參一定要定期復(fù)核別指望一次標(biāo)定用一年。4.3 延遲從 80 ms 抖到 400 ms融合策略要怎么改真實鏈路里的延遲不是常數(shù)。我在測試環(huán)境里記錄到的分布是中位數(shù) 80 ms 左右95 分位能到 300 ms極端情況下 400 ms 以上。如果你的融合模塊假設(shè)延遲恒定那它在長尾情況下的表現(xiàn)會非常差。我的處理分三層第一層時間戳門控。超過一定年齡比如 500 ms的協(xié)同特征直接丟棄不要試圖融合。老特征提供的信息價值可能還不如帶來的錯位傷害。第二層年齡編碼。把每個協(xié)同來源的“特征年齡”作為一個標(biāo)量編碼后拼接到融合特征上讓網(wǎng)絡(luò)自己學(xué)會根據(jù)年齡調(diào)整信任度。這一招效果出乎意料地好實現(xiàn)成本也低。第三層緩存與預(yù)測。對高頻更新的來源緩存最近幾幀用簡單的勻速模型外推到當(dāng)前時刻。這里不要上復(fù)雜的預(yù)測模型勻速加橫擺角速度補(bǔ)償就夠了復(fù)雜模型引入的誤差反而更大。4.4 訓(xùn)練集漂亮、閉環(huán)抖動問題多半在規(guī)劃層的耦合開環(huán)指標(biāo)比如軌跡 L2 誤差、碰撞率和閉環(huán)表現(xiàn)之間的相關(guān)性比很多人想象的低。我見過開環(huán) L2 降了 15%、閉環(huán)舒適度和完成率反而變差的案例。原因通常有兩個一是協(xié)同特征讓模型變得“激進(jìn)”。模型能從協(xié)同信息里提前看到遠(yuǎn)處空曠于是傾向于加速但它的規(guī)劃頭沒有學(xué)會處理“協(xié)同信息突然中斷”的情況一旦中斷它已經(jīng)建立的速度優(yōu)勢收不回來就會出現(xiàn)急剎或者猶豫。二是融合模塊和規(guī)劃模塊的梯度沖突。如果融合模塊的監(jiān)督信號比如特征重建損失和規(guī)劃損失的量級不匹配訓(xùn)練時規(guī)劃損失會被壓制模型學(xué)到的融合特征是“好看但不好用”的。我的做法是給融合損失加一個較小的權(quán)重并且用梯度裁剪控制它進(jìn)入主干的反傳強(qiáng)度讓規(guī)劃損失主導(dǎo)優(yōu)化方向。提示判斷是不是梯度沖突最快的辦法是分別記錄融合損失和規(guī)劃損失的梯度范數(shù)。如果融合損失的梯度范數(shù)長期高于規(guī)劃損失基本可以確認(rèn)存在沖突需要調(diào)權(quán)重。5. 從論文到能跑的東西一份務(wù)實的落地清單讀完一篇論文到真正能讓代碼跑起來中間的差距通常比論文本身厚得多。我把復(fù)現(xiàn)這篇工作時認(rèn)為必須提前定下來的事情列一遍按優(yōu)先級排。5.1 坐標(biāo)系和數(shù)據(jù)協(xié)議一定要在寫模型之前定死這是我最想強(qiáng)調(diào)的一條。協(xié)同項目里模型代碼可以改數(shù)據(jù)協(xié)議改了要全鏈路重來。我在協(xié)議里固定下來的字段包括每幀的唯一時間戳統(tǒng)一到毫秒級且明確是采集時刻還是發(fā)送時刻位姿包含位置、朝向角、以及朝向角的定義方式正方向、零點(diǎn)速度與橫擺角速度用于插值和外推BEV 特征圖的網(wǎng)格參數(shù)分辨率、原點(diǎn)偏移、行列方向特征的編碼格式通道數(shù)、數(shù)據(jù)類型、量化方式有效性 mask明確哪些區(qū)域是真實觀測、哪些是零填充來源標(biāo)識與幀序號用于做丟包檢測和亂序重排。這些字段看起來瑣碎但只要缺一個你后面就要花幾天去猜。我見過最慘的情況是對方?jīng)]發(fā)幀序號結(jié)果亂序到達(dá)時整個融合結(jié)果都是錯的排查了三天才發(fā)現(xiàn)。5.2 評估口徑開環(huán)指標(biāo)會騙人閉環(huán)又跑不動開環(huán)評估便宜、快但它只考核“像不像專家軌跡”。協(xié)同方案在開環(huán)上的增益往往被低估因為開環(huán)的專家軌跡本身就是在單車信息下產(chǎn)生的協(xié)同提供的額外信息沒有對應(yīng)的“更優(yōu)軌跡”作為監(jiān)督。所以只看開環(huán)你會覺得協(xié)同沒什么用。閉環(huán)評估能反映真實價值但跑起來慢。我的折中方案是開環(huán)做日?;貧w閉環(huán)做階段性驗收。開環(huán)階段重點(diǎn)關(guān)注分組指標(biāo)遮擋場景單列閉環(huán)階段重點(diǎn)關(guān)注三類指標(biāo)——完成率、碰撞率、舒適度加加速度的分布。這三類指標(biāo)里舒適度最容易被忽略但它是協(xié)同方案最容易退化的地方因為融合特征的抖動會直接傳導(dǎo)到規(guī)劃輸出。5.3 一份可以照著填的參數(shù)速查表下面這些取值是我在復(fù)現(xiàn)和調(diào)參過程中沉淀下來的“起點(diǎn)值”不是最優(yōu)值但能讓你少走彎路。不同數(shù)據(jù)集和場景需要微調(diào)具體以你的實驗結(jié)果為準(zhǔn)參數(shù)建議起點(diǎn)調(diào)整方向與說明BEV 網(wǎng)格范圍前后 50 m左右 50 m城區(qū)路口夠用高速需拉長前后向BEV 分辨率0.5 m/格再細(xì)帶寬吃不消再粗小目標(biāo)丟失融合通道數(shù)32壓縮后帶寬允許可到 64收益遞減融合半徑上限40 到 50 m超出后位姿誤差主導(dǎo)融合無益協(xié)同更新頻率10 Hz低于 5 Hz 時決策滯后明顯特征年齡門限500 ms超過直接丟棄教師蒸餾權(quán)重0.3 到 0.5太高會壓制規(guī)劃損失全協(xié)同樣本比例約 50%低于 30% 蒸餾失去方向完全無協(xié)同比例約 20%必須保留訓(xùn)練退化能力歷史幀數(shù)3 到 5 幀再多收益小且算力吃緊這張表里我覺得最值得強(qiáng)調(diào)的是“完全無協(xié)同比例”這一行。很多人在做退化訓(xùn)練時會不自覺地把這個比例設(shè)得很低比如 5%覺得“反正是極端情況”。但實測下來20% 左右是性價比最高的區(qū)間再低模型就學(xué)不會真正的退化策略。5.4 想繼續(xù)往上做可以從這三個方向切第一個方向是融合的稀疏化。現(xiàn)在主流的做法是稠密 BEV 特征融合但協(xié)同信息的價值其實高度集中在少數(shù)關(guān)鍵區(qū)域被遮擋的那塊、路口的那一角。如果能用一個輕量的注意力機(jī)制先預(yù)測“哪里需要協(xié)同信息”再做稀疏傳輸和稀疏融合帶寬能降一個數(shù)量級這對落地價值極大。第二個方向是規(guī)劃層直接消費(fèi)協(xié)同意圖。目前的方案基本是把協(xié)同信息融合進(jìn)感知表征再由規(guī)劃頭隱式使用。但如果協(xié)同方能直接廣播它的意圖比如“我準(zhǔn)備左轉(zhuǎn)”“我要并線”規(guī)劃層可以直接把這個意圖作為條件輸入做交互式?jīng)Q策。這在密集車流里的價值比感知融合更直接也更接近真正的協(xié)同駕駛。第三個方向是失效可解釋性。協(xié)同系統(tǒng)最怕的不是性能不夠而是“不知道什么時候不可信”。如果能給融合特征附帶一個置信度估計并在置信度低時明確退化到保守策略整個系統(tǒng)的可用性會上一個臺階。這塊目前論文里討論得不多但我認(rèn)為它是從 demo 走向產(chǎn)品的必經(jīng)之路。最后分享一個我自己的小習(xí)慣每次改完融合模塊我都會先把“無協(xié)同”和“全協(xié)同”兩種極端配置各跑一遍看兩者的差距。如果差距很小說明融合模塊根本沒起作用先去查 mask 和梯度如果差距很大但中間態(tài)部分協(xié)同表現(xiàn)很差說明退化訓(xùn)練不夠。這兩個極端值就像體溫計比看整體指標(biāo)更快定位問題。踩過幾次坑之后我現(xiàn)在打開任何一份協(xié)同端到端的實驗日志第一眼看的就是這兩行數(shù)字。