目标检测:R-CNN

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tinyzhao/article/details/53708862

《Rich feature hierarchies for accurate object detection and semantic segmentation》论文解读


作者是Ross B. Girshick,简称RBG,作者主页:

https://people.eecs.berkeley.edu/~rbg/index.html

目标检测问题就是从图片中检测出目标的位置并判断目标的类别,比如人脸检测问题。不过人脸检测问题只是一种专门针对人脸的检测问题,而本文提出的R-CNN是通用目标检测问题,针对20类目标的检测。通用目标检测问题只需要进行适当修改就可以应用在人脸检测上。R-CNN检测框架的发展脉络是R-CNN,SPPnet,Fast R-CNN,Faster R-CNN。一些新的方法比如YOLO和SSD以后有时间再解读。

概述

如我前面博客所说,检测问题需要解决三个问题:1、候选区域生成;2、候选区域特征提取;3、目标分类识别。R-CNN对此解答是:selective search,CNN,SVM。

R-CNN

R-CNN目标检测框架如下所示:

arch

对于输入图片,首先使用selective search方法提取大概2k个候选区域,然后每个候选区域变形缩放到227*227输入到AlexNet中,得到4096维的特征以后,使用SVM进行分类,得到类别以后,还需要使用边框回归(Bounding box regression)提高边框位置精度。

AlexNet如何微调?AlexNet微调时,样本为基准方框中的区块,以及和基准区块重叠比较大的区块(IoU>0.5),这些都归为一类;并把AlexNet最后一层换成21个类别(20类目标+背景)的softmax分类。这样训练出来的CNN最后的softmax分类就不是很准确,但是能够用来提取目标特征。

SVM如何训练?SVM本质是一个二分类器,正样本为包含目标的基准框(ground true),需要将目标完整包含在框中,负样本为非本类目标(背景或者其他,IoU<0.3)。将正负样本使用CNN提取特征以后,输入到SVM进行训练。SVM对小样本训练比较好,比如人体检测经典方法就是HOG+SVM。注意SVM和CNN的训练样本是不一样的,SVM训练样本更为严格。

这就是R-CNN的全部内容了,其实它仍然是传统检测的方法,不过把特征提取步骤换成了CNN。R-CNN理解起来困难的主要原因在于目标检测领域术语不明白,搞懂几个关键的名词以后还是比较容易理解的。

相关术语

在目标检测论文中,常出现的一些方法有Warp和Crop,Bounding box regression,IoU,NMS,Hard negative mining。这里具体介绍一下。这些资料有些是直接从网上复制过来的,我稍作整理。

Warp和Crop

这里写图片描述

crop可以翻译成剪裁,warp可以翻译成变形缩放。

Bounding box regression

这边有个很好的答案了:

http://www.caffecn.cn/?/question/160

简单而言就是将预测得到的框移动到实际的框,输入特征是候选区域提取的特征,目标是两个框的变化值。

IoU

重叠度(IOU):

物体检测需要定位出物体的bounding box,就像下面的图片一样,我们不仅要定位出车辆的bounding box 我们还要识别出bounding box 里面的物体就是车辆。

这里写图片描述

对于bounding box的定位精度,有一个很重要的概念: 因为我们算法不可能百分百跟人工标注的数据完全匹配,因此就存在一个定位精度评价公式:IOU。 它定义了两个bounding box的重叠度,如下图所示

iou

IoU=(AB)/AB

就是矩形框A、B的重叠面积占A、B并集的面积比例。

非极大值抑制(NMS):

RCNN会从一张图片中找出n个可能是物体的矩形框,然后为每个矩形框为做类别分类概率:

car

就像上面的图片一样,定位一个车辆,最后算法就找出了一堆的方框,我们需要判别哪些矩形框是没用的。非极大值抑制的方法是:先假设有6个矩形框,根据分类器的类别分类概率做排序,假设从小到大属于车辆的概率 分别为A、B、C、D、E、F。
(1)从最大概率矩形框F开始,分别判断A~E与F的重叠度IOU是否大于某个设定的阈值;
(2)假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第一个矩形框F,是我们保留下来的。
(3)从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。
就这样一直重复,找到所有被保留下来的矩形框。
非极大值抑制(NMS)顾名思义就是抑制不是极大值的元素,搜索局部的极大值。这个局部代表的是一个邻域,邻域有两个参数可变,一是邻域的维数,二是邻域的大小。这里不讨论通用的NMS算法,而是用于在目标检测中用于提取分数最高的窗口的。例如在行人检测中,滑动窗口经提取特征,经分类器分类识别后,每个窗口都会得到一个分数。但是滑动窗口会导致很多窗口与其他窗口存在包含或者大部分交叉的情况。这时就需要用到NMS来选取那些邻域里分数最高(是行人的概率最大),并且抑制那些分数低的窗口。

Hard negative mining

在目标分类问题里面(比如最后的SVM训练),正例数量(比如飞机图片)是相对较少的,负例(比如非飞机图片)是很多的。这样训练出来的分类器在检测分类时候的效果并不是太好。此时,我们可以先跑一次检测器,把那些不是飞机而被错分为飞机的图片 (false positive)放在训练集的负样本中重新训练分类器,这样检测效果就得到了提升。

总结

R-CNN其实是很慢的,单张图片需要几十秒时间。我们设想一下一个完美的目标检测系统应该是端到端的,输入一张图片,不需要经过复杂的流水线,只要一级就可以直接得到目标位置和目标类别。从这个角度来分析一下R-CNN的缺点,这样对后续的改进才能有指导意义。

(1)在候选区域选择阶段,使用了selective search产生候选区域,这部分是在CPU中完成,而且独立于神经网络。不过这部分直到Faster R-CNN时候才成为系统瓶颈。
(2)特征提取时候,每个候选区域都需要经过一次CNN,2000个候选区域就需要经过2000次,这个过程非常慢。
(3)训练SVM,需要使用CNN提取的特征另外进行训练,需要将正负样本特征保存下来,训练过程繁杂。
(4)边框回归是对特征进行,游离于系统之外。

总之,R-CNN这套方法主要贡献在于把特征提取换成了CNN,其他的模块都是游离于CNN之外的,本质上还是一种传统的目标检测方法。

主要矛盾和次要矛盾先抓住主要矛盾,就是系统中最耗时的特征提取步骤,这也是最先有人做出了改进,那就是Kaiming He大神的SPP-net,下一篇将解读这篇论文。

猜你喜欢

转载自blog.csdn.net/tinyzhao/article/details/53708862