R-CNN论文详细解读

R-CNN是13年https://arxiv.org/abs/1311.2524的论文。对计算机视觉的影响很大!

基础知识掌握:

①先来简单区分计算机视觉的任务:

简单来说,分类(classify)、定位(localization)和检测(detection)的区别如下: 
classify:是什么? 
localization:在哪里?是什么?(单个目标) 
detection:在哪里?分别是什么?(多个目标)

 

②物体检测算法中常用到的几个概念:Bbox,IoU,非极大值抑制

Bounding Box(bbox):

bbox是包含物体的最小矩形,该矩形既不太大以至于留出太多非物体空间,也不太小以至于没包住物体。

物体检测中关于物体位置的信息输出是一组(x,y,w,h)数据,其中x,y代表着bbox的左上角(或者其他固定点,可自定义),对应的w,h表示bbox的宽和高.一组(x,y,w,h)可以唯一的确定一个定位框。

Intersection over Union(IoU):

对于两个区域R和R′,则两个区域的重叠程度overlap计算如下:
O(R,R′)=|R∩R′| / |R∪R′|

在训练网络的时候,我们常依据侯选区域和标定区域的IoU值来确定正负样本。

非极大值抑制(Non-Maximum Suppression又称NMS):

非极大值抑制(NMS)可以看做是局部最大值的搜索问题,集通过IOU计算分数最高的框,然后计算与刚刚最高分数那个框有太多重合的部分的框都去掉,这样就可以去掉那些不准确的框。

 

有了基础知识,下面来介绍R-CNN的内容:

 

如上图所示,R-CNN这个物体检查系统可以大致分为四步进行:
1、获取输入图像,提取约2000个候选区域

2、将候选图片进行缩放

3、将候选区域分别输入CNN网络

4、将CNN的输出输入SVM中进行类别的判定

5、将特征输入训练好的线形回归器中,得到更为精确的位置定位

 

上述五个步骤是一个大致的过程,而且是一个检测的过程,实际上训练过程比较麻烦,下面开始详细介绍。

一、候选区域的提取

近来有很多研究都提出了产生类别无关区域推荐的方法。比如: objectness(物体性),selective search(选择性搜索),category-independent object proposals(类别无关物体推荐),constrained parametric min-cuts(受限参最小剪切, CPMC),multi-scal combinatorial grouping(多尺度联合分组),以及Ciresan等人的方法,将CNN用在规律空间块裁剪上以检测有丝分裂细胞,也算是一种特殊的区域推荐类型。由于R-CNN对特定区域算法是不关心的,所以我们采用了选择性搜索(selective search以方便和前面的工作进行可控的比较。

选择性搜索知识可以看这篇文章

 

二、缩放候选区域

特征提取(Feature extraction) 
我们使用Krizhevsky等人所描述的CNN的一个Caffe实现版本对每个推荐区域抽取一个4096维度的特征向量把一个输入为277*277大小的图片,通过五个卷积层和两个全连接层进行前向传播,最终得到一个4096-D的特征向量。读者可以参考AlexNet获得更多的网络架构细节。 
为了计算region proposal的特征,我们首先要对图像进行转换,使得它符合CNNC的输入(架构中的CNNC只能接受固定大小:277*277)。这个变换有很多办法。看下面

缩放分为两大类(该部分在原文附录A):

1)各向同性缩放,长宽放缩相同的倍数

  • tightest square with context:
    把region proposal的边界进行扩展延伸成正方形,灰色部分用原始图片中的相应像素填补,如下图(B)所示
  • tightest square without context:
    把region proposal的边界进行扩展延伸成正方形,灰色部分不填补,如下图(C)所示

2)各向异性缩放, 长宽放缩的倍数不同
不管图片是否扭曲,长宽缩放的比例可能不一样,直接将长宽缩放到227*227,如下图(D)所示

最后发现候选框周围加上16的padding的效果最好。所以作者选择了候选框周围加上16的padding,再进行各向异性缩放

 

三、测试方法

测试时其实分两个结果
1.分类
在测试的时候,先对带检测图像提取出约2000个候选区域,将每个区域都进行缩放,然后将缩放后的图片输入CNN进行特征提取,对CNN输出的特征用SVM进行打分(每类都有一个SVM,21类(20个分类+背景1个=21个)就有21个SVM分类器),对打好分的区域使用NMS即非极大值抑制(每类都单独使用)。

到这里分类就完成了,但是得到的位置只是候选区在图像中的位置,而候选区的位置并不一定就是ground truth,即检测目标的真实位置

2.定位(回归)
将CNN对候选区域提取出的特征输入训练好的线形回归器中,得到更为精确的位置定位,具体情况会在下面训练方法中详细介绍。但要明确的是,这些回归器是按照类来训练的,即每类分类完后进行回归。

 

四、训练方法

1、有监督的预训练
预训练采用了Caffe的CNN库。训练的时候,文章用了个trick,他先用ILSVRC2012数据库训练Alexnet,训练的时候目标时图片分类,因为ILSVRC2012数据库没有分类的标定数据。这步称为预训练

 

2、fine-tuning

为了让我们的CNN适应新的任务(即检测任务)和新的领域(变形后的推荐窗口)。我们只使用变形后的推荐区域对CNN参数进行SGD训练。我们替换掉了ImageNet专用的1000-way分类层,换成了一个随机初始化的21-way分类层,(其中20是VOC的类别数,1代表背景)而卷积部分都没有改变。我们对待所有的推荐区域,如果其和真实标注的框的IoU>= 0.5就认为是正例,否则就是负例。SGD开始的learning_rate为0.001(是初始化预训练时的十分之一),这使得调优得以有效进行而不会破坏初始化的成果。每轮SGD迭代,我们统一使用32个正例窗口(跨所有类别)和96个背景窗口,即每个mini-batch的大小是128。另外我们倾向于采样正例窗口,因为和背景相比他们很稀少。

微调(fine-tuning)是当数据量不够的时候,常用的一种训练方式,即先用别的数据库训练网络,然后再用自己的数据库微调训练。

 

3、目标种类分类器

思考一下检测汽车的二分类器。很显然,一个图像区域紧紧包裹着一辆汽车应该就是正例。同样的,没有汽车的就是背景区域,也就是负例。较为不明确的是怎样标注哪些只和汽车部分重叠的区域。我们使用IoU重叠阈值来解决这个问题,低于这个阈值的就是负例。这个阈值我们选择了0.3,是在验证集上基于{0, 0.1, … 0.5}通过网格搜索得到的。我们发现认真选择这个阈值很重要。如果设置为0.5,会降低mAP5个点,设置为0,就会降低4个点。正例就严格的是标注的框。

一旦特征提取出来,并应用标签数据,我们优化了每个类的线性SVM。由于训练数据太大,难以装进内存,我们选择了标准的hard negative mining method难负例挖掘算法,用途就是正负例数量不均衡,而负例分散代表性又不够的问题,hard negative就是每次把那些顽固的棘手的错误,再送回去继续练,练到你的成绩不再提升为止.这一个过程就叫做’hard negative mining‘)

①在fine-tunning和SVM训练这两个阶段,作者定义得正负样例是不同的

因为在训练SVM时,正样本为groundtruth,负样本定义为与ground truth的IoU小于0.3的候选区域为负样本,介于0.3与0.7之间的样本忽略。
fine-tuning是担心过拟合的原因,要扩大正样本的样本量,所以定义比较宽松,但是SVM是最终用于分类的分类器,而且SVM原理就是最小的距离最大化,越难分的数据越有利于SVM的训练,所以对样本的定义比较严格。

为什么单独训练了一个SVM而不是直接用softmax呢

因为在训练softmax的时候数据本来就不是很准确,而SVM的训练使用的是hard negative也就是样本比较严格,所以SVM效果会更好。

 

4、回归器训练
回归器是线性的,输入为Alexnet pool5的输出。
bbox回归认为候选区域和ground-truth之间是线性关系(因为在最后从SVM内确定出来的区域比较接近ground-truth,这里近似认为可以线性关系)

训练回归器的输入为N对值,\{(P^i, G^i)\}_{i=1,2,...,N},分别为候选区域的框坐标和真实的框坐标,下面在不必要时省略i。这里选用的Proposal必须和Ground Truth的IoU>0.6才算是正样本。

从候选框P到预测框\hat{G}的基本思路如下:

因为我们在分类之后得到候选框P (P_{x}, P_{y}, P_{w}, P_{h}),其中P_{x}P_{y}为候选框的中心点,P_{w}P_{h}为候选框的宽高,下面介绍中所有框的定位都用这种定义,即x和y表示中心点坐标,w和h表示框的宽高。知道候选框的表示,那么只要估计出出候选框与真实框的平移量和尺度缩放比例,就可以得到我们的估计框了

1)先求平移量(Δx,Δy)

Δx=P_{w}d_{x}(P) , Δy=P_{h}d_{y}(P)

即R-CNN论文里面的:
\hat{G_{x}}=P_{w}d_{x}(P)+P_{x},\hat{G_{y}}=P_{w}d_{y}(P)+P_{y}

2)算尺度放缩量(S_{w},S_{h})
S_{w}=P_{w}d_{w}(P), S_{h}=P_{h}d_{h}(P)
\hat{G_{w}}=P_{w}exp(d_{w}(P)), \hat{G_{h}}=P_{h}exp(d_{h}(P))

我们要学习的是d_{x}(P),d_{y}(P),d_{w}(P),d_{h}(P)这四个变换,就可以得到估计框了。

这四个变换可以用下列公式表示:
d_{*}(P) = w^{T}_{*}\Phi_{5}(P)
上式中\Phi_{5}(P)为Alexnet pool5输出的特征,所以要求d_{x}(P),d_{y}(P),d_{w}(P),d_{h}(P)这四个变换,只需求出w^{T}_{*}即可。

该回归器的损失函数为:
w_{*}=\mathop{\arg\min}_{\hat{w}_{*}}\sum_{i}^{n}(t^{i}_{*}-\hat{w}^{T}_{*}\Phi_{5}(P^{i}))^2+\lambda\|\hat{w}_{*}\|^2
上式中的t^{i}_{*}可以通过如下公式求出:
t_{x}=(G_{x} - P_{x})/P_{w}
t_{y}=(G_{y} - P_{y})/P_{h}
t_{w}=log(G_{w}/P_{w})
t_{h}=log(G_{h}/P_{h})
所以通过输入的特征值训练,从而求出\hat{w}_{*},就可以得到回归器

 

参考https://www.jianshu.com/p/5056e6143ed5

 

 

 


 

 

 

  • 12
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
R-CNN(Region-based Convolutional Neural Networks)是一种目标检测算法,它通过两个阶段来检测图像中的目标物体。首先,R-CNN使用选择性搜索(Selective Search)算法生成一系列候选区域,然后对每个候选区域进行卷积神经网络(CNN)特征提取和分类。R-CNN的主要缺点是速度较慢,因为每个候选区域都需要独立地进行CNN特征提取和分类。 Fast R-CNN是对R-CNN的改进,它通过引入RoI池化层(Region of Interest pooling)来解决R-CNN中重复计算的问题。RoI池化层可以将不同大小的候选区域映射为固定大小的特征图,从而使得所有候选区域可以共享相同的特征提取过程。这样一来,Fast R-CNN相比于R-CNN具有更快的速度。 Faster R-CNN是对Fast R-CNN的进一步改进,它引入了一个称为Region Proposal Network(RPN)的子网络来生成候选区域。RPN通过滑动窗口在特征图上提取候选区域,并为每个候选区域分配一个得分,然后根据得分进行筛选和排序。这种端到端的训练方式使得Faster R-CNN在目标检测任务上具有更高的准确性和更快的速度。 Mask R-CNN是在Faster R-CNN的基础上进一步发展的,它不仅可以进行目标检测,还可以进行实例分割。Mask R-CNN在Faster R-CNN的基础上增加了一个分支网络,用于预测每个候选区域中目标物体的像素级掩码。这使得Mask R-CNN能够同时获得目标的位置信息和像素级别的语义信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值