SPP网络结构——原网络与YOLOv5中修改结构的比较

目录

SPPNet

YOLO—SPPNet 

两者比较

补充

参考


SPPNet

——以原论文图像和在CNN中的应用为例

 SPPNet的函数定义

import math
def spatial_pyramid_pool(self,previous_conv, num_sample, previous_conv_size, out_pool_size):
    '''
    previous_conv: a tensor vector of previous convolution layer
    num_sample: an int number of image in the batch
    previous_conv_size: an int vector [height, width] of the matrix features size of previous convolution layer
    out_pool_size: a int vector of expected output size of max pooling layer
    
    returns: a tensor vector with shape [1 x n] is the concentration of multi-level pooling
    '''    
    # print(previous_conv.size())
    for i in range(len(out_pool_size)):
        # print(previous_conv_size)
        h_wid = int(math.ceil(previous_conv_size[0] / out_pool_size[i]))
        w_wid = int(math.ceil(previous_conv_size[1] / out_pool_size[i]))
        h_pad = (h_wid*out_pool_size[i] - previous_conv_size[0] + 1)/2
        w_pad = (w_wid*out_pool_size[i] - previous_conv_size[1] + 1)/2
        maxpool = nn.MaxPool2d((h_wid, w_wid), stride=(h_wid, w_wid), padding=(h_pad, w_pad))
        x = maxpool(previous_conv)
        if(i == 0):
            spp = x.view(num_sample,-1)
            # print("spp size:",spp.size())
        else:
            # print("size:",spp.size())
            spp = torch.cat((spp,x.view(num_sample,-1)), 1)
    return 

(代码来源——参考3)

SPPNet网络结构固定输出大小。

实现过程

1.输出不同大小的特征图。

2. 经过最大池化操作——通过输入与输出,确定步长stride,池化核的大小,填充的大小padding。

 maxpool = nn.MaxPool2d((h_wid, w_wid), stride=(h_wid, w_wid), padding=(h_pad, w_pad))

3. 获得输出——每张特征图输出成三种不同的大小(4,4),(2,2),(1,1) 。    

    个人理解就是把不同大小的特征图经过SPP操作后生成了3中大小相同的特征图。

4. 进行全连接操作 ——输出(4×4+2×2+1×1)×c(通道数)。

YOLO—SPPNet 

class SPP(nn.Module):
    def __init__(self, c1, c2, k=(5, 9, 13)):
        super(SPP, self).__init__()
        c_ = c1 // 2
        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)
        return self.cv2(torch.cat([x] + [m(x) for m in self.m], 1))

实现过程

1. 池化核的大小(1,5,9,13),步长(stride=1)是已经确定的,输入特征图的尺寸是一致的(YOLOV5传入图片后会对其进行处理640×640)。

2. 最大池化操作——通过池化核大大小确定padding。

3. 得到相同大小的特征图(特征图大小与经过1×1池化核生成的特征图大小一致——padding=x//2 ),通道数要乘4(4个最大池化操作)。

4. 进行拼接,接下来卷积操作,输出通道数在转换成与原来相同的。

两者比较

1.不变量与变量不一致  

SPPNet 的输出特征图是规定好的,池化核,步长,填充值会随着输入的特征图与输出的特征图变化;YOLO_SPPNet的输入特征图相同大小,池化核大小固定,填充值会根据设置的池化核变化,输出大小其实也固定了(和输出最大特征图一致)。

2. 池化操作后不同处理

SPPNet 会对输出的特征图进行全连接操作

YOLO_SPPNet 对输出的特征图进行卷积操作。

补充

padding的数据不计入参数,padding是对输入数据(输入特征图)进行填充。

池化操作特征提取可以增加感受野。

参考

Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition | IEEE Journals & Magazine | IEEE Xploreicon-default.png?t=N2N8https://ieeexplore.ieee.org/document/70055062.  https://github.com/ShaoQiBNU/CV-SPPneticon-default.png?t=N2N8https://github.com/ShaoQiBNU/CV-SPPnet 3.  https://github.com/yifanjiang19/sppnet-pytorchicon-default.png?t=N2N8https://github.com/yifanjiang19/sppnet-pytorch4.  https://github.com/bubbliiiing/yolov5-pytorchicon-default.png?t=N2N8https://github.com/bubbliiiing/yolov5-pytorch5.  睿智的目标检测56——Pytorch搭建YoloV5目标检测平台_Bubbliiiing的博客-CSDN博客睿智的目标检测56——Pytorch搭建YoloV5目标检测平台学习前言源码下载YoloV5改进的部分(不完全)YoloV5实现思路一、整体结构解析二、网络结构解析1、主干网络Backbone介绍2、构建FPN特征金字塔进行加强特征提取3、利用Yolo Head获得预测结果三、预测结果的解码1、获得预测框与得分2、得分筛选与非极大抑制四、训练部分1、计算loss所需内容2、正样本的匹配过程a、匹配先验框b、匹配特征点3、计算Loss训练自己的YoloV5模型一、数据集的准备二、数据集的处理三、开始网络训练四https://blog.csdn.net/weixin_44791964/article/details/121626848如有问题欢迎指出!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江湖路远不包邮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值