论文下载地址:Rich feature hierarchies for accurate object detection and semantic segmentation
Answer:
我们的方法结合了两个关键见解 :
(1) 可以将大容量卷积神经网络 (CNNs) 应用于自下而上的区域提案,以便对对象进行定位和分割;
(2) 当标记训练数据稀缺时,对辅助任务进行有监督的预训练,其次是特定领域的微调,可以显着提高性能。
(3) 由于我们将区域提案与CNNs结合在一起,因此我们将方法称为R-CNN: 具有CNN功能的区域。
Answer:
我们专注于两个问题:
(1)使用深度网络定位对象
(2)仅使用少量带注释的检测数据训练大容量模型
Answer:
一种选择是建立一个滑动窗口检测器。,利用CNN去提取特征为了保持高空间分辨率,这些CNN通常仅具有两个卷积层和池化层,还需要考虑采用滑动窗口方法,但是这些问题可以通过在 “使用区域识别” 范式内操作来解决CNN定位问题,并且该范式在对象检测和语义分割方面都取得了成功。
(解释)测试表明,我们的方法为输入图像生成大约2000个与类别无关的区域提案,使用CNN从每个提案中提取固定长度的特征向量,然后使用特定于类别的线性SVM对每个区域进行分类。我们使用一种简单的技术 (仿射图像扭曲) 来计算来自每个区域提案的固定大小的CNN输入,而与区域的形状无关。如图所示Fig.1
Answer:
使用无监督的预训练,然后进行有监督的微调。在大型辅助数据集 (ILSVRC) 上进行有监督的预训练,然后在小型数据集 (PASCAL) 上进行域特定的微调,是在数据稀缺时学习大容量CNN的有效范例。在我们的实验中,用于检测的微调可将地图性能提高8个百分点。经过微调后,与高度调整的基于HOG的可变形零件模型 (DPM) 的33% 相比,我们的系统在VOC 2010上获得了54% 。
我们的物体检测系统由三个模块组成。如图所示Fig.2
第一个生成与类别无关的区域提案,定义了我们的检测器可用的候选检测集(2)。第二个模块是大型卷积神经网络,它从每个区域中提取固定长度的特征向量(3)。第三个模块是一组特定于类的线性SVM(4)
PS:(n)代表对应图中的第几步
虽然R-CNN与特定区域建议方法无关,但我们使用选择性搜索(Selective Search)来实现区域的选择。
介绍一下Selective Search(SS采用了一种具备层次结构的算法来解决这个问题),训练过程中用于从输入图像中搜索出2000个Region Proposal。Selective Search算法主要步骤:
1.使用一种过分割手段,将图像分割成小区域 (1k~2k 个)
2.计算所有邻近区域之间的相似性,包括颜色、纹理、尺度等
3.将相似度比较高的区域合并到一起
4.计算合并区域和临近区域的相似度
5.重复3、4过程,直到整个图片变成一个区域
参考:Selective Search 算法
为了计算区域建议的特征,我们必须首先将该区域中的图像数据转换为与CNN兼容的形式 (其体系结构需要固定227 × 227像素大小的输入)。为了进行检测,我们考虑为任意图像矩形的对象建议。
我们评估了将对象提案转换为有效CNN输入的两种方法:
第一种方法 (“带有上下文的最紧的正方形”) 将每个对象提案封闭在最紧的正方形内,并缩放 (各向同性) 该正方形中包含的图像到CNN输入大小(B)。此方法的一个变体 (“没有上下文的最紧正方形”) 排除了围绕原始对象建议的图像内容(C)。
第二种方法 (“扭曲”) 各向异性地将每个对象提案缩放到CNN输入大小(D)。{“扭曲”之前,我们先在候选框周围加上16的padding,再进行各向异性缩}
如图所示Fig.4:
参见上文:如何解决仅使用少量带注释的检测数据训练大容量模型?
原CNN模型针对ImageNet数据集且无变形的图像来提取特征,现在却是针对新任务 (检测) 和新的领域(VOC检测数据集且变形的图像)来提取特征。所以,为了让我们的CNN适应新的任务(即检测任务)和新的领域(变形后的推荐窗口),需要对CNN做特定领域的参数调优,也就是fine-tunning。用的是从每张VOC训练图像中搜索到的Region Proposal进行微调的。
除了用随机初始化 (N+ 1) 的分类层 (其中N是对象类的数量,背景是1) 替换CNN的ImageNet-specific 1000分类层之外,CNN体系结构是不变的。然后计算每个region proposal和ground truth 的IoU,对于IoU>0.5的region proposal被视为正样本,否则为负样本(即背景)。另外,由于对于一张图片的多有候选区域来说,负样本是远远大于正样本数,所以需要将正样本进行上采样来保证样本分布均衡。在每次迭代的过程中,选择层次采样,每个mini-batch中采样两张图像,从中随机选取32个正样本和96个负样本组成一个mini-batch(128,正负比:1:3)。我们来进行训练。我们继续使用仅扭曲区域提案对CNN参数进行使用0.001的学习率和SGD进行训练。
PS:
什么是IoU?
简单来说IoU就是用来度量目标检测中预测框与真实框的重叠程度。在图像分类中,有一个明确的指标准确率来衡量模型分类模型的好坏。其公式为:
这个公式显然不适合在在目标检测中使用。我们知道目标检测中都是用一个矩形框住被检测物体,又因为检测物体尺度不同,预测框与真实框或大或小。所以度量标准必然是具有尺度不变性的,那么大神们就引入了一个概念IoU(交并比),用预测框(A)和真实框(B)的交集除上二者的并集,其公式为:
显而易见,IOU的值越高也说明A框与B框重合程度越高,代表模型预测越准确。反之,IOU越低模型性能越差。
参考:IoU介绍
对于一张图片或者区域,很明显,紧紧包围汽车的图像区域应该是一个积极的例子。同样,很明显,与汽车无关的背景区域应该是一个负面的例子。
我们通过IoU重叠阈值来解决此问题,低于该阈值的区域被定义为负。(我们通过实验发现仔细选择这个阈值很重要)
接下来一旦利用CNN提取特征并应用训练标签后,我们将每一类优化一个线性SVM。由于训练数据太大,无法放入内存,因此我们采用标准的hard negative mining method。hard negative mining 会迅速收敛,并且在实践中,仅在所有图像上一次通过后,地图就停止增加。
PS:
Hard Negative Mining Method 思想:
hard是困难样本,negative是负样本,hard negative就是说在对负样本分类时候,loss比较大(label与prediction相差较大)的那些样本,也可以说是容易将负样本看成正样本的那些样本。
举个例子:
1.假如roi里没有物体,全是背景,这时候分类器很容易正确分类成背景,这个就叫easy negative;
2.假如roi里有二分之一个物体,标签仍是负样本,这时候分类器就容易把他看成正样本,即假阳性(false positive),这时候就是hard negative。
hard negative mining就是多找一些hard negative加入负样本集,进行训练,这样会比easy negative组成的负样本集效果更好。主要体现在也false positive少,因为它相当于一个错题集。
参考:hard negative mining
如何判断它为hard negative?
Answer:
(1)先用初始的正负样本训练分类器(此时为了平衡数据,使用的负样本也只是所有负样本的子集)
(2)用(1)训练好的分类器对样本进行分类,把其中错误分类的那些样本(hard negative,最容易被判断为正样本的负样本为困难样本)放入负样本子集,
(3)再继续训练分类器,
(4)如此反复,直到达到停止条件(比如分类器性能不再提升).
参考: rcnn中的Hard negative mining方法是如何实现的? - 薰风初入弦的回答 - 知乎
上述CNN训练完成后就已经能够对矩形框中的物体做出类别判断了,这里我们还需要使用SVM进行类别判断? **原因是CNN需要大量的训练数据,训练数据过少容易出现过拟合的现象,而传统的SVM适用于少样本的训练,所以这里的类别判断才使用SVM。**我们前面训练的AlexNet(或者其它网络)最后一层(softmax)在这里也是不需要使用的,我们只使用上一层输出的4096维的特征向量作为输入(其实就是将前面训练的神经网络当作特征提取器,而不直接使用其用于分类),我们为每个物体类训练一个SVM分类器,然后将上述特征输入到SVM中即可。
我们使用简单的边界框回归阶段来提高定位性能。在使用特定于类的检测SVM对每个选择性搜索建议进行评分之后,我们使用特定于类的边界框回归器预测了用于检测的新边界框。
我们的目标是学习一种将建议的框P(proposed box,P= (Px, Py, Pw, Ph))映射到地面真相框G(ground-truth box,G= (Gx, Gy, Gw, Gh))的转换。
我们根据四个函数dx§,dy§,dw§ 和dh§ 对变换进行参数化。前两个指定P边界框中心的比例不变平移,而第二个指定P边界框的宽度和高度的对数空间平移。在学习了这些函数之后,我们可以通过应用转换将输入建议P转换为预测的地面真相框G。
我们在实现边界框回归时发现了两个微妙的问题。首先,正则化很重要: 我们基于验证集设置 λ = 1000。其次,在选择使用哪些训练对 (P,G) 时必须小心(只有在proposal P附近至少有一个地面真相框的情况下,我们才能从proposal P中学习)。
消融实验类似于“控制变量法”。
假设在某目标检测系统中,使用了A,B,C,取得了不错的效果,但是这个时候你并不知道这不错的效果是由于A,B,C中哪一个起的作用,于是你保留A,B,移除C进行实验来看一下C在整个系统中所起的作用
Layer fc6 is fully connected to pool5(half-wave rectified (x ← max(0, x)). )
Layer fc7 is the final layer of the network and is fully connected to fc6(half-wave rectified (它们都经过半波整流 x ← max(0, x)).)
在本文中:主要用于对比:预训练,fine-tunning,bbox reg ,CNN层数
可以看出:Pre-training + Fine-tunning + bbox reg + CNN层数 综合起来性能更加(在训练集和测试集上都体现出了(mAP))
1.数据准备
2.Region Proposal :SS搜索算法选取Region Proposal或者候选框(2000个)
3.Feature Extraction : resize 至固定大小+CNN特征提取(2000个4096维Feature)
4.SVM分类 :将将(2000,4096)维矩阵输入进SVM分类器中,最终得到(2000,21)矩阵。每一行的21个列值,分别代表了这个RP属于每一个类的可能性。通过提前设置好的backgroud阈值 α和所属于类的阈值 β,筛选出满足条件的 m 个RP区域。
5.Bounding Box Regression:将SVM筛选出的 m 个RP区域对应的特征向量,组成(m,4096)矩阵代入 (4096,4)的回归矩阵 d 中,最后输出(m,4)偏移矩阵
6.只画出SVM筛选出的 m个RP区域的修正后的检测框。考虑到bbox的大量累赘重叠,进行非极大值抑制(NMS),得到最终检测结果。
PS:
非极大值抑制(non-maximum suppression,NMS)的理解
非极大值抑制就是一个寻找局部最大值的过程。在进行目标检测时一般会采取窗口滑动的方式,在图像上生成很多的候选框,然后把这些候选框进行特征提取后送入分类器,一般会得出一个得分(score),比如人脸检测,会在很多框上都有得分,然后把这些得分全部排序。选取得分最高的那个框,接下来计算其他的框与当前框的重合程度(IoU),如果重合程度大于一定阈值就删除,因为在同一个脸上可能会有好几个高得分的框,都是人脸但是不需要那么框我们只需要一个就够了。
举个例子:
假设有ABCDEF这么多个得分框(已经按照得分从小到大排序)。
1、从最大概率矩形框F开始,分别判断A~E与F的重叠度IoU是否大于某个设定的阈值;
2、假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第一个矩形框F,是我们保留下来的。
3、从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。
4、一直重复这个过程,找到所有曾经被保留下来的矩形框。
第一步寻找得分框:
不同选择的性能对比测试:带有Bounding box regression 的R-CNN 达到了mAP最高(性能最佳)
基于O-net和T-net不同架构的网络结果测试对比:
1.训练是一个多阶段的管道。R-CNN首先使用日志丢失对对象提案进行微调。然后,它适合SVM到ConvNet功能。这些SVM充当对象检测器,取代了通过微调学习的softmax分类器。在第三个训练阶段,学习边界框回归变量。
2.训练在空间和时间上都是昂贵的。对于SVM和bounding-box回归器训练,从每个图像中的每个对象提案中提取特征并将其写入磁盘。对于非常深的网络,例如VGG16,此过程需要2.5 GPU天的VOC07 trainval集的5k图像。这些功能需要数百gb的存储空间。
3.对象检测缓慢。测试一下时,从每个测试一下图像中的每个对象建议中提取特征。使用VGG16进行检测需要47s/图像 (在GPU上)。
理解的:
(1)训练时间长:主要原因是分阶段多次训练,而且对于每个region proposal都要单独计算一次特征,导致整体的时间变长。(R-CNN它对每个region proposal执行ConvNet前向传递,而不共享计算。)
(2)占用空间大:每个图像中的每个region proposal中提取特征并将其写入磁盘,以供后续的步骤使用。
(3)多阶段:文章中提出的模型包括多个模块,每个模块都是相互独立的,训练也是分开的。这会导致精度不高,因为整体没有一个训练联动性,都是不共享分割训练的,自然最重要的CNN特征提取也不会做的太好。
(4)测试时间长,由于不共享计算,所以对于test image,也要为每个region proposal单独计算一次feature map,因此测试时间也很长。
近年来,物体检测性能停滞不前。性能最好的系统是复杂的合奏,它们将多个低级图像特征与来自对象检测器和场景分类器的高级上下文相结合。本文提出了一种简单且可扩展的对象检测算法,该算法比PASCAL VOC 2012上的最佳结果提供了30% 的相对改进。我们通过两个见解实现了这一表现。首先是将大容量卷积神经网络应用于自下而上的区域提案,以定位和分割对象。第二种是在标记训练数据稀少的情况下训练大型CNN的范例。我们证明,对于具有丰富数据 (图像分类) 的辅助任务,在监督下对网络进行预训练,然后针对数据稀缺的目标任务 (检测) 对网络进行微调是非常有效的。我们推测 “有监督的预训练/特定领域的微调” 范式对于各种数据稀缺的视觉问题将非常有效。最后,我们指出,通过结合使用计算机视觉和深度学习 (bottom-up区域提案和卷积神经网络) 的经典工具来获得这些结果非常重要。两者不是科学探究的对立路线,而是自然而不可避免的伙伴。
Rich feature hierarchies for accurate object detection and semantic segmentation
Selective Search 算法
IoU介绍
rcnn中的Hard negative mining方法是如何实现的? - 薰风初入弦的回答 - 知乎
NMS
RCNN