开始讲解之前推荐一下我的专栏本专栏的内容支持(分类、检测、分割、追踪、关键点检测),专栏目前为限时折扣欢迎大家订阅本专栏本专栏每周更新3-5篇最新机制更有包含我所有改进的文件和交流群提供给大家。一、本文介绍本文给大家带来的最新改进机制是利用多层次特征融合模块SDI配上经典的加权双向特征金字塔网络Bi-FPN形成一种全新的Neck网络结构从而达到二次创新的效果其中SDI模块的主要思想是通过整合编码器生成的层级特征图来增强图像中的语义信息和细节信息。Bi-FPN无需过多介绍其作为经典的特征金字塔网络其效果一直以来都是非常的不错其中Bi-FPN的劣势主要是时间过于久远但是SDI是一种全新的机制所以我们将其融合在一起这就是一种全新的Neck从而达到一个二次创新的形式我们在书写论文的时候论文的结构图也比较好画同时本文的SDI模块在分割领域涨点高效融合起来非常适用于目标分割。欢迎大家订阅我的专栏一起学习YOLO专栏链接YOLOv26有效涨点专栏包含Conv、注意力机制、主干/Backbone、损失函数、优化器、后处理等改进机制目录一、本文介绍二、原理介绍2.1 BiFPN的基本原理2.2 双向特征融合2.3 加权融合机制2.4 结构优化2.5 SDI的基本原理三、BiFPN代码四、手把手教你修改BiFPN4.1 修改一4.2 修改二4.3 修改三4.4 修改四五、SDI的核心代码六、手把手教你添加SDI机制6.1 修改一6.2 修改二6.3 修改三6.4 修改四七、融合后的yaml文件八、运行截图九、全文总结二、原理介绍论文地址论文官方地址代码地址官方代码地址2.1 BiFPN的基本原理BiFPNBidirectional Feature Pyramid Network双向特征金字塔网络是一种高效的多尺度特征融合网络它在传统特征金字塔网络FPN的基础上进行了优化。主要特点包括1. 高效的双向跨尺度连接BiFPN通过在自顶向下和自底向上路径之间建立双向连接允许不同尺度特征间的信息更有效地流动和融合。2. 简化的网络结构BiFPN通过删除只有一个输入边的节点、在同一层级的输入和输出节点间添加额外边以及将每个双向路径视为一个特征网络层并重复多次来优化跨尺度连接。3. 加权特征融合BiFPN引入了可学习的权重来确定不同输入特征的重要性从而提高了特征融合的效果。我们可以将其基本原理概括分为以下几点1. 双向特征融合BiFPN允许特征在自顶向下和自底向上两个方向上进行融合从而更有效地结合不同尺度的特征。2. 加权融合机制BiFPN通过为每个输入特征添加权重来优化特征融合过程使得网络可以更加重视信息量更大的特征。3. 结构优化BiFPN通过移除只有一个输入边的节点、添加同一层级的输入输出节点之间的额外边并将每个双向路径视为一个特征网络层来优化跨尺度连接。我将通过下图为大家对比展示BiFPN与其他四种不同特征金字塔网络设计的不同以及BiFPN如何更有效地整合特征(a) FPN (Feature Pyramid Network):引入了自顶向下的路径来融合从第3层到第7层P3 - P7的多尺度特征。(b) PANet:在FPN的基础上增加了自底向上的额外路径。(c) NAS-FPN:使用神经架构搜索NAS来找到不规则的特征网络拓扑然后重复应用相同的块。(d) BiFPN:通过高效的双向跨尺度连接和重复的块结构改进了准确度和效率之间的权衡。我们可以看出BiFPN通过双向路径允许特征信息在不同尺度间双向流动这种双向流动可以看做是在不同尺度之间进行有效信息交换。这样的设计旨在通过强化特征的双向流动来提升特征融合的效率和有效性从而提高目标检测的性能。2.2双向特征融合双向特征融合在BiFPN双向特征金字塔网络中指的是一种机制它允许在特征网络层中的信息在自顶向下和自底向上两个方向上流动和融合。这种方法与传统的单向特征金字塔网络如PANet相比能够在不同层级之间更高效地融合特征而无需增加显著的计算成本。在BiFPN中每一条双向路径自顶向下和自底向上被视作一个单独的特征网络层然后这些层可以被重复多次以促进更高级别的特征融合。这样做的结果是一个简化的双向网络它增强了网络对特征融合的能力使网络能够更有效地利用不同尺度的信息从而提高目标检测的性能。下图展示的是EfficientDet架构的具体细节其中包含了EfficientNet作为骨干网络backbone以及BiFPN作为特征网络的使用。在这个架构中BiFPN层通过其双向特征融合的能力从EfficientNet骨干网络接收多尺度的输入特征然后生成用于对象分类和边框预测的富有表现力的特征。在BiFPN层中我们可以看到不同尺度的特征P2至P7如何通过上下双向路径进行融合。这种结构设计的目的是在保持计算效率的同时最大化特征融合的效果以提高对象检测的整体性能。图中还显示了类别预测网络和边框预测网络这些是在BiFPN特征融合后用于预测对象类别和定位对象边界框的网络部分。2.3加权融合机制加权融合机制是BiFPN中用于改进特征融合效果的一种技术。在传统的特征金字塔网络中所有输入特征通常在没有区分的情况下等同对待这意味着不同分辨率的特征被简单地相加在一起而不考虑它们对输出特征的不同贡献。然而在BiFPN中观察到由于不同的输入特征具有不同的分辨率它们通常对输出特征的贡献是不等的。为了解决这个问题BiFPN提出了为每个输入添加一个额外的权重并让网络学习每个输入特征的重要性:其中 是一个可学习的权重可以是标量每个特征向量每个通道或多维张量每个像素。这些权重是可学习的可以是标量针对每个特征向量针对每个通道或者多维张量针对每个像素。这种加权融合方法可以在最小化计算成本的同时实现与其他方法可比的准确度。2.4结构优化结构优化是为了在不同的资源约束下通过复合缩放方法确定不同的层数从而在保持效率的同时提高准确性。我们通过分析观察BiFPN的设计其结构优化包括1. 简化的双向网络通过优化结构减少了网络中的节点数特别是移除了那些只有一个输入边的节点。这种简化的直觉是如果一个节点没有进行特征融合即它只有一个输入边那么它对于融合不同特征的特征网络的贡献会更小。2. 增加额外的边缘在相同层级的原始输入和输出节点之间增加了额外的边缘以便在不显著增加成本的情况下融合更多的特征。3. 重复使用双向路径与只有单一自顶向下和自底向上路径的PANet不同BiFPN将每条双向自顶向下和自底向上路径视为一个特征网络层并重复多次以实现更高级别的特征融合。论文地址论文官方地址代码地址:代码官方地址2.5 SDI的基本原理SDISemantic and Detail Infusion模块是UNetV2模型的一个组成部分。UNetV2包含三个主要模块编码器、SDI模块和解码器。在SDI模块中首先应用空间和通道注意机制对编码器生成的每个层级的特征进行处理。SDI模块的主要思想是通过整合编码器生成的层级特征图来增强图像中的语义信息和细节信息。具体来说1. 特征提取和整合首先编码器针对输入图像生成多层级的特征。然后通过空间和通道注意机制处理每个层级的特征以便特征能够整合局部空间信息和全局通道信息。2. 高级特征和低级特征的融合对于每个层级的特征图SDI模块将包含更多语义信息的高级特征和捕捉更精细细节的低级特征进行融合。这通过简单的哈达玛积Hadamard product操作来实现从而增强了每个层级特征的语义和细节。3. 特征传递和分割经过精炼的特征随后传递给解码器用于解析重构和图像分割。SDI模块可以无缝集成到任何编码器-解码器网络中。该方法已在多个公开的医学图像分割数据集上进行了验证包括皮肤病变分割和息肉分割展示了其在这些分割任务中相比于现有方法的优越性同时保持了计算和内存效率。图中的SDI模块部分 (b) 展示了该模块是如何对第三层级的特征l3进行精细化处理的。我们可以从以下几个步骤来理解SDI模块的工作原理上采样UpSample通过上采样过程SDI模块将来自更低层级的特征图l2的尺寸增加使其与当前层级的尺寸匹配。这有助于将更细节的信息带入当前的特征图中。身份映射IdentityMap这通常表示特征图在不经任何修改的情况下直接传递到下一个操作。在这里它可能表示第三层级的特征图在没有任何变化的情况下直接传递到SDI模块进行处理。下采样DownSample与上采样相反这一步将更高层级的特征图l4的尺寸减小以匹配第三层级的尺寸。这有助于将更高层次的语义信息带入当前层级。注意力的应用应用空间和通道注意机制对编码器生成的每个层级的特征进行处理。这个过程使得特征能够整合局部空间信息和全局通道信息总结这一机制我觉得大家可以理解成一种融合了注意力机制的Concat操作三、BiFPN代码添加方法看章节四import torch.nn as nn import torch class swish(nn.Module): def forward(self, x): return x * torch.sigmoid(x) class Bi_FPN(nn.Module): def __init__(self, length): super().__init__() self.weight nn.Parameter(torch.ones(length, dtypetorch.float32), requires_gradTrue) self.swish swish() self.epsilon 0.0001 def forward(self, x): weights self.weight / (torch.sum(self.swish(self.weight), dim0) self.epsilon) # 权重归一化处理 weighted_feature_maps [weights[i] * x[i] for i in range(len(x))] stacked_feature_maps torch.stack(weighted_feature_maps, dim0) result torch.sum(stacked_feature_maps, dim0) return result四、手把手教你修改BiFPN4.1 修改一第一还是建立文件我们找到如下ultralytics/nn文件夹下建立一个目录名字呢就是Addmodules文件夹(用群内的文件的话已经有了无需新建)然后在其内部建立一个新的py文件将核心代码复制粘贴进去即可。4.2 修改二第二步我们在该目录下创建一个新的py文件名字为__init__.py(用群内的文件的话已经有了无需新建)然后在其内部导入我们的检测头如下图所示。4.3 修改三第三步我门中到如下文件ultralytics/nn/tasks.py进行导入和注册我们的模块(用群内的文件的话已经有了无需重新导入直接开始第四步即可)4.4 修改四按照我的添加在ultralytics/nn/tasks.py文件下的parse_model里添加即可。elif m is Bi_FPN: length len([ch[x] for x in f]) args [length]五、SDI的核心代码代码的使用方式看章节六import torch import torch.nn as nn import torch.nn.functional as F __all__ [SDI] class SDI(nn.Module): def __init__(self, channel): super().__init__() self.convs nn.ModuleList( [nn.Conv2d(c, channel[0], kernel_size3, stride1, padding1) for c in channel]) def forward(self, xs): ans torch.ones_like(xs[0]) target_size xs[0].shape[-2:] for i, x in enumerate(xs): if x.shape[-1] target_size[0]: x F.adaptive_avg_pool2d(x, (target_size[0], target_size[1])) elif x.shape[-1] target_size[0]: x F.interpolate(x, size(target_size[0], target_size[1]), modebilinear, align_cornersTrue) ans ans * self.convs[i](x) return ans六、手把手教你添加SDI机制这个添加方式和之前的变了一下以后的添加方法都按照这个来了是为了和群内的文件适配。6.1 修改一第一还是建立文件我们找到如下ultralytics/nn文件夹下建立一个目录名字呢就是Addmodules文件夹(用群内的文件的话已经有了无需新建)然后在其内部建立一个新的py文件将核心代码复制粘贴进去即可。6.2 修改二第二步我们在该目录下创建一个新的py文件名字为__init__.py(用群内的文件的话已经有了无需新建)然后在其内部导入我们的检测头如下图所示。6.3 修改三第三步我门中到如下文件ultralytics/nn/tasks.py进行导入和注册我们的模块(用群内的文件的话已经有了无需重新导入直接开始第四步即可)6.4 修改四按照我的添加在parse_model里添加即可。elif m is SDI: args [[ch[x] for x in f]]到此就修改完成了大家可以复制下面的yaml文件运行。七、融合后的yaml文件训练信息YOLO26-Neck-BiFPN-SDI summary: 368 layers, 3,133,468 parameters, 3,133,468 gradients, 9.6 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. modelyolo26n.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: - [4, 1, Conv, [256]] # 11-P3/8 - [6, 1, Conv, [256]] # 12-P4/16 - [10, 1, Conv, [256]] # 13-P5/32 - [-1, 1, nn.Upsample, [None, 2, nearest]] # 14 P5-P4 - [[-1, 12], 1, SDI, []] # 15 - [-1, 3, C3k2, [256, True]] # 16-P4/16 - [-1, 1, nn.Upsample, [None, 2, nearest]] # 17 P4-P3 - [[-1, 11], 1, SDI, []] # 18 - [-1, 3, C3k2, [256, True]] # 19-P3/8 - [1, 1, Conv, [256, 3, 2]] # 20 P2-P3 - [[-1, 11, 19], 1, SDI, []] # 21 - [-1, 3, C3k2, [256, True]] # 22-P3/8 - [-1, 1, Conv, [256, 3, 2]] # 23 P3-P4 - [[-1, 12, 16], 1, SDI, []] # 24 - [-1, 3, C3k2, [512, True]] # 25-P4/16 - [-1, 1, Conv, [256, 3, 2]] # 26 P4-P5 - [[-1, 13], 1, SDI, []] # 27 - [-1, 3, C3k2, [1024, True, 0.5, True]] # 28-P5/32 - [[22, 25, 28], 1, Detect, [nc]] # Detect(P3, P4, P5)八、运行截图九、全文总结到此本文的正式分享内容就结束了在这里给大家推荐我的YOLOv26改进有效涨点专栏本专栏目前为新开的平均质量分98分后期我会根据各种最新的前沿顶会进行论文复现也会对一些老的改进机制进行补充目前本专栏免费阅读(暂时大家尽早关注不迷路~)如果大家觉得本文帮助到你了订阅本专栏关注后续更多的更新~专栏链接
yolov26改进 | Neck/颈部创新篇 | SDI结合BiFPN全新的特征融合网络(全网独家创新)
发布时间:2026/6/14 3:29:02
开始讲解之前推荐一下我的专栏本专栏的内容支持(分类、检测、分割、追踪、关键点检测),专栏目前为限时折扣欢迎大家订阅本专栏本专栏每周更新3-5篇最新机制更有包含我所有改进的文件和交流群提供给大家。一、本文介绍本文给大家带来的最新改进机制是利用多层次特征融合模块SDI配上经典的加权双向特征金字塔网络Bi-FPN形成一种全新的Neck网络结构从而达到二次创新的效果其中SDI模块的主要思想是通过整合编码器生成的层级特征图来增强图像中的语义信息和细节信息。Bi-FPN无需过多介绍其作为经典的特征金字塔网络其效果一直以来都是非常的不错其中Bi-FPN的劣势主要是时间过于久远但是SDI是一种全新的机制所以我们将其融合在一起这就是一种全新的Neck从而达到一个二次创新的形式我们在书写论文的时候论文的结构图也比较好画同时本文的SDI模块在分割领域涨点高效融合起来非常适用于目标分割。欢迎大家订阅我的专栏一起学习YOLO专栏链接YOLOv26有效涨点专栏包含Conv、注意力机制、主干/Backbone、损失函数、优化器、后处理等改进机制目录一、本文介绍二、原理介绍2.1 BiFPN的基本原理2.2 双向特征融合2.3 加权融合机制2.4 结构优化2.5 SDI的基本原理三、BiFPN代码四、手把手教你修改BiFPN4.1 修改一4.2 修改二4.3 修改三4.4 修改四五、SDI的核心代码六、手把手教你添加SDI机制6.1 修改一6.2 修改二6.3 修改三6.4 修改四七、融合后的yaml文件八、运行截图九、全文总结二、原理介绍论文地址论文官方地址代码地址官方代码地址2.1 BiFPN的基本原理BiFPNBidirectional Feature Pyramid Network双向特征金字塔网络是一种高效的多尺度特征融合网络它在传统特征金字塔网络FPN的基础上进行了优化。主要特点包括1. 高效的双向跨尺度连接BiFPN通过在自顶向下和自底向上路径之间建立双向连接允许不同尺度特征间的信息更有效地流动和融合。2. 简化的网络结构BiFPN通过删除只有一个输入边的节点、在同一层级的输入和输出节点间添加额外边以及将每个双向路径视为一个特征网络层并重复多次来优化跨尺度连接。3. 加权特征融合BiFPN引入了可学习的权重来确定不同输入特征的重要性从而提高了特征融合的效果。我们可以将其基本原理概括分为以下几点1. 双向特征融合BiFPN允许特征在自顶向下和自底向上两个方向上进行融合从而更有效地结合不同尺度的特征。2. 加权融合机制BiFPN通过为每个输入特征添加权重来优化特征融合过程使得网络可以更加重视信息量更大的特征。3. 结构优化BiFPN通过移除只有一个输入边的节点、添加同一层级的输入输出节点之间的额外边并将每个双向路径视为一个特征网络层来优化跨尺度连接。我将通过下图为大家对比展示BiFPN与其他四种不同特征金字塔网络设计的不同以及BiFPN如何更有效地整合特征(a) FPN (Feature Pyramid Network):引入了自顶向下的路径来融合从第3层到第7层P3 - P7的多尺度特征。(b) PANet:在FPN的基础上增加了自底向上的额外路径。(c) NAS-FPN:使用神经架构搜索NAS来找到不规则的特征网络拓扑然后重复应用相同的块。(d) BiFPN:通过高效的双向跨尺度连接和重复的块结构改进了准确度和效率之间的权衡。我们可以看出BiFPN通过双向路径允许特征信息在不同尺度间双向流动这种双向流动可以看做是在不同尺度之间进行有效信息交换。这样的设计旨在通过强化特征的双向流动来提升特征融合的效率和有效性从而提高目标检测的性能。2.2双向特征融合双向特征融合在BiFPN双向特征金字塔网络中指的是一种机制它允许在特征网络层中的信息在自顶向下和自底向上两个方向上流动和融合。这种方法与传统的单向特征金字塔网络如PANet相比能够在不同层级之间更高效地融合特征而无需增加显著的计算成本。在BiFPN中每一条双向路径自顶向下和自底向上被视作一个单独的特征网络层然后这些层可以被重复多次以促进更高级别的特征融合。这样做的结果是一个简化的双向网络它增强了网络对特征融合的能力使网络能够更有效地利用不同尺度的信息从而提高目标检测的性能。下图展示的是EfficientDet架构的具体细节其中包含了EfficientNet作为骨干网络backbone以及BiFPN作为特征网络的使用。在这个架构中BiFPN层通过其双向特征融合的能力从EfficientNet骨干网络接收多尺度的输入特征然后生成用于对象分类和边框预测的富有表现力的特征。在BiFPN层中我们可以看到不同尺度的特征P2至P7如何通过上下双向路径进行融合。这种结构设计的目的是在保持计算效率的同时最大化特征融合的效果以提高对象检测的整体性能。图中还显示了类别预测网络和边框预测网络这些是在BiFPN特征融合后用于预测对象类别和定位对象边界框的网络部分。2.3加权融合机制加权融合机制是BiFPN中用于改进特征融合效果的一种技术。在传统的特征金字塔网络中所有输入特征通常在没有区分的情况下等同对待这意味着不同分辨率的特征被简单地相加在一起而不考虑它们对输出特征的不同贡献。然而在BiFPN中观察到由于不同的输入特征具有不同的分辨率它们通常对输出特征的贡献是不等的。为了解决这个问题BiFPN提出了为每个输入添加一个额外的权重并让网络学习每个输入特征的重要性:其中 是一个可学习的权重可以是标量每个特征向量每个通道或多维张量每个像素。这些权重是可学习的可以是标量针对每个特征向量针对每个通道或者多维张量针对每个像素。这种加权融合方法可以在最小化计算成本的同时实现与其他方法可比的准确度。2.4结构优化结构优化是为了在不同的资源约束下通过复合缩放方法确定不同的层数从而在保持效率的同时提高准确性。我们通过分析观察BiFPN的设计其结构优化包括1. 简化的双向网络通过优化结构减少了网络中的节点数特别是移除了那些只有一个输入边的节点。这种简化的直觉是如果一个节点没有进行特征融合即它只有一个输入边那么它对于融合不同特征的特征网络的贡献会更小。2. 增加额外的边缘在相同层级的原始输入和输出节点之间增加了额外的边缘以便在不显著增加成本的情况下融合更多的特征。3. 重复使用双向路径与只有单一自顶向下和自底向上路径的PANet不同BiFPN将每条双向自顶向下和自底向上路径视为一个特征网络层并重复多次以实现更高级别的特征融合。论文地址论文官方地址代码地址:代码官方地址2.5 SDI的基本原理SDISemantic and Detail Infusion模块是UNetV2模型的一个组成部分。UNetV2包含三个主要模块编码器、SDI模块和解码器。在SDI模块中首先应用空间和通道注意机制对编码器生成的每个层级的特征进行处理。SDI模块的主要思想是通过整合编码器生成的层级特征图来增强图像中的语义信息和细节信息。具体来说1. 特征提取和整合首先编码器针对输入图像生成多层级的特征。然后通过空间和通道注意机制处理每个层级的特征以便特征能够整合局部空间信息和全局通道信息。2. 高级特征和低级特征的融合对于每个层级的特征图SDI模块将包含更多语义信息的高级特征和捕捉更精细细节的低级特征进行融合。这通过简单的哈达玛积Hadamard product操作来实现从而增强了每个层级特征的语义和细节。3. 特征传递和分割经过精炼的特征随后传递给解码器用于解析重构和图像分割。SDI模块可以无缝集成到任何编码器-解码器网络中。该方法已在多个公开的医学图像分割数据集上进行了验证包括皮肤病变分割和息肉分割展示了其在这些分割任务中相比于现有方法的优越性同时保持了计算和内存效率。图中的SDI模块部分 (b) 展示了该模块是如何对第三层级的特征l3进行精细化处理的。我们可以从以下几个步骤来理解SDI模块的工作原理上采样UpSample通过上采样过程SDI模块将来自更低层级的特征图l2的尺寸增加使其与当前层级的尺寸匹配。这有助于将更细节的信息带入当前的特征图中。身份映射IdentityMap这通常表示特征图在不经任何修改的情况下直接传递到下一个操作。在这里它可能表示第三层级的特征图在没有任何变化的情况下直接传递到SDI模块进行处理。下采样DownSample与上采样相反这一步将更高层级的特征图l4的尺寸减小以匹配第三层级的尺寸。这有助于将更高层次的语义信息带入当前层级。注意力的应用应用空间和通道注意机制对编码器生成的每个层级的特征进行处理。这个过程使得特征能够整合局部空间信息和全局通道信息总结这一机制我觉得大家可以理解成一种融合了注意力机制的Concat操作三、BiFPN代码添加方法看章节四import torch.nn as nn import torch class swish(nn.Module): def forward(self, x): return x * torch.sigmoid(x) class Bi_FPN(nn.Module): def __init__(self, length): super().__init__() self.weight nn.Parameter(torch.ones(length, dtypetorch.float32), requires_gradTrue) self.swish swish() self.epsilon 0.0001 def forward(self, x): weights self.weight / (torch.sum(self.swish(self.weight), dim0) self.epsilon) # 权重归一化处理 weighted_feature_maps [weights[i] * x[i] for i in range(len(x))] stacked_feature_maps torch.stack(weighted_feature_maps, dim0) result torch.sum(stacked_feature_maps, dim0) return result四、手把手教你修改BiFPN4.1 修改一第一还是建立文件我们找到如下ultralytics/nn文件夹下建立一个目录名字呢就是Addmodules文件夹(用群内的文件的话已经有了无需新建)然后在其内部建立一个新的py文件将核心代码复制粘贴进去即可。4.2 修改二第二步我们在该目录下创建一个新的py文件名字为__init__.py(用群内的文件的话已经有了无需新建)然后在其内部导入我们的检测头如下图所示。4.3 修改三第三步我门中到如下文件ultralytics/nn/tasks.py进行导入和注册我们的模块(用群内的文件的话已经有了无需重新导入直接开始第四步即可)4.4 修改四按照我的添加在ultralytics/nn/tasks.py文件下的parse_model里添加即可。elif m is Bi_FPN: length len([ch[x] for x in f]) args [length]五、SDI的核心代码代码的使用方式看章节六import torch import torch.nn as nn import torch.nn.functional as F __all__ [SDI] class SDI(nn.Module): def __init__(self, channel): super().__init__() self.convs nn.ModuleList( [nn.Conv2d(c, channel[0], kernel_size3, stride1, padding1) for c in channel]) def forward(self, xs): ans torch.ones_like(xs[0]) target_size xs[0].shape[-2:] for i, x in enumerate(xs): if x.shape[-1] target_size[0]: x F.adaptive_avg_pool2d(x, (target_size[0], target_size[1])) elif x.shape[-1] target_size[0]: x F.interpolate(x, size(target_size[0], target_size[1]), modebilinear, align_cornersTrue) ans ans * self.convs[i](x) return ans六、手把手教你添加SDI机制这个添加方式和之前的变了一下以后的添加方法都按照这个来了是为了和群内的文件适配。6.1 修改一第一还是建立文件我们找到如下ultralytics/nn文件夹下建立一个目录名字呢就是Addmodules文件夹(用群内的文件的话已经有了无需新建)然后在其内部建立一个新的py文件将核心代码复制粘贴进去即可。6.2 修改二第二步我们在该目录下创建一个新的py文件名字为__init__.py(用群内的文件的话已经有了无需新建)然后在其内部导入我们的检测头如下图所示。6.3 修改三第三步我门中到如下文件ultralytics/nn/tasks.py进行导入和注册我们的模块(用群内的文件的话已经有了无需重新导入直接开始第四步即可)6.4 修改四按照我的添加在parse_model里添加即可。elif m is SDI: args [[ch[x] for x in f]]到此就修改完成了大家可以复制下面的yaml文件运行。七、融合后的yaml文件训练信息YOLO26-Neck-BiFPN-SDI summary: 368 layers, 3,133,468 parameters, 3,133,468 gradients, 9.6 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. modelyolo26n.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: - [4, 1, Conv, [256]] # 11-P3/8 - [6, 1, Conv, [256]] # 12-P4/16 - [10, 1, Conv, [256]] # 13-P5/32 - [-1, 1, nn.Upsample, [None, 2, nearest]] # 14 P5-P4 - [[-1, 12], 1, SDI, []] # 15 - [-1, 3, C3k2, [256, True]] # 16-P4/16 - [-1, 1, nn.Upsample, [None, 2, nearest]] # 17 P4-P3 - [[-1, 11], 1, SDI, []] # 18 - [-1, 3, C3k2, [256, True]] # 19-P3/8 - [1, 1, Conv, [256, 3, 2]] # 20 P2-P3 - [[-1, 11, 19], 1, SDI, []] # 21 - [-1, 3, C3k2, [256, True]] # 22-P3/8 - [-1, 1, Conv, [256, 3, 2]] # 23 P3-P4 - [[-1, 12, 16], 1, SDI, []] # 24 - [-1, 3, C3k2, [512, True]] # 25-P4/16 - [-1, 1, Conv, [256, 3, 2]] # 26 P4-P5 - [[-1, 13], 1, SDI, []] # 27 - [-1, 3, C3k2, [1024, True, 0.5, True]] # 28-P5/32 - [[22, 25, 28], 1, Detect, [nc]] # Detect(P3, P4, P5)八、运行截图九、全文总结到此本文的正式分享内容就结束了在这里给大家推荐我的YOLOv26改进有效涨点专栏本专栏目前为新开的平均质量分98分后期我会根据各种最新的前沿顶会进行论文复现也会对一些老的改进机制进行补充目前本专栏免费阅读(暂时大家尽早关注不迷路~)如果大家觉得本文帮助到你了订阅本专栏关注后续更多的更新~专栏链接