[yolov11改进系列]基于yolov11引入轻量级Triplet Attention三重注意力模块python源码+训练源码

[Triplet Attention注意力机制介绍]

Rotate to Attend: Convolutional Triplet Attention Module

2.1原理Triplet Attention Module是一种轻量级的注意力机制模块,以下是对其模块设计的出发点、原理、结构和优势的详细介绍:

2.1 原理

  • 跨维度交互原理:传统的通道注意力计算方法通常是为输入张量中的每个通道计算一个单一权重,然后使用该权重对特征图进行统一缩放。这种方法在计算通道注意力时,通常会通过全局平均池化将输入张量在空间上分解为每个通道一个像素,导致空间信息丢失,以及通道维度和空间维度之间的相互依赖关系缺失。Triplet Attention通过在三个分支中分别捕捉输入张量的不同维度组合之间的依赖关系来解决这个问题。

  • 注意力权重计算:对于每个分支,通过一系列操作计算注意力权重。首先对输入张量进行旋转操作,然后经过Z - pool层进行维度缩减,接着通过卷积层和批归一化层,最后通过sigmoid激活层生成注意力权重。这些权重用于对相应分支的特征进行加权,然后将三个分支的结果进行平均聚合,得到最终的输出张量。

【yolov11框架介绍】

2024 年 9 月 30 日,Ultralytics 在其活动 YOLOVision 中正式发布了 YOLOv11。YOLOv11 是 YOLO 的最新版本,由美国和西班牙的 Ultralytics 团队开发。YOLO 是一种用于基于图像的人工智能的计算机模

Ultralytics YOLO11 概述

YOLO11 是Ultralytics YOLO 系列实时物体检测器的最新版本,以尖端的精度、速度和效率重新定义了可能性。基于先前 YOLO 版本的令人印象深刻的进步,YOLO11 在架构和训练方法方面引入了重大改进,使其成为各种计算机视觉任务的多功能选择。

Key Features 主要特点

  • 增强的特征提取:YOLO11采用改进的主干和颈部架构,增强了特征提取能力,以实现更精确的目标检测和复杂任务性能。
  • 针对效率和速度进行优化:YOLO11 引入了精致的架构设计和优化的训练管道,提供更快的处理速度并保持准确性和性能之间的最佳平衡。
  • 使用更少的参数获得更高的精度:随着模型设计的进步,YOLO11m 在 COCO 数据集上实现了更高的平均精度(mAP),同时使用的参数比 YOLOv8m 少 22%,从而在不影响精度的情况下提高计算效率。
  • 跨环境适应性:YOLO11可以无缝部署在各种环境中,包括边缘设备、云平台以及支持NVIDIA GPU的系统,确保最大的灵活性。
  • 支持的任务范围广泛:无论是对象检测、实例分割、图像分类、姿态估计还是定向对象检测 (OBB),YOLO11 旨在应对各种计算机视觉挑战。

与之前的版本相比,Ultralytics YOLO11 有哪些关键改进?

Ultralytics YOLO11 与其前身相比引入了多项重大进步。主要改进包括:

  • 增强的特征提取:YOLO11采用改进的主干和颈部架构,增强了特征提取能力,以实现更精确的目标检测。
  • 优化的效率和速度:精细的架构设计和优化的训练管道可提供更快的处理速度,同时保持准确性和性能之间的平衡。
  • 使用更少的参数获得更高的精度:YOLO11m 在 COCO 数据集上实现了更高的平均精度(mAP),参数比 YOLOv8m 少 22%,从而在不影响精度的情况下提高计算效率。
  • 跨环境适应性:YOLO11可以跨各种环境部署,包括边缘设备、云平台和支持NVIDIA GPU的系统。
  • 支持的任务范围广泛:YOLO11 支持多种计算机视觉任务,例如对象检测、实例分割、图像分类、姿态估计和定向对象检测 (OBB)

【测试环境】

windows10 x64

ultralytics==8.3.0

torch==2.3.1

【改进流程】

1. 新增TripletAttention.py实现骨干网络(代码太多,核心模块源码请参考改进步骤.docx)然后在同级目录下面创建一个__init___.py文件写代码

from .TripletAttention import *

2. 文件修改步骤

修改tasks.py文件

创建模型配置文件

yolo11-TripleAtt.yaml内容如下:

# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLO11 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect

# Parameters
nc: 80 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolo11n.yaml' will call yolo11.yaml with scale 'n'
  # [depth, width, max_channels]
  n: [0.50, 0.25, 1024] # summary: 319 layers, 2624080 parameters, 2624064 gradients, 6.6 GFLOPs
  s: [0.50, 0.50, 1024] # summary: 319 layers, 9458752 parameters, 9458736 gradients, 21.7 GFLOPs
  m: [0.50, 1.00, 512] # summary: 409 layers, 20114688 parameters, 20114672 gradients, 68.5 GFLOPs
  l: [1.00, 1.00, 512] # summary: 631 layers, 25372160 parameters, 25372144 gradients, 87.6 GFLOPs
  x: [1.00, 1.50, 512] # summary: 631 layers, 56966176 parameters, 56966160 gradients, 196.0 GFLOPs

# YOLO11n backbone
backbone:
  # [from, repeats, module, args]
  - [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
  - [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
  - [-1, 2, C3k2, [256, False, 0.25]]
  - [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
  - [-1, 2, C3k2, [512, False, 0.25]]
  - [-1, 1, Conv, [512, 3, 2]] # 5-P4/16
  - [-1, 2, C3k2, [512, True]]
  - [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32
  - [-1, 2, C3k2, [1024, True]]
  - [-1, 1, SPPF, [1024, 5]] # 9
  - [-1, 2, C2PSA, [1024]] # 10

# YOLO11n head
head:
  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 6], 1, Concat, [1]] # cat backbone P4
  - [-1, 2, C3k2, [512, False]] # 13

  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 4], 1, Concat, [1]] # cat backbone P3
  - [-1, 2, C3k2, [256, False]] # 16 (P3/8-small)
  - [-1, 1, TripletAttention, []] # 17 (P3/8-small)  小目标检测层输出位置增加注意力机制

  - [-1, 1, Conv, [256, 3, 2]]
  - [[-1, 13], 1, Concat, [1]] # cat head P4
  - [-1, 2, C3k2, [512, False]] # 20 (P4/16-medium)
  - [-1, 1, TripletAttention, []] # 21 (P4/16-medium) 中目标检测层输出位置增加注意力机制

  - [-1, 1, Conv, [512, 3, 2]]
  - [[-1, 10], 1, Concat, [1]] # cat head P5
  - [-1, 2, C3k2, [1024, True]] # 24 (P5/32-large)
  - [-1, 1, TripletAttention, []] # 25 (P5/32-large) 大目标检测层输出位置增加注意力机制

  # 注意力机制我这里其实是添加了三个但是实际一般生效就只添加一个就可以了,所以大家可以自行注释来尝试.
  # 具体在那一层用注意力机制可以根据自己的数据集场景进行选择。
  # 如果你自己配置注意力位置注意from[17, 21, 25]位置要对应上对应的检测层!
  - [[17, 21, 25], 1, Detect, [nc]] # Detect(P3, P4, P5)
3. 验证集成

使用新建的yaml配置文件启动训练任务:

from ultralytics import YOLO

if __name__ == '__main__':
    model = YOLO('yolo11-TripleAtt.yaml')  # build from YAML and transfer weights
        # Train the model
    results = model.train(data='coco128.yaml',epochs=100, imgsz=640, batch=8, device=0, workers=1, save=True,resume=False)

成功集成后,训练日志中将显示TripletAttention模块的初始化信息,表明已正确加载到模型中。

【训练说明】

第一步:首先安装好yolov11必要模块,可以参考yolov11框架安装流程,然后卸载官方版本pip uninstall ultralytics,最后安装改进的源码pip install .
第二步:将自己数据集按照dataset文件夹摆放,要求文件夹名字都不要改变
第三步:分别打开train.py,coco128.yaml和模型参数yaml文件修改必要的参数,最后执行python train.py即可训练

【提供文件】

├── [官方源码]ultralytics-8.3.0.zip
├── train/
│   ├── coco128.yaml
│   ├── dataset/
│   │   ├── train/
│   │   │   ├── images/
│   │   │   │   ├── firc_pic_1.jpg
│   │   │   │   ├── firc_pic_10.jpg
│   │   │   │   ├── firc_pic_11.jpg
│   │   │   │   ├── firc_pic_12.jpg
│   │   │   │   ├── firc_pic_13.jpg
│   │   │   ├── labels/
│   │   │   │   ├── classes.txt
│   │   │   │   ├── firc_pic_1.txt
│   │   │   │   ├── firc_pic_10.txt
│   │   │   │   ├── firc_pic_11.txt
│   │   │   │   ├── firc_pic_12.txt
│   │   │   │   ├── firc_pic_13.txt
│   │   └── val/
│   │       ├── images/
│   │       │   ├── firc_pic_100.jpg
│   │       │   ├── firc_pic_81.jpg
│   │       │   ├── firc_pic_82.jpg
│   │       │   ├── firc_pic_83.jpg
│   │       │   ├── firc_pic_84.jpg
│   │       ├── labels/
│   │       │   ├── firc_pic_100.txt
│   │       │   ├── firc_pic_81.txt
│   │       │   ├── firc_pic_82.txt
│   │       │   ├── firc_pic_83.txt
│   │       │   ├── firc_pic_84.txt
│   ├── train.py
│   ├── yolo11-TripleAtt.yaml
│   └── 训练说明.txt
├── [改进源码]ultralytics-8.3.0.zip
├── 改进原理.pdf
└── 改进流程.docx

 【常见问题汇总】
问:为什么我训练的模型epoch显示的map都是0或者map精度很低?
回答:由于源码改进过,因此不能直接从官方模型微调,而是从头训练,这样学习特征能力会很弱,需要训练很多epoch才能出现效果。此外由于改进的源码框架并不一定能够保证会超过官方精度,而且也有可能会存在远远不如官方效果,甚至精度会很低。这说明改进的框架并不能取得很好效果。所以说对于框架改进只是提供一种可行方案,至于改进后能不能取得很好map还需要结合实际训练情况确认,当然也不排除数据集存在问题,比如数据集比较单一,样本分布不均衡,泛化场景少,标注框不太贴合标注质量差,检测目标很小等等原因
【重要说明】
我们只提供改进框架一种方案,并不保证能够取得很好训练精度,甚至超过官方模型精度。因为改进框架,实际是一种比较复杂流程,包括框架原理可行性,训练数据集是否合适,训练需要反正验证以及同类框架训练结果参数比较,这个是十分复杂且漫长的过程。

### YOLOv8 中 Triplet Attention改进方法及实现细节 Triplet Attention 是一种高效的注意力机制,能够显著增强卷积神经网络对空间和通道关系的理解能力。通过引入 Triplet AttentionYOLOv8 中,可以进一步优化目标检测模型的性能。 #### 1. Triplet Attention 原理概述 Triplet Attention 同时考虑了输入特征图的空间维度(水平方向和垂直方向)以及通道维度的关系。它通过对这三个维度分别施加注意力权重来突出重要的特征区域[^1]。这种设计使得模型能够在复杂的背景环境中更精准地定位目标对象。 #### 2. 将 Triplet Attention 集成至 C2f_TCA 模块 C2f_TCA 模块本身已经融合了 CSP 结构与三重注意力机制的优点,在此基础上可以直接嵌入 Triplet Attention 来强化其功能。具体来说: - **结构扩展**:在原有的 C2f_TCA 架构中增加一层 Triplet Attention 层次作为额外的注意力建模工具。 - **计算流程调整**:当数据流经该层时先经过标准卷积操作提取基础特征;随后送入 Triplet Attention 单元完成精细化筛选过程——即依次沿 H-W-C 轴向执行独立的一维全局池化并生成对应位置上的激活映射值用于重新校准原始信号强度分布情况。 以下是基于 PyTorch 实现的一个简化版本代码片段展示如何修改官方 Ultralytics 提供的基础框架文件以支持上述改动: ```python import torch.nn as nn class TripletAttention(nn.Module): def __init__(self, channel=512, reduction_ratio=4): super(TripletAttention,self).__init__() self.avg_pool_h = nn.AdaptiveAvgPool2d((None,1)) self.max_pool_h = nn.AdaptiveMaxPool2d((None,1)) self.conv_du_ch = nn.Sequential( nn.Conv2d(channel//reduction_ratio ,channel //reduction_ratio,kernel_size=(1,1),stride=(1,1)), nn.BatchNorm2d(channel //reduction_ratio), nn.ReLU(inplace=True), nn.Conv2d(channel//reduction_ratio ,channel,kernel_size=(1,1),stride=(1,1)), nn.Sigmoid() ) self.spatial_conv = nn.Sequential( nn.Conv2d(2,1,kernel_size=7,stride=1,padding='same'), nn.BatchNorm2d(1), nn.Sigmoid(), ) def forward(self,x): b,c,h,w=x.size() avg_out_h=self.avg_pool_h(x).permute(0,3,1,2).contiguous().view(b,-1,h) max_out_h=self.max_pool_h(x).permute(0,3,1,2).contiguous().view(b,-1,h) ch_att=torch.cat([avg_out_h,max_out_h],dim=-1) ch_att=self.conv_du_ch(ch_att.unsqueeze(-1)).squeeze(-1) ch_att=ch_att.view(b,c,1,1)+x spatial_avg=torch.mean(x,dim=[0,1]).unsqueeze_(0).unsqueeze_(0) spatial_max,_=torch.max(x,dim=[0]) spatial_max=spatial_max.unsqueeze_(0).unsqueeze_(0) spatital_cat=torch.cat([spatial_avg,spatial_max],dim=1) spaial_mask=self.spatial_conv(spatital_cat)*x out=spaial_mask*ch_att+x return out from ultralytics import YOLO model = YOLO('yolov8n.pt') for m in model.model.modules(): if isinstance(m,C2f): setattr(m,'attention',TripletAttention()) ``` 此脚本定义了一个新的 `TripletAttention` 类,并将其插入到现有的 C2f 组件内部。这样做的目的是为了利用 Triplet Attention 对每一阶段输出的结果进行二次加工处理,从而达到提高整体精度的目的。 #### 3. 训练参数微调建议 由于新增加了一定数量可学习参数量级较大的组件,因此可能需要适当延长总迭代次数或者降低初始学习率以便于新旧部分之间更好地协同工作。此外还可以尝试启用混合精度加速技术 (AMP) 进一步缩短耗时时长同时维持相近质量表现水准。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FL1623863129

你的打赏是我写文章最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值