SPP的应用有哪些,SPP结构分析是怎样的
Admin 2022-09-08 群英技术资讯 1543 次浏览
在卷积神经网络中我们经常看到固定输入的设计,但是如果我们输入的不能是固定尺寸的该怎么办呢?
通常来说,我们有以下几种方法:
(1)对输入进行resize操作,让他们统统变成你设计的层的输入规格那样。但是这样过于暴力直接,可能会丢失很多信息或者多出很多不该有的信息(图片变形等),影响最终的结果。
(2)替换网络中的全连接层,对最后的卷积层使用global average pooling,全局平均池化只和通道数有关,而与特征图大小没有关系
(3)最后一个当然是我们要讲的SPP结构啦~
SPP结构又被称为空间金字塔池化,能将任意大小的特征图转换成固定大小的特征向量。
接下来我们来详述一下SPP是怎么处理滴~
输入层:首先我们现在有一张任意大小的图片,其大小为w * h。
输出层:21个神经元 -- 即我们待会希望提取到21个特征。
分析如下图所示:分别对1 * 1分块,2 * 2分块和4 * 4子图里分别取每一个框内的max值(即取蓝框框内的最大值),这一步就是作最大池化,这样最后提取出来的特征值(即取出来的最大值)一共有1 * 1 + 2 * 2 + 4 * 4 = 21个。得出的特征再concat在一起。
而在YOLOv5中SPP的结构图如下图所示:
其中,前后各多加一个CBL,中间的kernel size分别为1 * 1,5 * 5,9 * 9和13 * 13。
(x,y1这些是啥请看下面的代码)
代码注释与上图的SPP结构相对应。
class SPP(nn.Module): def __init__(self, c1, c2, k=(5, 9, 13)):#这里5,9,13,就是初始化的kernel size super().__init__() c_ = c1 // 2 # hidden channels self.cv1 = Conv(c1, c_, 1, 1)#这里对应第一个CBL self.cv2 = Conv(c_ * (len(k) + 1), c2, 1, 1)#这里对应SPP操作里的最后一个CBL self.m = nn.ModuleList([nn.MaxPool2d(kernel_size=x, stride=1, padding=x // 2) for x in k]) #这里对应SPP核心操作,对5 * 5分块,9 * 9分块和13 * 13子图分别取最大池化 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)) #torch.cat对应concat
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)#先通过CBL进行通道数的减半 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)) #将原来的x,一次池化后的y1,两次池化后的y2,3次池化的self.m(y2)先进行拼接,然后再CBL
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要介绍了Python变量名详细规则详细变量值,Python需要使用标识符给变量命名,其实标识符就是用于给程序中变量、类、方法命名的符号(简单来说,标识符就是合法的名称,下面葛小编一起进入文章里哦阿姐更多详细内容吧
这篇文章主要给大家分享python做三维图可视化的内容,这是学习tensorflow框架中遇到的知识,下文会使用到的定义函数选用的是将x和y封装,方便tensorflow求导,下面我们就来具体一些实现代码以及要注意的问题。
我们在Python中会遇到很多转换的问题,例如需要字符串,而输入内容为二进制。码的是字符串,却要是字符串。字符串与二进制如何相互转换呢?本文向大家介绍Python中字符串与二进制相互转换的两种方法,一个是简单版本,另一个是依靠bitarray对象,也是可以轻松转化。内容如下:
今天给大家分享的是Pandas库中的transform函数,我们知道Pandas库有很多很强大的功能,接下来来给大家介绍的transform函数就是其中之一,使用transform函数,我们可以实现高效的汇总数据且不改变数据行数,接下来我们就来详细的了解一下transform函数。
这篇文章主要介绍了Python可视化神器pyecharts之绘制箱形图,箱形图(Box-plot)又称为盒须图、盒式图或箱线图,是一种用作显示一组数据分散情况资料的统计图,因形状如箱子而得名
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008