YOLOv9独家改进|动态蛇形卷积Dynamic Snake Convolution与空间和通道重建卷积SCConv与RepNCSPELAN4融合


专栏介绍:YOLOv9改进系列 | 包含深度学习最新创新,主力高效涨点!!!


一、改进点介绍

        Dynamic Snake Convolution是一种针对细长微弱的局部结构特征复杂多变的全局形态特征设计的卷积模块。

        SCConv是一种即插即用的空间和通道重建卷积。

        RepNCSPELAN4是YOLOv9中的特征提取模块,类似YOLOv5和v8中的C2f与C3模块。        


二、DS-RepNCSPELAN4模块详解

 2.1 模块简介

       DS-RepNCSPELAN4的主要思想:  使用Dynamic Snake Convolution、SCConv与RepNCSPELAN4中融合。


三、 DS-RepNCSPELAN4模块使用教程

3.1 DS-RepNCSPELAN4模块的代码

class RepConvN_SC(RepConvN):
    """RepConv is a basic rep-style block, including training and deploy status
    This code is based on https://github.com/DingXiaoH/RepVGG/blob/main/repvgg.py
    """
    default_act = nn.SiLU()  # default activation
 
    def __init__(self, c1, c2, k=3, s=1, p=1, g=1, d=1, act=True, bn=False, deploy=False):
        super().__init__(c1, c2, k, s, p, g, d, act, bn, deploy)
        assert k == 3 and p == 1
        self.g = g
        self.c1 = c1
        self.c2 = c2
        self.act = self.default_act if act is True else act if isinstance(act, nn.Module) else nn.Identity()
 
        self.bn = None
        self.conv1 = SCConv(c1, c2, k, s, p=p, g=g)
        self.conv2 = Conv(c1, c2, 1, s, p=(p - k // 2), g=g, act=False)
 
 
class RepNBottleneck_SC(RepNBottleneck):
    # Standard bottleneck
    def __init__(self, c1, c2, shortcut=True, g=1, k=(3, 3), e=0.5):  # ch_in, ch_out, shortcut, kernels, groups, expand
        super().__init__( c1, c2, shortcut, g, k, e)
        c_ = int(c2 * e)  # hidden channels
        self.cv1 = RepConvN_SC(c1, c_, k[0], 1)
        self.cv2 = SCConv(c_, c2, k[1], s=1, g=g)
        self.add = shortcut and c1 == c2
 
 
class RepNCSP_SCConv(RepNCSP):
    # CSP Bottleneck with 3 convolutions
    def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):  # ch_in, ch_out, number, shortcut, groups, expansion
        super().__init__(c1, c2, n, shortcut, g, e)
        c_ = int(c2 * e)  # hidden channels
        self.cv1 = Conv(c1, c_)
        self.cv2 = Conv(c1, c_)
        self.cv3 = Conv(2 * c_, c2)  # optional act=FReLU(c2)
        self.m = nn.Sequential(*(RepNBottleneck_SC(c_, c_, shortcut, g, e=1.0) for _ in range(n)))
 
 
 
class SCConv(nn.Module):
    """https://github.com/MCG-NKU/SCNet/blob/master/scnet.py"""
    def __init__(self, inplanes, planes,k=3, s=1, p=1, dilation=1, g=1, pooling_r=4):
        super(SCConv, self).__init__()
        self.k2 = nn.Sequential(
                    nn.AvgPool2d(kernel_size=pooling_r, stride=pooling_r),
                    Conv(inplanes, planes, k=k, s=s, p=p, d=dilation, g=g, act=False))
        self.k3 = Conv(inplanes, planes, k=k, s=s, p=p, d=dilation, g=g, act=False)
 
        self.k4 = Conv(inplanes, planes, k=k, s=s, p=p, d=dilation, g=g, act=False)
 
    def forward(self, x):
        identity = x
 
        out = torch.sigmoid(torch.add(identity, F.interpolate(self.k2(x), identity.size()[2:]))) # sigmoid(identity + k2)
        out = torch.mul(self.k3(x), out)    # k3 * sigmoid(identity + k2)
        out = self.k4(out)  # k4
 
        return out
 
 
 
class DS_RepNCSPELAN4(RepNCSPELAN4):
    # csp-elan
    def __init__(self, c1, c2, c3, c4, c5=1):  # ch_in, ch_out, number, shortcut, groups, expansion
        super().__init__(c1, c2, c3, c4, c5)
        self.cv1 = Conv(c1, c3, k=1, s=1)
        self.cv2 = nn.Sequential(RepNCSP_SCConv(c3 // 2, c4, c5), DySnakeConv(c4, c4, 3))
        self.cv3 = nn.Sequential(RepNCSP_SCConv(c4, c4, c5), DySnakeConv(c4, c4, 3))
        self.cv4 = Conv(c3 + (2 * c4), c2, 1, 1)

3.2 在YOlO v9中的添加教程

阅读YOLOv9添加模块教程或使用下文操作

        1. 将YOLOv9工程中models下common.py文件中的最下行(否则可能因类继承报错)增加模块的代码。

         2. 将YOLOv9工程中models下yolo.py文件中的第681行(可能因版本变化而变化)增加以下代码。

            RepNCSPELAN4, SPPELAN, DS_RepNCSPELAN4}:

3.3 运行配置文件

# YOLOv9
# Powered bu https://blog.csdn.net/StopAndGoyyy
 
# parameters
nc: 80  # number of classes
#depth_multiple: 0.33  # model depth multiple
depth_multiple: 1  # model depth multiple
#width_multiple: 0.25  # layer channel 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, DS_RepNCSPELAN4, [256, 128, 64, 1]],  # 3
 
   # avg-conv down
   [-1, 1, ADown, [256]],  # 4-P3/8
 
   # elan-2 block
   [-1, 1, RepNCSPELAN4, [512, 256, 128, 1]],  # 5
 
   # avg-conv down
   [-1, 1, ADown, [512]],  # 6-P4/16
 
   # elan-2 block
   [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 7
 
   # avg-conv down
   [-1, 1, ADown, [512]],  # 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
 
   # up-concat merge
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 7], 1, Concat, [1]],  # cat backbone P4
 
   # elan-2 block
   [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 13
 
   # up-concat merge
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 5], 1, Concat, [1]],  # cat backbone P3
 
   # elan-2 block
   [-1, 1, RepNCSPELAN4, [256, 256, 128, 1]],  # 16 (P3/8-small)
 
   # avg-conv-down merge
   [-1, 1, ADown, [256]],
   [[-1, 13], 1, Concat, [1]],  # cat head P4
 
   # elan-2 block
   [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 19 (P4/16-medium)
 
   # avg-conv-down merge
   [-1, 1, ADown, [512]],
   [[-1, 10], 1, Concat, [1]],  # cat head P5
 
   # elan-2 block
   [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 22 (P5/32-large)
   
   
   # multi-level reversible auxiliary branch
   
   # routing
   [5, 1, CBLinear, [[256]]], # 23
   [7, 1, CBLinear, [[256, 512]]], # 24
   [9, 1, CBLinear, [[256, 512, 512]]], # 25
   
   # conv down
   [0, 1, Conv, [64, 3, 2]],  # 26-P1/2
 
   # conv down
   [-1, 1, Conv, [128, 3, 2]],  # 27-P2/4
 
   # elan-1 block
   [-1, 1, RepNCSPELAN4, [256, 128, 64, 1]],  # 28
 
   # avg-conv down fuse
   [-1, 1, ADown, [256]],  # 29-P3/8
   [[23, 24, 25, -1], 1, CBFuse, [[0, 0, 0]]], # 30  
 
   # elan-2 block
   [-1, 1, RepNCSPELAN4, [512, 256, 128, 1]],  # 31
 
   # avg-conv down fuse
   [-1, 1, ADown, [512]],  # 32-P4/16
   [[24, 25, -1], 1, CBFuse, [[1, 1]]], # 33 
 
   # elan-2 block
   [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 34
 
   # avg-conv down fuse
   [-1, 1, ADown, [512]],  # 35-P5/32
   [[25, -1], 1, CBFuse, [[2]]], # 36
 
   # elan-2 block
   [-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 37
   
   
   
   # detection head
 
   # detect
   [[31, 34, 37, 16, 19, 22], 1, DualDDetect, [nc]],  # DualDDetect(A3, A4, A5, P3, P4, P5)
  ]

3.4 训练过程


欢迎关注!



http://www.niftyadmin.cn/n/5403992.html

相关文章

网络编程(IP、端口、协议、UDP、TCP)【详解】

目录 1.什么是网络编程? 2.基本的通信架构 3.网络通信三要素 4.UDP通信-快速入门 5.UDP通信-多发多收 6.TCP通信-快速入门 7.TCP通信-多发多收 8.TCP通信-同时接收多个客户端 9.TCP通信-综合案例 1.什么是网络编程? 网络编程是可以让设…

.NET高级面试指南专题十三【 单例模式介绍,用单例模式写个缓存器】

单例模式是一种常用的设计模式,其主要目的是确保一个类只有一个实例,并提供一个全局访问点。这在某些情况下很有用,特别是当系统中只应该存在一个实例时,如数据库连接、日志记录器、线程池等。 在C#中,实现单例模式有多…

pytorch loss函数整理

变量名解释 logits:未经过normalize(未经过激活函数处理)的原始分数,例如一个mlp将特征映射到num_target_class维的输出tensor就是logits。 probs:probabilities的简写,logits经过sigmoid函数,…

第二章:数据类型 第四节:矩阵

一、矩阵的基本概念 矩阵是一个按照长方形阵列排列的复数或则实数集合,是一个二维数组,需要由行和列。在R中,矩阵是有维数的向量,矩阵可以是数值型、字符型或逻辑型,但是所有列的数据类型必须相同。 二、创建矩阵 &…

C习题002:澡堂洗澡

问题 输入样例 在这里给出一组输入。例如&#xff1a; 2 5 1 3 3 2 3 3 输出样例 在这里给出相应的输出。例如&#xff1a; No代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB 栈限制 8192 KB 代码 #include<stdio.h> int main() {int N,W,s,t,p;int arr_s[…

git clone http/https 报错 10054/443 问题

文章目录 错误解决方案1 关闭http和https代理2 设置自己的代理 错误 错误 Failed to connect to github.com port 443: Timed out OpenSSL SSL_read: Connection was reset, errno 10054 一般都是网络问题 解决方案 1 关闭http和https代理 git config --global --unset htt…

【Eclipse插件开发】5JFace UI框架-上

【Eclipse插件开发】5JFace UI框架 文章目录 【Eclipse插件开发】5JFace UI框架前言JFace和工作台JFace和SWT一、 Viewers标准的Viewers面向列表的查看器文本查看器Viewer 架构输入元素内容查看器视图和工作台二、Actions and contributions (Deprecated)

ABAP - SALV教程05 添加页眉和页脚

先看看效果叭CL_SALV_TABLE提供了SET_TOP_OF_LIST方法设置页眉显示和SET_TOP_OF_LIST_PRINT方法设置页眉打印来实现添加页眉的目的。CL_SALV_TABLE提供了SET_END_OF_LIST方法设置页脚显示和SET_END_OF_LIST_PRINT方法设置页脚打印来实现添加页脚的目的。这个四个方法的传入参数…