感知算法:地平線SparseBevFusionMultitask解析與部署實(shí)踐)
1. 項(xiàng)目概述當(dāng)稀疏化遇上多任務(wù)BEV感知最近在自動(dòng)駕駛感知算法的圈子里地平線推出的“SparseBevFusionMultitaskOE-V1.0”這個(gè)參考算法引起了不少工程師和研究員的好奇。這個(gè)名字聽起來(lái)有點(diǎn)長(zhǎng)但拆開來(lái)看每一個(gè)詞都指向了當(dāng)前感知領(lǐng)域最前沿的幾個(gè)技術(shù)方向Sparse稀疏化、BevFusion鳥瞰圖融合和Multitask多任務(wù)。簡(jiǎn)單來(lái)說(shuō)這是一個(gè)基于地平線征程系列芯片專門為高效、高性能的多任務(wù)鳥瞰圖感知而設(shè)計(jì)的算法參考實(shí)現(xiàn)。如果你正在為車載計(jì)算平臺(tái)上的感知模型部署發(fā)愁尤其是面對(duì)動(dòng)輒幾十個(gè)GFLOPs甚至上百TFLOPs的復(fù)雜BEV模型時(shí)感覺(jué)內(nèi)存和算力都捉襟見肘那么這個(gè)算法可能就是你一直在找的“參考答案”。它核心要解決的就是在有限的車規(guī)級(jí)芯片算力下如何讓一個(gè)模型同時(shí)、高效地完成3D目標(biāo)檢測(cè)、可行駛區(qū)域分割、車道線檢測(cè)等多個(gè)關(guān)鍵感知任務(wù)。這不僅僅是把幾個(gè)任務(wù)的網(wǎng)絡(luò)頭拼在一起更深層的是通過(guò)稀疏化計(jì)算來(lái)大幅降低冗余讓模型跑得更快、更省資源。我之所以花時(shí)間深入研究它是因?yàn)樵趯?shí)際項(xiàng)目中我們常常遇到這樣的困境單個(gè)任務(wù)的BEV模型比如只做3D檢測(cè)已經(jīng)能讓芯片的NPU利用率飆到80%以上再加上其他任務(wù)要么延遲超標(biāo)要么內(nèi)存爆掉。地平線這個(gè)參考算法給出了一種將前沿學(xué)術(shù)思想稀疏BEV、多任務(wù)學(xué)習(xí)與芯片硬件特性如BPU架構(gòu)深度結(jié)合的工程化范例。它不僅僅是論文里的代碼更是考慮了真實(shí)部署約束的解決方案。對(duì)于算法工程師、部署工程師甚至是負(fù)責(zé)技術(shù)選型的架構(gòu)師理解這個(gè)算法的設(shè)計(jì)思路和實(shí)現(xiàn)細(xì)節(jié)都能為自家的感知系統(tǒng)優(yōu)化帶來(lái)直接的啟發(fā)。2. 核心設(shè)計(jì)思路與稀疏化價(jià)值解析2.1 從密集BEV到稀疏BEV的范式轉(zhuǎn)變要理解SparseBevFusionMultitask首先得明白傳統(tǒng)密集BEVBird‘s-Eye-View感知的瓶頸在哪里。經(jīng)典的BEV感知流程通常是將多攝像頭圖像通過(guò)一個(gè)強(qiáng)大的視覺(jué)主干網(wǎng)絡(luò)如ResNet、Swin Transformer提取特征然后通過(guò)一個(gè)稱為“View Transformer”的模塊比如LSS、BEVFormer等方法將這些透視視圖下的特征“抬升”或“變換”到鳥瞰圖坐標(biāo)系下形成一個(gè)密集的BEV特征圖。這個(gè)BEV特征圖就像一張俯視的地圖每個(gè)像素位置都對(duì)應(yīng)著地面上的一個(gè)物理位置并包含了該處的視覺(jué)語(yǔ)義信息。問(wèn)題就出在這個(gè)“密集”上。為了覆蓋車輛周圍足夠大的感知范圍比如前向100米左右各50米并保持足夠高的分辨率比如0.1米/像素這個(gè)BEV特征圖會(huì)非常龐大。假設(shè)范圍是100m x 100m分辨率0.25m那么BEV特征圖就是400x400的網(wǎng)格。如果特征通道數(shù)是256那么單幀的BEV特征數(shù)據(jù)量就是400 * 400 * 256 ≈ 4千萬(wàn)個(gè)元素對(duì)于float32數(shù)據(jù)類型就是約160MB。這僅僅是特征圖還不算后續(xù)檢測(cè)頭、分割頭的計(jì)算量。如此密集的計(jì)算和內(nèi)存訪問(wèn)對(duì)于車載芯片是巨大的負(fù)擔(dān)。稀疏BEV的核心思想就是打破這個(gè)密集網(wǎng)格的約束。它認(rèn)為在真實(shí)的駕駛場(chǎng)景中感興趣的目標(biāo)車輛、行人和可駕駛區(qū)域只占據(jù)了整個(gè)BEV空間的一小部分大部分區(qū)域是空曠的或無(wú)信息的。因此完全沒(méi)有必要為所有位置都進(jìn)行計(jì)算和存儲(chǔ)。稀疏BEV算法會(huì)動(dòng)態(tài)地生成一組“BEV查詢”或“BEV錨點(diǎn)”這些查詢只聚焦在可能有物體的區(qū)域。計(jì)算和特征存儲(chǔ)只發(fā)生在這組稀疏的查詢位置上從而極大地減少了計(jì)算量和內(nèi)存占用。在這個(gè)參考算法中“Sparse”前綴正是體現(xiàn)了這一關(guān)鍵設(shè)計(jì)。它很可能采用了類似Sparse BEV或PETR系列算法的思想使用一組可學(xué)習(xí)的稀疏查詢向量直接與圖像特征進(jìn)行交互生成稀疏的BEV特征從而避免了構(gòu)建龐大密集特征圖的開銷。2.2 多任務(wù)學(xué)習(xí)的協(xié)同與權(quán)衡“Multitask”是這個(gè)算法的另一大支柱。在自動(dòng)駕駛感知中3D目標(biāo)檢測(cè)框出車輛、行人的位置和大小、語(yǔ)義分割劃分出道路、車道線、人行道等區(qū)域通常是獨(dú)立模型。但這帶來(lái)了幾個(gè)問(wèn)題1) 多個(gè)模型重復(fù)計(jì)算底層特征算力浪費(fèi)2) 模型間輸出可能不一致比如檢測(cè)框壓到了分割出的道路上3) 系統(tǒng)集成復(fù)雜調(diào)度開銷大。多任務(wù)學(xué)習(xí)用一個(gè)共享的主干網(wǎng)絡(luò)Backbone來(lái)提取圖像的通用特征然后為不同任務(wù)配備不同的任務(wù)頭Task Head。這樣特征提取只做一次各個(gè)任務(wù)頭在此基礎(chǔ)上進(jìn)行特異性解碼。這能顯著提升計(jì)算效率并可能因?yàn)槿蝿?wù)間的相關(guān)性而提升各自的性能知識(shí)共享。然而多任務(wù)設(shè)計(jì)并非簡(jiǎn)單的“搭積木”。它面臨嚴(yán)峻的挑戰(zhàn)任務(wù)沖突不同任務(wù)的最優(yōu)特征表示可能不同。例如檢測(cè)任務(wù)需要精確的邊界信息而分割任務(wù)需要連貫的區(qū)域信息。強(qiáng)行共享特征可能導(dǎo)致相互干擾性能都不如單任務(wù)模型。損失平衡各任務(wù)的損失函數(shù)量綱、數(shù)值范圍差異巨大。如何平衡檢測(cè)損失如Smooth-L1 Loss和分割損失如交叉熵Loss的權(quán)重是一個(gè)需要精心調(diào)參的難題。部署友好性多個(gè)任務(wù)頭的輸出后處理邏輯不同需要設(shè)計(jì)高效的流水線避免成為新的瓶頸。地平線的這個(gè)參考算法其價(jià)值就在于它提供了一個(gè)經(jīng)過(guò)驗(yàn)證的多任務(wù)網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計(jì)和損失平衡方案并且是針對(duì)其BPU硬件進(jìn)行過(guò)優(yōu)化的確保了算法高效性的同時(shí)也兼顧了部署的便利性。2.3 BevFusion特征融合的藝術(shù)“BevFusion”指明了算法的另一項(xiàng)關(guān)鍵技術(shù)融合。在自動(dòng)駕駛中感知的可靠性不能只依賴于單一傳感器。雖然這個(gè)算法名稱和當(dāng)前的熱點(diǎn)“BEVFusion”融合激光雷達(dá)和攝像頭在字面上重合但根據(jù)其作為“參考算法”的定位以及地平線芯片主要面向純視覺(jué)方案的特點(diǎn)此處的“Fusion”更可能指的是多攝像頭之間的視覺(jué)特征融合或者是在BEV空間中對(duì)時(shí)序特征的融合。對(duì)于多攝像頭每個(gè)攝像頭只能看到場(chǎng)景的一部分且存在重疊區(qū)域。如何將這些不同視角、不同畸變的圖像特征統(tǒng)一、無(wú)失真地融合到一個(gè)共同的BEV空間表達(dá)中是View Transformer模塊要解決的核心問(wèn)題。這個(gè)參考算法所采用的融合策略直接決定了BEV特征的空間一致性和精度。此外時(shí)序融合也至關(guān)重要。單幀圖像難以判斷靜止或低速目標(biāo)也容易受遮擋影響。引入歷史BEV特征通過(guò)遞歸神經(jīng)網(wǎng)絡(luò)如ConvGRU或Transformer進(jìn)行融合可以顯著提升感知的穩(wěn)定性和對(duì)遮擋目標(biāo)的預(yù)測(cè)能力。這部分如果實(shí)現(xiàn)得好對(duì)于城區(qū)復(fù)雜場(chǎng)景的感知提升將是巨大的。3. 算法模塊深度拆解與實(shí)操要點(diǎn)3.1 圖像主干網(wǎng)絡(luò)與特征提取優(yōu)化圖像主干網(wǎng)絡(luò)Backbone是感知系統(tǒng)的基石負(fù)責(zé)從原始像素中提取豐富、多尺度的語(yǔ)義特征。在車載環(huán)境主干網(wǎng)絡(luò)的選擇必須在性能和效率之間取得完美平衡。常見選型與地平線適配像ResNet、ResNeXt、RegNet這類CNN backbone因其結(jié)構(gòu)規(guī)整、易于優(yōu)化在部署中很受歡迎。而近年來(lái)Swin Transformer等視覺(jué)Transformer憑借其強(qiáng)大的全局建模能力在精度上往往更勝一籌。然而Transformer的自注意力機(jī)制計(jì)算復(fù)雜度高對(duì)芯片的矩陣乘加能力和內(nèi)存帶寬要求苛刻。地平線的BPUBrain Processing Unit對(duì)卷積類操作有深度優(yōu)化。因此這個(gè)參考算法極有可能采用了一種重參數(shù)化卷積網(wǎng)絡(luò)或高效CNN架構(gòu)作為主干例如RepVGG、GhostNet的變體或者地平線自研的、針對(duì)BPU指令集特化過(guò)的基礎(chǔ)網(wǎng)絡(luò)結(jié)構(gòu)。這類網(wǎng)絡(luò)在訓(xùn)練時(shí)可能結(jié)構(gòu)復(fù)雜多分支但在部署時(shí)可以通過(guò)結(jié)構(gòu)重參數(shù)化轉(zhuǎn)換為單一的直連卷積從而獲得極高的推理速度。注意在嘗試替換主干網(wǎng)絡(luò)時(shí)務(wù)必考慮其與后續(xù)View Transformer模塊的兼容性。有些Transformer-based的View Transformer如BEVFormer與CNN主干的配合可能需要調(diào)整特征圖的尺度或通道數(shù)。直接套用可能破壞原有的設(shè)計(jì)平衡。多尺度特征融合目標(biāo)有大有小車道線細(xì)長(zhǎng)這就要求主干網(wǎng)絡(luò)能提供多尺度的特征圖例如1/8, 1/16, 1/32下采樣率。參考算法會(huì)精心設(shè)計(jì)一個(gè)特征金字塔網(wǎng)絡(luò)FPN或雙向特征金字塔BiFPN來(lái)融合這些多尺度特征。這里的一個(gè)實(shí)操技巧是在融合時(shí)可以為不同尺度的特征分配可學(xué)習(xí)的權(quán)重如BiFPN讓網(wǎng)絡(luò)自動(dòng)學(xué)習(xí)哪些尺度對(duì)后續(xù)的BEV生成和不同任務(wù)更重要。在部署時(shí)這些額外的加權(quán)操作可能會(huì)增加一些開銷需要評(píng)估其帶來(lái)的精度收益是否值得。3.2 稀疏BEV查詢生成與視圖變換這是整個(gè)算法的核心創(chuàng)新點(diǎn)所在也是“Sparse”一詞的落腳點(diǎn)。稀疏查詢的初始化算法不會(huì)創(chuàng)建一個(gè)覆蓋全場(chǎng)景的密集BEV網(wǎng)格而是初始化一組固定數(shù)量比如900個(gè)的可學(xué)習(xí)參數(shù)每個(gè)參數(shù)稱為一個(gè)“查詢”Query。每個(gè)查詢可以理解為一個(gè)“虛擬的智能體”它被賦予了一個(gè)初始的3D空間參考位置x, y, z和一個(gè)特征向量。這些初始位置可以是均勻分布在感興趣區(qū)域內(nèi)的錨點(diǎn)也可以是純粹可學(xué)習(xí)、由數(shù)據(jù)驅(qū)動(dòng)的?;趫D像的查詢細(xì)化初始的查詢是“盲目的”。接下來(lái)這些查詢需要與多攝像頭的圖像特征進(jìn)行交互從而獲取視覺(jué)信息并細(xì)化自身。這個(gè)過(guò)程通常通過(guò)交叉注意力Cross-Attention機(jī)制實(shí)現(xiàn)每個(gè)查詢通過(guò)相機(jī)參數(shù)投影到所有攝像頭的圖像平面上找到其對(duì)應(yīng)的圖像區(qū)域。查詢的特征向量與對(duì)應(yīng)圖像區(qū)域的特征進(jìn)行交叉注意力計(jì)算。查詢作為“問(wèn)詢者”圖像特征作為“被檢索的信息源”。通過(guò)注意力機(jī)制查詢從圖像中聚合最相關(guān)的特征更新自身的特征表示同時(shí)也可能微調(diào)其3D位置如果設(shè)計(jì)允許。這個(gè)過(guò)程是稀疏的因?yàn)橹挥羞@有限數(shù)量的查詢參與計(jì)算而不是所有BEV網(wǎng)格。輸出稀疏BEV特征經(jīng)過(guò)多輪通常是幾層Transformer Decoder層與圖像特征的交互后這組查詢就攜帶了豐富的、基于視覺(jué)的3D場(chǎng)景信息。它們的特征集合就構(gòu)成了我們需要的稀疏BEV特征。相比于400x400的密集網(wǎng)格900個(gè)查詢的特征數(shù)據(jù)量小了近兩個(gè)數(shù)量級(jí)。實(shí)操心得查詢數(shù)量的設(shè)置是一個(gè)關(guān)鍵的超參數(shù)。數(shù)量太少無(wú)法充分表達(dá)復(fù)雜場(chǎng)景會(huì)丟失小目標(biāo)或細(xì)節(jié)如遠(yuǎn)處車道線數(shù)量太多則稀疏化的收益降低。需要在實(shí)際數(shù)據(jù)集上進(jìn)行驗(yàn)證。一個(gè)實(shí)用的方法是分析場(chǎng)景中目標(biāo)分布的密度讓查詢數(shù)量略高于平均每幀的目標(biāo)數(shù)并留有一定余量。3.3 多任務(wù)頭設(shè)計(jì)與損失函數(shù)工程在得到稀疏的BEV特征后不同的任務(wù)頭將在此基礎(chǔ)上進(jìn)行解碼。這是體現(xiàn)“Multitask”設(shè)計(jì)水平的關(guān)鍵環(huán)節(jié)。3D目標(biāo)檢測(cè)頭由于BEV特征是稀疏的傳統(tǒng)的基于密集錨框Anchor的檢測(cè)器不再適用。通常采用基于查詢的檢測(cè)頭。每個(gè)BEV查詢本身就蘊(yùn)含了一個(gè)潛在目標(biāo)的位置和特征信息。檢測(cè)頭通常由幾個(gè)全連接層MLP組成直接對(duì)每個(gè)查詢進(jìn)行分類是車、人、自行車等和邊界框回歸中心點(diǎn)偏移、尺寸、朝向。這種“一對(duì)一”的預(yù)測(cè)方式避免了后處理中復(fù)雜且耗時(shí)的非極大值抑制NMS或者只需要很輕量級(jí)的NMS進(jìn)一步提升了效率。語(yǔ)義分割頭可行駛區(qū)域、車道線分割任務(wù)需要輸出每個(gè)BEV位置的類別標(biāo)簽這似乎又回到了密集預(yù)測(cè)。這里有兩種主流策略渲染法利用稀疏BEV查詢的特征和其對(duì)應(yīng)的3D位置通過(guò)一個(gè)輕量級(jí)的解碼器如幾層反卷積網(wǎng)絡(luò)“渲染”出密集的BEV分割圖。因?yàn)椴樵円呀?jīng)包含了關(guān)鍵信息這個(gè)渲染過(guò)程可以做得比較輕量。查詢直接預(yù)測(cè)法將BEV空間預(yù)先劃分為一個(gè)粗糙的網(wǎng)格比如40x40每個(gè)網(wǎng)格單元分配一個(gè)或多個(gè)查詢。分割頭直接預(yù)測(cè)每個(gè)查詢所負(fù)責(zé)的網(wǎng)格單元的類別。這種方法更省計(jì)算但分辨率較低。損失函數(shù)平衡術(shù)這是多任務(wù)訓(xùn)練中最棘手的部分。損失通常由三部分組成L_total w_det * L_det w_seg * L_seg w_lane * L_lane。L_det檢測(cè)損失常用Focal Loss分類和L1/L2損失回歸。L_seg分割損失常用帶權(quán)重的交叉熵?fù)p失或Dice Loss以處理類別不平衡道路區(qū)域遠(yuǎn)大于障礙物。L_lane車道線損失因其細(xì)長(zhǎng)結(jié)構(gòu)可能使用特定損失如親和力損失Affinity Loss。手動(dòng)調(diào)整權(quán)重w_*非常耗時(shí)。參考算法很可能采用了動(dòng)態(tài)損失加權(quán)策略例如不確定性加權(quán)為每個(gè)任務(wù)的損失學(xué)習(xí)一個(gè)可訓(xùn)練的參數(shù)對(duì)數(shù)方差讓任務(wù)難度大的自動(dòng)獲得較小的權(quán)重。GradNorm在訓(xùn)練過(guò)程中動(dòng)態(tài)調(diào)整權(quán)重使得各任務(wù)損失的梯度幅度相近。 我個(gè)人的經(jīng)驗(yàn)是在項(xiàng)目初期可以使用不確定性加權(quán)快速得到一個(gè)基線然后基于驗(yàn)證集上各任務(wù)的表現(xiàn)進(jìn)行微調(diào)。要密切關(guān)注一個(gè)任務(wù)精度快速提升時(shí)是否以另一個(gè)任務(wù)的顯著下降為代價(jià)。4. 基于地平線平臺(tái)的部署與優(yōu)化實(shí)踐4.1 模型量化與BPU適配地平線征程芯片的核心是其BPU。要讓PyTorch或TensorFlow訓(xùn)練出的浮點(diǎn)模型在BPU上高效運(yùn)行必須經(jīng)過(guò)模型量化和編譯器優(yōu)化。量化流程詳解量化是將模型權(quán)重和激活值從高精度如FP32轉(zhuǎn)換為低精度如INT8的過(guò)程能大幅減少內(nèi)存占用和加速計(jì)算。地平線提供了完整的量化工具鏈如天工開物工具鏈。流程一般如下校準(zhǔn)準(zhǔn)備一個(gè)代表性的數(shù)據(jù)集驗(yàn)證集的一部分讓浮點(diǎn)模型在“校準(zhǔn)模式”下運(yùn)行。工具會(huì)統(tǒng)計(jì)每一層激活值的分布最大值、最小值、直方圖為后續(xù)確定量化參數(shù)scale, zero_point做準(zhǔn)備。量化感知訓(xùn)練QAT可選但強(qiáng)烈推薦在訓(xùn)練的最后幾個(gè)epoch在模型中插入“量化模擬器”QAT。前向傳播時(shí)模擬INT8計(jì)算的效果反向傳播仍用FP32。這能讓模型權(quán)重主動(dòng)適應(yīng)量化帶來(lái)的誤差是保證量化后精度不掉點(diǎn)的最關(guān)鍵步驟。參考算法應(yīng)該提供了對(duì)應(yīng)的QAT訓(xùn)練配置。模型轉(zhuǎn)換使用地平線提供的編譯器如hb_mapper將訓(xùn)練好的模型可能是QAT后的轉(zhuǎn)換成BPU支持的指令序列文件.bin。避坑指南量化最容易出問(wèn)題的是那些激活值分布范圍大或不穩(wěn)定的層例如注意力機(jī)制中的Softmax輸出、某些激活函數(shù)如Swish之后。在參考算法中稀疏交叉注意力模塊需要特別關(guān)注。在地平線工具鏈中通常支持分層量化可以為這些敏感層單獨(dú)設(shè)置更高的量化位數(shù)如保持FP16或使用更精細(xì)的校準(zhǔn)方法如KL散度校準(zhǔn)。算子支持與定制BPU有其支持的算子列表。參考算法中使用的所有操作如變形后的稀疏注意力、特定的插值操作都必須落在支持列表中或者能夠被等價(jià)分解為一系列支持的操作。如果使用了不支持的算子就需要進(jìn)行算子替換或子圖重寫。地平線的工具鏈通常提供了常見算子的替代實(shí)現(xiàn)方案。4.2 內(nèi)存與耗時(shí)瓶頸分析即使算法本身是稀疏的在真實(shí)部署中仍需警惕內(nèi)存和耗時(shí)瓶頸。內(nèi)存占用分析模型權(quán)重INT8量化后模型本身大小會(huì)顯著減少。主要關(guān)注點(diǎn)在于模型中間激活值A(chǔ)ctivation占用的內(nèi)存。稀疏算法雖然減少了BEV特征的內(nèi)存但圖像主干網(wǎng)絡(luò)產(chǎn)生的多尺度特征圖仍然是內(nèi)存消耗的大頭。工具鏈的編譯報(bào)告會(huì)詳細(xì)列出每一層的輸出張量大小。輸入輸出緩沖區(qū)多路高清攝像頭如1280x720的輸入數(shù)據(jù)以及多個(gè)任務(wù)檢測(cè)框、分割圖的輸出數(shù)據(jù)也需要預(yù)留連續(xù)的內(nèi)存空間。優(yōu)化策略利用BPU的內(nèi)存復(fù)用機(jī)制至關(guān)重要。編譯器會(huì)嘗試讓不同層的臨時(shí)輸出共享同一塊內(nèi)存區(qū)域。在模型結(jié)構(gòu)設(shè)計(jì)時(shí)有意識(shí)地讓網(wǎng)絡(luò)的計(jì)算圖更“整潔”減少長(zhǎng)距離的跳躍連接有助于編譯器進(jìn)行更優(yōu)的內(nèi)存規(guī)劃。推理耗時(shí)剖析工具鏈生成的性能分析報(bào)告會(huì)給出每個(gè)算子的耗時(shí)。需要重點(diǎn)關(guān)注卷積層尤其是主干網(wǎng)絡(luò)中的大kernel深度可分離卷積通常是耗時(shí)主力。自定義/稀疏操作如果稀疏注意力是通過(guò)一系列基礎(chǔ)算子組合實(shí)現(xiàn)的其整體效率需要評(píng)估。可能需要在算法設(shè)計(jì)階段就采用BPU友好的稀疏計(jì)算模式。后處理檢測(cè)頭的輸出解碼、車道線的多項(xiàng)式擬合等CPU側(cè)的后處理也可能在整體Pipeline中占據(jù)可觀比例不能忽視。一個(gè)實(shí)用的技巧是進(jìn)行端到端E2E性能評(píng)測(cè)即從接收?qǐng)D像數(shù)據(jù)到輸出感知結(jié)果的總時(shí)間。這包括了數(shù)據(jù)預(yù)處理縮放、歸一化、BPU推理、結(jié)果后處理等所有環(huán)節(jié)。只有E2E延遲滿足要求如100ms算法才算真正可用。4.3 多任務(wù)輸出后處理與同步模型在BPU上跑完輸出的是原始的張量數(shù)據(jù)需要經(jīng)過(guò)后處理才能變成應(yīng)用層可用的信息。檢測(cè)輸出處理基于查詢的檢測(cè)頭輸出通常是一個(gè)列表每個(gè)查詢對(duì)應(yīng)一個(gè)預(yù)測(cè)結(jié)果類別得分、邊框參數(shù)。后處理包括得分過(guò)濾根據(jù)置信度閾值如0.3過(guò)濾掉低質(zhì)量預(yù)測(cè)。邊框解碼將預(yù)測(cè)的偏移量解碼為實(shí)際的3D框中心點(diǎn)、長(zhǎng)寬高、朝向。輕量級(jí)NMS由于查詢?cè)O(shè)計(jì)已經(jīng)減少了冗余可能只需要一個(gè)簡(jiǎn)單的、基于3D IoU的NMS即可。分割輸出處理如果分割圖是密集渲染的后處理主要是取argmax獲得每個(gè)像素的類別ID。如果是查詢預(yù)測(cè)的粗糙網(wǎng)格可能需要一個(gè)簡(jiǎn)單的上采樣或插值來(lái)匹配所需的分辨率。關(guān)鍵挑戰(zhàn)——輸出同步檢測(cè)結(jié)果是物體列表分割結(jié)果是二維網(wǎng)格車道線可能是另一套參數(shù)化表示。如何保證這些輸出在時(shí)間和空間上是同步的例如檢測(cè)框的底部應(yīng)該落在可行駛區(qū)域分割圖內(nèi)。這要求所有任務(wù)頭共享完全相同的BEV空間坐標(biāo)系和時(shí)序輸入。在后處理模塊中有統(tǒng)一的時(shí)鐘和幀管理確保處理的是同一時(shí)刻的數(shù)據(jù)。 參考算法的框架應(yīng)該已經(jīng)考慮了這一點(diǎn)提供了統(tǒng)一的結(jié)果封裝接口。在集成到更大的自動(dòng)駕駛系統(tǒng)中時(shí)需要確保從這個(gè)接口獲取的是自洽的一幀感知結(jié)果。5. 復(fù)現(xiàn)環(huán)境搭建、調(diào)試與常見問(wèn)題排查5.1 從零開始搭建復(fù)現(xiàn)環(huán)境復(fù)現(xiàn)官方參考算法是理解它的第一步。環(huán)境配置是第一個(gè)攔路虎?;A(chǔ)環(huán)境配置# 1. 創(chuàng)建并激活conda環(huán)境強(qiáng)烈推薦 conda create -n sparse_bev python3.8 -y conda activate sparse_bev # 2. 安裝PyTorch版本需嚴(yán)格匹配地平線工具鏈要求如1.10.0cu113 pip install torch1.10.0cu113 torchvision0.11.0cu113 -f https://download.pytorch.org/whl/torch_stable.html # 3. 安裝地平線開發(fā)套件以Horizon OpenExplorer為例 # 通常需要從地平線官方渠道獲取安裝包例如 pip install openexplorer-xxx.whl # 具體包名和版本以官方文檔為準(zhǔn) pip install hbdk-xxx.whl # 模型編譯工具項(xiàng)目代碼與依賴從地平線官方Git倉(cāng)庫(kù)或提供的壓縮包獲取SparseBevFusionMultitaskOE-V1.0源代碼。進(jìn)入項(xiàng)目根目錄安裝其特定的Python依賴pip install -r requirements.txt。這里經(jīng)常會(huì)出現(xiàn)版本沖突。特別注意項(xiàng)目可能依賴一些定制化的CUDA算子如Deformable Attention的實(shí)現(xiàn)。需要按照項(xiàng)目README中的說(shuō)明使用python setup.py build_ext --inplace進(jìn)行編譯。編譯失敗通常是CUDA版本、PyTorch版本或編譯器如g不匹配導(dǎo)致的。數(shù)據(jù)集準(zhǔn)備算法通常基于NuScenes、Waymo Open Dataset或自有的標(biāo)注數(shù)據(jù)集。需要下載數(shù)據(jù)集至指定路徑。運(yùn)行項(xiàng)目提供的預(yù)處理腳本將原始數(shù)據(jù)轉(zhuǎn)換為項(xiàng)目約定的格式如.pkl或.bin文件。在配置文件中修改數(shù)據(jù)集路徑。踩坑實(shí)錄最常遇到的問(wèn)題是“內(nèi)存溢出”。尤其是在數(shù)據(jù)加載或模型前向傳播時(shí)。除了檢查硬件內(nèi)存是否足夠更應(yīng)檢查代碼中是否存在不必要的緩存。例如數(shù)據(jù)加載器是否使用了過(guò)大的num_workers導(dǎo)致內(nèi)存翻倍在訓(xùn)練腳本中是否在每個(gè)epoch結(jié)束后沒(méi)有及時(shí)釋放不再需要的變量可以使用torch.cuda.empty_cache()進(jìn)行手動(dòng)清理但這只是治標(biāo)。治本之策是優(yōu)化數(shù)據(jù)流和減少單次加載的數(shù)據(jù)量。5.2 訓(xùn)練過(guò)程中的典型問(wèn)題與調(diào)參即使環(huán)境搭好了訓(xùn)練過(guò)程也可能一波三折。損失震蕩或NaN現(xiàn)象訓(xùn)練初期損失值劇烈跳動(dòng)或突然變成NaN。排查學(xué)習(xí)率過(guò)高這是首要懷疑對(duì)象。多任務(wù)模型對(duì)學(xué)習(xí)率更敏感。嘗試將初始學(xué)習(xí)率降低一個(gè)數(shù)量級(jí)例如從1e-3降到1e-4。數(shù)據(jù)異常檢查數(shù)據(jù)預(yù)處理特別是歸一化Normalization的參數(shù)mean, std是否正確。是否有破損的圖像或標(biāo)注梯度爆炸在反向傳播計(jì)算梯度時(shí)可以使用torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm1.0)進(jìn)行梯度裁剪。損失權(quán)重不當(dāng)如果某個(gè)任務(wù)的損失值遠(yuǎn)大于其他任務(wù)可能導(dǎo)致梯度主導(dǎo)?;仡檮?dòng)態(tài)損失加權(quán)的設(shè)置或手動(dòng)調(diào)整到一個(gè)更平衡的初始值。某個(gè)任務(wù)性能始終很差現(xiàn)象檢測(cè)精度尚可但分割mIoU極低或者反過(guò)來(lái)。排查任務(wù)頭能力不足可能是分割頭或檢測(cè)頭的網(wǎng)絡(luò)容量層數(shù)、通道數(shù)不夠。嘗試輕微增加其復(fù)雜度。特征共享沖突這可能是根本原因??梢試L試在共享主干網(wǎng)絡(luò)和任務(wù)頭之間插入任務(wù)特定適配層。例如為分割任務(wù)和檢測(cè)任務(wù)分別設(shè)計(jì)一個(gè)輕量的卷積模塊讓它們從共享特征中提取出更適合自己的特征再輸入各自的任務(wù)頭。這增加了少量參數(shù)但能有效緩解沖突。數(shù)據(jù)標(biāo)注質(zhì)量仔細(xì)檢查該任務(wù)標(biāo)注數(shù)據(jù)的質(zhì)量。分割的邊界是否模糊檢測(cè)框是否準(zhǔn)確過(guò)擬合現(xiàn)象訓(xùn)練集損失持續(xù)下降驗(yàn)證集損失早早就停止下降甚至上升。對(duì)策數(shù)據(jù)增強(qiáng)加強(qiáng)數(shù)據(jù)增強(qiáng)策略如隨機(jī)裁剪、顏色抖動(dòng)、Mosaic等。對(duì)于BEV任務(wù)在圖像空間做增強(qiáng)要謹(jǐn)慎需同步考慮其對(duì)相機(jī)參數(shù)和BEV空間映射的影響。更安全的增強(qiáng)是在BEV空間進(jìn)行如隨機(jī)旋轉(zhuǎn)、平移。正則化增加Dropout層、權(quán)重衰減Weight Decay。早停監(jiān)控驗(yàn)證集指標(biāo)當(dāng)連續(xù)多個(gè)epoch不再提升時(shí)停止訓(xùn)練。5.3 模型轉(zhuǎn)換與部署驗(yàn)證問(wèn)題訓(xùn)練出一個(gè)精度不錯(cuò)的模型只是成功了一半能否成功部署到芯片上才是終極考驗(yàn)。量化精度損失過(guò)大現(xiàn)象浮點(diǎn)模型mAP為70%量化后模型在驗(yàn)證集上掉到65%以下。排查與解決校準(zhǔn)集不具代表性確保校準(zhǔn)集能覆蓋各種場(chǎng)景白天/黑夜、晴天/雨天、擁堵/暢通。校準(zhǔn)集數(shù)據(jù)量不宜過(guò)少通常需要幾百?gòu)堄写硇缘膱D片。敏感層處理使用工具鏈的分析功能找出量化誤差最大的層。嘗試對(duì)這些層使用定點(diǎn)-浮點(diǎn)混合精度即保持其FP16精度。QAT是關(guān)鍵務(wù)必進(jìn)行充分的量化感知訓(xùn)練。檢查QAT訓(xùn)練時(shí)模擬量化的配置如量化位寬、對(duì)稱/非對(duì)稱是否與最終部署的配置完全一致。使用更先進(jìn)的量化策略探索工具鏈?zhǔn)欠裰С謩?dòng)態(tài)范圍量化或通道級(jí)量化這些方法比傳統(tǒng)的層級(jí)靜態(tài)量化更精細(xì)可能帶來(lái)更好的精度保持。編譯失敗或編譯后模型錯(cuò)誤現(xiàn)象hb_mapper編譯過(guò)程中報(bào)錯(cuò)或編譯出的.bin模型在仿真器上運(yùn)行結(jié)果異常。常見原因不支持的操作符模型中使用了一個(gè)BPU不支持的PyTorch操作。需要根據(jù)錯(cuò)誤信息在代碼中找到該操作并按照地平線提供的算子替換指南進(jìn)行修改。常見需要替換的包括某些特殊的插值模式、自定義的激活函數(shù)等。張量形狀動(dòng)態(tài)模型中存在根據(jù)輸入數(shù)據(jù)動(dòng)態(tài)決定形狀的操作如非固定數(shù)量的查詢。BPU通常需要靜態(tài)圖。需要修改代碼將動(dòng)態(tài)性移除例如設(shè)置一個(gè)固定的最大查詢數(shù)量并用掩碼mask表示有效查詢。中間輸出檢查在編譯前使用工具鏈的check_model功能對(duì)比PyTorch模型和轉(zhuǎn)換后模型在相同輸入下的逐層輸出。如果某層開始出現(xiàn)巨大偏差問(wèn)題就出在這一層或之前。部署后性能不達(dá)標(biāo)現(xiàn)象模型在芯片上運(yùn)行的幀率FPS低于預(yù)期。性能分析使用性能分析工具地平線工具鏈通常提供性能分析工具可以生成詳細(xì)的時(shí)間線顯示每個(gè)算子的耗時(shí)。找出最耗時(shí)的“熱點(diǎn)”算子。優(yōu)化數(shù)據(jù)搬運(yùn)在預(yù)處理CPU和后處理CPU與模型推理BPU之間數(shù)據(jù)搬運(yùn)DDR訪問(wèn)可能成為瓶頸。確保使用零拷貝或高效的內(nèi)存接口。模型輕量化如果某些算子耗時(shí)過(guò)高考慮是否能用更高效的算子組合替代?;蛘咴诰瓤山邮艿姆秶鷥?nèi)是否可以進(jìn)一步減少主干網(wǎng)絡(luò)的深度、寬度或者減少稀疏查詢的數(shù)量。Pipeline優(yōu)化如果是多攝像頭輸入是否可以并行處理多個(gè)攝像頭的預(yù)處理模型推理和前后處理是否可以流水線化隱藏部分延遲這需要系統(tǒng)級(jí)的架構(gòu)設(shè)計(jì)。在整個(gè)復(fù)現(xiàn)和部署的旅程中保持耐心和細(xì)致的日志記錄至關(guān)重要。每一個(gè)報(bào)錯(cuò)信息都是線索每一次性能分析都是優(yōu)化機(jī)會(huì)。地平線的這個(gè)參考算法提供了一個(gè)高起點(diǎn)但真正讓它在你自己的產(chǎn)品中發(fā)揮威力還需要大量的工程打磨和場(chǎng)景適配。