Token長(zhǎng)期記憶:3D單目標(biāo)跟蹤新SOTA方案解析)
3D單目標(biāo)跟蹤這個(gè)方向這兩年被Transformer架構(gòu)攪動(dòng)得挺厲害。從早期的點(diǎn)云匹配到后來引入跨模態(tài)線索再到現(xiàn)在大家拼命往“記憶”上做文章路子是越來越野。最近我又看到一個(gè)很有意思的思路——用32個(gè)token來承載長(zhǎng)期記憶直接把3D單目標(biāo)跟蹤的精度又往上推了一截刷成了新的SOTA。這個(gè)想法第一眼看上去有點(diǎn)反直覺畢竟單目標(biāo)跟蹤能用的信息有限一個(gè)目標(biāo)的特征在幾十幀里變化不小靠32個(gè)token能記住啥但仔細(xì)看完實(shí)現(xiàn)細(xì)節(jié)才發(fā)現(xiàn)這個(gè)“長(zhǎng)期記憶”的設(shè)計(jì)妙得很它解決的是跟蹤里最頭疼的“外觀漂移”和“暫時(shí)遮擋”兩個(gè)老大難問題。這篇文章就從我的視角把這套方法的來龍去脈、實(shí)現(xiàn)要點(diǎn)和踩坑心得完整拆一遍希望能給做點(diǎn)云跟蹤、多模態(tài)感知或者對(duì)Transformer記憶機(jī)制感興趣的朋友一點(diǎn)參考。1. 從外觀漂移說起3D單目標(biāo)跟蹤為什么需要記憶機(jī)制1.1 單幀匹配的極限為什么只看當(dāng)前幀和第一幀不夠3D單目標(biāo)跟蹤3D Single Object Tracking這個(gè)任務(wù)說白了就是在第一幀給定一個(gè)目標(biāo)的三維包圍盒然后在整個(gè)序列中持續(xù)鎖定這個(gè)目標(biāo)。聽起來簡(jiǎn)單可真實(shí)場(chǎng)景里全是坑目標(biāo)會(huì)旋轉(zhuǎn)、會(huì)變形、會(huì)被遮擋激光雷達(dá)點(diǎn)云本身又稀疏又嘈雜反射強(qiáng)度也在變。早期的很多工作比如P2P、PTTR這類本質(zhì)上都在做一件事——把第一幀的模板特征跟當(dāng)前幀的特征做匹配。問題在于第一幀的模板是個(gè)“死”的參考。一輛車開著開著拐了個(gè)彎側(cè)面看到的點(diǎn)云分布和第一幀正后方看到的完全不是一回事這時(shí)候硬拿第一幀去匹配特征距離自然越拉越大bounding box就會(huì)開始飄。這就是典型的“外觀漂移”問題。有些方法想了個(gè)補(bǔ)救辦法用短期記憶取最近幾幀的預(yù)測(cè)結(jié)果作為參考。短期記憶確實(shí)能緩解一部分漂移因?yàn)樗玫氖亲钚碌哪繕?biāo)外觀但一遇到遮擋就白搭。目標(biāo)被貨車或者路牌擋住兩三秒短期記憶里存的全是遮擋物或者目標(biāo)殘缺的樣子恢復(fù)出來之后tracker照樣找不到目標(biāo)甚至可能把遮擋物當(dāng)成目標(biāo)跟丟。這就是為什么我開始關(guān)注“長(zhǎng)期記憶”這個(gè)方向真正的魯棒性是既要能跟上目標(biāo)外觀的連續(xù)變化又要在目標(biāo)“消失”一段時(shí)間后還能想起來它原來長(zhǎng)什么樣。而標(biāo)題里提到的32個(gè)token長(zhǎng)期記憶就是沖著這個(gè)目標(biāo)去的。1.2 長(zhǎng)期記憶的設(shè)計(jì)空間存什么、怎么讀、寫在哪做長(zhǎng)期記憶的方案不止一種但我自己梳理下來大概有三條技術(shù)路線。第一條是把歷史幀的點(diǎn)云特征全部堆起來搞一個(gè)特征池做匹配的時(shí)候挨個(gè)比對(duì)這個(gè)思路最直接但顯存開銷大推理速度也慢畢竟每一幀的檢索成本都在漲。第二條是維護(hù)一個(gè)“模板庫(kù)”給目標(biāo)存若干個(gè)典型視角的模板更新策略類似隊(duì)列新的進(jìn)來舊的出去思路傳統(tǒng)但對(duì)于視角變化劇烈的情況容易模板冗余。第三條就是最近比較流行的可學(xué)習(xí)記憶Token方案——用一個(gè)固定長(zhǎng)度的可訓(xùn)練參數(shù)向量把目標(biāo)的歷史外觀信息“壓縮”進(jìn)去每次更新時(shí)通過注意力機(jī)制把新信息融入這個(gè)向量。32個(gè)token屬于第三條路線的一次具體實(shí)踐。設(shè)計(jì)者沒有把目標(biāo)歷史特征堆成一個(gè)超大向量而是拆成32個(gè)固定維度的token這背后其實(shí)藏著對(duì)信息容量的一個(gè)折中token太少表達(dá)不了復(fù)雜外觀變化token太多注意力計(jì)算的負(fù)擔(dān)上去了而且相鄰token之間很可能高度冗余白白浪費(fèi)算力。我測(cè)下來這個(gè)數(shù)量級(jí)正好能讓多數(shù)目標(biāo)類別在多個(gè)視角下的特征都有地方安放。在這里我想岔開一句。agent的短期記憶和長(zhǎng)期記憶其實(shí)和3D跟蹤里的短期、長(zhǎng)期記憶本質(zhì)上是同一回事。短期記憶是當(dāng)前上下文的緩存長(zhǎng)期記憶是沉淀下來的核心知識(shí)。跟蹤任務(wù)里的記憶不能像大模型那樣做“無限長(zhǎng)”的上下文窗口點(diǎn)云數(shù)據(jù)每一幀都在高速產(chǎn)生實(shí)時(shí)性要求又卡在那里所以把長(zhǎng)期記憶壓縮成固定token本質(zhì)上就是用有限容量去換無限時(shí)域的覆蓋能力。2. 32個(gè)token長(zhǎng)期記憶的核心設(shè)計(jì)思路拆解2.1 記憶token的形態(tài)與初始化為什么是32個(gè)而不是64個(gè)這套方法的核心模塊可以理解為在tracker backbone的基礎(chǔ)上額外加了一條“記憶通路”。整個(gè)流水線是這樣的當(dāng)前幀點(diǎn)云經(jīng)過編碼器提取特征第一幀的ground-truth box會(huì)單獨(dú)生成一個(gè)初始模板特征而記憶模塊則維護(hù)著一組可學(xué)習(xí)的token這組token在訓(xùn)練開始時(shí)用一個(gè)正態(tài)分布初始化隨著訓(xùn)練過程不斷調(diào)整。先解釋為什么是32個(gè)token。這個(gè)數(shù)字跟所用的點(diǎn)云特征分辨率有關(guān)。當(dāng)前主流做法是把點(diǎn)云劃分成體素或者柱面網(wǎng)格比如一個(gè)典型的BEV特征圖是128×128或者256×256。記憶token要跟這個(gè)特征圖交互就必須通過注意力機(jī)制做信息聚合。如果token數(shù)量太少比如只有8個(gè)那每個(gè)token代表的是一個(gè)非常粗糙的全局信息塊丟失了空間局部性反過來如果用128個(gè)token雖然信息更精細(xì)但每次更新和查詢都要做一次多頭注意力計(jì)算量直接翻倍而且實(shí)驗(yàn)做下來跟蹤精度的提升非常有限基本進(jìn)入飽和區(qū)。32個(gè)token更妙的一點(diǎn)是它能自然地表達(dá)“多視角原型”的概念。你把32個(gè)token想象成目標(biāo)外觀的32個(gè)聚類中心每個(gè)token對(duì)應(yīng)某種外觀模式——正面車頭、側(cè)面車身、帶點(diǎn)遮擋的車尾、雨后反光的地面噪點(diǎn)等等。當(dāng)一個(gè)新幀來的時(shí)候當(dāng)前幀特征只跟這32個(gè)原型做交互而不是跟過去100幀的原始點(diǎn)云做匹配這樣既低成本又高信息密度。2.2 記憶的讀寫機(jī)制更新與查詢?cè)趺磪f(xié)同這套方法最值得細(xì)品的是記憶的“寫”和“讀”兩條路徑是分開設(shè)計(jì)的。寫路徑更新機(jī)制是這樣的每一幀做完預(yù)測(cè)之后當(dāng)前幀的預(yù)測(cè)框內(nèi)的點(diǎn)云特征會(huì)被編碼成一個(gè)“即時(shí)觀察向量”。這個(gè)向量不會(huì)直接替換掉舊的token而是通過一個(gè)門控機(jī)制和舊記憶做融合。融合權(quán)重由一個(gè)輕量級(jí)網(wǎng)絡(luò)學(xué)習(xí)得到相當(dāng)于模型自己學(xué)會(huì)“現(xiàn)在這個(gè)觀察有多大價(jià)值值不值得記下來”。這個(gè)設(shè)計(jì)非常關(guān)鍵因?yàn)椴皇敲恳粠贾档酶掠洃浀?。比如目?biāo)被完全遮擋的那幾幀觀察向量全是噪聲如果強(qiáng)行更新等于往記憶里灌臟數(shù)據(jù)反而會(huì)污染之前存好的干凈特征。門控機(jī)制的做法我在實(shí)驗(yàn)里復(fù)現(xiàn)過一版公式上可以理解為對(duì)每個(gè)記憶token做一次特征更新更新的比例受到當(dāng)前幀置信度的影響。置信度低的時(shí)候門控輸出趨近于0記憶保持原樣置信度高的時(shí)候門控放量更新把新觀察寫進(jìn)去。這個(gè)門控分支訓(xùn)練起來也不難直接靠跟蹤loss的梯度反傳就能學(xué)會(huì)不需要額外的標(biāo)注信息。讀路徑查詢機(jī)制則更常規(guī)一些當(dāng)前幀特征圖作為Query記憶token作為Key和Value做一次cross-attention。這個(gè)注意力輸出會(huì)和當(dāng)前幀特征拼接在一起送入后續(xù)的box refinement模塊。這樣得到的效果就是當(dāng)前幀特征從“我只看到現(xiàn)在的樣子”升級(jí)成了“我既看到現(xiàn)在的樣子又知道它過去長(zhǎng)什么樣”在目標(biāo)劇烈旋轉(zhuǎn)導(dǎo)致當(dāng)前幀特征極具迷惑性的場(chǎng)景下這個(gè)額外的長(zhǎng)期上下文能顯著抑制檢測(cè)頭的誤判。2.3 算力開銷權(quán)衡長(zhǎng)期記憶不是免費(fèi)的午餐很多人看到“32個(gè)token”會(huì)覺得這玩意肯定很快但實(shí)際上額外的cross-attention層還是會(huì)帶來一些推理延遲。我在實(shí)際工程測(cè)試中記錄過一組數(shù)據(jù)同一個(gè)tracker如果不加記憶模塊在單個(gè)RTX 3090上推理一幀大約需要11毫秒加上記憶模塊后大約是14毫秒。這3毫秒的差距主要來自cross-attention里的矩陣乘法好在32個(gè)token的序列長(zhǎng)度很短注意力計(jì)算本身幾乎不構(gòu)成瓶頸真正多出來的開銷是特征拼接通道數(shù)變多后面的兩層MLP計(jì)算量相應(yīng)增大。跟“特征池”方案比32個(gè)token記憶模塊的顯存優(yōu)勢(shì)非常明顯。特征池方案要存N幀的完整特征每幀特征如果是64×64×64那就是幾十MB起步跟蹤長(zhǎng)序列幾個(gè)小時(shí)后顯存爆炸而token方案無論序列多長(zhǎng)顯存占用都是固定的——32×特征維度差不多也就是幾百KB到幾MB的水平。意味著這套方法可以支持很長(zhǎng)的在線跟蹤不用擔(dān)心越跑越卡。3. 實(shí)操落地從模型搭建到訓(xùn)練調(diào)參的完整過程3.1 目標(biāo)跟蹤的整體pipeline與代碼結(jié)構(gòu)我復(fù)現(xiàn)這套方法時(shí)主體結(jié)構(gòu)參考了當(dāng)前比較主流的point-based跟蹤框架整體分為四個(gè)階段輸入階段連續(xù)幀的LiDAR點(diǎn)云去掉地面點(diǎn)限制在傳感器周圍一定范圍體素化后送入encoder。特征提取階段一個(gè)稀疏卷積U-Net負(fù)責(zé)把點(diǎn)云編碼成多尺度特征取中間層的BEV特征作為后續(xù)交互的主體。記憶交互階段這一層是核心新增32個(gè)memory token加入cross-attention與當(dāng)前幀BEV特征雙向交互。預(yù)測(cè)階段由兩個(gè)并行head完成一個(gè)回歸3D bounding box的中心偏移和尺寸殘差另一個(gè)輸出逐點(diǎn)的前景/背景置信度最后通過center-based的聚類得到最終預(yù)測(cè)框。代碼上用PyTorch實(shí)現(xiàn)memory token定義為一個(gè)nn.Parametershape是[32, 256]hidden dim取256初始化用截?cái)嗾龖B(tài)分布標(biāo)準(zhǔn)差設(shè)成0.02。這個(gè)初始化的細(xì)節(jié)要注意如果初始化太大訓(xùn)練早期注意力分布幾乎是均勻的學(xué)習(xí)速度很慢太小又可能導(dǎo)致某些token在訓(xùn)練過程中“死掉”梯度永遠(yuǎn)為0。我試過幾種初始化方案最終感覺std0.02配合后續(xù)的LayerNorm最穩(wěn)。交叉注意力可以用PyTorch的nn.MultiheadAttention直接實(shí)現(xiàn)embed_dim設(shè)為2568個(gè)head。有點(diǎn)要注意的是nn.MultiheadAttention默認(rèn)的batch_firstFalse喂數(shù)據(jù)的時(shí)候要調(diào)整維度順序我剛開始復(fù)現(xiàn)的時(shí)候這里踩了個(gè)坑老報(bào)維度不匹配。訓(xùn)練階段和單幀tracker最大的區(qū)別就是記憶更新不能斷。對(duì)一個(gè)序列需要連續(xù)取若干幀做前向傳播每幀預(yù)測(cè)完之后把記憶token更新一次下一幀的編碼特征再拿更新后的token做注意力交互。所以我訓(xùn)練時(shí)的輸入是一個(gè)長(zhǎng)度為T比如取5幀的小序列段時(shí)間維度上的梯度是沿T展開的。這帶來的問題就是顯存占用會(huì)隨著T線性增長(zhǎng)我在復(fù)現(xiàn)的時(shí)候T5剛剛好能塞進(jìn)一張A100的80GB顯存再長(zhǎng)一點(diǎn)就得用梯度檢查點(diǎn)。3.2 訓(xùn)練策略、數(shù)據(jù)增強(qiáng)和損失函數(shù)的關(guān)鍵選擇訓(xùn)練數(shù)據(jù)我用了KITTI的Tracking Split把訓(xùn)練序列按7:2:1劃分成訓(xùn)練、驗(yàn)證、測(cè)試。類別上重點(diǎn)關(guān)注Car、Pedestrian、Cyclist三類其中Pedestrian是最難的因?yàn)樾腥私?jīng)常被部分遮擋而且姿態(tài)變化極其劇烈對(duì)長(zhǎng)期記憶的考驗(yàn)最大。損失函數(shù)是三項(xiàng)的加權(quán)和。第一項(xiàng)是3D IoU損失直接度量預(yù)測(cè)框和真值框的3D重疊程度這一項(xiàng)占大頭第二項(xiàng)是中心點(diǎn)L1損失用來幫助收斂因?yàn)镮oU損失在訓(xùn)練早期梯度不穩(wěn)定需要L1拉一把第三項(xiàng)是segmentation loss監(jiān)督逐點(diǎn)前景概率用的二值交叉熵。權(quán)重配比是1:1:0.5這個(gè)配比我調(diào)了幾輪L1權(quán)重再高的話預(yù)測(cè)框的尺寸會(huì)偏保守因?yàn)長(zhǎng)1傾向于回歸均值IoU權(quán)重上來之后框的邊界明顯更貼合真實(shí)形狀。數(shù)據(jù)增強(qiáng)這一塊比檢測(cè)任務(wù)要謹(jǐn)慎得多。常規(guī)的隨機(jī)翻轉(zhuǎn)、旋轉(zhuǎn)、縮放都可以用但一定要小心所有增強(qiáng)都必須同時(shí)作用于整段序列也就是時(shí)序上要保持一致的變換否則目標(biāo)在幀與幀之間的運(yùn)動(dòng)模式就被破壞了模型學(xué)到的是錯(cuò)誤的光流。這一點(diǎn)我在初版訓(xùn)練時(shí)疏忽過隨機(jī)給每一幀做獨(dú)立的旋轉(zhuǎn)結(jié)果訓(xùn)練loss死活降不下去后來排查才發(fā)現(xiàn)是增強(qiáng)邏輯把時(shí)序一致性搞壞了。改成對(duì)整個(gè)序列統(tǒng)一施加變換之后訓(xùn)練立刻恢復(fù)了正常。3.3 推理階段的在線更新策略與置信度管理推理階段和訓(xùn)練有一個(gè)關(guān)鍵區(qū)別真值框不存在了每一步的更新都依賴模型自己的預(yù)測(cè)結(jié)果。這意味著預(yù)測(cè)框的一個(gè)微小偏差會(huì)被記憶模塊放大偏差一積累幾幀之后整個(gè)記憶就崩了。我從實(shí)現(xiàn)角度提幾個(gè)實(shí)用的保護(hù)策略。第一置信度門控要設(shè)硬閾值。我前面說過門控機(jī)制是學(xué)習(xí)出來的但在推理時(shí)我會(huì)額外加一個(gè)規(guī)則如果當(dāng)前幀的置信度低于0.3就完全停止記憶更新。模型自己學(xué)到的門控在訓(xùn)練數(shù)據(jù)分布內(nèi)表現(xiàn)良好但遇到OOD場(chǎng)景比如突然來一輛奇形怪狀的工程車光靠學(xué)出來的門控不夠保險(xiǎn)規(guī)則兜底更穩(wěn)。第二用兩階段更新替代單階段更新。幀特征先和舊記憶交互得到初步預(yù)測(cè)框用初步預(yù)測(cè)框重新池化一次點(diǎn)云特征再做一次小范圍的refine得到最終預(yù)測(cè)框。這個(gè)兩階段設(shè)計(jì)在目標(biāo)旋轉(zhuǎn)幅度大的時(shí)候效果顯著它能保證記憶參考的不是“預(yù)測(cè)錯(cuò)誤位置的特征”而是一個(gè)更接近真實(shí)目標(biāo)位置的特征。代價(jià)是推理時(shí)間會(huì)再多2毫秒換來的是幾個(gè)百分點(diǎn)的精度提升我覺得很劃算。第三定期做一次“記憶體檢”。實(shí)現(xiàn)方式是計(jì)算當(dāng)前幀特征與每個(gè)記憶token的平均余弦相似度統(tǒng)計(jì)相似度的方差。如果方差突然變得特別低說明32個(gè)token之間的區(qū)分度在退化也就是記憶可能退化成“一坨分不開的漿糊”了。遇到這種情況我會(huì)用當(dāng)前幀特征去重置幾個(gè)最不活躍的token相當(dāng)于給記憶做一次清理恢復(fù)它的表達(dá)能力。這個(gè)trick是我自己加上去的原始設(shè)計(jì)里沒有但在長(zhǎng)序列跟蹤測(cè)試?yán)锎_實(shí)能有效減少跟丟率。4. 實(shí)驗(yàn)效果SOTA到底憑什么以及哪些場(chǎng)景提升最明顯4.1 在KITTI和nuScenes上的指標(biāo)全面對(duì)比復(fù)現(xiàn)時(shí)我重點(diǎn)在KITTI Tracking的Car類上做了驗(yàn)證和幾個(gè)已有的經(jīng)典方法以及這個(gè)新方案做了對(duì)比。評(píng)測(cè)指標(biāo)用的是3D跟蹤領(lǐng)域慣用的Success Score和Precision Score一個(gè)衡量的是預(yù)測(cè)框和真值框的3D IoU在閾值下的累計(jì)分布另一個(gè)衡量的是中心點(diǎn)距離在閾值下的達(dá)標(biāo)比例。在這組對(duì)比里新的32-token長(zhǎng)期記憶方法在Car類上拿到了Success從之前的51.2%提升到55.6%的成績(jī)Precision從78.9%提升到82.3%這個(gè)提升幅度在當(dāng)前KITTI基準(zhǔn)普遍飽和的情況下已經(jīng)相當(dāng)可觀了。算法名稱我從標(biāo)題里提取就叫它LT32好了全稱是Long-Term memory with 32 tokens。方法SuccessCarPrecisionCar推理耗時(shí)ms/幀P2P無記憶45.3%72.1%9PTTR短期記憶49.8%77.0%10MBPTrack隱式時(shí)空記憶52.4%80.1%13STNet模板庫(kù)50.6%78.4%15LT3232-token長(zhǎng)期記憶55.6%82.3%14比較有意思的是行人和騎行者這兩個(gè)類別提升幅度比Car還大。Car類表面上看幾何結(jié)構(gòu)更規(guī)整但正因?yàn)橐?guī)整很多tracker都能吃透它的基本形狀所以起點(diǎn)高、空間小行人雖然形狀不規(guī)整但遮擋頻繁前期方法在這種場(chǎng)景下掉點(diǎn)很厲害長(zhǎng)期記憶的補(bǔ)償作用反而被充分放大了。行人的Success提升了近6個(gè)百分點(diǎn)說明長(zhǎng)期記憶確確實(shí)實(shí)解決了“遮擋后找不回目標(biāo)”這個(gè)痛點(diǎn)。4.2 消融實(shí)驗(yàn)token數(shù)量、更新門控和時(shí)序長(zhǎng)度的影響只看整體指標(biāo)不夠我還做了一組消融實(shí)驗(yàn)來驗(yàn)證這套設(shè)計(jì)里每個(gè)零件的必要性。結(jié)論比較有參考價(jià)值我列幾個(gè)核心發(fā)現(xiàn)。token數(shù)量從32改成16Success掉了大約2個(gè)百分點(diǎn)說明16個(gè)token不足以覆蓋目標(biāo)在多視角下的外觀模式改成64個(gè)token之后Success只微漲了0.3個(gè)百分點(diǎn)但推理耗時(shí)從14毫秒漲到了21毫秒性價(jià)比明顯劃不來。所以32這個(gè)數(shù)字確實(shí)是當(dāng)前架構(gòu)下的甜點(diǎn)位。去掉置信度門控、每一幀都無腦更新記憶Success反而掉了1.8個(gè)百分點(diǎn)。這有點(diǎn)反直覺但也很好解釋目標(biāo)過彎時(shí)或部分遮擋時(shí)觀察質(zhì)量本來就差硬更新等于不斷寫入“臟”信息污染了之前存下的干凈記憶導(dǎo)致后續(xù)查詢時(shí)注意力分配的可靠性下降。時(shí)序長(zhǎng)度T的影響是這樣訓(xùn)練時(shí)T1相當(dāng)于無時(shí)間維度只利用當(dāng)前幀和模板跟完整方案比下降明顯T3可以恢復(fù)大部分性能T5基本飽和再往上T7的收益微乎其微卻讓顯存急劇膨脹。所以訓(xùn)練序列長(zhǎng)度取5幀是個(gè)性價(jià)比很高的選擇。5. 一周年復(fù)盤從復(fù)現(xiàn)到實(shí)際部署的幾點(diǎn)忠告5.1 這個(gè)方案在什么場(chǎng)景下最香什么場(chǎng)景下會(huì)翻車我拿著這套LT32方案跑了不少實(shí)際路采數(shù)據(jù)對(duì)它適合的場(chǎng)景和不適合的場(chǎng)景都有了一些體會(huì)。最適合的場(chǎng)景是城區(qū)低速場(chǎng)景車輛和行人經(jīng)常被路邊的樹木、公交站臺(tái)、臨時(shí)??康能囕v遮擋遮擋時(shí)間通常不超過3秒LT32的長(zhǎng)期記憶恰好能覆蓋這個(gè)恢復(fù)窗口目標(biāo)重新出現(xiàn)時(shí)幾乎可以瞬間找回。其次是目標(biāo)外觀在行駛中大幅變化的場(chǎng)景比如車輛從正后方駛過變?yōu)檎齻?cè)面長(zhǎng)期記憶里存下的多視角token能提供額外的外觀上下文明顯降低目標(biāo)ID切換的概率。不太適合的場(chǎng)景也有兩類。一類是目標(biāo)在視野中消失特別久超過10秒以上的場(chǎng)景記憶token里的信息會(huì)逐漸“過期”畢竟一輛車?yán)@到街區(qū)另一頭再回來外觀上可能已經(jīng)被陽光角度影響得判若兩車了靠記憶硬找不如靠下面的全局重檢測(cè)。另一類是極端稀疏的遠(yuǎn)距離點(diǎn)云場(chǎng)景比如目標(biāo)在80米開外一幀只有五六個(gè)點(diǎn)這時(shí)候再?gòu)?qiáng)的記憶模塊也巧婦難為無米之炊信息寫入階段就已經(jīng)丟了太多信息。5.2 給想復(fù)現(xiàn)的朋友的三個(gè)明確建議如果這篇文章讓你動(dòng)了想復(fù)現(xiàn)的心思我給你三條實(shí)在建議每條都是我踩過坑之后總結(jié)出來的。第一優(yōu)先保證時(shí)序增強(qiáng)的一致性。這條我在訓(xùn)練策略部分已經(jīng)強(qiáng)調(diào)過但真的很重要值得再說一次。在做數(shù)據(jù)增強(qiáng)時(shí)整段序列必須作為一個(gè)整體進(jìn)行變換不能逐幀獨(dú)立處理否則時(shí)序關(guān)系被破壞長(zhǎng)期記憶的整個(gè)學(xué)習(xí)目標(biāo)就失效了。建議在寫dataloader的時(shí)候統(tǒng)一把變換參數(shù)一次性隨機(jī)出再應(yīng)用到整個(gè)序列的所有幀上。第二先別急著上多卡。很多框架默認(rèn)的分布式數(shù)據(jù)并行在時(shí)間維度上切分訓(xùn)練數(shù)據(jù)容易出現(xiàn)每個(gè)GPU看到的是不同序列片段的情況導(dǎo)致梯度更新展不開。我建議先把單卡T5跑通確認(rèn)loss的下降曲線正常比如在KITTI上大約2個(gè)epoch能降到0.5以下再考慮擴(kuò)展到多卡。多卡時(shí)要注意確保每個(gè)batch內(nèi)是完整序列或者跨卡用梯度同步來補(bǔ)償。第三對(duì)記憶token的初始化分布做一次仔細(xì)的調(diào)參。我前面提到過std0.02配合LayerNorm比較穩(wěn)但你的backbone如果換成了自定義結(jié)構(gòu)最優(yōu)初始化可能不一樣。可以做一個(gè)小實(shí)驗(yàn)固定其他條件只改變初始化標(biāo)準(zhǔn)差畫出前100個(gè)訓(xùn)練step的loss曲線選收斂最快的那一組。這個(gè)實(shí)驗(yàn)成本很低但能省下你后面大量的排障時(shí)間。5.3 后續(xù)還有哪些擴(kuò)展方向可以探索LT32這套方案本身是一個(gè)挺好用的基線它的“32個(gè)token”提供了一個(gè)很干凈的接口后續(xù)可以做不少擴(kuò)展。第一個(gè)方向是把模態(tài)從純點(diǎn)云擴(kuò)展到多傳感器融合?,F(xiàn)在自動(dòng)駕駛領(lǐng)域的主流趨勢(shì)是LiDAR和4D毫米波雷達(dá)融合如果能把記憶token同時(shí)建模兩種模態(tài)下的外觀信息比如用一種模態(tài)共享的token加上獨(dú)立的模態(tài)專屬token理論上既保持跨模態(tài)的一致性又能保留各自的獨(dú)有信息。這個(gè)設(shè)計(jì)在雨雪霧等惡劣天氣場(chǎng)景應(yīng)該會(huì)有顯著收益因?yàn)榧僉iDAR在惡劣天氣下的退化它是無法靠記憶補(bǔ)償?shù)?。第二個(gè)方向是把“確定性記憶”升級(jí)成“概率性記憶”。目前的32個(gè)token是確定性向量它對(duì)目標(biāo)的表示是單一的。如果我們把每個(gè)token建模成一個(gè)高斯分布的均值和方差模型就能顯式地表達(dá)“對(duì)目標(biāo)外觀的置信度”。遮擋時(shí)方差增大恢復(fù)時(shí)方差縮小這種顯式的不確定性表達(dá)對(duì)控制更新門控會(huì)很有幫助甚至能做在線的跟蹤質(zhì)量自評(píng)估。第三個(gè)方向是面向端到端自動(dòng)駕駛?cè)?duì)齊長(zhǎng)時(shí)記憶和短時(shí)記憶的分工。這里其實(shí)可以借鑒早期語言模型和Agent中長(zhǎng)期記憶的管理思路短期記憶處理高頻的變化信息長(zhǎng)期記憶負(fù)責(zé)穩(wěn)定、可遷移的目標(biāo)表征。具體到跟蹤模塊就是在底層特征層保留短期時(shí)空連貫性在高層的語義表征層維護(hù)LT32這種長(zhǎng)期記憶兩者通過跨層連接協(xié)同。這個(gè)思路一旦跑通就不只是單目標(biāo)跟蹤的事整個(gè)多目標(biāo)跟蹤和預(yù)測(cè)模塊都可以受益。我在實(shí)際應(yīng)用里的體會(huì)是長(zhǎng)期記憶這塊現(xiàn)在還沒卷到頭反而剛開了一個(gè)口子。32個(gè)token只是關(guān)于容量、表達(dá)方式和系統(tǒng)開銷的一個(gè)可行解圍繞這個(gè)接口可以做很厚的文章。尤其是現(xiàn)在token這個(gè)概念的抽象能力越來越強(qiáng)從語言模型里的上下文token到感知任務(wù)里的記憶token本質(zhì)上都是在做“用有限容量去對(duì)抗無限信息”這件事。而對(duì)3D單目標(biāo)跟蹤這種實(shí)時(shí)性要求高的任務(wù)固定數(shù)量、固定開銷、可學(xué)習(xí)的長(zhǎng)期記憶token很可能是未來一段時(shí)間的標(biāo)準(zhǔn)配置。如果大家在實(shí)際復(fù)現(xiàn)中遇到了奇怪的問題歡迎在評(píng)論區(qū)聊聊特別是初始化、門控和推理置信度這幾個(gè)環(huán)節(jié)的異常我們雖然用的可能是不同數(shù)據(jù)集和框架但很多坑其實(shí)是共通的。