CV – 目标检测:从R-CNN到Faster R-CNN

R-CNN的原理

R-CNN的全程是Region-CNN,它可以说是第一个成功地将深度学习应用到目标检测上的算法。之后的Fast R-CNN、Faster R-CNN全部都是建立在R-CNN基础上的。

R-CNN遵循传统目标检测的思路,同样采取提取框,对每个框提取特征、图像分类、非极大值抑制四个步骤进行目标检测。只不过在提取特征这一步,将传统的特征(如SIFT、HOG特征等)换成了深度卷积网络提取的特征。

对于原始图像,首先使用Selective Search搜索可能存在物体的区域。Selective Search可以从图像中启发式地搜索出可能包含物体的区域。相比穷举而言,Selective Search可以减少一部分计算量。下一步,将取出的可能含有物体的区域送入CNN中提取特征。CNN通常是接受一个固定大小的图像,而取出的区域大小却各有不同。对此,R-CNN的做法是将区域缩放到统一大小,再使用CNN提取特征。提取出特征后使用SVM进行分类,最后通过非极大值抑制输出结果。

R-CNN的缺点是计算量太大。在一张图片中,通过Selective Search得到的有效区域往往在1000个以上,这意味着要重复计算1000多次神经网络,非常耗时。

SPPNet的原理

SPPNet翻译成中文是“空间金字塔池化卷积网络”,它的作用是将CNN的输入从固定尺寸改为任意尺寸。

SPPNet在普通的CNN中加入了ROI池化层,使得网络的输入图像可以使任意尺寸的,输出则不变,同样是一个固定维数的向量。

ROI池化层一般跟在卷积层后面,它的输入层是任意大小的卷积,输出是固定维数的向量。

Fast R-CNN的原理

Fast R-CNN相比SPPNet更进一步,不再使用SVM作为分类器,而是使用神经网络进行分类,这样就可以同时训练特征提取网络和分类网络,从而取得比SPPNet更高的准确率

fast r-cnn

对于原始图片中的候选框区域,和SPPNet的做法一样,都是将它映射到卷及特征的对应区域。然后使用ROI池化层对该区域提取特征。在这之后,SPPNet使用SVM对特征进行分类,而Fast R-CNN则是直接使用全连接层。全连接层有两个输出,Softmax负责分类,bbox负责回归(框的位置)

假设要在图像中检测K类物体,那么最终的输出应该是K+1个数,每个数代表该区域为某个类别的概率。之所以是K+1个输出,是因为还需要一个没有任何目标物体的“背景类”。

Faster R-CNN的原理

在Fast R-CNN中,仍然需要先使用Selective Search提取框,这个方法比较慢,有时候检测一张图片大部分时间都花在了Selective Search提取框上!在Faster R-CNN中,用RPN网络取代了Selective Search,不仅速度得到了提高,而且还获得了更加精确的结果。

RPN先使用一个CNN网络对原始图片提取特征。假设CNN提取的特征为51*39*256,即有51*39个位置,256个通道。在Faster R-CNN中,检测框有9种尺寸(3种不同的面积,每种面积又有3种长宽比,分别是2:1、1:2、1:1),称为“anchor”,如下图所示。

anchor

对于这51*39*9和anchor。设k为一个位置对应的anchor数,此时k=9。使用一个3*3的滑动窗口,将每个位置转换为一个统一的256维的特征,每个256维特征对应两个输出,一个表示该位置为物体的概率,总长度为2*k(是物体的概率+不是物体的概率),另一个是框回归,一个anchor对应4个参数,总长度为4*k。

几种网络的对比

项目 R-CNN SPPNet Fast R-CNN Faster R-CNN
提取候选框 Selective Search Selective Search Selective Search RPN网络
提取特征 CNN CNN+ROI池化 CNN+ROI池化 CNN+ROI池化
特征分类 SVM SVM 神经网络 神经网络

拓展

CenterNet: Keypoint Triplets for Object Detection
https://blog.csdn.net/liuxiaoheng1992/article/details/101151750