花卉網(wǎng)站建設(shè)策劃網(wǎng)站開發(fā)職業(yè)前景評估
鶴壁市浩天電氣有限公司
2026/01/24 10:35:28
花卉網(wǎng)站建設(shè)策劃,網(wǎng)站開發(fā)職業(yè)前景評估,營銷網(wǎng)站制作哪家好,群暉 6 wordpress摘要
本文提出了一種基于多尺度稀疏交叉注意力(MSC)的YOLO11-MM多模態(tài)目標(biāo)檢測框架改進(jìn)方法。通過在P4和P5層特征之間引入MSC模塊#xff0c;實(shí)現(xiàn)了紅外與可見光特征的高效融合。MSC結(jié)合多尺度上下文建模和Top-K稀疏策略#xff0c;有效抑制噪聲干擾并提升目標(biāo)檢測精度。實(shí)驗(yàn)…摘要本文提出了一種基于多尺度稀疏交叉注意力(MSC)的YOLO11-MM多模態(tài)目標(biāo)檢測框架改進(jìn)方法。通過在P4和P5層特征之間引入MSC模塊實(shí)現(xiàn)了紅外與可見光特征的高效融合。MSC結(jié)合多尺度上下文建模和Top-K稀疏策略有效抑制噪聲干擾并提升目標(biāo)檢測精度。實(shí)驗(yàn)表明該方法在FLIR、M3FD和LLVIP等多模態(tài)數(shù)據(jù)集上表現(xiàn)出色具有工程友好性和場景適應(yīng)性。文章詳細(xì)介紹了MSC模塊的實(shí)現(xiàn)原理、代碼結(jié)構(gòu)和在YOLO11-MM框架中的集成步驟為多模態(tài)目標(biāo)檢測研究提供了實(shí)用參考。目錄一、引言二、多尺度稀疏交叉注意力 (MSC)2.1、核心思想MSC × YOLO11-MM × 多數(shù)據(jù)集多模態(tài)融合2.2、突出貢獻(xiàn)MSC 在 YOLO11-MM 多模態(tài)檢測中的價值2.3、優(yōu)勢特點(diǎn)FLIR / M3FD / LLVIP 多場景實(shí)戰(zhàn)表現(xiàn)2.4 代碼說明:三、逐步手把手添加MSC3.1 第一步3.2 第二步3.3 第三步3.4 第四步四 完整yaml4.1 YOLO11-MM加入MSC五 訓(xùn)練代碼和結(jié)果5.1 模型訓(xùn)練代碼5.2 模型訓(xùn)練結(jié)果六 總結(jié)一、引言本文圍繞YOLO11-MM 多模態(tài)目標(biāo)檢測框架的結(jié)構(gòu)改進(jìn)與性能優(yōu)化展開研究重點(diǎn)探討如何引入多尺度稀疏交叉注意力MSC, Multi-Scale Sparse Cross-Attention實(shí)現(xiàn)紅外Infrared與可見光Visible特征的高效融合從而提升模型在復(fù)雜場景下的目標(biāo)檢測魯棒性與整體準(zhǔn)確性。在具體實(shí)現(xiàn)層面本文系統(tǒng)分析了MSC 模塊在網(wǎng)絡(luò)不同階段的插入策略旨在探索更加合理且高效的紅外–可見光特征融合方式?;诙嘟M對比實(shí)驗(yàn)本文采用中期融合Middle Fusion作為主要實(shí)現(xiàn)方案重點(diǎn)研究多尺度稀疏交叉注意力介入時機(jī)對特征表達(dá)能力及最終檢測性能的影響。通過在P4和P5層特征之間引入 MSC模型能夠在不同語義層級上實(shí)現(xiàn)更充分的信息交互。從機(jī)制上看MSC 一方面能夠挖掘隱藏在復(fù)雜場景中的多尺度結(jié)構(gòu)與語義信息有效建模不同模態(tài)之間的互補(bǔ)關(guān)系另一方面通過引入稀疏注意力策略顯著減少無關(guān)區(qū)域和冗余特征對融合過程的干擾從而在保證表達(dá)能力的同時降低噪聲影響使融合特征更加聚焦于目標(biāo)區(qū)域。需要特別說明的是本文實(shí)驗(yàn)所采用的數(shù)據(jù)集為FLIR 數(shù)據(jù)集的子集而非完整 FLIR 數(shù)據(jù)集。在進(jìn)行實(shí)驗(yàn)復(fù)現(xiàn)或進(jìn)一步擴(kuò)展研究時讀者需注意數(shù)據(jù)劃分與配置設(shè)置上的差異以避免由數(shù)據(jù)規(guī)?;蚍植疾灰恢聨淼慕Y(jié)果偏差。希望本文的研究思路與工程實(shí)踐經(jīng)驗(yàn)?zāi)軌驗(yàn)槎嗄B(tài)目標(biāo)檢測領(lǐng)域的研究者與工程實(shí)踐者提供具有參考價值的技術(shù)借鑒與實(shí)現(xiàn)范式。二、多尺度稀疏交叉注意力 (MSC)論文鏈接https://ieeexplore.ieee.org/stamp/stamp.jsp?tparnumber10820553代碼鏈接https://github.com/TangXu-Group/Remote-Sensing-Images-Classification/tree/main/MSCN2.1、核心思想MSC × YOLO11-MM × 多數(shù)據(jù)集多模態(tài)融合在 YOLO11-MM 多模態(tài)目標(biāo)檢測框架中多尺度稀疏交叉注意力MSC, Multi-Scale Sparse Cross-Attention的核心思想是通過多尺度上下文建模 稀疏交叉注意力機(jī)制在紅外與可見光特征之間建立高效、可控的跨模態(tài)信息交互通道從而避免傳統(tǒng)全量注意力與簡單拼接帶來的冗余干擾問題。具體而言MSC 以兩路等尺度特征作為輸入通常對應(yīng)紅外與可見光或不同尺度/階段的融合特征首先對其中一路特征引入多尺度平均池化3×3 / 5×5 / 7×7在空間維度上顯式編碼不同感受野下的上下文信息隨后以 Query–Key–Value 形式構(gòu)建跨模態(tài)注意力并通過Top-K 稀疏策略在注意力矩陣中僅保留最相關(guān)的響應(yīng)位置。既捕獲跨模態(tài)的關(guān)鍵互補(bǔ)信息又避免背景噪聲、熱噪聲或光照干擾被無差別放大。2.2、突出貢獻(xiàn)MSC 在 YOLO11-MM 多模態(tài)檢測中的價值MSC 在 YOLO11-MM 框架中的突出貢獻(xiàn)在于以較低的工程復(fù)雜度引入了一種“可解釋、可控、可擴(kuò)展”的跨模態(tài)融合機(jī)制有效彌補(bǔ)了傳統(tǒng) Concat / Add 融合方式在多尺度與跨模態(tài)建模上的結(jié)構(gòu)性缺陷。從論文與代碼實(shí)現(xiàn)角度看MSC 的創(chuàng)新點(diǎn)主要體現(xiàn)在三方面1多尺度上下文先驗(yàn)通過多尺度池化聚合上下文信息使注意力計算不局限于單一空間尺度尤其適用于 M3FD 遙感場景中尺度變化劇烈的目標(biāo)分布2Top-K 稀疏交叉注意力通過兩組不同稀疏比例k1 / k2并引入可學(xué)習(xí)權(quán)重 α、β使模型能夠在“強(qiáng)對齊”和“弱對齊”兩種注意力模式之間自適應(yīng)權(quán)衡3工程友好的模塊化設(shè)計MSC 作為獨(dú)立模塊可直接插入 YOLO11-MM 的中期融合階段在 FLIR 與 LLVIP 場景下顯著提升紅外與可見光的互補(bǔ)利用效率。2.3、優(yōu)勢特點(diǎn)FLIR / M3FD / LLVIP 多場景實(shí)戰(zhàn)表現(xiàn)從多數(shù)據(jù)集實(shí)驗(yàn)與工程實(shí)踐角度來看MSC 在 YOLO11-MM 框架中展現(xiàn)出明顯的優(yōu)勢特點(diǎn)并且在不同類型的多模態(tài)數(shù)據(jù)集上具有良好的適應(yīng)性。在FLIR 數(shù)據(jù)集紅外–可見光夜間檢測中MSC 能夠有效抑制紅外模態(tài)中的熱噪聲干擾同時利用可見光中更清晰的結(jié)構(gòu)信息實(shí)現(xiàn)對行人、車輛等目標(biāo)的精準(zhǔn)對齊在M3FD 數(shù)據(jù)集遙感多模態(tài)場景中多尺度上下文池化使 MSC 對大范圍場景與尺度變化具備更強(qiáng)的建模能力避免小目標(biāo)在高層語義中被淹沒在LLVIP 數(shù)據(jù)集低照度與夜間行人檢測中稀疏交叉注意力機(jī)制顯著降低了無關(guān)區(qū)域?qū)θ诤辖Y(jié)果的影響使模型更加聚焦于行人輪廓與關(guān)鍵區(qū)域。2.4 代碼說明:import torch import torch.nn as nn class MSC(nn.Module): Multiscale Sparse Cross-Attention雙輸入→單輸出。 Args: dim (int | None): 通道數(shù)自動注入 num_heads (int): 注意力頭數(shù) kernel (list[int]): 多尺度 avgpool kernel 列表 s (list[int]): 多尺度 stride 列表 pad (list[int]): 多尺度 padding 列表 k1 (int): Top-k 比例分母N1/k1 k2 (int): Top-k 比例分母N1/k2 def __init__( self, dim: int | None None, num_heads: int 8, kernel: list[int] [3, 5, 7], s: list[int] [1, 1, 1], pad: list[int] [1, 2, 3], k1: int 2, k2: int 3, ) - None: super().__init__() self.dim dim self.num_heads int(num_heads) self.k1 int(k1) self.k2 int(k2) self.q nn.Linear(dim if dim is not None else 1, dim if dim is not None else 1, biasTrue) self.kv nn.Linear(dim if dim is not None else 1, (dim if dim is not None else 1) * 2, biasTrue) self.attn_drop nn.Dropout(0.0) self.proj nn.Linear(dim if dim is not None else 1, dim if dim is not None else 1) self.proj_drop nn.Dropout(0.0) self.attn1 nn.Parameter(torch.tensor([0.5]), requires_gradTrue) self.attn2 nn.Parameter(torch.tensor([0.5]), requires_gradTrue) self.avgpool1 nn.AvgPool2d(kernel_sizekernel[0], strides[0], paddingpad[0]) self.avgpool2 nn.AvgPool2d(kernel_sizekernel[1], strides[1], paddingpad[1]) self.avgpool3 nn.AvgPool2d(kernel_sizekernel[2], strides[2], paddingpad[2]) self.layer_norm nn.LayerNorm(dim if dim is not None else 1) def forward(self, x, yNone): if y is None and isinstance(x, (list, tuple)): x, y x if not isinstance(x, torch.Tensor) or not isinstance(y, torch.Tensor): raise TypeError(MSC 需要兩路輸入張量) if x.shape ! y.shape: raise ValueError(fMSC 要求兩路輸入形狀一致got {x.shape} vs {y.shape}) B, C, H, W x.shape # 多尺度池化融合上下文 y y1 self.avgpool1(y) y2 self.avgpool2(y) y3 self.avgpool3(y) y y1 y2 y3 y y.flatten(-2, -1).transpose(1, 2) y self.layer_norm(y) N1 y.shape[1] kv self.kv(y).reshape(B, N1, 2, self.num_heads, C // self.num_heads).permute(2, 0, 3, 1, 4) k, v kv[0], kv[1] q self.q(x.flatten(2).transpose(1, 2)) N q.shape[1] q q.reshape(B, N, self.num_heads, C // self.num_heads).permute(0, 2, 1, 3) attn (q k.transpose(-2, -1)) * (C // self.num_heads) ** -0.5 # Top-k 兩種稀疏度 mask1 torch.zeros(B, self.num_heads, N, N1, devicex.device, dtypetorch.bool) idx1 torch.topk(attn, kmax(N1 // self.k1, 1), dim-1, largestTrue)[1] mask1.scatter_(-1, idx1, True) attn1 torch.where(mask1, attn, torch.full_like(attn, float(-inf))).softmax(dim-1) attn1 self.attn_drop(attn1) out1 attn1 v mask2 torch.zeros(B, self.num_heads, N, N1, devicex.device, dtypetorch.bool) idx2 torch.topk(attn, kmax(N1 // self.k2, 1), dim-1, largestTrue)[1] mask2.scatter_(-1, idx2, True) attn2 torch.where(mask2, attn, torch.full_like(attn, float(-inf))).softmax(dim-1) attn2 self.attn_drop(attn2) out2 attn2 v out out1 * self.attn1 out2 * self.attn2 x out.transpose(1, 2).reshape(B, N, C) x self.proj(x) x self.proj_drop(x) hw int(N ** 0.5) x x.transpose(1, 2).reshape(B, C, hw, hw) return x三、逐步手把手添加MSC3.1 第一步在 ultralytics/nn 目錄下面新建一個叫 fusion的文件夾然后在里面分別新建一個.py 文件把注意力模塊的“核心代碼”粘進(jìn)去。注意 如果你使用我完整的項(xiàng)目代碼這個 fusion文件夾已經(jīng)有了、里面的模塊也是有的直接使用進(jìn)行訓(xùn)練和測試如果沒有你只需要在里面新建一個 py 文件或直接修改已有的即可如下圖所示。3.2 第二步第二步在該目錄下新建一個名為__init__.py的 Python 文件如果使用的是我項(xiàng)目提供的工程該文件一般已經(jīng)存在無需重復(fù)創(chuàng)建然后在該文件中導(dǎo)入我們自定義的注意力EMA具體寫法如下圖所示。3.3 第三步第三步找到ultralytics/nn/tasks.py文件在其中完成我們模塊的導(dǎo)入和注冊如果使用的是我提供的項(xiàng)目工程該文件已自帶無需新建。具體書寫方式如下圖所示3.4 第四步第四步找到ultralytics/nn/tasks.py文件在parse_model方法中加入對應(yīng)配置即可具體書寫方式如下圖所示。elif m in frozenset({CAMMSC,HighFrequencyPerception}): # Expect exactly two inputs; output channels follow the left branch if isinstance(f, int) or len(f) ! 2: raise ValueError(f{m.__name__} expects 2 inputs, got {f} at layer {i}) c_left, c_right ch[f[0]], ch[f[1]] # Auto infer dim if not provided (None or missing) if len(args) 0: args.insert(0, c_left) elif args[0] is None: args[0] c_left c2 c_left四 完整yaml4.1 YOLO11-MM加入MSC訓(xùn)練信息summary: 320 layers, 4,881,530 parameters, 4,881,514 gradients, 10.5 GFLOPs# Ultralytics YOLOMM Mid-Fusion (MSC Test) # Parameters nc: 80 # number of classes scales: # model compound scaling constants # [depth, width, max_channels] n: [0.50, 0.25, 1024] s: [0.50, 0.50, 1024] m: [0.50, 1.00, 512] l: [1.00, 1.00, 512] x: [1.00, 1.50, 512] backbone: # RGB路徑 (層0-10) - [-1, 1, Conv, [64, 3, 2], RGB] # 0-P1/2 RGB路徑起始 - [-1, 1, Conv, [128, 3, 2]] # 1-P2/4 - [-1, 2, C3k2, [256, False, 0.25]] # 2 - [-1, 1, Conv, [256, 3, 2]] # 3-P3/8 (RGB_P3) - [-1, 2, C3k2, [512, False, 0.25]] # 4 - [-1, 1, Conv, [512, 3, 2]] # 5-P4/16 - [-1, 2, C3k2, [512, True]] # 6 (RGB_P4) - [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32 - [-1, 2, C3k2, [1024, True]] # 8 - [-1, 1, SPPF, [1024, 5]] # 9 - [-1, 2, C2PSA, [1024]] # 10 (RGB_P5) # X路徑 (層11-21) - [-1, 1, Conv, [64, 3, 2], X] # 11-P1/2 X路徑起始 - [-1, 1, Conv, [128, 3, 2]] # 12-P2/4 - [-1, 2, C3k2, [256, False, 0.25]] # 13 - [-1, 1, Conv, [256, 3, 2]] # 14-P3/8 (X_P3) - [-1, 2, C3k2, [512, False, 0.25]] # 15 - [-1, 1, Conv, [512, 3, 2]] # 16-P4/16 - [-1, 2, C3k2, [512, True]] # 17 (X_P4) - [-1, 1, Conv, [1024, 3, 2]] # 18-P5/32 - [-1, 2, C3k2, [1024, True]] # 19 - [-1, 1, SPPF, [1024, 5]] # 20 - [-1, 2, C2PSA, [1024]] # 21 (X_P5) # P4 / P5 融合MSC - [[6, 17], 1, MSC, [null, 8, [3,5,7], [1,1,1], [1,2,3], 2, 3]] # 22: P4 MSCdim 自動 - [[10, 21], 1, MSC, [null, 8, [3,5,7], [1,1,1], [1,2,3], 2, 3]] # 23: P5 MSC - [-1, 2, C3k2, [1024, True]] # 24 - [-1, 1, C2PSA, [1024]] # 25 (Fused_P5) head: # 自頂向下路徑 (FPN) - [25, 1, nn.Upsample, [None, 2, nearest]] # 26 Fused_P5 上采樣 - [[-1, 22], 1, Concat, [1]] # 27 Fused_P4來自 MSC - [-1, 2, C3k2, [512, False]] # 28 - [-1, 1, nn.Upsample, [None, 2, nearest]] # 29 - [[-1, 4], 1, Concat, [1]] # 30 RGB_P3(4) - [-1, 2, C3k2, [256, False]] # 31 (P3/8-small) # 自底向上路徑 (PAN) - [-1, 1, Conv, [256, 3, 2]] # 32 - [[-1, 28], 1, Concat, [1]] # 33 - [-1, 2, C3k2, [512, False]] # 34 (P4/16-medium) - [-1, 1, Conv, [512, 3, 2]] # 35 - [[-1, 25], 1, Concat, [1]] # 36 - [-1, 2, C3k2, [1024, True]] # 37 (P5/32-large) - [[31, 34, 37], 1, Detect, [nc]] # 38 Detect(P3, P4, P5)五 訓(xùn)練代碼和結(jié)果5.1 模型訓(xùn)練代碼import warnings from ultralytics import YOLOMM # 1. 可選屏蔽 timm 的未來?xiàng)売镁娌挥绊懹?xùn)練僅減少控制臺噪音 warnings.filterwarnings( ignore, categoryFutureWarning, messageImporting from timm.models.layers is deprecated, please import via timm.layers ) if __name__ __main__: # 2. 加載多模態(tài)模型配置RGB IR # 這里使用官方提供的 yolo11n-mm-mid 配置你也可以換成自己的 yaml model YOLOMM(ultralytics/cfg/models/FFT/yolo11n-mm-mid-msc.yaml) # 3. 啟動訓(xùn)練 model.train( dataFLIR3C/data.yaml, # 多模態(tài)數(shù)據(jù)集配置上一節(jié)已經(jīng)編寫 epochs10, # 訓(xùn)練輪數(shù)實(shí)際實(shí)驗(yàn)中建議 100 起步 batch4, # batch size可根據(jù)顯存大小調(diào)整 imgsz640, # 輸入分辨率默認(rèn) 640可與數(shù)據(jù)集分辨率統(tǒng)一 device0, # 指定 GPU idCPU 訓(xùn)練可寫 cpu workers4, # dataloader 線程數(shù)Windows 一般 0~4 比較穩(wěn) projectruns/mm_exp, # 訓(xùn)練結(jié)果保存根目錄 namertdetrmm_flir3c, # 當(dāng)前實(shí)驗(yàn)名對應(yīng)子目錄名 # resumeTrue, # 如需從中斷的訓(xùn)練繼續(xù)可打開此項(xiàng) # patience30, # 早停策略連降若干輪 mAP 不提升則停止 # modalityX, # 模態(tài)消融參數(shù)默認(rèn)由 data.yaml 中的 modality_used 決定 # cacheTrue, # 啟用圖片緩存加快 IO內(nèi)存足夠時可打開 )5.2 模型訓(xùn)練結(jié)果六 總結(jié)到這里本文的正式內(nèi)容就告一段落啦。最后也想鄭重向大家推薦我的專欄 「YOLO11-MM 多模態(tài)目標(biāo)檢測」。目前專欄整體以實(shí)戰(zhàn)為主每一篇都是我親自上手驗(yàn)證后的經(jīng)驗(yàn)沉淀。后續(xù)我也會持續(xù)跟進(jìn)最新頂會的前沿工作進(jìn)行論文復(fù)現(xiàn)并對一些經(jīng)典方法及改進(jìn)機(jī)制做系統(tǒng)梳理和補(bǔ)充。?如果這篇文章對你哪怕只有一絲幫助歡迎訂閱本專欄、關(guān)注我并私信聯(lián)系我會拉你進(jìn)入 「YOLO11-MM 多模態(tài)目標(biāo)檢測」技術(shù)交流群 QQ 群你的支持就是我持續(xù)輸出的最大動力?