当前位置: 首页 > news >正文

yolov26改进 | 添加注意力机制篇 | 2026医学最新注意力机制AFIA抑制图像噪声环境影响(全网独家首发)

开始讲解之前推荐一下我的专栏,本专栏的内容支持(分类、检测、分割、追踪、关键点检测),专栏目前为限时折扣,欢迎大家订阅本专栏,本专栏每周更新5-7篇最新机制,更有包含我所有改进的文件和交流群提供给大家,本人定期在群内分享发表论文方法和经验。


一、本文介绍

本文给大家带来的最新改进机制,是发表于 2026 年医学图像领域的注意力模块 AFIA。 如果你的研究方向涉及医学目标检测、视频目标检测,那么这个模块完全可以作为一个值得关注的创新点。 当然,AFIA 并不局限于医学场景,只要你的任务同样面临目标模糊、动态干扰强、背景复杂或特征易混淆等问题,它同样具有较强的应用潜力。 其核心思想可以概括为:通过双分支自注意力、自适应融合以及通道重排,增强动态场景下的特征表达能力,从而提升模型对模糊目标和复杂背景目标的检测表现。除此之外,本文还进一步将 AFIA 与 C2PSA 结合,完成了一个可直接用于论文写作与实验设计的二次创新模块。同时本文还讲解了在YOLOv26中使用时针对不同尺度的检测目标不同的使用方法。

欢迎大家订阅我的专栏一起学习YOLO,购买专栏读者联系读者入群获取进阶项目文件!

(文字学不会的读者,作者可提供视频学习方法.)

专栏链接:YOLOv26有效涨点专栏包含:Conv、注意力机制、主干/Backbone、损失函数、优化器、后处理等改进机制


目录

一、本文介绍

二、AFIA 模块原理介绍

2.1 双分支自适应自注意力:一条保信息,一条去噪声

2.2 为什么不能只用 DSA 或只用 SSA

2.3 自适应特征融合:让模型自己决定更信哪一支

2.4 Channel Shuffle:不是主角,但很关键

2.5 AFIA 的最终输出是怎么得到的

三、核心代码

四、添加方法

4.1 修改一

4.2 修改二

4.3 修改三

4.4 修改四

4.5 修改五

4.6 修改六

五、正式训练

5.1 yaml文件

5.1.1 yaml文件1

5.1.2 yaml文件2

5.2 训练代码

5.3 训练过程截图

五、本文总结


二、AFIA 模块原理介绍

论文链接:官方论文链接点击此处即可跳转

代码链接:官方代码链接点击此处即可跳转

大致介绍:在动态肠镜场景中,息肉检测和普通静态图像检测并不一样。论文一开始就强调,结肠镜视频虽然比静态图像包含更丰富的诊断信息,但由于检查过程中镜头持续运动,单帧图像里会频繁出现运动模糊、镜面反射、气泡液体干扰以及尺度变化等问题。这些因素会直接破坏图像质量,使得模型更容易把背景纹理当成目标,或者错过真正的息肉区域。论文第 2 页的 Fig.1 就专门展示了这几类典型干扰:快速运动带来的背景组织模糊和断裂、镜头与肠壁接触引起的高光和气泡,以及相机远近变化导致的同一解剖结构尺度剧烈波动。

在这样的背景下,作者提出了 AVPDN,并把 AFIA(Adaptive Feature Interaction and Augmentation) 作为其中最核心的特征增强模块之一。论文明确写到,AFIA 位于 AFE(Adaptive Feature Enhancement)块的核心位置,用来在特征层面完成“增强有效信息、抑制噪声干扰、改善特征表达”这几件事。输入图像先经过 ResNet-50 主干网络提取基础特征,再进入一系列 AFE 块;而在每个 AFE 块内部,特征会先经过 LayerNorm,然后进入 AFIA 做第一轮特征优化,再继续后续处理。也就是说,AFIA 并不是一个挂在检测头后面的附加模块,而是整个特征增强链路里的关键前端单元。论文第 3–4 页对这一流程有明确描述,图 2 也把 AFIA 在整体网络中的位置画得很清楚。

如果从设计动机来看,AFIA 其实是在回应一个很具体的问题:传统 ViT 虽然擅长建模长距离依赖,但在结肠镜视频这种复杂噪声背景中,会把大量无关 token 一起纳入建模,既增加了无效计算,也会把冗余和噪声特征一起学进去。论文指出,肠镜图像中的背景纹理本身就复杂,再叠加运动模糊、镜面反射和尺度波动,直接套用标准自注意力往往会导致特征图中噪声和冗余信息过多,从而削弱检测性能。因此,AFIA 的本质目标不是单纯“加一个注意力机制”,而是要自适应地提升与息肉相关的特征,同时压制无关区域和噪声响应。

从内部结构看,论文把 AFIA 总结为一个“三管齐下”的设计:
第一部分是双分支自适应自注意力,第二部分是channel shuffle 带来的特征多样化,第三部分是自适应特征融合。这三者组合起来,构成了 AFIA 的核心。论文第 5 页对这三部分写得很完整。

2.1 双分支自适应自注意力:一条保信息,一条去噪声

AFIA 最关键的设计是它的双分支注意力结构。论文把这两条分支分别称为:

1. DSA(Dense Self-Attention)

2. SSA(Sparse Self-Attention)

作者认为,在动态肠镜图像中,模型既需要理解整个场景的全局上下文,又必须主动过滤掉由模糊和反光引起的大量低质量响应,只靠单一种类的注意力很难兼顾这两点,所以才引入了双分支机制。

其中,DSA 可以理解成“保留全局信息”的那条分支。论文中它沿用了常规自注意力的思路,通过 Softmax 对所有 query-key 对进行归一化,从而建模长距离依赖关系。作者指出,这一分支对于理解整体场景结构非常重要,因为它能够帮助模型保留关键语义信息,不至于因为过度筛选而丢掉有用上下文。公式上,论文写成:

其中 (Q)、(K)、(V) 由输入特征经过 (1\times1) 卷积和 (3\times3) depthwise convolution 生成,(B) 表示可学习的相对位置偏置。

与之对应,SSA 则可以理解成“主动降噪”的那条分支。论文没有继续使用 Softmax,而是把评分函数换成了 ReLU。这样一来,那些 query-key 匹配程度低、相关性弱的响应会直接被压到 0,从而形成更稀疏的注意力图。作者特别强调,这个设计对于结肠镜视频非常关键,因为它可以更有针对性地压制由运动模糊、镜面高光和无关背景纹理造成的伪激活,让模型把注意力集中在更有判别性的区域上。公式写成:

换句话说,DSA 更偏向“别漏掉有用信息”,SSA 更偏向“别把噪声也当成信息”。前者负责兜底,后者负责清理。

2.2 为什么不能只用 DSA 或只用 SSA

这篇论文写得比较好的地方,是它没有停留在“提出两个分支”这个层面,而是明确解释了为什么不能只保留其中一个。

作者指出,如果只使用 DSA,虽然能较好地保留全局信息,但 Softmax 会把所有位置都纳入注意力分配中,这会导致无关区域甚至噪声区域也参与特征聚合,容易把背景干扰一起带进来。反过来,如果只使用 SSA,虽然噪声能被压制得更狠,但 ReLU 带来的稀疏性也可能太强,导致部分有用特征在后续处理中信息不足,也就是论文里说的 over-sparsity 问题。

所以,AFIA 的思路并不是简单堆两个分支,而是在“保留足够上下文”和“强力抑制噪声”之间找平衡。这个平衡点,正是 AFIA 想解决的核心问题。

2.3 自适应特征融合:让模型自己决定更信哪一支

有了 DSA 和 SSA 之后,还存在一个问题:不同图像、不同场景下,两条分支的重要性其实并不一样。某些帧中,背景干扰特别严重,这时可能更需要 SSA 去筛噪;而另一些帧中,目标边界模糊但上下文关系比较重要,这时 DSA 的作用就更突出。

为了解决这个问题,AFIA 又加入了自适应融合机制。论文中用两个可学习参数来给两条分支分配权重,并通过归一化得到每一支的最终融合系数:

然后再将两条注意力分支的结果按权重组合,并与 (V) 做逐元素作用,得到注意力输出:

论文解释说,这样的做法使模型能够根据当前输入的特点,动态调整两条分支的重要性。也就是说,AFIA 不是固定地“各占一半”,而是由网络在训练中自己学会:什么时候该更依赖全局上下文,什么时候该更激进地去噪。作者还提到,这些可学习参数会用对应分支的输出来初始化,以增强自适应能力。。

2.4 Channel Shuffle:不是主角,但很关键

除了双分支注意力,AFIA 还有一个容易被忽略但很实用的设计,就是 channel shuffle。

论文认为,即便有了双分支注意力,如果输入特征本身通道交互不足、不同通道学到的内容过于相似,那么最终得到的表示仍然可能不够丰富。传统卷积网络里,不同通道之间往往会学出重复或冗余的模式。为了解决这一点,AFIA 在上分支中加入了 channel shuffle 操作,用来打散并重组通道,使不同组之间的信息发生交换。

具体来说,论文给出的上分支形式为:

其中就表示 channel shuffle,先对输入张量按通道分组,再重新排列,之后接卷积和堆叠的卷积进行特征提取。作者解释说,这样做的目的,是避免 AFIA 过度依赖某些单一通道,促进模型学习更互补、更多样的特征表达,而且不会明显增加额外计算开销。

2.5 AFIA 的最终输出是怎么得到的

AFIA 的最终输出并不复杂,它把 channel shuffle 分支得到的特征和 双分支注意力融合后的特征相加,得到模块输出:

从这个结果也能看出,AFIA 最终保留下来的并不是单纯的“注意力结果”,而是通道重组后的局部卷积特征与自适应注意力增强后的全局/稀疏特征的联合表示。换句话说,它希望同时保住两类能力:
一类是卷积系的局部纹理建模与通道交互能力,另一类是注意力系的全局依赖建模和噪声筛除能力。

个人总结:AFIA 本质上是一个面向动态肠镜场景的特征净化与增强模块。它并不是简单堆叠注意力,而是围绕结肠镜图像中常见的运动模糊、镜面高光和复杂背景噪声,设计了一套更有针对性的特征处理流程。具体来说,DSA 分支负责保留全局上下文和关键语义信息,SSA 分支负责抑制低相关区域带来的噪声响应,自适应融合机制负责根据输入动态平衡两者的贡献,而 channel shuffle 则进一步促进跨通道信息交换,提升特征多样性。最终,AFIA 在保住有用上下文的同时,更有效地滤除了任务无关干扰,为后续检测提供了更稳定、更有判别力的特征表示。其效果也在消融实验中得到了明确验证:完整 AFIA 相比基线显著提升了 AP 和 F1-score,说明这种“全局建模 + 稀疏筛噪 + 通道重组”的组合对动态息肉检测是有效的。


三、核心代码

核心代码的使用方式看章节四

import torch import torch.nn as nn import torch.nn.functional as F __all__ = ['AFIA', 'C2PSA_AFIA'] class ChannelShuffle(nn.Module): def __init__(self, groups): super().__init__() self.groups = groups def forward(self, x): b, c, h, w = x.size() channels_per_group = c // self.groups # reshape x = x.view(b, self.groups, channels_per_group, h, w) # transpose x = x.transpose(1, 2).contiguous() # flatten x = x.view(b, -1, h, w) return x class AFIA(nn.Module): def __init__(self, in_channels, groups=4): super().__init__() self.layer_norm = nn.LayerNorm(in_channels) # Assuming layer norm is applied over channels self.conv1x1_q = nn.Conv2d(in_channels, in_channels, kernel_size=1) self.deconv3x3_q = nn.ConvTranspose2d(in_channels, in_channels, kernel_size=3, stride=1, padding=1) self.conv1x1_k = nn.Conv2d(in_channels, in_channels, kernel_size=1) self.deconv3x3_k = nn.ConvTranspose2d(in_channels, in_channels, kernel_size=3, stride=1, padding=1) self.conv1x1_v = nn.Conv2d(in_channels, in_channels, kernel_size=1) self.deconv3x3_v = nn.ConvTranspose2d(in_channels, in_channels, kernel_size=3, stride=1, padding=1) self.channel_shuffle = ChannelShuffle(groups) self.stacked_conv = nn.Sequential( nn.Conv2d(in_channels, in_channels, kernel_size=3, padding=1), nn.ReLU(inplace=True), nn.Conv2d(in_channels, in_channels, kernel_size=3, padding=1), ) self.conv1x1_out = nn.Conv2d(in_channels, in_channels, kernel_size=1) self.layer_norm2 = nn.LayerNorm(in_channels) def depthwise_spatial_attention(self, Q, K): """Calculates the Depthwise Spatial Attention Map between Q and K. Args: Q: Tensor of shape (B, C, H, W) K: Tensor of shape (B, C, H, W) Returns: A spatial attention map with shape (B, H, W) """ B, C, H, W = Q.shape Q = Q.permute(0, 2, 3, 1).reshape(B, H * W, C) # B, HW, C K = K.permute(0, 2, 3, 1).reshape(B, H * W, C) # B, HW, C attention_map = torch.matmul(Q, K.transpose(1, 2)) # B, HW, HW attention_map = F.softmax(attention_map / (C ** 0.5), dim=-1) # B, HW, HW return attention_map def spatial_wise_self_attention(self, V, attention_map): """ Apply spatial-wise self-attention to value feature map Args: V: Tensor of shape (B, C, H, W) attention_map: Attention map with shape (B, H, W, HW) Return: weighted V """ B, C, H, W = V.shape V = V.permute(0, 2, 3, 1).reshape(B, H * W, C) # B, HW, C weighted_V = torch.matmul(attention_map, V) weighted_V = weighted_V.reshape(B, H, W, C).permute(0, 3, 1, 2) return weighted_V def forward(self, x): residual = x x = x.permute(0, 2, 3, 1) # B,H,W,C x = self.layer_norm(x).permute(0, 3, 1, 2) # B,C,H,W # Q branch Q = self.conv1x1_q(x) Q = self.deconv3x3_q(Q) # K branch K = self.conv1x1_k(x) K = self.deconv3x3_k(K) # V branch V = self.conv1x1_v(x) V = self.deconv3x3_v(V) # Channel Shuffle x = self.channel_shuffle(x) # DSA attention_map = self.depthwise_spatial_attention(Q, K) # SSA out = self.spatial_wise_self_attention(V, attention_map) # Apply weights out = F.relu(out) # 1x1 Conv out out = self.conv1x1_out(out) # Add and output out = out + self.stacked_conv(x) out = out + residual out = out.permute(0, 2, 3, 1) out = self.layer_norm2(out).permute(0, 3, 1, 2) return out def autopad(k, p=None, d=1): # kernel, padding, dilation """Pad to 'same' shape outputs.""" if d > 1: k = d * (k - 1) + 1 if isinstance(k, int) else [d * (x - 1) + 1 for x in k] # actual kernel-size if p is None: p = k // 2 if isinstance(k, int) else [x // 2 for x in k] # auto-pad return p class Conv(nn.Module): """Standard convolution with args(ch_in, ch_out, kernel, stride, padding, groups, dilation, activation).""" default_act = nn.SiLU() # default activation def __init__(self, c1, c2, k=1, s=1, p=None, g=1, d=1, act=True): """Initialize Conv layer with given arguments including activation.""" super().__init__() self.conv = nn.Conv2d(c1, c2, k, s, autopad(k, p, d), groups=g, dilation=d, bias=False) self.bn = nn.BatchNorm2d(c2) self.act = self.default_act if act is True else act if isinstance(act, nn.Module) else nn.Identity() def forward(self, x): """Apply convolution, batch normalization and activation to input tensor.""" return self.act(self.bn(self.conv(x))) def forward_fuse(self, x): """Perform transposed convolution of 2D data.""" return self.act(self.conv(x)) class PSABlock(nn.Module): def __init__(self, c, attn_ratio=0.5, num_heads=4, shortcut=True) -> None: """Initializes the PSABlock with attention and feed-forward layers for enhanced feature extraction.""" super().__init__() self.attn = AFIA(c, 4) self.ffn = nn.Sequential(Conv(c, c * 2, 1), Conv(c * 2, c, 1, act=False)) self.add = shortcut def forward(self, x): """Executes a forward pass through PSABlock, applying attention and feed-forward layers to the input tensor.""" x = x + self.attn(x) if self.add else self.attn(x) x = x + self.ffn(x) if self.add else self.ffn(x) return x class C2PSA_AFIA(nn.Module): """ C2PSA module with attention mechanism for enhanced feature extraction and processing. This module implements a convolutional block with attention mechanisms to enhance feature extraction and processing capabilities. It includes a series of PSABlock modules for self-attention and feed-forward operations. Attributes: c (int): Number of hidden channels. cv1 (Conv): 1x1 convolution layer to reduce the number of input channels to 2*c. cv2 (Conv): 1x1 convolution layer to reduce the number of output channels to c. m (nn.Sequential): Sequential container of PSABlock modules for attention and feed-forward operations. Methods: forward: Performs a forward pass through the C2PSA module, applying attention and feed-forward operations. Notes: This module essentially is the same as PSA module, but refactored to allow stacking more PSABlock modules. """ def __init__(self, c1, c2, n=1, e=0.5): """Initializes the C2PSA module with specified input/output channels, number of layers, and expansion ratio.""" super().__init__() assert c1 == c2 self.c = int(c1 * e) self.cv1 = Conv(c1, 2 * self.c, 1, 1) self.cv2 = Conv(2 * self.c, c1, 1) self.m = nn.Sequential(*(PSABlock(self.c, attn_ratio=0.5, num_heads=self.c // 64) for _ in range(n))) def forward(self, x): """Processes the input tensor 'x' through a series of PSA blocks and returns the transformed tensor.""" a, b = self.cv1(x).split((self.c, self.c), dim=1) b = self.m(b) return self.cv2(torch.cat((a, b), 1)) if __name__ == "__main__": # Generating Sample image image_size = (1, 64, 240, 240) image = torch.rand(*image_size) # Model mobilenet_v1 = C2PSA_AFIA(64, 64) out = mobilenet_v1(image) print(out.size())

四、添加方法

下面的步骤如果你不会或者不想麻烦操作,可以联系作者获得本专栏添加所有项目文件的源代码,可直接训练.

4.1 修改一

第一还是建立文件,我们找到如下ultralytics/nn文件夹下建立一个目录名字呢就是'Addmodules'文件夹!


4.2 修改二

然后在Addmodules文件夹内建立一个新的py文件,将本文章节三中的“核心代码"复制粘贴进去


4.3 修改三

第二步我们在该目录下创建一个新的py文件名字为'__init__.py',然后在其内部导入我们的文件,如下图所示。

​​​​


4.4 修改四

第三步我门中到如下文件'ultralytics/nn/tasks.py'进行导入和注册我们的模块(此处只需要添加一次即可,如果你用我其它的改进机制这里的步骤只需要添加一次)

​​​​


4.5 修改五

在'ultralytics/nn/tasks.py'文件内的parse_model方法函数内(位置大概在1500+行左右),按照图示位置添加即可(此处需要自己有一定的判别能力,如果不会可联系作者获得视频教程)。

​​​​


4.6 修改六

在'ultralytics/nn/tasks.py'文件内的parse_model方法函数内(位置大概在1550+行左右),按照图示位置添加即可,此处一定要对应好位置和缩进否则很容易报错。

elif m in {此处填写本章代码的名字.}: c2 = ch[f] args = [c2, *args]

五、正式训练

5.1 yaml文件

5.1.1 yaml文件1

训练信息:YOLO26-C2PSA-AFIA summary: 265 layers, 3,259,292 parameters, 3,259,292 gradients, 6.4 GFLOPs

# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license # Ultralytics YOLO26 object detection model with P3/8 - P5/32 outputs # Model docs: https://docs.ultralytics.com/models/yolo26 # Task docs: https://docs.ultralytics.com/tasks/detect # Parameters nc: 80 # number of classes end2end: True # whether to use end-to-end mode reg_max: 1 # DFL bins scales: # model compound scaling constants, i.e. 'model=yolo26n.yaml' will call yolo26.yaml with scale 'n' # [depth, width, max_channels] n: [0.50, 0.25, 1024] # summary: 260 layers, 2,572,280 parameters, 2,572,280 gradients, 6.1 GFLOPs s: [0.50, 0.50, 1024] # summary: 260 layers, 10,009,784 parameters, 10,009,784 gradients, 22.8 GFLOPs m: [0.50, 1.00, 512] # summary: 280 layers, 21,896,248 parameters, 21,896,248 gradients, 75.4 GFLOPs l: [1.00, 1.00, 512] # summary: 392 layers, 26,299,704 parameters, 26,299,704 gradients, 93.8 GFLOPs x: [1.00, 1.50, 512] # summary: 392 layers, 58,993,368 parameters, 58,993,368 gradients, 209.5 GFLOPs # YOLO26n 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, 3, True]] # 9 - [-1, 2, C2PSA_AFIA, [1024]] # 10 # YOLO26n head head: - [-1, 1, nn.Upsample, [None, 2, "nearest"]] - [[-1, 6], 1, Concat, [1]] # cat backbone P4 - [-1, 2, C3k2, [512, True]] # 13 - [-1, 1, nn.Upsample, [None, 2, "nearest"]] - [[-1, 4], 1, Concat, [1]] # cat backbone P3 - [-1, 2, C3k2, [256, True]] # 16 (P3/8-small) - [-1, 1, Conv, [256, 3, 2]] - [[-1, 13], 1, Concat, [1]] # cat head P4 - [-1, 2, C3k2, [512, True]] # 19 (P4/16-medium) - [-1, 1, Conv, [512, 3, 2]] - [[-1, 10], 1, Concat, [1]] # cat head P5 - [-1, 1, C3k2, [1024, True, 0.5, True]] # 22 (P5/32-large) - [[16, 19, 22], 1, Detect, [nc]] # Detect(P3, P4, P5)

5.1.2 yaml文件2

训练信息:YOLO26-Att-AFIA summary: 273 layers, 2,707,676 parameters, 2,707,676 gradients, 8.4 GFLOPs

# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license # Ultralytics YOLO26 object detection model with P3/8 - P5/32 outputs # Model docs: https://docs.ultralytics.com/models/yolo26 # Task docs: https://docs.ultralytics.com/tasks/detect # Parameters nc: 80 # number of classes end2end: True # whether to use end-to-end mode reg_max: 1 # DFL bins scales: # model compound scaling constants, i.e. 'model=yolo26n.yaml' will call yolo26.yaml with scale 'n' # [depth, width, max_channels] n: [0.50, 0.25, 1024] # summary: 260 layers, 2,572,280 parameters, 2,572,280 gradients, 6.1 GFLOPs s: [0.50, 0.50, 1024] # summary: 260 layers, 10,009,784 parameters, 10,009,784 gradients, 22.8 GFLOPs m: [0.50, 1.00, 512] # summary: 280 layers, 21,896,248 parameters, 21,896,248 gradients, 75.4 GFLOPs l: [1.00, 1.00, 512] # summary: 392 layers, 26,299,704 parameters, 26,299,704 gradients, 93.8 GFLOPs x: [1.00, 1.50, 512] # summary: 392 layers, 58,993,368 parameters, 58,993,368 gradients, 209.5 GFLOPs # YOLO26n 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, 3, True]] # 9 - [-1, 2, C2PSA, [1024]] # 10 # YOLO26n head head: - [-1, 1, nn.Upsample, [None, 2, "nearest"]] - [[-1, 6], 1, Concat, [1]] # cat backbone P4 - [-1, 2, C3k2, [512, True]] # 13 - [-1, 1, nn.Upsample, [None, 2, "nearest"]] - [[-1, 4], 1, Concat, [1]] # cat backbone P3 - [-1, 2, C3k2, [256, True]] # 16 (P3/8-small) - [-1, 1, Conv, [256, 3, 2]] - [[-1, 13], 1, Concat, [1]] # cat head P4 - [-1, 2, C3k2, [512, True]] # 19 (P4/16-medium) - [-1, 1, Conv, [512, 3, 2]] - [[-1, 10], 1, Concat, [1]] # cat head P5 - [-1, 1, C3k2, [1024, True, 0.5, True]] # 22 (P5/32-large) - [16, 1, AFIA, []] # 23 # - [19, 1, AFIA, []] # 24 # - [22, 1, AFIA, []] # 25 # 此处的使用说法注释: 其中上面的三个注意力机制目前仅使用了23层,如果你想使用24层那么就取消掉代码注释, # 并将下面检测头中的19改为24,如果想使用第25层注意力机制同理,将下面检测头中的22改为25即可。 # 此处用法比较复杂如过不会联系Snu77博主获取视频教程 - [[23, 19, 22], 1, Detect, [nc]] # Detect(P3, P4, P5)

5.2 训练代码

大家可以创建一个py文件将我给的代码复制粘贴进去,配置好自己的文件路径即可运行。

import warnings warnings.filterwarnings('ignore') from ultralytics import YOLO if __name__ == '__main__': model = YOLO('模型配置文件地址,也就是5.1你保存到本地文件的地址') # 如何切换模型版本, 上面的ymal文件可以改为 yolo26s.yaml就是使用的26s, # 类似某个改进的yaml文件名称为yolo26-XXX.yaml那么如果想使用其它版本就把上面的名称改为yolo26l-XXX.yaml即可(改的是上面YOLO中间的名字不是配置文件的)! # model.load('yolo26n.pt') # 是否加载预训练权重,科研不建议大家加载否则很难提升精度 model.train( data=r"数据集文件地址", # 如果大家任务是其它的'ultralytics/cfg/default.yaml'找到这里修改task可以改成detect, segment, classify, pose cache=False, imgsz=640, epochs=20, single_cls=False, # 是否是单类别检测 batch=16, close_mosaic=0, workers=0, device='0', optimizer='MuSGD', # using SGD/MuSGD # resume=, # 这里是填写last.pt地址 amp=True, # 如果出现训练损失为Nan可以关闭amp project='runs/train', name='exp', )

5.3 训练过程截图


五、本文总结

到此本文的正式分享内容就结束了,在这里给大家推荐我的YOLOv26改进有效涨点专栏,本专栏目前为新开的平均质量分98分,后期我会根据各种最新的前沿顶会进行论文复现,也会对一些老的改进机制进行补充,如果大家觉得本文帮助到你了,订阅本专栏,关注后续更多的更新~

专栏链接:YOLOv26有效涨点专栏包含:Conv、注意力机制、主干/Backbone、损失函数、优化器、后处理等改进机制

​​​​

http://www.gsyq.cn/news/1440063.html

相关文章:

  • 手把手教你学Simulink--六轴机械臂关节电机运动学建模
  • 机奢堂官网手机门店打破增长天花板,打造“全域获客+项目变现”新方法 - 博客万
  • 大模型训练流程实战:从预训练到推理的完整技术解析
  • 记一次现场oralce监听连接不上处理
  • 2026年石墨烯电地暖怎么选?利物盛、暖玛士、暖先森、吉居客、暖风五大品牌核心差异解析 - 速递信息
  • 无痕去水印软件免费版有哪些全平台工具用法与适配场景详解
  • GitHub 开源文档:人人可参与贡献,双仓库同步更新
  • 解锁音乐自由:QMCDecode让你的QQ音乐随处播放
  • 告别继电器!用MOS管给单片机做个‘电源开关’,实测电路与避坑指南
  • 海投票教程:微信投票如何发起?新手快速上手方法 - 微信投票小程序
  • 告别netstat命令:图形化神器TCPView让你的Windows网络连接一目了然
  • 碧蓝航线自动化脚本完整指南:如何让游戏自己运行24小时不间断?
  • 惠州本地黄金回收怎么选 避坑认准余生黄金回收连锁门店 - 余生黄金回收
  • 小红书视频文案提取工具有哪些?2026保姆级教程+推荐一看就会
  • 深入Linux驱动:手把手分析Xilinx ZynqMP RPU Remoteproc驱动加载与启动流程
  • Unity URP渲染管线从入门到实战:手把手教你配置第一个URP项目(含常见问题排查)
  • MTKClient完全指南:5分钟掌握联发科设备底层调试与刷机
  • 三亚全城上门回收黄金丨余生黄金回收带你轻松变现不踩坑 - 余生黄金回收
  • 区块链如何为AI构建可信基础设施:从数据溯源到智能协作
  • ESP32 BLE Mesh配网踩坑实录:为什么你的Client例程绑定AppKey总失败?
  • 2026上海GEO公司能力图谱:技术路径与服务模式参考
  • 电子科大编译原理四次实验完整实现:从词法识别到LLVM代码生成
  • 2026年4月目前靠谱的驾考门店怎么选择,老年驾考/驾考/理论困难户驾考/分期学车/驾校/三级正规驾校,驾考品牌推荐 - 品牌推荐师
  • 不止于绑定:在UE4中为角色动态切换武器的完整蓝图思路(从插槽到交互逻辑)
  • 避坑指南:Unity集成海康SDK时,NET_DVR_PTZControlWithSpeed_Other接口的这几个参数千万别设错
  • 明日方舟自动化助手终极指南:5个步骤实现一键长草
  • 别再搞混了!Unity里世界、屏幕、相机、本地坐标到底怎么用?一个实战案例讲透
  • MATLAB数字预失真(DPD)全流程仿真包:含静态验证、自适应辨识(RP-EM)、功放实测数据与FPGA协同参考
  • 智能控制 第七章——智能控制算法介绍(部分)(一)
  • 成都爱马仕、香奈儿、LV 包包回收 2026 实地甄选,靠谱实体店选收的顶避坑不踩雷 - 奢侈品回收测评