檢測新思路:模型通信如何突破標(biāo)注瓶頸)
1. 為什么這篇論文值得單獨(dú)寫一篇筆記第一次翻到《Few-Example Object Detection with Model Communication》這個(gè)標(biāo)題時(shí)我下意識以為又是一篇堆砌術(shù)語的增量工作。真正讀進(jìn)去才發(fā)現(xiàn)它解決的是一個(gè)非常具體、也非常痛的問題當(dāng)你手里只有少量標(biāo)注樣本時(shí)如何讓目標(biāo)檢測模型依然能學(xué)到穩(wěn)定的類別表征。這個(gè)問題在工業(yè)質(zhì)檢、醫(yī)療影像、遙感解譯、零售貨架識別里反復(fù)出現(xiàn)——標(biāo)注成本高得離譜但業(yè)務(wù)又要求模型能識別新類別。這篇論文的核心思路不是單純做數(shù)據(jù)增強(qiáng)也不是簡單套用元學(xué)習(xí)框架而是把模型通信作為一條主線多個(gè)模型之間通過參數(shù)、特征或預(yù)測層面的信息交換來彌補(bǔ)單模型在極少樣本下的表征不足。關(guān)鍵詞里提到的“Few-Example Object Detection”和“Model Communication”其實(shí)是兩個(gè)相互咬合的齒輪——前者定義問題邊界后者給出解法路徑。適合讀這篇筆記的人有三類一是正在做小樣本檢測落地、被標(biāo)注預(yù)算卡住的算法工程師二是想理解“多模型協(xié)作”在檢測任務(wù)中如何具體實(shí)現(xiàn)的研究生三是對元學(xué)習(xí)、遷移學(xué)習(xí)已有基礎(chǔ)但想知道它們在檢測任務(wù)里到底怎么組合才不別扭的從業(yè)者。我會把論文里的關(guān)鍵設(shè)計(jì)拆開補(bǔ)上我自己的復(fù)現(xiàn)經(jīng)驗(yàn)和踩坑記錄盡量讓不同基礎(chǔ)的讀者都能拿走可用的東西。2. 小樣本目標(biāo)檢測的真實(shí)難點(diǎn)不是樣本少而是“少得沒有結(jié)構(gòu)”2.1 少樣本分類和少樣本檢測完全不是一回事很多人從少樣本分類Few-Shot Classification轉(zhuǎn)過來做檢測第一反應(yīng)是“把分類 backbone 換掉就行”。實(shí)際跑一遍就會發(fā)現(xiàn)分類任務(wù)里一張圖只有一個(gè)主體模型只需要判斷“這是什么”檢測任務(wù)里一張圖可能有多個(gè)目標(biāo)、多個(gè)類別、不同尺度、不同遮擋關(guān)系。樣本少的時(shí)候分類模型還能靠全局特征硬撐檢測模型連“哪里是目標(biāo)”都學(xué)不穩(wěn)。論文里有一個(gè)很清醒的判斷少樣本檢測的困難不只是標(biāo)注框數(shù)量少而是正樣本在空間上的分布極度稀疏。假設(shè)你有 5 個(gè)類別每個(gè)類別只有 3 個(gè)標(biāo)注框那么模型在訓(xùn)練時(shí)看到的正樣本區(qū)域可能只占整張圖面積的百分之幾。剩下的大片背景區(qū)域會強(qiáng)烈影響 RPN 或 anchor 的回歸方向?qū)е履P蛢A向于預(yù)測“沒有目標(biāo)”。2.2 為什么“微調(diào)”在極少樣本下經(jīng)常失效我最早嘗試的方案很直接拿一個(gè)在基類上預(yù)訓(xùn)練好的檢測器凍結(jié) backbone只微調(diào)最后的分類頭和回歸頭。結(jié)果在 5-shot 設(shè)置下 mAP 經(jīng)常掉到個(gè)位數(shù)。原因有三個(gè)分類頭隨機(jī)初始化后梯度噪聲遠(yuǎn)大于有效信號。少量樣本產(chǎn)生的梯度方向不穩(wěn)定幾輪迭代就把預(yù)訓(xùn)練特征帶偏了。回歸頭對尺度敏感。新類別的物體尺度如果和基類差異大微調(diào)幾乎學(xué)不到正確的框回歸。背景抑制能力退化?;愑?xùn)練時(shí)學(xué)到的“什么是背景”在新類別場景下不適用模型會把大量背景區(qū)域誤判為新類目標(biāo)。論文里提到的“模型通信”正是針對這三點(diǎn)不讓單個(gè)模型獨(dú)自承擔(dān)所有壓力而是讓多個(gè)模型在不同層面交換信息互相校正。2.3 論文對問題邊界的定義Few-Example 而不是 Few-Shot標(biāo)題用的是“Few-Example”而不是更常見的“Few-Shot”這個(gè)措辭差異值得注意。Few-Shot 通常指 N-way K-shot 的標(biāo)準(zhǔn)元學(xué)習(xí)設(shè)定每個(gè)任務(wù)有明確的 support set 和 query set。而 Few-Example 更寬泛強(qiáng)調(diào)實(shí)際場景中每個(gè)新類別只有少量標(biāo)注實(shí)例且這些實(shí)例可能不滿足嚴(yán)格的類別平衡。這個(gè)定義更貼近工程現(xiàn)實(shí)。比如某條產(chǎn)線要新增一個(gè)缺陷類別你只能收集到 7 張有缺陷的圖其中 3 張還是同一位置的不同光照。這種數(shù)據(jù)分布用標(biāo)準(zhǔn) Few-Shot 協(xié)議去套會很別扭但 Few-Example 的框架能容納。論文在實(shí)驗(yàn)部分也專門做了類別不平衡的消融說明作者是有意為之。3. 模型通信到底在通信什么三個(gè)層面的信息交換3.1 參數(shù)層面的通信不是簡單平均而是選擇性共享多模型通信最直覺的做法是聯(lián)邦平均或權(quán)重平均但論文沒有走這條路。原因是檢測模型的參數(shù)可以分成三部分共享 backbone、類別相關(guān)頭、位置相關(guān)頭。如果直接平均所有參數(shù)類別相關(guān)頭會被不同模型的噪聲互相污染。論文的做法是在 backbone 和 RPN 部分做參數(shù)通信在分類頭和回歸頭保持各模型獨(dú)立。具體來說多個(gè)模型在訓(xùn)練過程中定期交換 backbone 的梯度或權(quán)重但每個(gè)模型保留自己的檢測頭。這樣做的邏輯是底層特征具有跨類別通用性適合共享高層決策具有類別特異性必須獨(dú)立。我復(fù)現(xiàn)時(shí)試過把通信范圍擴(kuò)大到分類頭結(jié)果在 5-shot 下 mAP 掉了 4 個(gè)點(diǎn)左右。后來改成只通信 backbone 的前三個(gè)階段效果才穩(wěn)定。這個(gè)細(xì)節(jié)論文里沒有展開寫但代碼實(shí)現(xiàn)時(shí)非常關(guān)鍵。3.2 特征層面的通信用交叉注意力做實(shí)例級對齊參數(shù)通信解決的是“底層表征一致性”但少樣本檢測還有一個(gè)更棘手的問題不同模型對同一張圖中同一目標(biāo)的特征表達(dá)可能差異很大。論文引入了一個(gè)特征通信模塊讓模型 A 的特征圖去查詢模型 B 的特征圖通過交叉注意力生成增強(qiáng)后的特征。這個(gè)設(shè)計(jì)的巧妙之處在于它不是簡單拼接或相加而是讓每個(gè)模型學(xué)會“從其他模型那里借信息”。具體實(shí)現(xiàn)上作者用了多頭注意力query 來自當(dāng)前模型key 和 value 來自其他模型。這樣當(dāng)前模型可以根據(jù)自己的需求有選擇地吸收其他模型的特征。我在自己的數(shù)據(jù)上試過這個(gè)模塊發(fā)現(xiàn)它對小目標(biāo)的提升最明顯。原因是小目標(biāo)在單模型里特征響應(yīng)弱但多個(gè)模型的特征圖疊加后響應(yīng)區(qū)域更容易被激活。不過要注意交叉注意力的計(jì)算開銷不小如果模型數(shù)量超過 3 個(gè)顯存會吃緊。3.3 預(yù)測層面的通信用集成思想做后處理第三個(gè)層面是預(yù)測通信。論文在推理階段沒有直接用單個(gè)模型的輸出而是讓多個(gè)模型的預(yù)測結(jié)果做融合。融合方式不是簡單的 NMS 疊加而是基于置信度和 IoU 的加權(quán)投票。具體來說對于每個(gè)預(yù)測框如果多個(gè)模型都預(yù)測了相似位置和類別就提高該框的置信度如果只有單個(gè)模型預(yù)測就降低權(quán)重。這個(gè)策略在少樣本場景下特別有用因?yàn)閱文P腿菀走^擬合到少量樣本的噪聲上多模型投票能過濾掉一部分虛假檢測。我實(shí)測下來預(yù)測通信帶來的提升在 1-shot 設(shè)置下最顯著mAP 能漲 3 到 5 個(gè)點(diǎn)但在 10-shot 以上提升就邊際遞減了。這也符合直覺樣本多了之后單模型本身已經(jīng)比較穩(wěn)通信帶來的增益自然變小。4. 復(fù)現(xiàn)時(shí)最容易踩的三個(gè)坑4.1 通信頻率不是越高越好論文里提到模型之間定期通信但沒給具體的頻率建議。我一開始設(shè)成每輪都通信結(jié)果訓(xùn)練極不穩(wěn)定loss 震蕩嚴(yán)重。后來改成每 5 輪通信一次才收斂正常。背后的原因是通信太頻繁會讓多個(gè)模型過早趨同失去多樣性。少樣本場景下模型多樣性本身就是一種正則化。如果所有模型在早期就變得一模一樣通信就退化成單模型訓(xùn)練了。我的經(jīng)驗(yàn)是通信間隔可以設(shè)為總訓(xùn)練輪數(shù)的十分之一左右比如總共 50 輪就每 5 輪通信一次。4.2 通信權(quán)重的初始化很關(guān)鍵特征通信模塊里的交叉注意力權(quán)重不能隨機(jī)初始化。論文雖然沒明說但從代碼實(shí)現(xiàn)看作者用了較小的初始化方差。我試過默認(rèn)初始化發(fā)現(xiàn)訓(xùn)練初期注意力幾乎均勻分布相當(dāng)于對所有其他模型的特征做平均效果很差。后來改成用 backbone 預(yù)訓(xùn)練特征的統(tǒng)計(jì)量來初始化讓注意力初始時(shí)偏向于相似區(qū)域效果明顯改善。這個(gè)技巧在論文里沒有寫但屬于“不做就掉點(diǎn)”的隱藏細(xì)節(jié)。4.3 數(shù)據(jù)增強(qiáng)不能照搬分類任務(wù)的做法少樣本檢測的數(shù)據(jù)增強(qiáng)和分類任務(wù)差別很大。分類任務(wù)常用的 RandomResizedCrop 在檢測里會破壞框的坐標(biāo)ColorJitter 過度使用會讓模型對顏色敏感。論文里用的增強(qiáng)策略比較克制只做水平翻轉(zhuǎn)、小幅度的尺度抖動和亮度調(diào)整。我額外加了 Mosaic 增強(qiáng)結(jié)果在 5-shot 下反而掉了 2 個(gè)點(diǎn)。原因是 Mosaic 會把多張圖拼在一起進(jìn)一步稀釋了本就稀疏的正樣本。所以少樣本檢測的增強(qiáng)原則是寧可少增強(qiáng)也不要引入破壞空間結(jié)構(gòu)的變換。5. 模型通信和常見元學(xué)習(xí)方法的對比5.1 和 MAML 類方法的差異MAML 的核心是學(xué)一個(gè)初始化參數(shù)使得模型在新任務(wù)上幾步梯度更新就能收斂。但在檢測任務(wù)里MAML 的內(nèi)循環(huán)需要計(jì)算二階梯度顯存和計(jì)算開銷都很大。而且檢測的損失函數(shù)包含分類和回歸兩部分二階梯度傳播容易不穩(wěn)定。模型通信的思路不同它不追求“快速適應(yīng)”而是通過多個(gè)模型的互補(bǔ)來直接提升表征質(zhì)量。MAML 是縱向的元學(xué)習(xí)模型通信是橫向的集成學(xué)習(xí)。兩者可以結(jié)合但論文沒有走這條路而是把通信作為主要貢獻(xiàn)點(diǎn)。5.2 和知識蒸餾的差異知識蒸餾通常是 teacher 模型指導(dǎo) student 模型信息是單向流動的。模型通信是雙向的每個(gè)模型既是信息提供者也是接收者。這個(gè)差異在少樣本場景下很重要沒有哪個(gè)模型天然是“老師”因?yàn)樗心P投贾灰娺^少量樣本。論文在消融實(shí)驗(yàn)里對比了單向蒸餾和雙向通信結(jié)果顯示雙向通信在 5-shot 下比單向蒸餾高 2 個(gè)點(diǎn)左右。這個(gè)差距不算大但考慮到實(shí)現(xiàn)復(fù)雜度相近雙向通信的性價(jià)比更高。5.3 和簡單集成的差異簡單集成是訓(xùn)練多個(gè)獨(dú)立模型推理時(shí)平均輸出。模型通信在訓(xùn)練階段就引入了信息交換所以模型之間不是完全獨(dú)立的。論文的實(shí)驗(yàn)顯示通信后的模型集成效果優(yōu)于獨(dú)立模型集成尤其在 1-shot 和 3-shot 設(shè)置下差距明顯。原因可以這樣理解獨(dú)立模型各自過擬合到不同的噪聲上集成只能平均掉一部分通信模型在訓(xùn)練中已經(jīng)互相校正過過擬合的噪聲更少集成后的方差更小。6. 這套方法在實(shí)際業(yè)務(wù)里的適用邊界6.1 適合的場景類別增量頻繁、標(biāo)注預(yù)算有限如果你的業(yè)務(wù)每隔幾周就要新增一個(gè)檢測類別每次只能標(biāo)幾十張圖那這套方法很合適。模型通信可以在不重新訓(xùn)練整個(gè)檢測器的前提下讓新類別快速融入。我試過在一個(gè)工業(yè)質(zhì)檢項(xiàng)目里用類似思路新增缺陷類別的冷啟動時(shí)間從兩周縮短到三天。6.2 不適合的場景極端實(shí)時(shí)性要求模型通信在推理階段需要跑多個(gè)模型計(jì)算量是單模型的 N 倍。雖然后期可以用蒸餾壓縮但訓(xùn)練階段的開銷是實(shí)打?qū)嵉?。如果業(yè)務(wù)要求端側(cè)實(shí)時(shí)推理且算力有限這套方法需要謹(jǐn)慎評估。6.3 對基類數(shù)據(jù)量的要求論文假設(shè)基類有充足標(biāo)注。如果基類本身也只有少量樣本模型通信的效果會打折扣。因?yàn)橥ㄐ诺那疤崾敲總€(gè)模型已經(jīng)學(xué)到了一定的通用表征如果所有模型都在欠擬合狀態(tài)通信只會放大噪聲。我的經(jīng)驗(yàn)是基類至少要有每類 50 到 100 個(gè)標(biāo)注框通信才能穩(wěn)定帶來增益。7. 如果讓我重新實(shí)現(xiàn)一遍我會怎么調(diào)整7.1 通信模塊放在 neck 而不是 backbone論文把通信放在 backbone 階段。我后來試過把通信模塊移到 FPN 的 neck 部分發(fā)現(xiàn)效果更好。原因是 neck 特征已經(jīng)融合了多尺度信息通信時(shí)交換的信息更接近檢測任務(wù)的需求。而且 neck 的參數(shù)量比 backbone 小通信開銷更低。7.2 用動態(tài)權(quán)重代替固定通信間隔固定通信間隔需要手動調(diào)參。我后來改成根據(jù)模型之間的特征差異動態(tài)決定是否通信如果兩個(gè)模型的 backbone 特征余弦相似度低于某個(gè)閾值就觸發(fā)通信如果已經(jīng)很高就跳過。這樣既保證了多樣性又避免了不必要的計(jì)算。7.3 預(yù)測通信加入類別先驗(yàn)論文的預(yù)測通信只用了置信度和 IoU。我在實(shí)際業(yè)務(wù)里加入了類別先驗(yàn)如果某個(gè)類別在訓(xùn)練集中出現(xiàn)頻率低就適當(dāng)提高其預(yù)測框的權(quán)重。這個(gè)調(diào)整在類別不平衡的場景下能再漲 1 到 2 個(gè)點(diǎn)。8. 讀這篇論文時(shí)我記下的幾個(gè)關(guān)鍵結(jié)論第一少樣本檢測的核心矛盾不是“樣本數(shù)量少”而是“正樣本空間分布稀疏”。任何方法如果只關(guān)注增加樣本數(shù)量而不解決空間稀疏問題效果都會受限。第二模型通信的有效性來自多樣性保持和信息互補(bǔ)的平衡。通信太弱模型各自過擬合通信太強(qiáng)模型趨同失去集成優(yōu)勢。找到這個(gè)平衡點(diǎn)是工程落地的關(guān)鍵。第三參數(shù)通信、特征通信、預(yù)測通信三個(gè)層面不是互斥的可以組合使用。論文的實(shí)驗(yàn)顯示三者同時(shí)開啟時(shí)效果最好但計(jì)算開銷也最大。實(shí)際使用時(shí)可以根據(jù)算力預(yù)算做取舍。第四少樣本檢測的評估不能只看 mAP。在 1-shot 設(shè)置下mAP 的方差很大單次實(shí)驗(yàn)的結(jié)果可能不可靠。論文用了多次隨機(jī)采樣的平均結(jié)果這個(gè)做法值得借鑒。我在實(shí)際復(fù)現(xiàn)時(shí)還發(fā)現(xiàn)一個(gè)論文沒提的現(xiàn)象模型通信對 backbone 的預(yù)訓(xùn)練質(zhì)量很敏感。如果 backbone 是在 ImageNet 上預(yù)訓(xùn)練的通信帶來的增益明顯如果是從頭訓(xùn)練通信幾乎不起作用。所以這套方法更適合“有預(yù)訓(xùn)練模型可用”的場景而不是完全從零開始的冷啟動。最后分享一個(gè)調(diào)參小技巧通信權(quán)重的溫度系數(shù)不要設(shè)得太小。我一開始設(shè)成 0.1結(jié)果注意力幾乎變成 one-hot每個(gè)模型只從最相似的模型那里取信息多樣性反而下降。后來改成 0.5 到 1.0 之間效果更穩(wěn)。這個(gè)參數(shù)在論文里沒有重點(diǎn)討論但實(shí)際影響不小。