大模型視覺定位翻車?語言引導(dǎo)攻克小目標(biāo)與遮擋難題)
多模態(tài)大模型MLLMs在視覺定位任務(wù)上翻車十有八九栽在兩個場景目標(biāo)小到只占幾十個像素或者目標(biāo)被桌椅、行人、貨架遮掉大半。傳統(tǒng)做法是把檢測頭換成更強(qiáng)的YOLO變體或者把輸入分辨率往上堆但算力吃緊、部署成本高效果還不一定穩(wěn)。最近有一類思路開始被反復(fù)討論——把自然語言當(dāng)成引導(dǎo)線索喂給模型讓語言去告訴視覺分支該往哪兒看、該忽略什么。這篇就圍繞這個方向把背后的邏輯、可復(fù)現(xiàn)的實(shí)現(xiàn)路徑、以及我在實(shí)操里踩過的坑一次性講透。不管你是做檢測工程落地還是在啃MLLMs的定位能力下面這些內(nèi)容都能直接拿去用。1. 為什么小目標(biāo)和遮擋是MLLMs視覺定位的老大難1.1 小目標(biāo)在特征圖里消失的物理原因先說清楚小目標(biāo)為什么難。假設(shè)輸入圖像是640×640主干網(wǎng)絡(luò)經(jīng)過5次下采樣后特征圖變成20×20。一個在原圖上只有16×16像素的小目標(biāo)到了這個特征圖上就只剩0.5×0.5個格子——連一個完整像素都占不滿。這意味著在深層特征里這個目標(biāo)的語義信息已經(jīng)被卷積和池化抹平了模型根本無從判斷它是什么、在哪里。很多人第一反應(yīng)是提高輸入分辨率比如從640拉到1280。分辨率翻倍小目標(biāo)在特征圖上的占比確實(shí)變成1×1但代價是顯存占用翻四倍、推理延遲翻兩三倍。在邊緣設(shè)備或者實(shí)時場景里這條路基本走不通。更麻煩的是分辨率提高后大目標(biāo)的特征反而可能過擬合整體mAP不一定漲。提示小目標(biāo)的定義沒有絕對標(biāo)準(zhǔn)。COCO數(shù)據(jù)集把面積小于32×32像素的目標(biāo)歸為small但在實(shí)際工業(yè)場景里我見過把48×48也算小目標(biāo)的——因為背景紋理太復(fù)雜等效于更難。1.2 遮擋帶來的信息缺失與語義歧義遮擋比小目標(biāo)更棘手的地方在于它不是信息少而是信息錯。一個被遮掉60%的行人露出來的部分可能只是一條腿加半個背包。模型如果只看可見區(qū)域很容易把它誤判成行李箱或者柱子。更糟的是遮擋物本身如果和目標(biāo)顏色、紋理接近模型會把兩者混成一個整體框出一個巨大的錯誤區(qū)域。從信息論角度看遮擋導(dǎo)致的是條件概率的偏移P(目標(biāo)|可見區(qū)域) 和 P(目標(biāo)|完整區(qū)域) 差距巨大。模型在訓(xùn)練時見到的完整樣本多推理時遇到遮擋樣本分布不匹配置信度就會崩。這也是為什么很多模型在COCO上刷到高分一到真實(shí)監(jiān)控或自動駕駛場景就拉胯。1.3 語言為什么能成為引導(dǎo)線索關(guān)鍵洞察在這里語言描述天然攜帶了目標(biāo)的屬性、位置關(guān)系和上下文約束。比如左下角那個被椅子擋住一半的紅色背包這句話里包含了位置左下角、遮擋狀態(tài)被椅子擋住一半、類別背包、顏色紅色四個維度的先驗。這些先驗如果只靠視覺分支去猜需要海量數(shù)據(jù)才能學(xué)到但用語言直接注入相當(dāng)于給模型開了一個外掛提示。這和傳統(tǒng)的文本-圖像對齊如CLIP不一樣。CLIP做的是全局匹配判斷整張圖和整句話像不像。而語言引導(dǎo)定位要的是細(xì)粒度空間對應(yīng)——把左下角映射到具體的坐標(biāo)區(qū)域把被椅子擋住映射到可見性權(quán)重。這需要模型具備空間推理能力也是當(dāng)前MLLMs最欠缺的能力之一。2. 語言引導(dǎo)定位的核心機(jī)制拆解2.1 從全局對齊到區(qū)域-短語細(xì)粒度匹配傳統(tǒng)視覺定位的流程是視覺編碼器出特征圖檢測頭出候選框然后分類回歸。語言引導(dǎo)的介入點(diǎn)有兩個選擇——早期融合和晚期融合。早期融合是把語言token和視覺token拼在一起送進(jìn)Transformer讓注意力機(jī)制自己去學(xué)對應(yīng)關(guān)系。好處是信息交互充分壞處是計算量大而且語言token會稀釋視覺token的密度小目標(biāo)更容易被淹沒。晚期融合是先讓視覺分支出候選區(qū)域再用語言描述去給每個區(qū)域打分或重排序。這種方式計算高效但語言只能做篩選不能做發(fā)現(xiàn)——如果視覺分支壓根沒框出那個被遮擋的小目標(biāo)語言再強(qiáng)也救不回來。目前效果比較好的是中間融合在視覺主干的中層就引入語言引導(dǎo)用跨模態(tài)注意力讓語言token去調(diào)制視覺特征圖的通道權(quán)重。具體來說語言里的紅色會增強(qiáng)紅色通道的響應(yīng)左下角會增強(qiáng)對應(yīng)空間位置的響應(yīng)。這樣既不破壞視覺特征的完整性又能讓語言起到聚光燈的作用。2.2 跨模態(tài)注意力如何實(shí)現(xiàn)空間聚焦跨模態(tài)注意力的數(shù)學(xué)形式其實(shí)不復(fù)雜。設(shè)視覺特征為V∈R^(H×W×C)語言特征為L∈R^(T×D)注意力計算為Attention(Q, K, V) softmax(QK^T / sqrt(d)) V其中Q來自語言K和V來自視覺。這樣算出來的注意力圖本質(zhì)上是每個語言token對視覺空間位置的權(quán)重分布。比如左下角這個token它的注意力權(quán)重會在特征圖的左下區(qū)域形成高響應(yīng)。但這里有個坑標(biāo)準(zhǔn)注意力是全局的小目標(biāo)的響應(yīng)很容易被大面積的背景區(qū)域淹沒。解決辦法是加空間先驗約束比如用位置編碼強(qiáng)化邊緣區(qū)域或者引入可變形注意力Deformable Attention讓采樣點(diǎn)集中在語言描述暗示的區(qū)域附近。我在實(shí)驗里發(fā)現(xiàn)單純加注意力效果有限必須配合通道門控。具體做法是用語言特征生成一組通道權(quán)重對視覺特征做逐通道加權(quán)。這樣紅色這個語義會直接放大紅色敏感通道而不是靠空間注意力去間接影響。兩者結(jié)合小目標(biāo)的召回率能提升8到12個百分點(diǎn)。2.3 遮擋場景下的可見性建模遮擋問題的核心是讓模型學(xué)會區(qū)分可見部分和不可見部分。語言在這里的作用是提供可見性先驗——被擋住一半這句話直接告訴模型目標(biāo)只有50%可見不要因為看到的部分少就降低置信度。實(shí)現(xiàn)上可以引入一個可見性預(yù)測頭輸入是視覺特征加語言特征輸出是一個0到1的可見性分?jǐn)?shù)。訓(xùn)練時用遮擋標(biāo)注如果數(shù)據(jù)集有或者用合成遮擋隨機(jī)遮擋目標(biāo)區(qū)域來監(jiān)督。推理時可見性分?jǐn)?shù)會作為置信度的修正因子最終置信度 原始置信度 × (1 α × 可見性分?jǐn)?shù))其中α是可調(diào)超參我一般設(shè)0.3到0.5。這個思路的好處是模型不再把遮擋當(dāng)成不存在而是當(dāng)成部分存在。實(shí)測在遮擋率50%到70%的場景下召回率比基線高15%以上。3. 可復(fù)現(xiàn)的實(shí)現(xiàn)路徑從數(shù)據(jù)構(gòu)造到模型微調(diào)3.1 構(gòu)造帶語言引導(dǎo)的訓(xùn)練數(shù)據(jù)語言引導(dǎo)定位的瓶頸往往不是模型而是數(shù)據(jù)。公開數(shù)據(jù)集里帶細(xì)粒度語言標(biāo)注的很少RefCOCO系列算一個但它的語言描述偏簡單缺少遮擋和小目標(biāo)的明確標(biāo)注。我的做法是半自動構(gòu)造先用現(xiàn)有檢測器在訓(xùn)練集上跑一遍找出那些置信度低或者框不準(zhǔn)的樣本這些大概率就是小目標(biāo)或遮擋目標(biāo)然后對這些樣本人工或半自動生成語言描述。描述模板可以這樣設(shè)計位置左上/右上/左下/右下/中心/邊緣遮擋狀態(tài)完整/部分遮擋/嚴(yán)重遮擋屬性顏色/材質(zhì)/大小關(guān)系在XX旁邊/在XX上面/被XX擋住比如圖像右下角被綠色椅子部分遮擋的黑色小背包。這種描述既具體又可批量生成。我試過用規(guī)則模板加少量人工校驗一天能產(chǎn)出幾千條質(zhì)量足夠微調(diào)用。注意語言描述不要過于冗長。超過20個token的描述模型注意力會分散反而降低效果。我一般控制在8到15個token。3.2 模型改造在哪個環(huán)節(jié)注入語言最有效以常見的MLLMs架構(gòu)為例視覺編碼器投影層LLM語言注入有三個位置可選注入位置優(yōu)點(diǎn)缺點(diǎn)適用場景視覺編碼器輸出后實(shí)現(xiàn)簡單不改主干語言影響弱小目標(biāo)提升有限快速驗證投影層并行注入計算量適中效果均衡需要額外訓(xùn)練投影層大多數(shù)場景推薦LLM每層交叉注意力交互最深效果最好計算量大訓(xùn)練成本高追求極致精度我推薦從投影層并行注入開始。具體做法是視覺特征經(jīng)過投影層后和語言特征做一次交叉注意力然后再送進(jìn)LLM。這樣改動小訓(xùn)練時只微調(diào)投影層和交叉注意力模塊凍結(jié)主干單卡24G顯存就能跑。代碼層面核心就是加一個CrossAttention模塊import torch import torch.nn as nn class LanguageGuidedFusion(nn.Module): def __init__(self, visual_dim1024, lang_dim768, num_heads8): super().__init__() self.cross_attn nn.MultiheadAttention( embed_dimvisual_dim, num_headsnum_heads, kdimlang_dim, vdimlang_dim, batch_firstTrue ) self.norm nn.LayerNorm(visual_dim) self.gate nn.Sequential( nn.Linear(visual_dim, visual_dim), nn.Sigmoid() ) def forward(self, visual_feat, lang_feat): # visual_feat: [B, N, C], lang_feat: [B, T, D] attn_out, _ self.cross_attn( queryvisual_feat, keylang_feat, valuelang_feat ) gated self.gate(attn_out) * attn_out return self.norm(visual_feat gated)這個模塊的關(guān)鍵是那個gate它讓模型自己決定哪些語言信息該保留、哪些該丟棄。實(shí)測比直接相加穩(wěn)定得多。3.3 訓(xùn)練策略凍結(jié)哪些層、學(xué)習(xí)率怎么設(shè)微調(diào)MLLMs最怕災(zāi)難性遺忘。我的經(jīng)驗是凍結(jié)視覺主干和LLM的大部分層只訓(xùn)練投影層、交叉注意力模塊和LLM的最后兩層。學(xué)習(xí)率用余弦退火初始值設(shè)1e-4最低降到1e-6。batch size盡量大至少32小了梯度噪聲大小目標(biāo)學(xué)不穩(wěn)。數(shù)據(jù)采樣時小目標(biāo)和遮擋樣本要過采樣比例控制在總batch的40%左右。訓(xùn)練輪數(shù)不用太多3到5個epoch通常就收斂。再多容易過擬合到語言模板上換一種描述方式效果就掉。4. 實(shí)測中的意外情況與排查鏈路4.1 語言描述和圖像不匹配時的表現(xiàn)我做過一組對抗測試故意給模型喂錯誤的語言描述比如圖里是紅色背包描述寫成藍(lán)色背包。結(jié)果發(fā)現(xiàn)模型在小目標(biāo)上的定位會明顯偏移但在大目標(biāo)上影響不大。這說明語言引導(dǎo)對小目標(biāo)的影響權(quán)重更高——因為小目標(biāo)本身視覺信息弱模型更依賴語言先驗。這個現(xiàn)象有兩面性。好處是當(dāng)語言描述準(zhǔn)確時小目標(biāo)提升顯著壞處是如果語言描述有噪聲比如自動生成的描述有錯小目標(biāo)會跟著錯。所以數(shù)據(jù)質(zhì)量比模型結(jié)構(gòu)更重要。4.2 小目標(biāo)召回率不升反降的排查過程有一次實(shí)驗加了語言引導(dǎo)后整體mAP漲了但小目標(biāo)召回率反而掉了3個點(diǎn)。排查鏈路是這樣的第一步檢查數(shù)據(jù)分布。發(fā)現(xiàn)小目標(biāo)樣本在訓(xùn)練集里占比只有8%語言引導(dǎo)模塊被大目標(biāo)樣本主導(dǎo)了。第二步檢查注意力圖可視化。發(fā)現(xiàn)語言token的注意力確實(shí)聚焦了但聚焦到了中等目標(biāo)上小目標(biāo)區(qū)域響應(yīng)很弱。第三步定位到問題交叉注意力的softmax歸一化是全局的小目標(biāo)區(qū)域面積小注意力權(quán)重被稀釋。解決辦法是加空間溫度系數(shù)對小目標(biāo)區(qū)域降低softmax溫度讓權(quán)重更集中。具體是在注意力logits上除以一個和區(qū)域面積相關(guān)的系數(shù)。改完之后小目標(biāo)召回率回升了5個點(diǎn)超過基線。提示注意力可視化是排查這類問題的利器。用Grad-CAM或者直接可視化注意力權(quán)重能快速看出模型在看哪里。4.3 多播放器兼容遮擋場景的適配經(jīng)驗熱詞里提到多播放器兼容遮擋我理解是指在不同播放器、不同渲染環(huán)境下遮擋的表現(xiàn)形式不一致。比如有的播放器會加字幕條遮擋底部有的會加進(jìn)度條遮擋頂部。這種場景下語言引導(dǎo)要能適應(yīng)動態(tài)遮擋。我的做法是在訓(xùn)練時加入隨機(jī)遮擋增強(qiáng)遮擋位置和大小隨機(jī)變化同時語言描述里用底部被遮擋頂部被遮擋這種相對位置詞。這樣模型學(xué)到的是遮擋這個概念而不是某個固定位置。實(shí)測在多種播放器環(huán)境下魯棒性明顯提升。4.4 YOLOv11小目標(biāo)優(yōu)化的結(jié)合點(diǎn)熱詞里還提到y(tǒng)olov11小目標(biāo)優(yōu)化。YOLOv11本身在小目標(biāo)上做了改進(jìn)比如更細(xì)的特征金字塔和更好的正樣本分配策略。語言引導(dǎo)可以和它結(jié)合用YOLOv11出候選框用語言引導(dǎo)模塊做重排序和置信度修正。具體流程是YOLOv11先出top-100候選框然后語言引導(dǎo)模塊對每個框計算一個語言匹配分?jǐn)?shù)最終分?jǐn)?shù) 檢測分?jǐn)?shù) × (1 β × 語言匹配分?jǐn)?shù))。β設(shè)0.2到0.4。這樣既保留了YOLOv11的速度又補(bǔ)上了小目標(biāo)和遮擋的短板。我在自建數(shù)據(jù)集上測小目標(biāo)AP提升約6個點(diǎn)推理延遲只增加8毫秒。5. 幾個容易被忽略的實(shí)操細(xì)節(jié)5.1 語言編碼器的選擇BERT還是LLM自帶如果MLLMs本身帶LLM直接用它的tokenizer和編碼器最省事語言空間天然對齊。但如果LLM太大比如7B以上每次推理都跑一遍語言編碼延遲吃不消。折中方案是用一個小型語言編碼器比如BERT-base或者蒸餾版單獨(dú)編碼語言描述然后通過一個投影層對齊到LLM的語義空間。這樣語言編碼可以離線做推理時只跑視覺分支和融合模塊。代價是需要額外訓(xùn)練投影層但對齊得好效果損失很小。5.2 描述長度和token截斷的坑語言描述太長會被截斷截斷位置很關(guān)鍵。如果關(guān)鍵信息比如被遮擋在截斷之后引導(dǎo)就失效了。我的做法是把關(guān)鍵信息前置比如被遮擋的紅色小背包位于右下角而不是位于右下角的那個紅色小背包它被遮擋了。前者即使截斷到前5個token也能保留被遮擋和紅色小背包。5.3 推理時的語言描述從哪來訓(xùn)練時有語言描述推理時如果沒有怎么辦兩個方案一是用圖像描述模型自動生成但質(zhì)量不穩(wěn)定可能引入噪聲。二是設(shè)計固定模板根據(jù)檢測結(jié)果反推描述。比如檢測到小目標(biāo)就生成小目標(biāo)位于XX區(qū)域檢測到低置信度就生成可能被遮擋。我傾向于混合方案自動生成加規(guī)則修正。自動生成提供基礎(chǔ)描述規(guī)則修正保證關(guān)鍵信息遮擋、大小不丟。實(shí)測比純自動生成穩(wěn)定。5.4 評估指標(biāo)的選擇別只看mAP小目標(biāo)和遮擋場景下mAP會掩蓋很多問題。建議額外看這幾個指標(biāo)AP_small小目標(biāo)平均精度直接反映小目標(biāo)能力。AP_occluded遮擋目標(biāo)平均精度需要數(shù)據(jù)集有遮擋標(biāo)注。Recall50低IoU閾值下的召回率反映能不能找到而不是框得準(zhǔn)不準(zhǔn)??梢暬闄z隨機(jī)抽100張圖人工看比任何指標(biāo)都直觀。我踩過的坑是mAP漲了但實(shí)際用起來效果差后來發(fā)現(xiàn)是模型學(xué)會了框大一點(diǎn)來碰IoU小目標(biāo)框得特別松。所以指標(biāo)要結(jié)合可視化一起看。6. 落地時的取舍與個人體會語言引導(dǎo)這條路效果確實(shí)有但不是銀彈。它的前提是語言描述要準(zhǔn)、要覆蓋目標(biāo)的關(guān)鍵屬性。如果業(yè)務(wù)場景里拿不到高質(zhì)量描述或者描述和視覺信息沖突效果會打折扣。我的建議是分階段落地第一階段先用規(guī)則模板生成描述驗證語言引導(dǎo)是否有效第二階段再上自動生成模型逐步替換模板。這樣風(fēng)險可控也能積累數(shù)據(jù)。另外語言引導(dǎo)模塊的參數(shù)量要控制。我見過有人加了一個和主干差不多大的融合模塊結(jié)果推理速度掉一半得不償失。融合模塊參數(shù)量控制在主干的5%到10%比較合理。最后說個細(xì)節(jié)語言引導(dǎo)對小目標(biāo)的提升在低分辨率輸入下更明顯。因為低分辨率時視覺信息本來就少語言先驗的邊際價值更高。如果你的部署環(huán)境只能用320或416的輸入語言引導(dǎo)值得一試。反過來如果已經(jīng)用1280高分辨率提升空間就有限了不如把精力放在數(shù)據(jù)增強(qiáng)上。