0


有效涨点!用于低分辨率图像和小物体的新 CNN 模块SPD-Conv

《用于低分辨率图像和小物体的新 CNN 模块》

《No More Strided Convolutions or Pooling: A New CNN Building Block for Low-Resolution Images and Small Objects》
2022年8月7日发表在ECML PKDD 2022论文集上的最新paper
作者:来自于 Missouri 大学的 Raja Sunkara and Tie Luo
论文地址:https://arxiv.org/abs/2208.03641v1
项目地址:https://github.com/labsaint/spd-conv

文章目录

1 摘要精读

卷积神经网络(

CNN

)在图像分类、目标检测等计算机视觉任务中取得了巨大的成功。然而,在图像分辨率较低或对象较小的更困难的任务中,它们的性能会迅速下降。

这源于现有

CNN

体系结构中一个有缺陷但却很常见的设计,即使用

strided convolution

和/或

池化层

,这导致了细粒度信息的丢失和较低效率的特征表示的学习。为此,我们提出了一种新的

CNN

模块,称为

SPD-Conv

,以取代每个

strided convolution

和每个

池化层

(从而完全消除了它们)。

SPD-Conv

space-to-depth

(SPD)层和

non-strided convolution

(Conv)层组成,可以应用于大多数

CNN

架构。

我们在两个最具代表性的计算机视觉任务下解释了这种新的设计:目标检测和图像分类。然后,我们通过将

SPD-Conv

应用于

YOLOv5

ResNet

来创建新的

CNN

架构,实验表明我们的方法显著优于最先进的深度学习模型,特别是在处理低分辨率图像和小对象的更困难的任务时。


2 SPD-Conv原理

2.1 Space-to-depth(SPD)

SPD-Conv

由一个

SPD

层和一个

non-strided convolution

层组成,

SPD

组件将(原始)图像转换技术推广到对

CNN 

内部和整个

CNN

中的特征图进行下采样,如下所示
考虑任何大小为

    S
   
   
    ×
   
   
    S
   
   
    ×
   
   
    C
   
   
    1
   
  
  
   S × S × C1
  
 
S×S×C1的中间特征图 

 
  
   
    X
   
  
  
   X
  
 
X,切出一系列子特征图为

在这里插入图片描述

一般来说,给定任何(原始)特征图

    X
   
  
  
   X
  
 
X,子图 

 
  
   
    
     f
    
    
     
      x
     
     
      ,
     
     
      y
     
    
   
  
  
   f_{x,y}
  
 
fx,y​由 

 
  
   
    i
   
   
    +
   
   
    x
   
  
  
   i+x
  
 
i+x 和 

 
  
   
    i
   
   
    +
   
   
    y
   
  
  
   i+y
  
 
i+y 可按比例整除的所有条目

 
  
   
    X
   
   
    (
   
   
    i
   
   
    +
   
   
    y
   
   
    )
   
  
  
   X(i+y)
  
 
X(i+y) 形成。因此,每个子图按比例因子对

 
  
   
    X
   
  
  
   X
  
 
X进行下采样。下图给出了

 
  
   
    s
   
   
    c
   
   
    a
   
   
    l
   
   
    e
   
   
    =
   
   
    2
   
  
  
   scale=2
  
 
scale=2时的例子,得到4个子图

 
  
   
    
     f
    
    
     
      0
     
     
      ,
     
     
      0
     
    
   
  
  
   f_{0,0}
  
 
f0,0​ ,

 
  
   
    
     f
    
    
     
      1
     
     
      ,
     
     
      0
     
    
   
  
  
   f_{1,0}
  
 
f1,0​ ,

 
  
   
    
     f
    
    
     
      0
     
     
      ,
     
     
      1
     
    
   
  
  
   f_{0,1}
  
 
f0,1​ , 

 
  
   
    
     f
    
    
     
      1
     
     
      ,
     
     
      1
     
    
   
  
  
   f_{1,1}
  
 
f1,1​ 每个都具有形状

 
  
   
    (
   
   
    S
   
   
    /
   
   
    2
   
   
    ,
   
   
    S
   
   
    /
   
   
    2
   
   
    ,
   
   
    
     C
    
    
     1
    
   
   
    )
   
  
  
   (S/2,S/2,C_1)
  
 
(S/2,S/2,C1​)并将

 
  
   
    X
   
  
  
   X
  
 
X下采样 

 
  
   
    2
   
  
  
   2
  
 
2 倍。

scale = 2 时的 SPD-Conv 示意图

scale = 2 时的 SPD-Conv 示意图

接下来,沿着通道维度连接这些子特征图,从而获得一个特征图

     X
    
    
     ′
    
   
  
  
   X'
  
 
X′,它的空间维度减少了一个比例因子,通道维度增加了一个比例因子

 
  
   
    2
   
  
  
   2
  
 
2。换句话说,
SPD

将特征图

    X
   
   
    (
   
   
    S
   
   
    ,
   
   
    S
   
   
    ,
   
   
    
     C
    
    
     1
    
   
   
    )
   
  
  
   X(S,S,C_1)
  
 
X(S,S,C1​) 转换为中间特征图

 
  
   
    
     X
    
    
     ′
    
   
   
    (
   
   
    S
   
   
    /
   
   
    s
   
   
    a
   
   
    c
   
   
    l
   
   
    e
   
   
    ,
   
   
    S
   
   
    /
   
   
    s
   
   
    a
   
   
    c
   
   
    l
   
   
    e
   
   
    ,
   
   
    s
   
   
    c
   
   
    a
   
   
    l
   
   
    
     e
    
    
     2
    
   
   
    
     C
    
    
     1
    
   
   
    )
   
  
  
   X'(S/sacle,S/sacle,scale^2C_1)
  
 
X′(S/sacle,S/sacle,scale2C1​)

2.2 Non-strided Convolution

SPD

特征变换层之后,添加了一个带有

     C
    
    
     2
    
   
  
  
   C_2
  
 
C2​滤波器的非跨步(即 stride=1)卷积层,其中

 
  
   
    
     C
    
    
     2
    
   
   
    <
   
   
    s
   
   
    c
   
   
    a
   
   
    l
   
   
    
     e
    
    
     2
    
   
   
    
     C
    
    
     1
    
   
  
  
   C_2<scale^2C_1
  
 
C2​<scale2C1​ ,并进一步变换 

 
  
   
    
     X
    
    
     ′
    
   
   
    (
   
   
    S
   
   
    /
   
   
    s
   
   
    a
   
   
    c
   
   
    l
   
   
    e
   
   
    ,
   
   
    S
   
   
    /
   
   
    s
   
   
    a
   
   
    c
   
   
    l
   
   
    e
   
   
    ,
   
   
    s
   
   
    c
   
   
    a
   
   
    l
   
   
    
     e
    
    
     2
    
   
   
    
     C
    
    
     1
    
   
   
    →
   
   
    
     X
    
    
     
      ′
     
     
      ′
     
    
   
   
    (
   
   
    S
   
   
    /
   
   
    s
   
   
    a
   
   
    c
   
   
    l
   
   
    e
   
   
    ,
   
   
    S
   
   
    /
   
   
    s
   
   
    a
   
   
    c
   
   
    l
   
   
    e
   
   
    ,
   
   
    
     C
    
    
     2
    
   
   
    )
   
  
  
   X'(S/sacle,S/sacle,scale^2C_1→X''(S/sacle,S/sacle,C_2)
  
 
X′(S/sacle,S/sacle,scale2C1​→X′′(S/sacle,S/sacle,C2​) 。

使用非跨步卷积的原因是尽可能地保留所有的判别特征信息。否则,例如,使用

    s
   
   
    t
   
   
    r
   
   
    i
   
   
    d
   
   
    e
   
   
    =
   
   
    3
   
  
  
   stride=3
  
 
stride=3 的 

 
  
   
    3
   
   
    ×
   
   
    3
   
  
  
   3×3
  
 
3×3 卷积,特征图将“缩小”,但每个像素只采样一次;如果 

 
  
   
    s
   
   
    t
   
   
    r
   
   
    i
   
   
    d
   
   
    e
   
   
    =
   
   
    2
   
  
  
   stride=2
  
 
stride=2,将发生不对称采样,其中偶数和奇数行/列的采样时间不同。一般来说,步长大于 

 
  
   
    1
   
  
  
   1
  
 
1 会导致信息的非歧视性丢失,尽管在表面上,它似乎转换了特征图 

 
  
   
    X
   
   
    (
   
   
    S
   
   
    ,
   
   
    S
   
   
    ,
   
   
    
     C
    
    
     1
    
   
   
    )
   
   
    →
   
   
    
     X
    
    
     
      ′
     
     
      ′
     
    
   
   
    (
   
   
    S
   
   
    /
   
   
    s
   
   
    a
   
   
    c
   
   
    l
   
   
    e
   
   
    ,
   
   
    S
   
   
    /
   
   
    s
   
   
    a
   
   
    c
   
   
    l
   
   
    e
   
   
    ,
   
   
    
     C
    
    
     2
    
   
   
    )
   
  
  
   X(S,S,C_1)→X''(S/sacle,S/sacle,C_2)
  
 
X(S,S,C1​)→X′′(S/sacle,S/sacle,C2​)(但没有

 
  
   
    
     X
    
    
     ′
    
   
  
  
   X'
  
 
X′)

3 如何使用SPD-Conv

为了解释如何将提出的方法应用到重新设计

CNN

架构中,使用了2个最具代表性的计算机视觉模型类别:目标检测和图像分类

3.1 检测:Yolov5改进方式

并且作者将这个模块应用到了YOLOv5中,取得了很好的效果
在这里插入图片描述

Fig 4 红框是发生替换的地方

YOLOv5-SPD

:将第 3 节中描述的方法应用于

YOLOv5

并获得

YOLOv5-SPD

,只需用

SPD-Conv

替换

YOLOv5
    s
   
   
    t
   
   
    r
   
   
    i
   
   
    d
   
   
    e
   
   
    −
   
   
    2
   
  
  
   stride-2
  
 
stride−2 卷积即可。这种替换有 

 
  
   
    7
   
  
  
   7
  
 
7 个实例,因为
 YOLOv5

在主干中使用

    5
   
  
  
   5
  
 
5个

 
  
   
    s
   
   
    t
   
   
    r
   
   
    i
   
   
    d
   
   
    e
   
   
    −
   
   
    2
   
  
  
   stride-2
  
 
stride−2 卷积层将特征图下采样 

 
  
   
    25
   
  
  
   25
  
 
25 倍,并在颈部使用

 
  
   
    2
   
  
  
   2
  
 
2个 

 
  
   
    s
   
   
    t
   
   
    r
   
   
    i
   
   
    d
   
   
    e
   
   
    −
   
   
    2
   
  
  
   stride-2
  
 
stride−2 卷积层。
YOLOv5

颈部的每个跨步卷积之后都有一个连接层;这不会改变本文的方法,只是将它保持在

SPD

Conv 

之间。

与YOLOv5一样,作者也提供了多个版本适配YOLO

在这里插入图片描述
可扩展性:

YOLOv5-SPD 

可以通过与

YOLOv5

相同的方式轻松扩展和缩减来适应不同的应用程序或硬件需求
具体来说,可以简单地调整(1)每个非跨步卷积层中的过滤器数量和/或(2)C3模块的重复次数(如图4所示),以获得不同版本的

YOLOv5-SPD

第1个称为宽度缩放:它将原始宽度

    n
   
   
    w
   
  
  
   nw
  
 
nw(通道数)更改为 

 
  
   
    n
   
   
    w
   
   
    ×
   
   
    w
   
   
    i
   
   
    d
   
   
    t
   
   
    
     h
    
    
     f
    
   
   
    a
   
   
    c
   
   
    t
   
   
    o
   
   
    r
   
   
    e
   
  
  
   nw × width_f actore
  
 
nw×widthf​actore(四舍五入到最接近的 8 倍数)

第2个称为深度缩放:它将原始深度

    n
   
   
    d
   
  
  
   nd
  
 
nd(重复 C3 模块的次数;例如,图 4 中的 

 
  
   
    9
   
   
    ×
   
   
    C
   
   
    3
   
  
  
   9 × C3
  
 
9×C3 中的 9)更改为 

 
  
   
    n
   
   
    d
   
   
    ×
   
   
    d
   
   
    e
   
   
    p
   
   
    t
   
   
    
     h
    
    
     f
    
   
   
    a
   
   
    c
   
   
    t
   
   
    o
   
   
    r
   
  
  
   nd × depth_factor
  
 
nd×depthf​actor

这样,通过选择不同的宽度/深度因子,我们得到了

YOLOv5-SP

D的

nano

small

medium

large

版本,如表2所示,其中因子值选择与

YOLOv5

相同,以便在后面的实验中进行比较 .


3.2 分类:ResNet改进方式

分类

CNN

通常从一个由

    s
   
   
    t
   
   
    r
   
   
    i
   
   
    d
   
   
    e
   
   
    −
   
   
    2
   
  
  
   stride-2
  
 
stride−2 卷积和池化层组成的stem单元开始,以将图像分辨率降低

 
  
   
    4
   
  
  
   4
  
 
4倍。一个流行的模型是 
ResNet

,它赢得了 ILSVRC 2015 挑战。

ResNet

引入了残差连接,以允许训练高达

    152
   
  
  
   152
  
 
152 层的网络。它还通过仅使用单个全连接层显着减少了参数的总数。最后使用 
softmax

层对类预测进行归一化。

ResNet18-SPD 和 ResNet50-SPD 架构

在这里插入图片描述

ResNet-18

ResNet-50

都使用总共

    4
   
  
  
   4
  
 
4个

 
  
   
    s
   
   
    t
   
   
    r
   
   
    i
   
   
    d
   
   
    e
   
   
    −
   
   
    2
   
  
  
   stride-2
  
 
stride−2卷积和一个

 
  
   
    s
   
   
    t
   
   
    r
   
   
    i
   
   
    d
   
   
    e
   
   
    2
   
  
  
   stride 2
  
 
stride2的最大池化层,将每个输入图像下采样

 
  
   
    25
   
  
  
   25
  
 
25倍。应用我们提出的构建块,用
SPD-Conv

替换了四个跨步卷积;但另一方面,我们只是删除了最大池化层,因为我们的主要目标是低分辨率图像,我们实验中使用的数据集的图像相当小(Tiny ImageNet 中为

    64
   
   
    ×
   
   
    64
   
  
  
   64 × 64
  
 
64×64,CIFAR-10中为

 
  
   
    32
   
   
    ×
   
   
    32
   
  
  
   32 × 32
  
 
32×32)因此不需要池化, 对于更大的图像,这样的最大池化层仍然可以用
SPD-Conv

以相同的方式替换


4 论文实验结果

4.1 目标检测

MS-COCO 验证数据集的比较(val2017)

在这里插入图片描述

MS-COCO测试数据集的比较(test-dev2017)

在这里插入图片描述
在这里插入图片描述

val2017的目标检测实例。蓝色方框表示 ground truth情况。红色箭头突出了不同之处


4.2 图像分类

图像分类性能比较

在这里插入图片描述

绿色标签: ground truth。蓝色标签:ResNet18-SPD 预测。红色标签:ResNet-18 预测


5 YOLOv5官方项目改进教程

YOLO Magic项目同步更新

第一步:
common.py中添加如下代码

classspace_to_depth(nn.Module):# Changing the dimension of the Tensordef__init__(self, dimension=1):super().__init__()
        self.d = dimension

    defforward(self, x):return torch.cat([x[...,::2,::2], x[...,1::2,::2], x[...,::2,1::2], x[...,1::2,1::2]],1)

第二步;yolo.py中添加如下代码
请添加图片描述

elif m is space_to_depth:
            c2 =4* ch[f]

第三步;修改配置文件(以为yolov5s为例)
其它版本依然可以通过调整宽度和深度控制

# Parameters
nc:80# number of classes
depth_multiple:0.33# model depth multiple
width_multiple:0.50# layer channel multiple
anchors:-[10,13,16,30,33,23]# P3/8-[30,61,62,45,59,119]# P4/16-[116,90,156,198,373,326]# P5/32# YOLOv5 v6.0 backbone
backbone:# [from, number, module, args][[-1,1, Focus,[64,3]],# 0-P1/2[-1,1, Conv,[128,3,1]],# 1[-1,1,space_to_depth,[1]],# 2 -P2/4[-1,3, C3,[128]],# 3[-1,1, Conv,[256,3,1]],# 4[-1,1,space_to_depth,[1]],# 5 -P3/8[-1,6, C3,[256]],# 6[-1,1, Conv,[512,3,1]],# 7-P4/16[-1,1,space_to_depth,[1]],# 8 -P4/16[-1,9, C3,[512]],# 9[-1,1, Conv,[1024,3,1]],# 10-P5/32[-1,1,space_to_depth,[1]],# 11 -P5/32[-1,3, C3,[1024]],# 12[-1,1, SPPF,[1024,5]],# 13]# YOLOv5 v6.0 head
head:[[-1,1, Conv,[512,1,1]],# 14[-1,1, nn.Upsample,[None,2,'nearest']],# 15[[-1,9],1, Concat,[1]],# 16 cat backbone P4[-1,3, C3,[512,False]],# 17[-1,1, Conv,[256,1,1]],# 18[-1,1, nn.Upsample,[None,2,'nearest']],# 19[[-1,6],1, Concat,[1]],# 20 cat backbone P3[-1,3, C3,[256,False]],# 21 (P3/8-small)[-1,1, Conv,[256,3,1]],# 22[-1,1,space_to_depth,[1]],# 23 -P2/4[[-1,18],1, Concat,[1]],# 24 cat head P4[-1,3, C3,[512,False]],# 25 (P4/16-medium)[-1,1, Conv,[512,3,1]],# 26[-1,1,space_to_depth,[1]],# 27 -P2/4[[-1,14],1, Concat,[1]],# 28 cat head P5[-1,3, C3,[1024,False]],# 29 (P5/32-large)[[21,25,29],1, Detect,[nc, anchors]],# Detect(P3, P4, P5)]

模型参数量parameters计算量GFLOPsyolov5s723538916.5yolov5s_SPD877138933.9yolov5n_SPD22561578.9yolov5m_SPD2464655788.0yolov5l_SPD52707709178.6

内容导航

本人更多改进YOLOv5内容导航

1.手把手带你调参Yolo v5 (v6.1)(一)🌟强烈推荐

2.手把手带你调参Yolo v5 (v6.1)(二)🚀

3.如何快速使用自己的数据集训练Yolov5模型

4.手把手带你Yolov5 (v6.1)添加注意力机制(一)(并附上30多种顶会Attention原理图)🌟

5.手把手带你Yolov5 (v6.1)添加注意力机制(二)(在C3模块中加入注意力机制)

6.Yolov5如何更换激活函数?

7.Yolov5 (v6.1)数据增强方式解析

8.Yolov5更换上采样方式( 最近邻 / 双线性 / 双立方 / 三线性 / 转置卷积)

9.Yolov5如何更换EIOU / alpha IOU / SIoU?

10.Yolov5更换主干网络之《旷视轻量化卷积神经网络ShuffleNetv2》🍀

11.YOLOv5应用轻量级通用上采样算子CARAFE🍀

12.空间金字塔池化改进 SPP / SPPF / ASPP / RFB / SPPCSPC🍀

13.持续更新中


觉得有帮助请点赞支持一下👍,如多觉得有问题欢迎指正😁


本文转载自: https://blog.csdn.net/weixin_43694096/article/details/126398068
版权归原作者 迪菲赫尔曼 所有, 如有侵权,请联系我们删除。

“有效涨点!用于低分辨率图像和小物体的新 CNN 模块SPD-Conv”的评论:

还没有评论