双阶段目标检测算法
本文将系统的过一遍双阶段目标检测的经典算法,文献阅读顺序如下:
R-CNN →\rightarrow→ SPPnet →\rightarrow→ Fast R-CNN →\rightarrow→ Faster R-CNN →\rightarrow→ Mask R-CNN
R-CNN
一、研究背景
R-CNN可以说是将神经网络引用到目标检测任务之中的开山之作,在R-CNN之前,人们大多数还是利用手工特征和传统的机器学习方法,例如支持向量机(SVM),随机森林等等,但传统的这些方法往往在图像处理任务上展现出的性能没有很好。
于是我们的RBG(Ross Girshick )大神就提出了R-CNN,将卷积神经网络给引用到目标检测任务中,提高了检测精度,也算开创了这一系列的先河吧~
二、算法流程

整体流程如上图所示,首先一张图片进来,先经过region proposal方法,提出待分类的区域,每张图大约会有2000个候选框,然后将这2000个候选框输入到CNN中进行特征提取,最后将提取的特征分为两个分支,一个分支输入到SVM中,进行分类,另一个分支进行回归,输出边界框的偏移值,进行边界框修正。具体来说主要分为以下四步:
(一) 利用Selective Search算法在图像上提取大约2000个候选框
(二)通过CNN对这些候选框进行特征的提取
(三)利用SVM方法进行特征分类
(四)利用线性回归器对边界框进行微调
其中(三)和(四)是并行的,并且SVM和线性回归器都是单独训练,其中他们的输入也各自有要求,这点后面会详细讲。
接下来我们分别详细阐述这四个步骤。

Selective Search(SS)算法
作者选择这个算法去提取候选框并不是因为这个算法多优秀,只不过当时大多数的方法用来提取候选框都是用这个算法的,作者为了比较方便,因此在提取候选框时也选用了这个算法。接下来我们大致说一下这个算法。
我们知道,最常规的方法,就是用不同尺寸的候选框,一行行遍历所有的点,判断候选框内物体是否有对象,是什么对象,但这样很显然,复杂度太高了,Selective Search可以快速的生成可能是物体的区域,具体算法流程如下

简单来说呢,对于一整张图像,他不断的合并相似度高的区域,直至全部合并完。当然,这样子合并完肯定会出现非常多密密麻麻的候选框,看源码还会对这些候选框进行进一步处理,例如排除太大或太小的候选框,排除扭曲的候选框,尽可能只保留矩形的等等。 这样,最后我们可以得到大约2000个候选框。 由于这块不是R-CNN的重点,例如相似度如何计算可以参考这篇文章。
https://blog.csdn.net/weixin_43694096/article/details/121610856

CNN进行特征提取
在这里需要说明的是网络的输入,我们知道候选框的大小肯定是不一样的,这点在最后输入到神经网络中可能会运行不起来,尽管现在网络大部分会在进入全连接层之前加一个 global pooling,但那样也会导致效果一般,以及那个时候global pooling应该还没有普及,因此最好的做法还是统一输入的shape。
如何选择让输入统一也是一个需要考虑的点,可以看下图,文中给出了许多统一shape的办法

第一列就是将图像等比例缩放并连带周围像素,第二列也是等比例缩放但是不连带周围像素,第三列就是强行将图像resize到所需的大小,是非等比例的。
第二行比第一行多的就是他们在底部加了16个像素的padding,实验结果表明这样会比不加好3~5个点。最终本文是选择了右下角的这种,非等比例缩放并在底部加16个像素的填充。
接着是R-CNN提取特征的网络结构,当然这里可以选择很多的网络,文中是用了8层的卷积神经网络,如图所示,5层卷积层,3层全连接层。具体的细节这里就不多说了,一个很简单的网络。

利用SVM进行分类
这一块其实也好说,就是假设有20个类别,那就对每个类别训练一个SVM,一共训练20个分类器,然后对进来的特征进行分类,之后再利用NMS对候选框进行选取。最基本的SVM这里就不一一推了,还有NMS,看图就很容易理解啦。


当然,也许时至发展今日,或许会有和我一样的疑惑,为什么要用SVM分类器?我直接用全连接不也可以吗(现在大部分都是这么做的)
作者也在文中的最后给出了解释:
Two design choices warrant further discussion. The first is: Why are positive and negative examples defined differently for fine-tuning the CNN versus training the object detection SVMs? To review the definitions briefly, for fine-tuning we map each object proposal to the ground-truth instance with which it has maximum IoU overlap (if any) and label it as a positive for the matched ground-truth class if the IoU is at least 0.5. All other proposals are labeled “background” (i.e., negative examples for all classes). For training SVMs, in contrast, we take only the ground-truth boxes as positive examples for their respective classes and label proposals with less than 0.3 IoU overlap with all instances of a class as a negative for that class. Proposals that fall into the grey zone (more than 0.3 IoU overlap, but are not ground truth) are ignored.
我简单翻译一下,我们在训练CNN时,使用的是与ground truth的IOU最大或IOU>0.5的候选框作为正样本,其余的是负样本。这是不好的,条件太宽松了,但是没办法,CNN训练需要更多的样本。 那我们在训练SVM的时候,就可以直接拿ground truth 作为正样本,与GT的IOU<0.3时作为负样本,利用了hard negative mining 进行训练。
PS:其实我觉得,一切还是要以实验为尊,在这里,实验表明,用SVM就是比用全连接要好,因此我们给他一个合理的解释。其实在后面读到Fast R-CNN的时候你会发现,他还是用了全连接,没用SVM,就是因为实验出来两者差不多甚至全连接更好。
利用线性回归器对边界框进行微调(Bounding-Box Regression)
Bounding-Box Regression 深挖原理,一个最基本的要求就是,假设我们的边界框目前是P(Px,Py,Pw,Ph)P(P_x,P_y,P_w,P_h)P(Px,Py,Pw,Ph) 其中Px,PyP_x,P_yPx,Py表示的是边界框的中心,Pw,PhP_w,P_hPw,Ph表示的是边界框的宽度和高度,Ground Truth我们就用G(Gx,Gy,Gw,Gh)G(G_x,G_y,G_w,G_h)G(Gx,Gy,Gw,Gh)表示,那么我们是希望找到一个映射,使得
f(P)=G^≈Gf(P)=\hat{G}\approx{G}f(P)=G^≈G
RCNN论文里指出,边界框回归主要是利用平移变换和尺度变换来实现映射
平移变换可由下面公式表示
Δx=Pwdx(P),Δy=Phdy(P)\Delta{x}=P_wd_x(P),\Delta{y}=P_hd_y(P)Δx=Pwdx(P),Δy=Phdy(P)
G^x=Px+Δx,G^y=Py+Δy\hat{G}_x=P_x+\Delta{x},\hat{G}_y=P_y+\Delta{y}G^x=Px+Δx,G^y=Py+Δy
尺度变换由如下公式表示
Δw=edw(P),Δh=edh(P)\Delta{w}=e^{d_w(P)},\Delta{h}=e^{d_h{(P)}}Δw=edw(P),Δh=edh(P)
G^w=Pw∗Δw,G^h=Ph∗Δh\hat{G}_w=P_w*\Delta{w},\hat{G}_h=P_h*\Delta{h}G^w=Pw∗Δw,G^h=Ph∗Δh
这里用eee次方是因为要保证尺度变化的非负性~
综上,我们可以得到以下四个公式
G^x=Px+Pwdx(P)\hat{G}_x=P_x+P_wd_x(P)G^x=Px+Pwd

248

被折叠的 条评论
为什么被折叠?



