YOLO11改进-模块-引入双分支特征提取(Twin-Branch Feature Extraction,TBFE)解决小目标问题、遮挡
高光谱图像(HSI)分类旨在将每个像素准确分类,早期研究多聚焦于光谱特征,采用经典机器学习技术,但这些方法对 HSI 光谱特性分析不全面,且未充分利用空间域像素间特征相关性。随着深度学习发展,多种基于深度学习的方法被提出,如基于卷积神经网络(CNNs)和 Transformer 的方法。然而,现有方法在有效联合利用空间 - 光谱信息以及在传播过程中跨层保存信息方面仍面临挑战。CNNs 在分析空间特征方面有效,但难以充分利用 HSI 内在的序列光谱信息;Transformer 虽擅长识别空间和光谱数据间长程依赖关系,但在从卷积获得的浅层特征中提取多维特征时存在困难,可能导致特征提取不足。因此,需要一种新的模块来更好地提取 HSI 的空间和光谱特征。
上面是原模型,下面是改进模型

1. 双分支特征提取模块TBFE介绍
TBFE 模块的设计基于 CNN 强大的局部特征提取能力。通过并行使用 3D 和 2D 卷积,分别从光谱和空间维度对 HSI 数据进行特征提取,旨在在特征提取早期无缝集成光谱和空间信息。利用低输出通道的逐点卷积层调整 HSI 的通道维度,减少后续层的输入通道数,降低计算复杂度的同时提取光谱信息。3D 卷积结合扩展和挤压机制,增强对光谱特征的捕获能力;2D 卷积用于提取光谱 - 空间特征,两者结合可充分发挥各自优势,提升模型对光谱 - 空间特征的表示能力。
从提供的图片来看,极性感知注意力模块主要包含以下几个部分:
逐点卷积层:TBFE 模块以特定大小的训练样本补丁为输入。起始的逐点卷积层采用1x1卷积核,在不改变特征图空间尺寸的前提下,调整通道维度。这不仅降低后续层输入通道数,减少计算量,还能初步提取光谱信息。
3D 卷积分支:经逐点卷积的特征图进入 3D 卷积分支。先扩展维度以适配 3D 卷积,再使用1x1x3卷积核进行卷积,并通过填充保证输出维度不变。之后经挤压操作恢复到三维空间,得到专注光谱特征的 3D 特征图。
2D 卷积分支:与 3D 卷积分支并行的 2D 卷积分支,以相同的逐点卷积后特征图为输入。利用3x3卷积核捕捉光谱 - 空间特征,卷积前进行填充以保持特征图尺寸。后续集成激活函数和归一化层,增强模型学习能力并稳定训练。
融合与后续处理:3D 和 2D 卷积分支得到的特征图在通道维度拼接,融合光谱与空间特征优势。模块末尾添加激活函数和归一化层提升泛化能力,再堆叠两个 2D 卷积层,进一步优化特征提取效果,为后续分类任务提供更优质特征 。
2. YOLOv11与TBFE的结合
本文使用极性感知注意力模块替换C3K2模块中的普通卷积,增强YOLOv11模型空间特征,解决小目标、遮挡问题。
3. TBFE代码部分
YOLOv8_improve/YOLOv11.md at master · tgf123/YOLOv8_improve · GitHub
YOLOv11全部代码,现有几十种改进机制。
4. 将TBFE引入到YOLOv11中
第一: 将下面的核心代码复制到D:\model\yolov11\ultralytics\change_model路径下,如下图所示。
第二:在task.py中导入包
第三:在task.py中的模型配置部分下面代码
第四:将模型配置文件复制到YOLOV11.YAMY文件中
第五:运行成功
from sympy import false
from ultralytics.models import NAS, RTDETR, SAM, YOLO, FastSAM, YOLOWorld
if __name__=="__main__":
# 使用自己的YOLOv8.yamy文件搭建模型并加载预训练权重训练模型
model = YOLO(r"E:\Part_time_job_orders\YOLO\YOLOv11\ultralytics\cfg\models\11\yolo11_TBFE.yamy")\
.load(r'E:\Part_time_job_orders\YOLO\YOLOv11\yolo11n.pt') # build from YAML and transfer weights
results = model.train(data=r'E:\Part_time_job_orders\YOLO\YOLOv11\ultralytics\cfg\datasets\VOC_my.yaml',
epochs=300,
imgsz=640,
batch=64,
# cache = False,
# single_cls = False, # 是否是单类别检测
# workers = 0,
# resume=r'D:/model/yolov8/runs/detect/train/weights/last.pt',
amp = True
)