一、本文介绍本文给大家带来的最新改进机制是最近这几天发布的改进机制MFDS-DETR提出的一种HS-FPN结构其是一种为白细胞检测设计的网络结构主要用于解决白细胞数据集中的多尺度挑战。它的基本原理包括两个关键部分特征选择模块和特征融合模块在本文的下面均会有讲解这个结构是非常新颖的。其可以起到特征选择的作用非常适合轻量化的读者来使用其存在二次创新和多次创新的机会在近期内我会对其进行更加轻量化和精度更高的二次创新利用该结构参数量下降至181W计算量降低至5.7GFLOPs本文结构为我独家复现全网目前无第二份大家可以抓紧使用。欢迎大家订阅我的专栏一起学习YOLO专栏链接YOLOv26有效涨点专栏包含Conv、注意力机制、主干/Backbone、损失函数、优化器、后处理等改进机制目录一、本文介绍二、HS-FPN原理2.1 HS-FPN的基本原理2.2 SSF模块三、HS-FPN的核心代码四、手把手教你添加HS-FPN4.1 修改一4.2 修改二4.3 修改三4.4 修改四4.5 修改五五、正式训练5.1 yaml文件15.2 yaml文件25.3 训练代码5.4 训练过程截图五、本文总结二、HS-FPN原理​论文地址论文官方链接代码地址代码官方链接​2.1 HS-FPN的基本原理HS-FPNHigh-level Screening-feature Fusion Pyramid Networks是一种为白细胞检测设计的网络结构主要用于解决白细胞数据集中的多尺度挑战。它的基本原理包括两个关键部分特征选择模块和特征融合模块。HS-FPN的结构如下图所示包括两个主要组成部分​1. 特征选择模块该模块利用通道注意力CA和维度匹配DM机制对不同尺度的特征图进行筛选。通过池化操作如全局平均池化和全局最大池化和权重计算该模块有效地提取了每个通道中的重要信息。2. 特征融合模块该模块通过选择性特征融合SFF机制将筛选后的低级特征和高级特征结合起来。高级特征扩展后通过双线性插值或转置卷积进行尺度调整然后与低级特征融合从而增强模型对白细胞特征的表达能力。总的来说HS-FPN通过这两个模块协同工作有效地解决了白细胞检测中的多尺度问题提高了检测的准确性和鲁棒性。2.2 SSF模块选择性特征融合Selective Feature Fusion, SFF是HS-FPN网络中的一个关键组件它的主要作用是融合不同尺度的特征图。SFF通过使用高级特征作为权重来过滤低尺度特征中的重要信息。在这个过程中高级特征经过转置卷积和双线性插值操作进行尺度调整以匹配低尺度特征的尺寸。然后利用高级特征作为注意力权重筛选出低尺度特征中有用的信息。这种融合方法能够有效地结合高级特征的语义信息和低尺度特征的细节信息从而提高模型在处理多尺度问题时的性能。下图为大家展示了SFF模块的框架结构​给定一个输入高级特征​和一个输入低尺度特征​高级特征首先使用一个大小为2核大小为3x3的转置卷积T-Conv进行扩展得到特征大小​。然后为了统一高级特征和低尺度特征的维度作者使用双线性插值来向上或向下采样高级特征得到特征​。接下来使用CA模块将高级特征转换为相应的注意力权重以过滤低尺度特征在获得具有相同维度的特征后。最后将过滤后的低尺度特征与高级特征融合以增强模型的特征表示并得到​。方程1和2说明了特征选择的融合过程​三、HS-FPN的核心代码这里的CA对应着官方代码中的ChannelAttention但是在早期的库里面它在官方里面已经集成了导入过来可能名字重复从而导致使用的时候报错我这里给改写成CA了大家看官方代码的时候需要注意下。import torch import torch.nn as nn import torch.nn.functional as F __all__ [CA, multiply, Add] class Add(nn.Module): # Concatenate a list of tensors along dimension def __init__(self, ch256): super().__init__() def forward(self, x): input1, input2 x[0], x[1] x input1 input2 return x class multiply(nn.Module): def __init__(self): super().__init__() def forward(self, x): x x[0] * x[1] return x class CA(nn.Module): def __init__(self, in_planes, ratio 4, flagTrue): super(CA, self).__init__() self.avg_pool nn.AdaptiveAvgPool2d(1) self.max_pool nn.AdaptiveMaxPool2d(1) self.conv1 nn.Conv2d(in_planes, in_planes // ratio, 1, biasFalse) self.relu nn.ReLU() self.conv2 nn.Conv2d(in_planes // ratio, in_planes, 1, biasFalse) self.flag flag self.sigmoid nn.Sigmoid() nn.init.xavier_uniform_(self.conv1.weight) nn.init.xavier_uniform_(self.conv2.weight) def forward(self, x): avg_out self.conv2(self.relu(self.conv1(self.avg_pool(x)))) max_out self.conv2(self.relu(self.conv1(self.max_pool(x)))) out avg_out max_out out self.sigmoid(out) * x if self.flag else self.sigmoid(out) return out class FeatureSelectionModule(nn.Module): def __init__(self, in_chan, out_chan): super(FeatureSelectionModule, self).__init__() self.conv_atten nn.Conv2d(in_chan, in_chan, kernel_size1) self.group_norm1 nn.GroupNorm(32, in_chan) self.sigmoid nn.Sigmoid() self.conv nn.Conv2d(in_chan, out_chan, kernel_size1) self.group_norm2 nn.GroupNorm(32, out_chan) nn.init.xavier_uniform_(self.conv_atten.weight) nn.init.xavier_uniform_(self.conv.weight) def forward(self, x): atten self.sigmoid(self.group_norm1(self.conv_atten(F.avg_pool2d(x, x.size()[2:])))) feat torch.mul(x, atten) x x feat feat self.group_norm2(self.conv(x)) return feat if __name__ __main__: # Generating Sample image image_size (1, 64, 240, 240) image torch.rand(*image_size) # Model mobilenet_v3 FeatureSelectionModule(64, 64) out mobilenet_v3(image) print(out.size())四、手把手教你添加HS-FPN4.1 修改一第一还是建立文件我们找到如下ultralytics/nn文件夹下建立一个目录名字呢就是Addmodules文件夹(用群内的文件的话已经有了无需新建)然后在其内部建立一个新的py文件将核心代码复制粘贴进去即可。​4.2 修改二第二步我们在该目录下创建一个新的py文件名字为__init__.py(用群内的文件的话已经有了无需新建)然后在其内部导入我们的检测头如下图所示。​​​4.3 修改三第三步我门中到如下文件ultralytics/nn/tasks.py进行导入和注册我们的模块(用群内的文件的话已经有了无需重新导入直接开始第四步即可)​​​4.4 修改四按照我的添加在parse_model里添加即可。​4.5 修改五按照我的添加在parse_model里添加即可。​elif m in {此处添加大家修改的对应机制即可}: c2 ch[f] args [c2, *args]elif m is multiply: c2 ch[f[0]] elif m is Add: c2 ch[f[-1]]到此就修改完成了大家可以复制下面的yaml文件运行。五、正式训练5.1 yaml文件1训练信息YOLO26-Neck-HSFPN-2 summary: 271 layers, 1,728,668 parameters, 1,728,668 gradients, 5.1 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: - [-1, 1, CA, []] # 11 - [-1, 1, nn.Conv2d, [256, 1]] # 12 - [-1, 2, C3k2, [256, True]] # 13 P5 - [6, 1, CA, []] - [-1, 1, nn.Conv2d, [256, 1]] # 15 - [12, 1, nn.ConvTranspose2d, [256, 3, 2, 1, 1]] # 16 - [-1, 1, CA, [4, False]] - [[-1, 15], 1, multiply, []] # 18 - [[-1, 16], 1, Add, []] # 19 - [-1, 2, C3k2, [256, True]] # 20 P4 - [4, 1, CA, []] # 21 - [-1, 1, nn.Conv2d, [256, 1]] # 22 - [16, 1, nn.ConvTranspose2d, [256, 3, 2, 1, 1]] # 23 - [-1, 1, CA, [4, False]] # 24 - [[-1, 22], 1, multiply, []] # 25 - [[-1, 23], 1, Add, []] # 26 - [-1, 2, C3k2, [256, True, 0.5, True]] # 27 P3 - [[27, 20, 13], 1, Detect, [nc]] # Det5.2 yaml文件2训练信息YOLO26-Neck-HSFPN-1 summary: 271 layers, 3,480,412 parameters, 3,480,412 gradients, 19.9 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: - [-1, 1, CA, []] # 11 - [-1, 1, nn.Conv2d, [256, 1]] # 12 - [-1, 2, C3k2, [256, True]] # 13 P5 - [6, 1, CA, []] - [-1, 1, nn.Conv2d, [256, 1]] # 15 - [12, 1, nn.ConvTranspose2d, [256, 3, 2, 1, 1]] # 16 - [-1, 1, CA, [4, False]] - [[-1, 15], 1, multiply, []] # 18 - [[-1, 16], 1, Add, []] # 19 - [-1, 2, C3k2, [512, True]] # 20 P4 - [4, 1, CA, []] # 21 - [-1, 1, nn.Conv2d, [512, 1]] # 22 - [16, 1, nn.ConvTranspose2d, [512, 3, 2, 1, 1]] # 23 - [-1, 1, CA, [4, False]] # 24 - [[-1, 22], 1, multiply, []] # 25 - [[-1, 23], 1, Add, []] # 26 - [-1, 2, C3k2, [1024, True, 0.5, True]] # 27 P3 - [[27, 20, 13], 1, Detect, [nc]] # Det5.3 训练代码大家可以创建一个py文件将我给的代码复制粘贴进去配置好自己的文件路径即可运行。import warnings warnings.filterwarnings(ignore) from ultralytics import YOLO if __name__ __main__: model YOLO(模型配置文件) # 如何切换模型版本, 上面的ymal文件可以改为 yolov8s.yaml就是使用的v8s, # 类似某个改进的yaml文件名称为yolov8-XXX.yaml那么如果想使用其它版本就把上面的名称改为yolov8l-XXX.yaml即可改的是上面YOLO中间的名字不是配置文件的 # model.load(yolov8n.pt) # 是否加载预训练权重,科研不建议大家加载否则很难提升精度 model.train(datarC:\Users\Administrator\PycharmProjects\yolov5-master\yolov5-master\Construction Site Safety.v30-raw-images_latestversion.yolov8\data.yaml, # 如果大家任务是其它的ultralytics/cfg/default.yaml找到这里修改task可以改成detect, segment, classify, pose cacheFalse, imgsz640, epochs150, single_clsFalse, # 是否是单类别检测 batch16, close_mosaic0, workers0, device0, optimizerSGD, # using SGD # resumeruns/train/exp21/weights/last.pt, # 如过想续训就设置last.pt的地址 ampTrue, # 如果出现训练损失为Nan可以关闭amp projectruns/train, nameexp, )5.4 训练过程截图​​五、本文总结到此本文的正式分享内容就结束了在这里给大家推荐我的YOLOv26改进有效涨点专栏本专栏目前为新开的平均质量分98分后期我会根据各种最新的前沿顶会进行论文复现也会对一些老的改进机制进行补充如果大家觉得本文帮助到你了订阅本专栏关注后续更多的更新~专栏链接