【R-CNN系列目标检测】(2)SPP-Net算法
2017-04-21 19:17
253 查看
重点参考《深度学习(十九)基于空间金字塔池化的卷积神经网络物体检测》
SPP-Net(Spatial Pyramid Pooling)是何凯明2014年提出的方法【1】,通过解决传统CNN无法处理不同尺寸输入的问题对同年的R-CNN算法做改进,实验结果表明SPP方法比R-CNN快了近100倍
从算法架构上,SPP-Net与R-CNN相似:通过Selective Search获取候选区域,最后也是使用SVM做分类。
但不再将每个候选区域过一次CNN,而是将原始图过一次CNN,在CNN的全连接层前添加新提出的SPP层,根据候选区域位置crop的图像卷积结果通过SPP层来确保输入全连接层的尺寸满足要求。最后在全连接层的输出一次性获得所有候选区域的特征向量。
基于此,SPP-Net将原始图像作为CNN输入,希望仅过一次CNN就将所有区域的特征向量提取出来。但这里遇到一个问题:传统CNN的输入尺寸是固定的,而通过Selective Search获得的区域尺寸显然是各异的。
那么该如何改进CNN网络,使之接受不同尺寸的输入呢?
文章提到,CNN主要包含3种层:卷积层、池化层和全连接层。从概念上不难推断,卷积层和池化层对不同的尺寸均适用,但全连接层的输入和输出尺寸是在模型里就定死的。这是传统CNN仅接受固定尺寸输入的根本原因
文章提出,在CNN的卷积(或池化)与全连接层之间添加一个空间金字塔池化层(SPP Layer)将上一层的输出统一为所需尺寸
图1. 空间金字塔池化(来源:1)
在这里SPP一共3层:第一层对整张图像做池化(最大、均值等);第二层将图像划分为2*2=4个块,分别做池化;第三层划分为4*4=16个块,分别做池化
通过以上步骤,最后获得1+4+16=21个特征值
2)原始图像输入CNN进行一次特征提取,得到feature maps(全连接层前的结果)。在feature maps里找到候选区域,对每个区域做SPP,提取出固定长度的特征向量
3)全连接层的输出向量作为特征,输入SVM做分类
这里一个问题是:经过前面的卷积和池化,如何在feature maps里找到对应的候选区域?
假设(x’, y’)为特征图上的坐标点,(x, y)为原始输入图片的坐标点。两者间有如下转换关系:
(x, y) = (S*x’, S*y’)
其中S为CNN中所有卷积和池化的strides值的乘积,如下图的3个网络,Overfeat-5/7对应的S=2*3*2=12
图2. 转换参数的计算(来源:1)
SPP-Net(Spatial Pyramid Pooling)是何凯明2014年提出的方法【1】,通过解决传统CNN无法处理不同尺寸输入的问题对同年的R-CNN算法做改进,实验结果表明SPP方法比R-CNN快了近100倍
从算法架构上,SPP-Net与R-CNN相似:通过Selective Search获取候选区域,最后也是使用SVM做分类。
但不再将每个候选区域过一次CNN,而是将原始图过一次CNN,在CNN的全连接层前添加新提出的SPP层,根据候选区域位置crop的图像卷积结果通过SPP层来确保输入全连接层的尺寸满足要求。最后在全连接层的输出一次性获得所有候选区域的特征向量。
算法思路
R-CNN实现了CNN做检测的一种方法,但由于一次检测需要过大约2K次CNN(每个候选区域过一次),因此检测效率特别低,几乎无法实用,同时对每个区域的resize也降低了最终的检测精度。基于此,SPP-Net将原始图像作为CNN输入,希望仅过一次CNN就将所有区域的特征向量提取出来。但这里遇到一个问题:传统CNN的输入尺寸是固定的,而通过Selective Search获得的区域尺寸显然是各异的。
那么该如何改进CNN网络,使之接受不同尺寸的输入呢?
文章提到,CNN主要包含3种层:卷积层、池化层和全连接层。从概念上不难推断,卷积层和池化层对不同的尺寸均适用,但全连接层的输入和输出尺寸是在模型里就定死的。这是传统CNN仅接受固定尺寸输入的根本原因
文章提出,在CNN的卷积(或池化)与全连接层之间添加一个空间金字塔池化层(SPP Layer)将上一层的输出统一为所需尺寸
空间金字塔池化
假设一个很简单的两层网络,池化的输出尺寸是未知的,全连接的输入要求为21图1. 空间金字塔池化(来源:1)
在这里SPP一共3层:第一层对整张图像做池化(最大、均值等);第二层将图像划分为2*2=4个块,分别做池化;第三层划分为4*4=16个块,分别做池化
通过以上步骤,最后获得1+4+16=21个特征值
结合SPP的目标检测流程
1)通过Selective Search获取2K个候选区域2)原始图像输入CNN进行一次特征提取,得到feature maps(全连接层前的结果)。在feature maps里找到候选区域,对每个区域做SPP,提取出固定长度的特征向量
3)全连接层的输出向量作为特征,输入SVM做分类
这里一个问题是:经过前面的卷积和池化,如何在feature maps里找到对应的候选区域?
假设(x’, y’)为特征图上的坐标点,(x, y)为原始输入图片的坐标点。两者间有如下转换关系:
(x, y) = (S*x’, S*y’)
其中S为CNN中所有卷积和池化的strides值的乘积,如下图的3个网络,Overfeat-5/7对应的S=2*3*2=12
图2. 转换参数的计算(来源:1)
算法实现
作者在Github上公开了代码,同样可能是由于selective search代码的原因,使用的Matlab参考文献
【1】He K, Zhang X, Ren S, et al. Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition[J]. IEEE Transactions on Pattern Analysis & Machine Intelligence, 2014, 37(9):1904-16.相关文章推荐
- 目标检测方法系列——R-CNN, SPP, Fast R-CNN, Faster R-CNN, YOLO, SSD
- TensorFlow 目标检测方法系列——R-CNN, SPP, Fast R-CNN, Faster R-CNN, YOLO, SSD
- 目标检测方法系列——R-CNN, SPP, Fast R-CNN, Faster R-CNN, YOLO, SSD
- 目标检测方法系列:R-CNN, SPP, Fast R-CNN, Faster R-CNN, YOLO, SSD
- 【深度学习:目标检测】深度学习检测方法梳理:R-CNN,SPP-NET, Fast-R-CNN,Faster-R-CNN, YOLO, SSD系列
- 目标检测方法系列:R-CNN, SPP, Fast R-CNN, Faster R-CNN, YOLO, SSD
- R-CNN,SPP-NET, Fast-R-CNN,Faster-R-CNN, YOLO, SSD系列深度学习检测方法梳理
- 【目标检测】R-CNN系列之Faster-RCNN
- 深度学习目标检测(object detection)系列(二) SPP-Net
- 目标检测CNN系列学习资料汇总(2014-2017)
- 目标检测方法总结(RFCN/SSD/RCNN/FastRCNN/FasterRCNN/SPPNet/DPM/OverFeat/YOLO)
- 深度学习笔记之目标检测算法系列(包括RCNN、Fast RCNN、Faster RCNN和SSD)
- 目标检测之CNN系列
- 目标检测方法总结(RFCN/SSD/RCNN/FastRCNN/FasterRCNN/SPPNet/DPM/OverFeat/YOLO)
- CNN系列之目标检测方法【1】
- R-CNN,SPP-NET, Fast-R-CNN,Faster-R-CNN, YOLO, SSD系列深度学习检测方法梳理
- 【R-CNN系列目标检测】(1)R-CNN算法
- 目标检测方法总结(R-CNN系列)
- R-CNN,SPP-NET, Fast-R-CNN,Faster-R-CNN, YOLO,系列深度学习检测方法
- 【相关知识】目标检测之||R-CNN||SPP-NET ||Fast-RCNN ||Faster-RCNN||YOLO ||SSD