RCNN系列目标检测方法概述

时间:2021-09-05 11:20:47
R-CNN系列算法是将将CNN方法引入目标检测领域的开山之作,极大改善目标检测的效果。

传统的目标检测:穷举的方式进行滑窗处理;

R-CNN:基于候选区域的方法(region proposals)

一、预备知识
物体检测和图片分类的区别:图片分类不需要定位,而物体检测需要定位出物体的位置,也就是相当于把物体的bbox检测出来,还有一点物体检测是要把所有图片中的物体都识别定位出来.
IOU定义
物体检测需要检测出物体的bounding box,如下图,不仅需要定位出车辆的bounding box,还需要识别出bounding box中的物体是车辆。
RCNN系列目标检测方法概述RCNN系列目标检测方法概述
对于定位精度,有一个重要的精度评价公式:IOU;IOU定义了两个bounding box的重叠度,如下图示:
RCNN系列目标检测方法概述RCNN系列目标检测方法概述
矩形框A、B的一个重合度IOU计算公式为:IOU=(A∩B)/(A∪B)
就是矩形框A、B的重叠面积占A、B并集的面积比例:
IOU=SI/(SA+SB-SI)

非极大值抑制(NMS)
RCNN系列目标检测方法概述
RCNN系列目标检测方法概述
定位一个车辆时,算法会找出一堆方框,我们需要对有些框进行剔除。非极大值抑制:假设有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,然后判断A,C与E的重叠度,重叠度大于阈值的,扔掉,并标记E为保

留的第二个矩形框。

就这样一直重复,找到所有被保留下来的矩形框。

二、R-CNN

2.1算法总体思路(R-CNN)

RCNN系列目标检测方法概述RCNN系列目标检测方法概述


R-CNN算法分为4个步骤:

1.候选区域生长:一张图像生成1k~2k个候选区域(采用selective search方法);

2.特征提取:对每个候选区域,使用深度卷积网络提取特征(CNN),4096维的特征向量;

3.类别判断:特征送入每一类的SVM分类器,判别是否属于该类;

4.位置精修:使用回归器精细修正候选框位置

2.2注意细节
selective search 需要考虑的几个问题:
(1)适应不同的尺度(capture all scales):穷举搜索(exhaustive selective)通过改变窗口大小来适应物体的不同尺度,选择搜索同样无法避免这个问题。算法采用了图像分割和层次算法有效地解决了这个问题。
(2)多样化:单一的策略无法应对多种类别的图像。使用颜色、纹理、大小等多种策略对分割好的区域进行合并。
(2)效率:fast to compute.
wraped region 需要考虑的几个问题:
裁剪出的矩形候选框大小不一,在送入CNN中提取特征时需要对大小进行归一化,paper试验了两种不同的方法:
(1)各向异性缩放:不管图片的长宽比例,是否发生扭曲,全部缩放至固定大小,如图(D所示)
(2)各向同性缩放:考虑到图片发生扭曲会对后续CNN的精度产生影响,作者测试了两种“各向同性缩放”防范:
A.先扩充后裁剪:直接在原始图片中,把bounding box的边界进行扩展延伸成正方形,然后再进行裁剪;如果已经延伸到了原始图片的外边界,那么就用bounding box中的颜色均值填充;如下图(B)所示;
B.先裁剪后扩充:先把bounding box图片裁剪出来,然后用固定的背景颜色填充成正方形图片(背景颜色也是采用bounding box的像素颜色均值),如下图(C)所示;
RCNN系列目标检测方法概述RCNN系列目标检测方法概述
对于上面的异性、同性缩放,文献还有个padding处理,上面的示意图中第1、3行就是结合了padding=0,第2、4行结果图采用padding=16的结果。经过最后的试验,作者发现采用各向异性缩放、padding=16的精度最高,具体不再啰嗦。

CNN提取特征需要考虑的几个问题:
(1)网络架构选取:经测试AlexNet精度58.5%,VGG16精度66%,虽然VGG精度高,但计算量是AlexNet的7倍,为简单起见,paper直接选取了AlexNet;
(2)使用fine-tuning之后的CNN提取特征:使用已经在ImageNet的上已经训练过的模型在目标检测数据集pascal上进行微调,(fc:1000->21);如果不进行微调直接使用AlexNet提取的特征用于分类,类似于HOH\SIFT一样做特征提取器,不针对特定的任务,发现精度一般,但进行fine-tuning之后的精度却能达到大幅度提升;

SVM训练,测试需要考虑的几个问题:
(1)训练:
A.训练SVM的正负样本:使用IOU 的方法,计算每一个region proposal与标准框的IOU,paper实验选取的阈

值是0.3,大于该阈值的作为正样本,否则为负样本;

B.hard negative mining:一般来说训练一个SVM分类器,需要正负两个样本,训练集图片中作为正样本很

少,但是随即产生用于训练的负样本可能远大于正样本,这样训练出来的SVM效果并不好,所以利用hard 

negative mining 方法,从负样本中选取一些具有代表性的负样本,使得分类器的训练效果更好

即:负样本降采样---提取更具有判别力的负样本。

C.分类器个数:总共有N+1类(N目标类+背景),每个类别对应一个SVM线性分类器,共N个;
(2)测试
A.非极大值抑制(NMS):使用selective search 方法得到的2000个region proposals ,经过归一化之后,使用CNN最后一层FC7提取4096维特征向量,使用该类的SVM分类器对提取的特征向量进行打分,得到所有region proposals的对于这一类的分数,使用非极大值抑制(NMS去除相交的多余的框。再对这些框进行canny边缘检测,就可以得到bounding box。
(非极大值抑制(NMS)先计算出每一个bounding box的面积,然后根据score进行排序,把score最大的bounding box作为选定的框,计算其余bounding box与当前最大score与box的IoU,去除IoU大于设定的阈值的bounding box。然后重复上面的过程,直至候选bounding box为空,然后再将score小于一定阈值的选定框删除得到这一类的结果(然后继续进行下一个分类)。

位置精修需要考虑的几个问题(bounding box回归):???

讨论:CNN训练的时候,最后一层softmax就是分类层,那么为什么作者闲着没事干要先用CNN做特征提取(提取fc7层数据),然后再把提取的特征用于训练svm分类器?
这个是因为SVM训练和CNN训练过程中正负样本定义方式各不相同,导致最后采用softmax输出比采用SVM精度还低。CNN在训练的时候,对训练数据做了比较宽松的标注,比如一个bbox可能只包含物体的一部分,那么我也把他标注为正样本用于CNN训练,采用这种方法的主要原因在于CNN容易过拟合,所以需要大量的训练数据。然而SVM训练的时候,因为SVM适用于少样本训练,所以对训练数据的标注IOU比较严格,只有当bbox把整个物体都包含进去之后,才标注为物体类别,然后训练SVM。

2.3 R-CNN缺点
计算量大:R-CNN虽然不再是穷举,但依然有两千多个region proposals,每个都需要进行CNN操作,计算量巨大;
训练测试分为多步:候选区域生长,特征提取,分类,回归都是断开的训练过程,中间数据训练单独保存,训练空间和时间代价很高;
耗时长:一张图片13秒(GPU),53秒(CPU).

总结:R-CNN需要两次跑CNN模型,第一次得到的是classification的结果,第二次才得到bbox(NMS+bbox regression)

三、Fast R-CNN(特殊之处在于提出ROI pooling层,实现了end-to-end training和testing)

Fast RCNN 相对 RCNN 来说,将一张图片的测试时间降低到了 0.37 秒.主要改进有:
(1)将classification和回归结合起来,作为网络的输出,利用softmax和特殊的损失函数进行结合;
(2)将selective search提取的region proposal(ROI)传输到最后一个卷积层,降低运算成本;
(3)在最后一个卷积层后的max pooling层改为ROI pooling层,结合ROI得到特征向量用于softmax分类bbox回归。

3.1算法总体思路(Fast R-CNN)
RCNN系列目标检测方法概述
RCNN系列目标检测方法概述
RCNN系列目标检测方法概述
RCNN系列目标检测方法概述
Fast R-CNN的输入是一张图像以及使用selective search 得到的诸多region proposals(ROI),首先通过CNN提取到整幅图像的最后一层的卷积feature map,然后对每一个ROI根据映射提取自己的特征向量,然后输入到全连接层,输出为两个分支:softmax分类+bbox回归;



3.3 Fast R-CNN 总结
(1)用EdgeBoxes得到2000个region proposals即ROI,注意与RCNN区别,RCNN使用的selective search (2s/image),而fast rcnn使用的是EdgeBoxes(0.2s/image),也就是fast rcnn提高了十倍的速度;
(2)把它们整体输入到卷积网络中,在最后一个卷积层上对每个ROI求映射关系,并用一个RoI pooling layer来统一到相同的大小;
(3)经过两个fc,得到特征向量,特征向量经由各自的FC得到两个输出向量:softmax分类+bbox回归。
(4)由于全连接层计算量比较大,文章采用了truncated SVD来加速计算。
简要流程图如下:

RCNN系列目标检测方法概述RCNN系列目标检测方法概述

Fast R-CNN不足:
(1)region proposal耗时(提取regionproposals 2~3s,而提取特征分类只需0.32s),大部分时间用来生成region proposals;
(2)属于伪end-to-end训练(region proposals使用selective search先提取出来,占用磁盘存储);

基于上面几个缺点,Faster R-CNN使用卷积网络(RPN)直接产生region proposals,其本质为滑动窗口;

四、Faster R-CNN

从RCNN到fast RCNN,再到本文的faster RCNN,目标检测的四个基本步骤(候选区域生成,特征提取,分类,位置精修)终于被统一到一个深度网络框架之内。所有计算没有重复,完全在GPU中完成,大大提高了运行速度。
RCNN系列目标检测方法概述RCNN系列目标检测方法概述

faster RCNN可以简单地看做“区域生成网络(Region Proposal Network) +fast RCNN“的系统, 用RPN代替selective search。
RCNN系列目标检测方法概述

如图所示,fater rcnn其实分为4个主要内容:
1.conv layers:首先使用一组基础的conv+relu+pooling 层提取image 的feature maps,一般使用5层的ZF或16层的
VGG-16作为conv layers,这些feature maps被共享用于后续RPN和全连接层;
2.region proposal network:rpn用于生成region proposals。该层通过softmax判断anchors属于foreground或者background,再利用bounding box 回归修正anchors获得精确的proposals。
3.ROI pooling:该层综合输入的feature maps和proposals提取proposal feature 送入后续fc层判断目标类别;
4.classification:利用proposal feature maps计算proposals的类别,同时再次bbox回归获得检测框最终的精确位置。

这里大致的讲解了一下faster rcnn的大致思路,其中较为重要的region proposal network由于比较难以理解,具体细节在下一篇博客具体讲解。