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