申明:本系列目标检测大部分内容转自以下链接,博主做了稍微修改,若侵犯权利,请联系删除,谢谢!
1)cs231n学习笔记-CNN-目标检测、定位、分割
2)基于深度学习的目标检测研究进展
----------------------------------------------------------------------------------------------------------
1)SPP-NET:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
2)Motivation:解决R-CNN速度慢的问题。
3)R-CNN速度慢的原因
使用R-CNN框架对图像提完region proposal(2000个左右)之后将每个proposal当成一张图像进行后续处理(CNN提特征+SVM分类),实际上对一张图像进行了2000次提特征和分类的过程!
4)解决思路
由于2000个region proposal都是图像的一部分,那么我们完全可以对图像提一次卷积层特征,然后只需要将region proposal在原图的位置映射到卷积层特征图上,这样对于一张图像我们只需要提一次卷积层特征,然后将每个region proposal的卷积层特征输入到全连接层做后续操作。(对于CNN来说,大部分运算都耗在卷积操作上,这样做可以节省大量时间)
5)存在的问题
每个region proposal的尺度不一样,无法直接输入全连接层,因为全连接层输入必须是固定的长度。
6)传统CNN的做法
由于传统的CNN限制了输入必须固定大小,如Alexnet是224×224,所以通常对原图进行一下两种操作:
a)crop:截取原图的一个固定大小的patch—————————缺点:物体可能产生截断,尤其是长宽比大的图片;
b)warp:将原图片的ROI缩放到一个固定大小的patch————缺点:物体被拉伸,失去“原形”,尤其是长宽比大的图片;
它们都无法保证在不失真的情况下将图片传入到CNN中。
图 2 基于不同的CNN的目标检测流程
7)SPP的解决思路
CNN的卷积层可以处理任意尺度的输入,只是在全连接层处有限制尺度,所以只需找到一种方法,在全连接层之前将其输入限制到等长。————效果:不管输入的图片是什么尺度,都能够正确的传入网络。
8)SPP的具体方案
a)如果输入的原图大小为224×224,经过conv5输出后大小变为13×13×256,即有256个filter,每个filter对应13×13的激活map;
b)如下图,对256个激活map使用pooling(空间金字塔pooling)操作,使它们分别成为4×4,2×2和1×1的三张子图;
c)对b)中出来的特征做max pooling 后,得到的特征是固定长度的,即(16+4+1)×256维度的;该维度不受输入尺寸的影响;
图 3 基于SPP的目标检测流程
9)SPP的缺陷
a)训练分为多个阶段,步骤繁琐: 微调网络+训练SVM+训练训练边框回归器
b)SPP在微调网络的时候固定了卷积层,只对全连接层进行微调,而对于一个新的任务,有必要对卷积层也进行微调
【分类的模型提取的特征更注重高层语义,而目标检测任务除了语义信息还需要目标的位置信息】