大家好,又见面了,我是你们的朋友全栈君。
简介
SPPNet的英文名称是Spatial Pyramid Pooling Convolutional Networks,翻译成中文是“空间金字塔池化卷积网络”。
paper地址https://arxiv.org/pdf/1406.4729.pdf
原理
SPPNet主要做了一件事:将CNN的输入从固定尺寸改进为任意尺寸。例如,在普通的CNN结构中,输入的尺寸往往是固定的(如224*224*3),输出可以看做是一个固定维数的向量。SPPNet在普通的CNN结构中加入了ROI池化层(ROI Pooling),使得网络的输入图像可以是任意尺寸的,输出则不变,同样是一个固定维数的向量。
ROI池化层一般跟在卷积层后面,它的输入是任意大小的卷积,输出是固定维数的向量,如图所示:
为什么ROI池化层能够把任意大小的卷积特征转换成固定长度的向量
不妨设卷积层的输出的宽度为w, 高度为h,通道为c。不管输入的图像尺寸是多少,卷积层的通道数都不会变,也就是说c是一个常数。而w,h会随着输入图像尺寸的变化而变化,可以看做是两个变量。以上图中的ROI池化层为例,它首先把卷积层划分为4*4的网格,每个网格的宽度是w/4,高是h/4,通道数为c。当不能整除时,需要取整。接着,对每个网格中的每个通道,都取出其最大值,换句话说,就是说对每个网格内的特征做做最大值池化(Max Pooling)。这个4*4的网格最终就形成可16c维的特征。接着,再把网络划分成2*2的网络,同样的方法提取特征,提取的特征的长度为4c。再把网络划分为1*1的网络,提取的特征的长度就是c,最后的1*1的划分实际是去处卷积中每个通道的最大值。最后,将得到的特征拼接起来,得到的特征是16c+4c+c=21c维的特征。很显然,这个输出特征的长度与w,h两个值无关的,因此ROI池化层可以吧任意宽度,高度的卷积特征转换为固定长度的向量。
可以这样考虑问题:网络的输入是一张图像,中间进过若干卷积形成了卷积特征,这个卷积特征实际上和原始图像在位置上是有一定的关系的。因此,原始图像中的候选框,实际上也可以对应到卷积特征中相同位置的框。由于候选区域框的大小千变万化,对应到卷积特征的区域形状也各不相同,但是不用担心,利用ROI池化层可以把卷积特征中的不同形状的区域对应到同样长度的向量特征。
参考书籍21个项目玩转深度学习
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/145026.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...