【YOLOv8改进】 SAConv(Switchable Atrous Convolution):可切换的空洞卷积

简介: **DetectoRS是目标检测的先进网络,融合递归特征金字塔和可切换空洞卷积。递归金字塔在FPN基础上增加反馈,增强特征表示。SAC使用不同空洞率卷积并用开关函数融合,适应不同尺度目标。在COCO数据集上,DetectoRS达到55.7%的Box AP,48.5%的Mask AP和50.0%的

摘要

许多现代目标检测器通过采用二次观察和思考机制展示了卓越的性能。在本文中,我们在目标检测的主干设计中探索了这一机制。在宏观层面上,我们提出了递归特征金字塔(Recursive Feature Pyramid),该金字塔将特征金字塔网络(Feature Pyramid Networks)的额外反馈连接融入到底层的自下而上主干层中。在微观层面上,我们提出了可切换空洞卷积(Switchable Atrous Convolution),该卷积通过不同的空洞率卷积特征,并使用切换函数汇集结果。结合这些方法,我们提出了DetectoRS,它显著提升了目标检测的性能。在COCO test-dev数据集上,DetectoRS实现了最先进的55.7%的目标检测框AP、48.5%的实例分割掩码AP和50.0%的全景分割PQ。代码已公开发布。

文章链接

论文地址:论文地址

代码地址:代码地址

YOLO目标检测创新改进与实战案例专栏

专栏目录: YOLO有效改进系列及项目实战目录 包含卷积,主干 注意力,检测头等创新机制 以及 各种目标检测分割项目实战案例

专栏链接: YOLO基础解析+创新改进+实战案例

基本原理

Switchable Atrous Convolution(SAC)是DetectoRS目标检测系统的关键组件之一。它涉及将输入特征与不同的空洞率进行卷积,并利用开关函数将结果组合在一起。

  1. 空洞卷积:空洞卷积用于扩大滤波器的视野,而不增加参数或计算量。它根据空洞率𝑟在滤波器值之间引入零,从而扩大有效的核大小。

  2. Switchable Atrous Convolution(SAC)

    • 功能:SAC将输入特征与不同的空洞率进行卷积,并利用开关函数将结果组合在一起。
    • 空间依赖性:开关函数是空间相关的,允许特征图上的不同位置具有不同的开关,控制SAC的输出。
    • 转换:将骨干网络中的标准3x3卷积层转换为SAC,显著提高检测器性能。
    • 示例:SAC的概念在图4中有所说明,显示了如何在不同的空洞率之间软切换卷积计算。
  3. 优势

    • 适应性:SAC通过为较大的对象使用较大的空洞率,适应不同的对象尺度。
    • 性能:通过将SAC纳入检测器中,实现了目标检测性能的显著提升。

原理

Switchable Atrous Convolution(SAC)结合了双重观察机制和开关函数

  1. 双重观察机制的技术原理

    • 宏观层面:通过在特征金字塔网络(FPN)的输出和底层骨干网络之间添加反馈连接,实现了对特征的多次增强和迭代处理。这种反馈机制使得特征能够在不同层级上进行多次观察和处理,从而提高了特征的表征能力和鲁棒性。
    • 微观层面:在微观层面,SAC通过在卷积过程中使用不同的空洞率和开关函数来实现“看两次”的概念。不同空洞率的卷积操作能够捕获不同尺度的特征信息,而开关函数则动态地选择不同空洞率下的卷积结果,以适应不同位置和尺度的特征需求。
  2. 开关函数的应用技术原理

    • 空间适应性:开关函数在空间上是位置相关的,允许不同位置的特征图有不同的开关控制,以实现对特征的精细调节和整合。
    • 特征融合:开关函数动态地选择不同空洞率下的卷积结果,并将它们组合在一起,以获得更丰富和准确的特征表示。
    • 性能提升:通过开关函数的应用,SAC能够适应不同尺度的对象,并在目标检测任务中提升性能,使系统更具鲁棒性和泛化能力。

yolov8 代码引入

class SAConv2d(ConvAWS2d):
    def __init__(self, in_channels, out_channels, kernel_size, s=1, p=None, g=1, d=1, act=True, bias=True):
        super().__init__(
            in_channels, out_channels, kernel_size, stride=s, padding=autopad(kernel_size, p), dilation=d, groups=g, bias=bias)
        # 定义一个1x1卷积作为开关机制
        self.switch = torch.nn.Conv2d(
            self.in_channels, 1, kernel_size=1, stride=s, bias=True)
        self.switch.weight.data.fill_(0)
        self.switch.bias.data.fill_(1)
        # 参数,用于调整权重差异
        self.weight_diff = torch.nn.Parameter(torch.Tensor(self.weight.size()))
        self.weight_diff.data.zero_()
        # 预先和后续的1x1卷积,用于实现上下文依赖
        self.pre_context = torch.nn.Conv2d(
            self.in_channels, self.in_channels, kernel_size=1, bias=True)
        self.pre_context.weight.data.fill_(0)
        self.pre_context.bias.data.fill_(0)
        self.post_context = torch.nn.Conv2d(
            self.out_channels, self.out_channels, kernel_size=1, bias=True)
        self.post_context.weight.data.fill_(0)
        self.post_context.bias.data.fill_(0)

        # 批归一化和激活函数
        self.bn = nn.BatchNorm2d(out_channels)
        self.act = nn.SiLU() if act is True else (act if isinstance(act, nn.Module) else nn.Identity())

    def forward(self, x):
        # 前置上下文模块,增强输入特征
        avg_x = torch.nn.functional.adaptive_avg_pool2d(x, output_size=1)
        avg_x = self.pre_context(avg_x)
        avg_x = avg_x.expand_as(x)
        x = x + avg_x
        # 使用开关控制不同的卷积核
        avg_x = torch.nn.functional.pad(x, pad=(2, 2, 2, 2), mode="reflect")
        avg_x = torch.nn.functional.avg_pool2d(avg_x, kernel_size=5, stride=1, padding=0)
        switch = self.switch(avg_x)
        # 标准化权重并进行卷积
        weight = self._get_weight(self.weight)
        out_s = super()._conv_forward(x, weight, None)
        ori_p = self.padding
        ori_d = self.dilation
        self.padding = tuple(3 * p for p in self.padding)
        self.dilation = tuple(3 * d for d in self.dilation)
        weight = weight + self.weight_diff
        out_l = super()._conv_forward(x, weight, None)
        out = switch * out_s + (1 - switch) * out_l
        self.padding = ori_p
        self.dilation = ori_d
        # 后置上下文模块,增强输出特征
        avg_x = torch.nn.functional.adaptive_avg_pool2d(out, output_size=1)
        avg_x = self.post_context(avg_x)
        avg_x = avg_x.expand_as(out)
        out = out + avg_x
        return self.act(self.bn(out))

task与yaml配置

详见:https://blog.csdn.net/shangyanaf/article/details/139393928

相关文章
|
6月前
|
机器学习/深度学习 数据可视化 计算机视觉
YOLOv8改进 | 2023注意力篇 | MSDA多尺度空洞注意力(附多位置添加教程)
YOLOv8改进 | 2023注意力篇 | MSDA多尺度空洞注意力(附多位置添加教程)
498 0
|
16天前
|
机器学习/深度学习 计算机视觉
【YOLOv11改进 - 注意力机制】 MSDA(Multi-Scale Dilated Attention):多尺度空洞注意力
【YOLOv11改进 - 注意力机制】 MSDA(Multi-Scale Dilated Attention):多尺度空洞注意力本文介绍了一种高效的视觉变换器——DilateFormer,通过多尺度扩张注意力(MSDA)模块,在保持高性能的同时显著降低计算成本。MSDA通过在滑动窗口内模拟局部和稀疏的块交互,实现了多尺度特征聚合。实验结果显示,DilateFormer在ImageNet-1K分类、COCO对象检测/实例分割和ADE20K语义分割任务上均取得了优异的性能,且计算成本比现有模型减少70%。
【YOLOv11改进 - 注意力机制】 MSDA(Multi-Scale Dilated Attention):多尺度空洞注意力
|
6月前
|
机器学习/深度学习 编解码 边缘计算
YOLOv5改进 | 卷积模块 | 用ShuffleNetV2卷积替换Conv【轻量化网络】
本文介绍了如何在YOLOv5中用ShuffleNetV2替换卷积以减少计算量。ShuffleNetV2是一个轻量级网络,采用深度可分离卷积、通道重组和多尺度特征融合技术。文中提供了一个逐步教程,包括ShuffleNetV2模块的代码实现和在YOLOv5配置文件中的添加方法。此外,还分享了完整的代码链接和GFLOPs的比较,显示了GFLOPs的显著减少。该教程适合初学者实践,以提升深度学习目标检测技能。
YOLOv5改进 | 卷积模块 | 用ShuffleNetV2卷积替换Conv【轻量化网络】
|
4月前
|
机器学习/深度学习 计算机视觉
【YOLOv10改进-卷积Conv】SCConv :即插即用的空间和通道重建卷积
YOLOv10专栏介绍了将Swin Transformer应用于目标检测的创新。Swin Transformer采用分层窗口结构,解决了视觉任务中的尺度变化问题,提供线性复杂度的效率提升。在图像分类、目标检测和语义分割任务中表现出色,超越先前最佳模型。YOLOv10结合Swin Transformer,利用其局部注意力机制和层次化设计,提升了检测性能。提供的代码片段展示了Swin Transformer模块,包括窗口划分、注意力计算和相对位置偏置。更多信息可在相关博客文章中找到。
|
4月前
|
机器学习/深度学习 计算机视觉
【YOLOv10改进-卷积Conv】RFAConv:感受野注意力卷积,创新空间注意力
【YOLO目标检测专栏】探索空间注意力局限,提出感受野注意力(RFA)机制,解决卷积核参数共享问题。RFAConv增强大尺寸卷积核处理能力,不增加计算成本,提升网络性能。已在YOLOv8中实现,详情见YOLO目标检测创新改进与实战案例专栏。
|
4月前
|
机器学习/深度学习 编解码 计算机视觉
【YOLOv10改进-卷积Conv】 SPD-Conv空间深度转换卷积,处理低分辨率图像和小对象问题
YOLO目标检测专栏探讨了CNN在低分辨率和小目标检测中的局限性,提出SPD-Conv新架构,替代步长卷积和池化层,通过空间到深度层和非步长卷积保持细粒度信息。创新点包括消除信息损失、通用设计和性能提升。YOLOv5和ResNet应用SPD-Conv后,在困难任务上表现优越。详情见YOLO有效改进系列及项目实战目录。
|
5月前
|
机器学习/深度学习 计算机视觉 网络架构
【YOLOv8改进-卷积Conv】DualConv( Dual Convolutional):用于轻量级深度神经网络的双卷积核
**摘要:** 我们提出DualConv,一种融合$3\times3$和$1\times1$卷积的轻量级DNN技术,适用于资源有限的系统。它通过组卷积结合两种卷积核,减少计算和参数量,同时增强准确性。在MobileNetV2上,参数减少54%,CIFAR-100精度仅降0.68%。在YOLOv3中,DualConv提升检测速度并增4.4%的PASCAL VOC准确性。论文及代码已开源。
|
5月前
|
机器学习/深度学习 计算机视觉
YOLOv8改进 | 卷积模块 | 用坐标卷积CoordConv替换Conv
💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡
|
机器学习/深度学习 PyTorch 算法框架/工具
空间金字塔池化(Spatial Pyramid Pooling, SPP)原理和代码实现(Pytorch)
想直接看公式的可跳至第三节 3.公式修正 一、为什么需要SPP 首先需要知道为什么会需要SPP。 我们都知道卷积神经网络(CNN)由卷积层和全连接层组成,其中卷积层对于输入数据的大小并没有要求,唯一对数据大小有要求的则是第一个全连接层,因此基本上所有的CNN都要求输入数据固定大小,例如著名的VGG模型则要求输入数据大小是 (224*224) 。
2197 0
|
6月前
YOLOv8改进 | SAConv可切换空洞卷积(附修改后的C2f+Bottleneck)
YOLOv8改进 | SAConv可切换空洞卷积(附修改后的C2f+Bottleneck)
338 0