目录
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 Xplorehttps://ieeexplore.ieee.org/document/70055062. https://github.com/ShaoQiBNU/CV-SPPnet
https://github.com/ShaoQiBNU/CV-SPPnet 3. https://github.com/yifanjiang19/sppnet-pytorch
https://github.com/yifanjiang19/sppnet-pytorch4. https://github.com/bubbliiiing/yolov5-pytorch
https://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如有问题欢迎指出!