SPPNet
图1
1. 模型结构
(1)输入图片。
(2)使用Selective Search为每张图片生成基于原图的2000个候选框
(3)把整张待检测的图片传到backbone(骨架网络,多指提取特征的网络)CNN中,进行一次性特征提取,得到feature maps(特征图),然后在feature maps中找到各个候选框的区域。
(4)对各个候选框采用Spatial Pyramid Pooling(空间金字塔池化)。
(5)提取出固定长度的特征向量传到全连接层。
(6)用线性支持向量机(SVM)对这些特征进行分类,每个分类一个SVM;同时进行边界框回归(Bounding-box regression)。
2. Spatial Pyramid Pooling(空间金字塔池化)
图2
(1)SPP:一种自适应max pooling(最大池化)
(2)bin:SPP输出C*N*N的feature map,既特征图有C层,每层有N*N,取所有通道最左上角的一个像素,这样就形成很多层但每层只有一个像素,合起来是一个C*1的bin,则总共bin的数量是N*N
(3)L-level SPP:即为L个输出size不同的SPP形成的pyramid(金字塔)。一般将每个SPP的输出分别进行flatten(函数),然后concatenate(函数),最后输入到FC层或其他classifier(分类器)中。
(4)思路:根据输入的feature map(特征图)的size和期望输出的feature map的size,来确定pooling的window size(窗口大小)和stride(步长)
(5)实现:假设输入为C*M*M的feature map,期望SPP输出C*N*N的feature map,则SPP的window size为ceil(M/N)想上取整,stride为floor(M/N)向下取整
案例:以下为3-level SPP的案例,输入为13*13,输出为3*3,2*2,1*1
当输出为3*3:window size = ceil(M/N)= ceil(13/3)= 5
Stride= floor(M/N)= floor(13/3)= 4
当输出为2*2:window size = ceil(M/N)= ceil(13/2)= 7
Stride= floor(M/N)= floor(13/2)= 6
当输出为1*1:window size = ceil(M/N)= ceil(13/1)= 13
Stride= floor(M/N)= floor(13/1)= 13
图3
3. 分类与回归
分类与回归是同时进行的,需要先将proposal box从image映射到feature map上,具体流程如图5所示:
图4
(1)分类branch
* 把基于原图大小的2000个region proposal映射到feature map上
* 映射后再分别对每一个region proposal (候选框)进行SPP:4-level spatial pyramid(四层空间金字塔)(1*1,2*2,3*3,6*6,共50个bin),为每个proposal输出12800维(256通道*50bin)的vector(向量)
* 再把vector传到两个FC层(全连接层)里面(fc6,fc7)
* 再传到SVM(支持向量机)中进行分类,与R-CNN相同,每一个类别都有一个线性SVM,判断当前的vector或proposal是不是属于该类别
* NMS:基于SVM生成的classification score(分类分数)对scored windows进行NMS(非极大值抑制),阈值为0.3
“具体可参考该系列中R-CNN部分”
(2)回归branch
·基于proposal和backbone(conv5)输出的feature map,做BB regression(边框回归)
4. 总结
(1)论文出处
SPPNet是出自2015发表在IEEE上的论文《Spatial Pyramid Pooling in Deep ConvolutionalNetworks for Visual Recognition》。这篇论文解决之前深度神经网络的一个大难题,即输入数据的维度一定要固定。在ILSVRC2014,SPPNet取得目标检测第二,图像分类第三的成绩。
(2)针对的问题
全连接层(FC层)、支持向量机(SVM)和softmax要求输入的图像的尺寸是固定的,这限制了输入图像的尺寸和纵横比(aspect ratio)。R-CNN中对图片进行缩放,这都在一定程度上导致图片信息的丢失和变形,限制了识别精确度,因此不利于图像识别。针对这个问题的解决思路有两个,一是使不同尺寸的图像的输出的维度是固定的;二是使FC层可以接受维度不固定的输入。而SPPNet应用的就是第一种思路。
(3)R-CNN与SPPNet模型比较如图5所示:
图5
* R-CNN中使用3*3大小,stride为2的最大池化把13*13*256通道的特征图变成6*6大小的一个特征图,然后拉平最后的池化结果并传给FC层
* 而SPPNet中的SPP层限制了输出尺寸,采用了一个动态的池化盒尺寸。因为不再需要像R-CNN中限制CNN的输入尺寸,则可以将整张图传给CNN,在CNN里只使用整张图进行一次前向传播,计算整张图的一个特征图,最后再把各个候选区域的特征抠出来,也就是在整张图上共享计算
(4)创新点
·在最后一个卷积层后面添加SPP层,SPP层对特征进行池化,对不同大小的特征图可以得到固定尺寸的输出,然后将其输入到全连接层(FC层)或其他classifier中。
·通用性:SPP可以改进所有基于CNN的方法。
·多尺度训练:输入可以是不同尺寸的,增加了尺度不变性并降低了过拟合的风险。
·降低特征计算冗余度,用卷积层只在整个图像上进行一次特征提取然后在卷积特征图上使用SPP生成fixed-length representation。
(5)优点
·提高了准确度。
·速度加快。由于是先提取特征,降低了计算冗余度。
(6)缺点
·在训练时分了多个阶段:因为在最后利用全连接层提取特征后,还是像R-CNN一样额外单独训练分类器或回归模型,未解决R-CNN第一个问题。
·耗费大量空间储存特征:由于是个多阶段过程,因此所有特征还是需要先存下来写到磁盘里,未解决R-CNN第二个问题。
·SPPNet的fine-tuning(微调算法)很难更新卷积层:SPP层实现了共享计算解决R-CNN第三个问题的同时产生了新的问题,SPPNet只对全连接层进行fine-tuning(微调),而无法更新卷积层的参数,这限制了网络的准确性。其原因是SPPNet不能更新SPP layer之前的权重,当每个训练样本(ROI)来自不同图像时,SPP层back propagation(反向传播)的效率非常低,而这正是R-CNN和SPPNet网络的训练方式。