关于YOLO系列直接做一些即插即用的小改进

其实做一些这种改进对研究生来讲几乎是没有意义的,但是对于本科生来说,多做几个这种的改进就够本科毕业了哈哈哈哈哈,无论效果好不好,反正是有的写了。

由于网上充斥着大量的YOLO系列检测代码,所以在这里我以yolov5举例,当然,这里所做的一些方法完全可以用到yolov7中,如果大家想看的话,我再专门出几期yolov7的换主干或者改进的文章。

首先,你需要有一些即插即用的模块,一般来讲很好找,无论是烂大街的通道注意力,空间注意力,还是一些新文章中比较知名的模块,我们都可以拿来用。然后怎么改进我们的方法里呢?我一直认为简单清晰的才是最好的,所以可以看我之前发的几篇博文,三步走方法。

1,找到合适的模块,并且把这个模块拷贝到models/common.py中。

一般找到模块后,我们要注意到他的参数是什么,输入输出又是什么,最简单的就是找输入输出之后,特征的尺寸没有任何变化的,这样的即插即用的方法有一大堆,比如多种注意力机制,这里我给大家介绍一个新出的涨点神器,以这个模块为例子,讲解如何改进方法。

这个是CVPR2023 InceptionNeXt当Inception遇见ConvNeXt,他的论文地址是:https://arxiv.org/pdf/2303.16900.pdf

代码地址是:GitHub - sail-sg/inceptionnext: InceptionNeXt: When Inception Meets ConvNeXt

然后我找到了这个核心模块,接下来就以yolov5s举例,改进到这个方法里,我们把下面的代码拷贝到models/common.py中,放到最后就可以了,尽量直接抄我的,因为我加了一个没有用的输出参数。

lass InceptionDWConv2d(nn.Module):
    def __init__(self, in_channels, out_channel,square_kernel_size=3, band_kernel_size=11, branch_ratio=0.125):
        super().__init__()

        gc = int(in_channels * branch_ratio)  # channel numbers of a convolution branch
        self.dwconv_hw = nn.Conv2d(gc, gc, square_kernel_size, padding=square_kernel_size // 2, groups=gc)
        self.dwconv_w = nn.Conv2d(gc, gc, kernel_size=(1, band_kernel_size), padding=(0, band_kernel_size // 2),
                                  groups=gc)
        self.dwconv_h = nn.Conv2d(gc, gc, kernel_size=(band_kernel_size, 1), padding=(band_kernel_size // 2, 0),
                                  groups=gc)
        self.split_indexes = (in_channels - 3 * gc, gc, gc, gc)

    def forward(self, x):
        x_id, x_hw, x_w, x_h = torch.split(x, self.split_indexes, dim=1)
        return torch.cat(
            (x_id, self.dwconv_hw(x_hw), self.dwconv_w(x_w), self.dwconv_h(x_h)),
            dim=1,
        )

2,把这个模块名字添加到models/yolo.py中

3,配置models/yolov5s.yaml文件

在配置之前,我们要注意一下这个模块的参数是什么,他的输入输出是什么,不难发现,参数就是输入特征的通道数,而他的输出并没有改变输入特征的尺寸,这就可以随便找位置添加了。主打的就是随心所欲,只要最后的通道数是匹配的就行。

关于YOLO系列直接做一些即插即用的小改进_第1张图片

谢谢大家,请求大家多多点赞,多多关注!

你可能感兴趣的:(YOLO)