YOLOv9改进策略 | Neck篇 | 2024.1最新MFDS-DETR的HS-FPN改进特征融合层(轻量化Neck、全网独家首发)

本文主要是介绍YOLOv9改进策略 | Neck篇 | 2024.1最新MFDS-DETR的HS-FPN改进特征融合层(轻量化Neck、全网独家首发),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  一、本文介绍

本文给大家带来的改进机制是最近这几天最新发布的改进机制MFDS-DETR提出的一种HS-FPN结构,其是一种为白细胞检测设计的网络结构,主要用于解决白细胞数据集中的多尺度挑战。它的基本原理包括两个关键部分:特征选择模块特征融合模块。其可以起到特征选择的作用,非常适合轻量化的读者来使用,其存在二次创新和多次创新的机会,利用该结构参数量下降了约100W,本专栏每周更新3-5篇最新机制,更有包含我所有改进的文件和交流群提供给大家,同时本专栏目前改进基于yolov9.yaml文件,后期如果官方放出轻量化版本,专栏内所有改进也会同步更新,请大家放心。

欢迎大家订阅我的专栏一起学习YOLO! 

专栏地址:YOLOv9有效涨点专栏-持续复现各种顶会内容-有效涨点-全网改进最全的专栏 

目录

  一、本文介绍

二、HS-FPN原理

2.1  HS-FPN的基本原理

2.2  SSF模块

三、HS-FPN的核心代码

四、手把手教你添加HS-FPN 

4.1 HS-FPN添加步骤

4.1.1 修改一

4.1.2 修改二

4.1.3 修改三 

4.1.4 修改四

4.2 HS-FPN的yaml文件和训练截图

4.2.1 HS-FPN的yaml版本一(推荐)

4.2.2 HS-FPN的yaml版本二

4.2 HS-FPN的训练过程截图 

五、本文总结


二、HS-FPN原理

dc5fc59fbdae4c919232c28df8009d0f.png

论文地址:论文官方链接

代码地址:代码官方链接

610b78849060477ca986c2d71398cf80.png


2.1  HS-FPN的基本原理

HS-FPN(High-level Screening-feature Fusion Pyramid Networks)是一种为白细胞检测设计的网络结构,主要用于解决白细胞数据集中的多尺度挑战。它的基本原理包括两个关键部分:特征选择模块特征融合模块

HS-FPN的结构如下图所示,包括两个主要组成部分:

2eafc944fb234fc5b384934ecd97a0a8.png

1. 特征选择模块:该模块利用通道注意力(CA)和维度匹配(DM)机制对不同尺度的特征图进行筛选。通过池化操作(如全局平均池化和全局最大池化)和权重计算,该模块有效地提取了每个通道中的重要信息。

2. 特征融合模块:该模块通过选择性特征融合(SFF)机制将筛选后的低级特征和高级特征结合起来。高级特征扩展后,通过双线性插值或转置卷积进行尺度调整,然后与低级特征融合,从而增强模型对白细胞特征的表达能力。

总的来说,HS-FPN通过这两个模块协同工作,有效地解决了白细胞检测中的多尺度问题,提高了检测的准确性和鲁棒性。


2.2  SSF模块

选择性特征融合(Selective Feature Fusion, SFF)是HS-FPN网络中的一个关键组件,它的主要作用是融合不同尺度的特征图。SFF通过使用高级特征作为权重来过滤低尺度特征中的重要信息。在这个过程中,高级特征经过转置卷积和双线性插值操作进行尺度调整,以匹配低尺度特征的尺寸。然后,利用高级特征作为注意力权重,筛选出低尺度特征中有用的信息。这种融合方法能够有效地结合高级特征的语义信息和低尺度特征的细节信息,从而提高模型在处理多尺度问题时的性能。

 下图为大家展示了SFF模块的框架结构:

4ab051fb7d174d31add86d1ac4ad0e7d.png

给定一个输入高级特征eq?f_%7Bhigh%7D%5Cepsilon%20R%5E%7BC*H*W%7D和一个输入低尺度特征eq?f_%7Blow%7D%5Cepsilon%20R%5E%7BC*H*W_%7B1%7D%7D,高级特征首先使用一个大小为2,核大小为3x3的转置卷积(T-Conv)进行扩展,得到特征大小eq?f_%7Bhigh%7D%5Cepsilon%20R%5E%7BC*2H*2W%7D

然后,为了统一高级特征和低尺度特征的维度,作者使用双线性插值来向上或向下采样高级特征,得到特征eq?f_%7Batt%7D%5Cepsilon%20R%5E%7BC*H_%7B1%7D*W_%7B1%7D%7D。接下来,使用CA模块将高级特征转换为相应的注意力权重,以过滤低尺度特征,在获得具有相同维度的特征后。

最后,将过滤后的低尺度特征与高级特征融合,以增强模型的特征表示,并得到eq?f_%7Bout%7D%5Cepsilon%20R%5E%7BC*H_%7B1%7D*W_%7B1%7D%7D。方程(1)和(2)说明了特征选择的融合过程:

65f82ddf139441b29ef26fd1349271af.png


三、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 dimensiondef __init__(self, ch=256):super().__init__()def forward(self, x):input1, input2 = x[0], x[1]x = input1 + input2return xclass multiply(nn.Module):def __init__(self):super().__init__()def forward(self, x):x = x[0] * x[1]return xclass CA(nn.Module):def __init__(self, in_planes, ratio = 4, flag=True):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, bias=False)self.relu = nn.ReLU()self.conv2 = nn.Conv2d(in_planes // ratio, in_planes, 1, bias=False)self.flag = flagself.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_outout = self.sigmoid(out) * x if self.flag else self.sigmoid(out)return outclass FeatureSelectionModule(nn.Module):def __init__(self, in_chan, out_chan):super(FeatureSelectionModule, self).__init__()self.conv_atten = nn.Conv2d(in_chan, in_chan, kernel_size=1)self.group_norm1 = nn.GroupNorm(32, in_chan)self.sigmoid = nn.Sigmoid()self.conv = nn.Conv2d(in_chan, out_chan, kernel_size=1)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 + featfeat = self.group_norm2(self.conv(x))return featif __name__ == "__main__":# Generating Sample imageimage_size = (1, 64, 240, 240)image = torch.rand(*image_size)# Modelmobilenet_v3 = FeatureSelectionModule(64, 64)out = mobilenet_v3(image)print(out.size())


四、手把手教你添加HS-FPN 

4.1 HS-FPN添加步骤

4.1.1 修改一

首先我们找到如下的目录'yolov9-main/models',然后在这个目录下在创建一个新的目录然后这个就是存储改进的仓库,大家可以在这里新建所有的改进的py文件,对应改进的文件名字可以根据你自己的习惯起(不影响任何但是下面导入的时候记住改成你对应的即可),然后将HS-FPN 的核心代码复制进去。


4.1.2 修改二

然后在新建的目录里面我们在新建一个__init__.py文件(此文件大家只需要建立一个即可),然后我们在里面添加导入我们模块的代码。注意标记一个'.'其作用是标记当前目录。


4.1.3 修改三 

然后我们找到如下文件''models/yolo.py''在开头的地方导入我们的模块按照如下修改->

(如果你看了我多个改进机制此处只需要添加一个即可,无需重复添加)

注意的添加位置要放在common的导入上面!!!!!

5af82969538846b0ad386aa4acd733dd.png​​​​


4.1.4 修改四

然后我们找到''models/yolo.py''文件中的parse_model方法,按照如下修改->

3b5e1471ac054f6c8e50ffd57a080b7a.png

        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]]

到此就修改完成了,复制下面的ymal文件即可运行。


4.2 HS-FPN的yaml文件和训练截图

4.2.1 HS-FPN的yaml版本一(推荐)

下面的添加HS-FPN是我实验结果的版本,这个版本为官方一比一复现的版本。

# YOLOv9# parameters
nc: 80  # number of classes
depth_multiple: 1  # model depth multiple
width_multiple: 1  # layer channel multiple
#activation: nn.LeakyReLU(0.1)
#activation: nn.ReLU()# anchors
anchors: 3# YOLOv9 backbone
backbone:[[-1, 1, Silence, []],# conv down[-1, 1, Conv, [64, 3, 2]],  # 1-P1/2# conv down[-1, 1, Conv, [128, 3, 2]],  # 2-P2/4# elan-1 block[-1, 1, RepNCSPELAN4, [256, 128, 64, 1]],  # 3# conv down[-1, 1, Conv, [256, 3, 2]],  # 4-P3/8# elan-2 block[-1, 1, RepNCSPELAN4, [512, 256, 128, 1]],  # 5# conv down[-1, 1, Conv, [512, 3, 2]],  # 6-P4/16# elan-2 block[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 7# conv down[-1, 1, Conv, [512, 3, 2]],  # 8-P5/32# elan-2 block[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 9]# YOLOv9 head
head:[# elan-spp block[-1, 1, SPPELAN, [512, 256]],  # 10[ -1, 1, CA, [ ] ], # 11[ -1, 1, nn.Conv2d, [ 256, 1 ] ], # 12[ -1, 1, RepNCSPELAN4, [256, 256, 128, 1] ], # 13 P5[ 7, 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, 1, RepNCSPELAN4, [256, 256, 128, 1]], # 20 P4[ 5, 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, 1, RepNCSPELAN4, [256, 256, 128, 1]], # 27 P3# routing + 5[5, 1, CBLinear, [[256]]], # 28[7, 1, CBLinear, [[256, 512]]], # 29[9, 1, CBLinear, [[256, 512, 512]]], # 30# conv down[0, 1, Conv, [64, 3, 2]],  # 31-P1/2# conv down[-1, 1, Conv, [128, 3, 2]],  # 32-P2/4# elan-1 block[-1, 1, RepNCSPELAN4, [256, 128, 64, 1]],  # 33# conv down fuse[-1, 1, Conv, [256, 3, 2]],  # 34-P3/8[[28, 29, 30, -1], 1, CBFuse, [[0, 0, 0]]], # 35# elan-2 block[-1, 1, RepNCSPELAN4, [512, 256, 128, 1]],  # 36# conv down fuse[-1, 1, Conv, [512, 3, 2]],  # 37-P4/16[[29, 30, -1], 1, CBFuse, [[1, 1]]], # 38# elan-2 block[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 39# conv down fuse[-1, 1, Conv, [512, 3, 2]],  # 40-P5/32[[30, -1], 1, CBFuse, [[2]]], # 41# elan-2 block[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 42# detect[[36, 39, 42, 13, 20, 27], 1, DualDDetect, [nc]],  # DualDDetect(A3, A4, A5, P3, P4, P5)]


4.2.2 HS-FPN的yaml版本二

添加的版本二具体那种适合你需要大家自己多做实验来尝试,此版本把通道数改回了YOLOv5的版本。

# YOLOv9# parameters
nc: 80  # number of classes
depth_multiple: 1  # model depth multiple
width_multiple: 1  # layer channel multiple
#activation: nn.LeakyReLU(0.1)
#activation: nn.ReLU()# anchors
anchors: 3# YOLOv9 backbone
backbone:[[-1, 1, Silence, []],# conv down[-1, 1, Conv, [64, 3, 2]],  # 1-P1/2# conv down[-1, 1, Conv, [128, 3, 2]],  # 2-P2/4# elan-1 block[-1, 1, RepNCSPELAN4, [256, 128, 64, 1]],  # 3# conv down[-1, 1, Conv, [256, 3, 2]],  # 4-P3/8# elan-2 block[-1, 1, RepNCSPELAN4, [512, 256, 128, 1]],  # 5# conv down[-1, 1, Conv, [512, 3, 2]],  # 6-P4/16# elan-2 block[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 7# conv down[-1, 1, Conv, [512, 3, 2]],  # 8-P5/32# elan-2 block[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 9]# YOLOv9 head
head:[# elan-spp block[-1, 1, SPPELAN, [512, 256]],  # 10[ -1, 1, CA, [ ] ], # 11[ -1, 1, nn.Conv2d, [ 256, 1 ] ], # 12[ -1, 1, RepNCSPELAN4, [256, 256, 128, 1] ], # 13 P5[ 7, 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, 1, RepNCSPELAN4, [512, 256, 128, 1]], # 20 P4[ 5, 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, 1, RepNCSPELAN4, [512, 256, 128, 1]], # 27 P3# routing + 5[5, 1, CBLinear, [[256]]], # 28[7, 1, CBLinear, [[256, 512]]], # 29[9, 1, CBLinear, [[256, 512, 512]]], # 30# conv down[0, 1, Conv, [64, 3, 2]],  # 31-P1/2# conv down[-1, 1, Conv, [128, 3, 2]],  # 32-P2/4# elan-1 block[-1, 1, RepNCSPELAN4, [256, 128, 64, 1]],  # 33# conv down fuse[-1, 1, Conv, [256, 3, 2]],  # 34-P3/8[[28, 29, 30, -1], 1, CBFuse, [[0, 0, 0]]], # 35# elan-2 block[-1, 1, RepNCSPELAN4, [512, 256, 128, 1]],  # 36# conv down fuse[-1, 1, Conv, [512, 3, 2]],  # 37-P4/16[[29, 30, -1], 1, CBFuse, [[1, 1]]], # 38# elan-2 block[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 39# conv down fuse[-1, 1, Conv, [512, 3, 2]],  # 40-P5/32[[30, -1], 1, CBFuse, [[2]]], # 41# elan-2 block[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 42# detect[[36, 39, 42, 13, 20, 27], 1, DualDDetect, [nc]],  # DualDDetect(A3, A4, A5, P3, P4, P5)]


4.2 HS-FPN的训练过程截图 

大家可以看下面的运行结果和添加的位置所以不存在我发的代码不全或者运行不了的问题大家有问题也可以在评论区评论我看到都会为大家解答(我知道的)。

​​​​​​


五、本文总结

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

希望大家阅读完以后可以给文章点点赞和评论支持一下这样购买专栏的人越多群内人越多大家交流的机会就更多了。  

专栏地址:YOLOv9有效涨点专栏-持续复现各种顶会内容-有效涨点-全网改进最全的专栏 

这篇关于YOLOv9改进策略 | Neck篇 | 2024.1最新MFDS-DETR的HS-FPN改进特征融合层(轻量化Neck、全网独家首发)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/919141

相关文章

Redis多种内存淘汰策略及配置技巧分享

《Redis多种内存淘汰策略及配置技巧分享》本文介绍了Redis内存满时的淘汰机制,包括内存淘汰机制的概念,Redis提供的8种淘汰策略(如noeviction、volatile-lru等)及其适用场... 目录前言一、什么是 Redis 的内存淘汰机制?二、Redis 内存淘汰策略1. pythonnoe

Golang的CSP模型简介(最新推荐)

《Golang的CSP模型简介(最新推荐)》Golang采用了CSP(CommunicatingSequentialProcesses,通信顺序进程)并发模型,通过goroutine和channe... 目录前言一、介绍1. 什么是 CSP 模型2. Goroutine3. Channel4. Channe

Python 中 requests 与 aiohttp 在实际项目中的选择策略详解

《Python中requests与aiohttp在实际项目中的选择策略详解》本文主要介绍了Python爬虫开发中常用的两个库requests和aiohttp的使用方法及其区别,通过实际项目案... 目录一、requests 库二、aiohttp 库三、requests 和 aiohttp 的比较四、requ

Redis过期键删除策略解读

《Redis过期键删除策略解读》Redis通过惰性删除策略和定期删除策略来管理过期键,惰性删除策略在键被访问时检查是否过期并删除,节省CPU开销但可能导致过期键滞留,定期删除策略定期扫描并删除过期键,... 目录1.Redis使用两种不同的策略来删除过期键,分别是惰性删除策略和定期删除策略1.1惰性删除策略

Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)

《Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)》:本文主要介绍Python基于火山引擎豆包大模型搭建QQ机器人详细的相关资料,包括开通模型、配置APIKEY鉴权和SD... 目录豆包大模型概述开通模型付费安装 SDK 环境配置 API KEY 鉴权Ark 模型接口Prompt

Spring Boot 中整合 MyBatis-Plus详细步骤(最新推荐)

《SpringBoot中整合MyBatis-Plus详细步骤(最新推荐)》本文详细介绍了如何在SpringBoot项目中整合MyBatis-Plus,包括整合步骤、基本CRUD操作、分页查询、批... 目录一、整合步骤1. 创建 Spring Boot 项目2. 配置项目依赖3. 配置数据源4. 创建实体类

Java子线程无法获取Attributes的解决方法(最新推荐)

《Java子线程无法获取Attributes的解决方法(最新推荐)》在Java多线程编程中,子线程无法直接获取主线程设置的Attributes是一个常见问题,本文探讨了这一问题的原因,并提供了两种解决... 目录一、问题原因二、解决方案1. 直接传递数据2. 使用ThreadLocal(适用于线程独立数据)

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费