目标检测算法:RCNN论文解读

目标检测算法:RCNN论文解读

前言

​ 其实网上已经有很多很好的解读各种论文的文章了,但是我决定自己也写一写,当然,我的主要目的就是帮助自己梳理、深入理解论文,因为写文章,你必须把你所写的东西表达清楚而正确,我认为这是一种很好的锻炼,当然如果可以帮助到网友,也是很开心的事情。

说明

​ 如果有笔误或者写错误的地方请指出(勿喷),如果你有更好的见解也可以提出,我也会认真学习。

原始论文地址

点击这里,或者复制链接

https://arxiv.org/abs/1311.2524

目录结构

1. 文章内容概述:

​ 近几年,在目标检测领域发展一直停步不前。作者提出了一种将区域建议(region proposal)和CNN结合的方法,称之为R-CNN,其在目标检测数据集上取得了当时最好的结果。

2. 基础知识点:

2.1 PASCAL和VOC是什么?

​ PASCAL是欧盟资助的网络组织,可以类似理解为ImageNet。而VOC,即Visual Objec Classes,是PASCAL举办的一个目标检测挑战赛。

​ 不过,VOC在2012年已经停办了,但是其数据集仍然可以使用。其中,值得一提是VOC数据集共有20个类别(不包含背景)。

2.2 mAP:

PR曲线

​ PR曲线,即precision-recall(查准率-查全率)曲线,也就是我们熟知的ROC曲线。

​ 在西瓜书中,这样描述查准率和查全率:

在这里插入图片描述

在这里插入图片描述

​ 而在我们的目标检测中:

  • TP认为是IOU>IOU阈值(一般为0.5)的预测框的数量;FP则相反
  • FN认为是没有检测到的ground-truth框数量

​ 这样一来,上述两个公式可以改写为:

P = TP / 所有预测框的数量
R = TP / 所有真实框的数量

AP

​ AP就是某一个类别PR曲线下的面积。这里有一个问题:按照PR原理来说,一个类别应该只有一个P值和R值,那么PR曲线怎么来的呢?

​ 是这样的,当我们得到结果后,将结果按照置信度大小排序(即最有可能是正例的排在最前面),然后依次累加计算P和R值。举个例子:

真实框一共10个,排序后的表为,
序号	预测的类别	置信度		TP	FP
0	 A		    95%		  1   0
1	 B		    90%		  1   0
2	 C		    86%		  0   1
3	 D		    84%		  1   0
4	 E		    80%		  0   1
...
(上面随便取的)
那么,依次累加计算:
* 第一次,只考虑序号0,P=TP/(TP+FP)=1/(1+0)=1,R=TP/(TP+FN)=1/10=0.1
* 第二次,考虑序号0和1,P=2/(2+0)=1,R=2/10=0.2
* 第三次,考虑序号0、1、2,......(如此计算)

​ 然后,就可以得到PR曲线,严格来说,只能说为折线,但是数量达到一定程度即可近似为曲线。

mAP

​ 在目标检测中,不止有一个对象,因此会得到所有类别的不同AP值,而mAP就是求平均的意思。

2.3 ground-truth、bbox:

​ ground-truth,即真实框,也就是数据集自带的框,一般是人为先标记好的框。

​ bbox:bounding box,即边界框。

2.4 IOU:

​ IOU,简单来说就是交并比。在检测领域,通常是说真实框和预测框的交集除以并集大小,用于衡量预测框位置的准确性。

2.5 目标检测的任务:

  • 对象在哪里?
  • 对象是什么?

2.6 目标检测中的两个难题:

  • 图像如何精准定位?
  • 带有标记的图像数据很少?

解释:带有标记的图像数据很少

​ 图像分类领域,只需要一张图像和图像对应的类别即可。

​ 而目标检测,需要一张图像和图像中所有类别的定位框信息,因此在检测领域中,没有像ImageNet那样的大型数据库,这样导致我们没有办法直接训练一个大型CNN网络。

3. RCNN流程:

​ 来自论文原图(不是很详细,没有体现SVM、回归和非极大值抑制等内容):

在这里插入图片描述

​ 简单说一下图片流程:

  • 首先,就是输入一张图片
  • 然后,使用选择性搜索方法(Selective Search,SS)生成大约2000个区域建议框
  • 接着,直接将区域建议框所包围的图像缩放到指定大小作为后面CNN架构的输入
  • RCNN采取的AlexNet架构,需要利用其最后全连接输出的特征向量和最后一个卷积层输出的特征图
  • 特征向量送给SVM,然后SVM来判断类别,并使用NMS(非极大值抑制)剔除一些框
  • 特征图送给线性回归,校准框的位置,得到精确框

​ 下面我将按照知识点出现的顺序进行一一解读。

3.1 选择性搜索:

​ 选择性搜索这个方法来自另外一篇论文,简单来说,其就是基于某种相似度度量,然后不停去分析图片,直至满足一定要求为止。

​ 这里简单提一下,有兴趣的可以自己去看原文。

3.2 图像缩放:

​ 图像缩放(这里的图像指的是区域建议包围的图像)肯定有很多方式,作者在论文的附录中提及了的。主要采取两种方式:

  • 直接缩放,即把图像长宽比直接缩放至227*227(227是AlexNet要求的),如图(c)所示
  • 将图像缩放到227*227,但是保证原来的图像为正方形,而多余的部分可以用整个大图像的部分填充或者用灰色直接填充,如下图(b)、(c)所示

在这里插入图片描述

3.3 CNN架构:

​ RCNN论文采取的CNN架构为AlexNet,没什么好说的,不知道的可以去看我的AlexNet论文解读。

​ 但是,需要注意的是,我们需要用的AlexNet的两个输出,一个是最后全连接输出的特征向量,后最后一个卷积层输出的特征图,前者用于分类,后者用于回归。

不难看出,CNN在RCNN中就是一个特征提取器。

3.4 模型微调fine-tuning:

​ 前面提及目标检测领域数据少,不足以训练一个大型CNN。因此作者采取另外一个思路,首先使用AlexNet在ImageNet大型数据集上训练,然后把它放到检测数据集上,将最后一层输出1000个类别的层改为了输出21个类别层(20个类别加上一个背景),在此训练,进行模型的微调。

​ 在此,必须注意,目标检测训练的数据集,首先需要进行一定剔除。怎么理解,就是我们通过选择性搜索得到了2000个框,但是肯定的是这里面不是所有框都是正确的,因此作者设置了一个IOU阈值(此时为0.5,特别注意是此时,因为SVM中会变),当建议框与真实框的IOU大于该阈值,才送给模型训练。

3.5 SVM分类器:

​ 这里,作者为每一个类别都训练了一个SVM分类器,即此处共有21个分类器(20个类别+1背景)。

​ 如何训练SVM呢?我们假设传入的对象为汽车,那么包含所有汽车的框肯定是正例,而一点都不包含汽车的肯定为负例,那么那些包含了一部分汽车的该怎么划分呢?这里作者再次设置了一个阈值,设定为0.3(0.3这个值是作者通过不断尝试的出来的),此时把建议框与真实框IOU小于0.3的设定为负例,真实框为正例,处于两者之间的全部丢弃。(为什么这样做,后面解答)

​ 除去上述手段外,还采取了Hard Negative Mining方法和NMS(非极大值抑制)方法(后面解读)。

3.6 问题:为什么微调和SVM的IOU阈值不同?

​ 首先,在模型微调的时候,CNN对于小数据集是十分容易过拟合的,这表示我们需要尽量多的数据,而IOU阈值设定为0.5,并且认为正例为IOU大于0.5的框,这样得到的训练数据集更多一些。

​ 而SVM恰好相反,其更适用于小数据集,在小数据集上表现很好,因此将阈值设定为0.3,并且只认为真实框为正例,IOU小于0.3的为负例(此时为训练SVM)。

3.7 Hard Negative Mining(难负例挖掘/硬负挖掘):

​ 这个好理解。我们知道对于一张图片,除去我们目标对象的边界框外,肯定是不包含对象的边界框多的多。那么对于一个分类器而言,肯定是负例样本远远多于正例样本,这会导致一个问题,就是分类器即使无脑输出负例,也会有很好的分类精度。

​ 于是,采取了Hard Negative Mining方法,即选择正负样本比例为1:3,并且负样本最好是那些容易分类错误的样本(即Hard Negative sample)。将它们送入分类器训练,训练完成后,再将得分最高的k个负例样本(即最容易分类错误的k个样本)再次送入上述的负样本集合中。如此反复迭代训练,这样做可以加速收敛和提高分类器性能

3.8 非极大值抑制(NMS):

​ 首先,明确NMS的作用:去掉一些重叠的预测框,提高效率和精度。

​ 我们知道,一张图片2000个区域建议框,假设每个框经历了N个SVM分类器,而每个分类器都会输出一个得分(即某类别分类器认为这个区域属于该类的可能值),那么,我们可以得到一个2000*N的值,如下表:

		1	2	3	4	...	2000
1		x	x	x	x	... x
2		x	x	x	x	...	x
3		x	x	x	x	...	x
4		x	x	x	x	...	x
5		x	x	x	x	...	x
...
N		x	x	x	x	...	x

# x表示值
# 1--2000与1--N分别是列号和行号,列表示不同的框,行表示不同的分类器

​ 在上表中,列表示这个框属于不同类别的概率值/得分。

​ NMS这样做:

  • 第一步,针对第i行,根据2000个框的第i行的值从大到小重新排列(行序号排列不变,列序号根据值从大到小排列)
  • 第二步,排列后,首先依次计算第一列(此时的第一列表示第i行的值最大的列,而列代表框)与后面所有列的IOU值,如果IOU大于设定阈值,那么删除该框/列(指与第一列做计算的列),如果小于设定阈值,则保留。
  • 第三步,然后,计算次最大值(因为不确定第二列是否被删除了,用次最大列代表)与后面所有列的IOU值,同样如果IOU大于设定阈值,那么删除该框/列(指与第一列做计算的列),如果小于设定阈值,则保留。
  • 重复2、3操作,直至所有列都参与了计算。
  • 重复1、2、3操作,直至所有行都参与了计算。

这样就排除了一些重叠的框,留下了更好的预测框。

3.9 线性回归:

​ 回归的主要目的就是修正预测框的位置。这一部分内容在论文的附录里。

​ 首先看下图(来自网络):

在这里插入图片描述

​ 其中,P是预测框,G是真实框,G*表示回归后的框(用G*表示上图的G加一上标)。其中P由四个值构成,即中心点的坐标和长宽

​ 而,P要变为G*,需要先平移过去,在进行一定程度的缩放,用公式表示为(下式中的exp是为了保证缩放因子为正数):

在这里插入图片描述

​ 即,我们需要知道四个参数值:dx§、dy§、dw§、dh§,就可以求出我们的回归后的框了。我们将上面四个值分别用tx、ty、tw、th代替,可以建立回归方程:

在这里插入图片描述

​ 其中,Ф5§表示为AlexNet的con5输出的特征图,w*即表示我们需要的四个参数值。

​ 构建损失函数:(一看就是线性回归的MSE,不过加上了正则参数而已

在这里插入图片描述

​ 而t*表示回归目标,可以用下面公式求出:

在这里插入图片描述

​ 然后,通过线性回归训练即可得到我们需要的dx§、dy§、dw§、dh§值。

​ 不过这里有一个问题,就是作者采取的线性回归,而为了让线性回归可以有很好的结果,作者认为只有预测框和真实框的IOU大于0.6这个值才考虑使用线性回归。

为什么?

​ 这里可以看tw的公式:

在这里插入图片描述

​ 而我们知道:

lim  log(1+x) ---- x
x->0

​ 所以要满足线性回归,即Gw与Pw值要接近,那么自然IOU值越大就越接近,因此做出了这样的要求。

4. 其它:

4.1 消融学习:

​ 这个好理解,作者去除了ALexNet的FC6、FC7层,仍然得到了很好的结果,这是因为CNN发挥作用的就是卷积层,而不是全连接层。

4.2 优缺点:

​ 优点:

  • 提出了一种全新的检测方法
  • NMS、回归、SVM分类器、Hard Negative Mining等的使用

​ 缺点:

  • 不是端到端的,即分离器、CNN、回归是分开的
  • 速度慢、空间大,对于每张图片都有2000个框,且对每一个框都要做CNN操作

5. 总结:

​ RCNN是很多年前的算法了,而现在也有许多新且强大的算法,但是我们不能否认RCNN的经典性。

​ 而读这些经典而处于初期的文献,可以让我们更深入理解当时人们怎么思考的,怎么去优化的,可以为我们开拓更宽的思路。

6. 参考文献:

论文原文
https://blog.csdn.net/takedachia/article/details/126146828
https://blog.csdn.net/qq_52852138/article/details/121484598
https://blog.csdn.net/kk123k/article/details/86515513
https://blog.csdn.net/v1_vivian/article/details/78599229
https://blog.csdn.net/m0_49534117/article/details/127419451

猜你喜欢

转载自blog.csdn.net/weixin_46676835/article/details/129929232