原文地址https://www.cnblogs.com/wangguchangqing/p/10384058.html
Object Detection,在给定的图像中,找到目标图像的位置,并标注出来。 或者是,图像中有那些目标,目标的位置在那。这个目标,是限定在数据集中包含的目标种类,比如数据集中有两种目标:狗,猫。 就在图像找出来猫,狗的位置,并标注出来 是狗还是猫。
这就涉及到两个问题:
- 目标识别,识别出来目标是猫还是狗,Image Classification解决了图像的识别问题。
- 定位,找出来猫狗的位置。
R-CNN
2012年AlexNet在ImageNet举办的ILSVRC中大放异彩,R-CNN作者受此启发,尝试将AlexNet在图像分类上的能力迁移到PASCAL VOC的目标检测上。这就要解决两个问题:
- 如何利用卷积网络去目标定位
- 如何在小规模的数据集上训练出较好的网络模型。
对于问题,R-CNN利用候选区域的方法(Region Proposal),这也是该网络被称为R-CNN的原因:Regions with CNN features。对于小规模数据集的问题,R-CNN使用了微调的方法,利用AlexNet在ImageNet上预训练好的模型。
R-CNN目标检测的思路:
-
给定一张图片,从图片中选出2000个独立的候选区域(Region Proposal)
-
将每个候选区域输入到预训练好的AlexNet中,提取一个固定长度(4096)的特征向量
-
对每个目标(类别)训练一SVM分类器用来辨别目标物体和背景,对每个类别,都要训练一个二元SVM,识别该区域是否包含目标
-
训练一个回归器,修正候选区域中目标的位置:对于每个类,训练一个线性回归模型判断当前框是不是很完美。
下面是具体详解释: -
输入图片
-
从上下文中选择性进行搜索得到感兴趣的区域
-
区域经过卷积CNN,并经过卷积网络
-
CNN为每个区域提取特征,利用SVM将这些区域分成不同类别:
这就是RCNN检测目标物体的方法
训练
R-CNN进行目标检测的训练流程:
- 使用区域生成算法,生成2000个候选区域,这里使用的是Selective search.
- 对生成的2000个候选区域,使用预训练好的AlexNet网络进行特征提取。
将候选区域变换到网络需要的尺寸(227×227)。 在进行变换的时候,在每个区域的边缘添加p个像素,也就是手工的添加个边框,设置p=16。
改造预训练好的AlexNet网络,将其最后的全连接层去掉,并将类别设置为21(20个类别,另外一个类别代表背景)
这样一个候选区域输入到网络中,最终得到一个4096×21的特征。
- 利用上面提取到的候选区域的特征,对每个类别训练一个SVM分类器(而分类)来判断,候选框里物体的类别,是给类别就是positive,不是就是negative。比如,下图针对狗的SVM分类器
狗的SVM分类器,就要能判断出某个候选区域是不是包含狗,包含狗了那就是Positive;不包含就是Negative.这里有个问题是,假如候选区域只是框出来了某个类的一部分,那要怎么来标注这个区域呢。在R-CNN中,设定一个IOU的阈值,如果该区域与Ground truth的IOU低于该阈值,就将给区域设置为Negative。阈值设置为0.3。 - 对于面只是得到了每个候选框是不是包含某个目标,其得到的区域位置不是很准确。这里需要再训练一个线性回归模型判断,候选区域框出的目标是不是完美。对于某个类别的SVM是Positive的候选区域,来判断其框的目标区域是不是很完美。
测试
从一张图片中提取2000个候选区域,将每个区域按照训练时候的方式进行处理,输入到SVM中进行正负样本的识别,并使用候选框回归器,计算出每个候选区域的分数。
候选区域较多,有2000个,所有很多重叠的部分,就需要剔除掉重叠的部分。
针对每个类,通过计算IOU,采取非最大值抑制的方法,以最高分的区域为基础,删掉重叠的区域。
问题
这里要说明一个问题,为什么不用AlexNet直接进行多分类,反而要使用SVM构造那么多二分类器?
这是因为训练AlexNet网络需要更多的样本,因此在训练AlexNet网络时,选择样本类别上控制的不够严格(为了精确分类,在分类一步最好严格一点,但是严格样本数量又不够训练AlexNet网络的);而SVM分类器更适用于小样本分类,因此选择训练样本时更加严格。是否严格可以从控制iou阈值上看出。
为什么RCNN用SVM做分类而不直接用CNN全连接之后softmax输出?
知乎地址:https://www.zhihu.com/question/54117650