前面说RCNN的时候,说到了几个缺点:
1). 训练步骤繁琐:首先要用SS算法提取图片的候选区域,然后利用IOU计算每一块候选区域的标签,这是需要单独计算并将数据保存下来的。其次,利用候选区域与候选区域的标签训练CNN+SVM。最后利用BBox对边框回归。
2). 训练测试的速度均比较慢
3). 训练占用较大磁盘空间
4). 由于存在fc,所以需要对候选区域尺寸进行Resize,这样会导致图像扭曲变形,影响检测精度。
因此Spp-Net主要是针对第二点以及第四点进行改进。针对第二点:由于在RCNN中,训练和测试的时候,每个候选区域都会经过CNN特征提取网络,而候选区域之间是存在很大的重叠的,实际上有很多区域都计算了很多遍,所以导致训练和测试时的速度都很慢,因此作者提取直接对整图进行CNN提取,然后利用候选区域的位置坐标映射得到候选区域在特征图中的位置。针对第四点,作者提出了SPP层,用来对不同尺寸的特征归一化到相同尺度。
主要流程图如下所示:
spp的思想如下图所示,主要就是利用了金字塔的思想,将原始CNN中得到的特征图复制三份,第一份平均分割成4*4的网格,每个网格计算平均值输出,则会得到一个16维度的向量。第二份平均分成2*2的网格,计算网格平均值,得到4维向量,最后一份直接计算平均值,得到一维向量,将三个向量拼接起来,得到21维向量,且不管图像尺寸为多大,都能固定得到21维向量。其实这里存在一个问题,如果feature map除以4的时候除不尽,会导致定位精度的不准确,在mask rcnn中用align pool改进了。