【YOLOv5】SPP、SPPF模块及添加ASPP模块

文章目录

  • YOLOv5配置文件
  • SPP介绍
  • YOLOv5中的SPP
  • SPPF
  • ASPP
  • 又名,整理整理自己不靠谱的学习记录。

    YOLOv5配置文件

    YOLOv5通过yaml配置文件来搭建先在common.py文件中构建相同名称的类,再从配置文件中读取到对应的操作后就会对该操作的类实例化。整个网络结构由Model类构成,Model中调用了parse_model()函数,由该函数对配置文件进行解析后调用对应的类进行网络构建,构建后由Model实现后面的处理。
    parse_model()函数存在于yolo.py文件中。

    def parse_model(d, ch):  # model_dict, input_channels(3)
        logger.info('\n%3s%18s%3s%10s  %-40s%-30s' % ('', 'from', 'n', 'params', 'module', 'arguments'))
        anchors, nc, gd, gw = d['anchors'], d['nc'], d['depth_multiple'], d['width_multiple']
        na = (len(anchors[0]) // 2) if isinstance(anchors, list) else anchors  # number of anchors
        no = na * (nc + 5)  # number of outputs = anchors * (classes + 5)
    
        layers, save, c2 = [], [], ch[-1]  # layers, savelist, ch out
        add = d['backbone'] + d['head']
    

    以YOLOv5s.yaml其中一行为例

    [-1, 1, Conv, [64, 6, 2, 2]]
    #[from, number, module, args]
    

    定义好以上参数后,parse_model()函数对yaml文件中的内容按行取出,依次放到f, n, m, args中,
    f = -1代表从上一层接受特征,
    n = 1代表只有一个这样的操作,
    m = Conv这层要执行Conv操作,
    args = [64, 6, 2, 2]代表这层输出为64维,用3*3的卷积核,步长为1。
    其中需要解析下yolo.py文件中 m = eval(m) if isinstance(m, str) else m 这句代码。

    SPP介绍

    why
    CNN可以简略的 = 卷积网络层+全连接网络部分。
    卷积核:完全能够适用任意大小的输入,并且能够产生任意大小的输出。
    全连接层:参数是神经元对于所有输入的连接权重。如果输入尺寸不固定的话,全连接层参数的个数都不能固定。
    CNN对于每一个区域候选都需要首先将图片放缩到固定尺度。
    problem
    速度瓶颈:重复为每个region proposal提取特征是极其费时的。
    性能瓶颈:对于所有的region proposal缩放到固定的尺寸会导致我们不期望看到的几何形变,而且由于速度瓶颈的存在,不可能采用多尺度或者是大量的数据增强去训练模型。
    常见想法
    全连接层需要固定的输入,在全连接层前加入一个网络层,对任意的输入产生固定的输出。
    对于最后一层卷积层的输出pooling一下,但这个pooling窗口的尺寸及步伐设置为相对值(输出尺寸的一个比例值)。
    后果:任意输入–固定的输出
    解决方案SPPNet
    在以上想法上加入SPM的思路。
    对于一副图像分成若干尺度的一些块,比如一副图像分成1份,4份,8份等,然后对于每一块提取特征然后融合在一起。—–兼容多个尺度的特征。
    传统的SPP
    eg. 把特征图依次输出为4x4x256,2x2x256,1x1x256最后按256通道拼接后就可以放到FC中。

    YOLOv5中的SPP

    YOLO中的SPP只是借鉴了SPP的思想。如图所示,YOLO采用统一的步长但不同尺寸的卷积核实现SPP,统一步长则代表输出的特征图尺寸一样,只是对区域的敏感性不一样,再通过concate按通道拼接后用1×1卷积,实现特征融合。


    输入特征先通过一个Conv,然后分别进行不同kernel的pooling,3个pooling和输入拼接,在通过一个Conv。

    class SPP(nn.Module):
        # Spatial Pyramid Pooling (SPP) layer https://arxiv.org/abs/1406.4729
        def __init__(self, c1, c2, k=(5, 9, 13)): ## ch_in, ch_out
            super().__init__()
            c_ = c1 // 2  # hidden channels
            self.cv1 = Conv(c1, c_, 1, 1)
            self.cv2 = Conv(c_ * (len(k) + 1), c2, 1, 1)
            self.m = nn.ModuleList([nn.MaxPool2d(kernel_size=x, stride=1, padding=x // 2) for x in k])
    
        def forward(self, x):
            x = self.cv1(x)
            with warnings.catch_warnings():
                warnings.simplefilter('ignore')  # suppress torch 1.9.0 max_pool2d() warning
                return self.cv2(torch.cat([x] + [m(x) for m in self.m], 1))
    

    SPPF

    class SPPF(nn.Module):
        # Spatial Pyramid Pooling - Fast (SPPF) layer for YOLOv5 by Glenn Jocher 
        def __init__(self, c1, c2, k=5):  # equivalent to SPP(k=(5, 9, 13))
            super().__init__()
            c_ = c1 // 2  # hidden channels
            self.cv1 = Conv(c1, c_, 1, 1)
            self.cv2 = Conv(c_ * 4, c2, 1, 1)
            self.m = nn.MaxPool2d(kernel_size=k, stride=1, padding=k // 2)
    
        def forward(self, x):
            x = self.cv1(x)
            with warnings.catch_warnings():
                warnings.simplefilter('ignore')  # suppress torch 1.9.0 max_pool2d() warning
                y1 = self.m(x)
                y2 = self.m(y1)
                return self.cv2(torch.cat([x, y1, y2, self.m(y2)], 1))
    

    ASPP

    Atrous Convolution又名Dilated convolutions即空洞卷积/带孔卷积/扩张卷积/膨胀卷积/多孔卷积,论文参见https://arxiv.org/pdf/1511.07122.pdf。
    blog参考https://blog.csdn.net/qq_41731861/article/details/120967519
    和普通的卷积操作不同的地方在于空洞卷积即将卷积核中按照一定的规律插入了一些(rate-1)为零的值,使得感受野增加,而无需通过减小图像大小来增加感受野。小卷积核叠加的方式能够线性增加感受野,而此种方式是指数级增加感受野。
    ASPP
    DeepLab: Semantic image segmentation with deep convolutional nets, atrous convolution, and fully connected CRFs.论文中提出的一种可提高感受野的技术。

    空洞空间卷积池化金字塔(atrous spatial pyramid pooling (ASPP))对所给定的输入以不同采样率的空洞卷积并行采样,相当于以多个比例捕捉图像的上下文。
    在实验中,我直接把SPP中的卷积改成ASSP的空洞卷积。
    感觉没有什么用= =。
    再研究再研究。

    待思考
    ASPP潜在问题:

    1. The Gridding Effect kernel 并不连续
    2. Long-ranged information might be not relevant
      对一些大物体分割有效果,对小物体可能则有弊无利,如何同时处理不同大小的物体的关系。
      提出
      HDC (Hybrid Dilated Convolution)

    https://blog.csdn.net/xiaoleige0713/article/details/114261794
    Spatial Pyramid Pooling (SPP) layer https://arxiv.org/abs/1406.4729
    https://github.com/ElegantAnkster/ASPP/blob/main/ASPP.py
    https://github.com/ultralytics/yolov5
    https://blog.csdn.net/IEEE_FELLOW/article/details/117536808
    https://blog.csdn.net/qq_41731861/article/details/120967519

    来源:Petra取名废

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【YOLOv5】SPP、SPPF模块及添加ASPP模块

    发表评论