【目标检测】R-CNN系列梳理


前言

对R-CNN系列(R-CNN,Fast R-CNN,Faster R-CNN)进行一次完整性的梳理。如果原文的排版比较单一,不利于理解阅读,我这里就重新整理一下,方便自己学习。如果原文已经组织的很好,放上链接即可。

目标检测 – 从RCNN到Faster RCNN 串烧

原文链接(版权声明):https://blog.csdn.net/xyy19920105/article/details/50817725

一、什么是目标检测

目标检测,就是在给定的图片中精确找到物体所在位置,并标注出物体的类别。要解决的问题就是在哪里,是什么。然而,这个问题并不容易解决,有很多困难,物体的尺寸变化范围很大,摆放物体的角度,姿态不定,而且可以出现在图片的任何地方,更何况物体还可以是多个类别。故用一般的方法比较难处理,这也是为什么在深度学习兴起之前,ILSVRC检测比赛检测那么沉寂的原因,大家都做的比较差。

不过随着Hinton在2012年的比赛用CNN虐杀其他团队之后,深度学习以及CNN再一次进入人们视线,这个比较困难的问题也渐渐有思路了。在开始接触物体检测和深度学习时,我想凭借深度学习强大的拟合能力,给它啥它都能学,最开始的想法是,先训练出一个网络能分出是否是物体,即先不管是什么物体,只要bounding box 与ground truth 的IOU大于某个阈值,就认为是正样本,小于某个阈值为负样本,然后直接训练,然后直接给它ground truth,然后用当前框位置与ground truth的欧式距离作为loss,让它自己去学习什么是object以及object在哪里呢,也就是说把这个任务当成分类问题+回归问题来做。通过这个网络在一张大图sliding windows,就能确定存在物体的区域,再根据回归,来使得bounding box框得更准。

不过实际上,想想就能知道,这种方法是没有任何限制地去学习,这样会导致任务复杂度非常高,网络会不收敛,而且测试时会非常慢,因为不知道在哪里有什么东西,需要sliding windows并且需要不同尺度的缩放。另外,并且在RCNN的论文中提到了不加限制直接当回归来做实际效果并不是特别好。我觉得不好的原因可能是学习的复杂度太高,这相当于在一开始就没有给任何限制,让网络自己去根据自己预测的框和真实的框的距离差去学习,这样,同一种物体在不同位置以不同的大小都可以认为是全新的一个训练样本,完全去拟合这样的任务显然是不太可能的。

所以,这种问题一定要 先降低任务复杂度,然后再去学习降低复杂度的等价任务。当然这是我看了这么多优秀论文得出的马后炮式的结论,不过这也恰好说明了Ross Girshick大神提出RCNN ,思路到底有多么地超前。他为了降低检测任务的复杂度,把检测任务最直观的在哪里(回归问题),转化成先用传统方法先定候选框(通过边缘特征、轮廓特征等,使得整个问题的复杂度降低,并不是全图搜索物体,而是只在符合proposals算法的区域来搜索),然后再确定是什么(是背景还是某种物体),然后根据这些已经判断是物体的区域(object score分数高于阈值)来进行回归(精确位置所在)。通过我以上的分析,我觉得检测最难做的是,网络判断物体大致在哪里这个过程,而具体是什么、精确位置,当知道大致的位置后也就变得异常简单了。按照该思路,也就是RCNN,Fast RCNN,Faster RCNN这一条线了。

二、RCNN 详解

RCNN是跨时代的研究成果。流程图如下:
在这里插入图片描述
RCNN全称是Regions with CNN features。主要思路:

(1)RCNN基于传统方法来找出一些可能是物体的区域(提取候选区域),
(2)再把该区域的尺寸归一化成CNN输入的尺寸,
(3)最后判断该区域是不是物体、是哪个物体,
(4)以及对是物体的区域进行进一步回归的微微调整学习,使得框的更加准确。

具体细节:

RCNN的核心思想就是把 图片区域内容 送入CNN网络,然后提取出网络某层的特征,并用这个特征来判断是什么物体(文章把背景也当成一种类别,故如果是判断是不是20个物体时,实际上实现的是判断21个类),最后再对是物体的区域进行微微调整。

论文用直观的方式说明,先学习分类器,然后使用滑动窗口 的方式计算消耗非常大。一个神经网络(AlexNet)在conv5上的感受野是195×195,直白地理解,就是195×195 的区域经过五层卷积后,才变成一个点。所以想经过conv5之后有一个区域性的大小(7×7),则需要原图为227×227,这样的滑窗每次都要对这么大尺度的内容进行计算,计算量可想而知。故论文得下结论,不能用滑动窗口的方式去做检测。

不过论文也没有提为什么作者会使用先找可能区域,再进行判断这种方式,只是说他们根据09年的另一篇论文[1]而做的。这应该就是大神们与常人不同的积累量导致的。中间的神经网络通过ILSVRC分类问题来进行训练,即利用训练图片和训练的分类监督信号,来学习出这个网络,再根据这个网络提取的特征,来训练21个分类器和其相应的回归器。不过分类器和回归器可以放在网络中学习,这也是下面要讲的Fast RCNN的内容。

三、SPP 详解

SPP网络的思想在Fast RCNN, Faster RCNN上都起了举足轻重的作用。SPP网络主要解决神经网络固定输入尺寸的限制,也从各个方面说明了不限制输入尺寸带来的好处

文章一开始,就说明了目前神经网络存在的弊端:如果固定网络输入尺寸,要么选择crop 策略,要么选择warp 策略。(1)crop策略就是从一个大图中抠出网络输入尺寸大小的patch(比如227×227);(2)warp 策略则是把一个bounding box(边界框)的内容resize 成227×227 。无论是那种策略,都能明显看出有影响网络训练的不利因素。crop有可能只抠出物体的一个部分,破坏了图像的完整结构;warp则会改变物体的正常宽高比,破坏了图像原始形状信息。

接着,文章分析出神经网络需要固定输入尺寸的原因是因为有全连接层。不过在那时还没有FCN的思想,那么如何才能使得网络不受输入尺寸的限制呢?Kaiming He 大神就想出,用不同尺度的pooling 层来pooling 出固定尺度大小的feature map,这样就可以不受全连接层的约束,任意改变输入尺寸了。

以下是SPP网络的核心思想:通过对feature map进行相应尺度的pooling,使得能pooling 出4×4,2×2, 1×1的feature map,再将这些feature map concat成列向量与下一层的全连接层相连。这样就消除了输入尺度不一致的影响。训练时就用常规方法训练,不过由于不受尺度的影响,可以进行多尺度训练,即先resize 成几个固定的尺度,然后用SPP网络进行训练学习。

重点是, SPP如何用在检测上面?

论文中实际上最关键的地方是提出了一个如何将原图的某个region映射到conv5的一种机制(原作者并不太认可这种映射机制,具体原因见原文)。<------ 具体的映射机制与作者认可的映射机制见原文 ------>

使用 padding(扩边) 的好处:
在这里插入图片描述

(1)使得卷积后的尺寸与卷积前相同
(2)使得边缘不会只被卷积一次就消失了

使用SPP进行检测,先用提候选proposals的方法(selective search)选出候选框。不过不像RCNN 把每个候选区域送入神经网络提取特征,而是整张图提一次特征,再把候选框映射到conv5上,因为候选框的大小尺度不同,映射到conv5后仍不同,所以需要再通过SPP层提取到相同维度的特征,再进行分类和回归.

实际上这样做就比原先快很多了,因为RCNN也提出了这个原因,就是神经网络所需要的感受野是非常大的,需要每次将RoI 放大到网络的尺度才能卷积到conv5层。这样计算量就会很大。而SPP只需要计算一次特征,剩下的只需要在conv5层上操作就可以了。

当然即使是这么完美的算法,也是有瑕疵的,可能Kaiming He大神太注重提高SPP 的功效了,使得流程框架并没有变得更加完美。首先在训练方面,SPP没有发挥出它的优势,依旧用了传统的训练方法,这使得计算量依旧很大。而且,分类和bounding box 的回归问题也可以联合学习,使得流程框架更加完美。这些Kaiming He都给忽略了,于是也就有了第二篇神作 Fast RCNN。

四、Fast RCNN

从上帝视角(看完整个线)看来,Fast RCNN 提出新东西并不是太多,往往都是别人忽略的东西,实际上也算是对SPP上的捡漏。当然大神能够找到漏可以捡,所以这并不是贬义,只是对这篇论文客观的评价。

首先,Fast RCNN 无论训练还是测试都比RCNN 和SPP 快很多倍。
其次,Fast RCNN 提出了一个特殊的层RoI,这一层实际上是SPP的变种,SPP是pooling 成多个固定尺度,而RoI 只pooling 到一个固定的尺度(6×6)

Fast RCNN网络结构的变化

网络结构与之前的分类网络AlexNet 结构类似,不过把pooling5 层换成了RoI 层,并把最后一层的Softmax 换成了两个:(1)对区域分类的Softmax(包括背景);(2)对bounding box 微调的Softmax。

Fast RCNN 网络有两个输入,一个是整张图片,另一个是候选proposals算法产生的可能proposals的坐标。训练时,它指出了SPP训练的不足之处,并提出新的训练方式: 把同一张图片的prososals 作为一批进行学习,而proposals 的坐标直接映射到conv5 层上,这就相当于一个batch 一张图片,所以训练样本只卷积了一次。使用这种训练方式,可以加快训练速度。而且,同时利用了分类的监督信息和回归的监督信息,使得网络训练地更加鲁棒,而且效果更好。文章提出这样的训练方式或许存在不收敛的情况,不过实验发现,这种情况并没有发生。

值得注意的是,Fast RCNN 在回归问题上并没有使用常见的L2范数作为回归,而是使用所谓的鲁棒的L1范数作为损失函数(可能在其他地方很常见,不过我是第一次见)。实际训练时,一个batch 训练两张图片,每张图片训练64个RoIs,前向反向计算就不说了,如果把poolin g的反向计算理解了,这个RoI 应该不会太难。

这篇论文提到了一个让人引发遐想的地方,就是它将比较大的全连接层用SVD分解了一下使得检测的时候更加迅速。虽然这是别人的工作,但是迁移过来恰到好处。最后作者写了个类似讨论的板块,并从实验角度说明了多任务对训练是否有帮助?尺度不变性如何实现?是单尺度学习还是多尺度学习(注意,这里的尺度是对整张图片的resize尺度)?得到的结论是多尺度学习能提高一点点map,不过计算量成倍的增加了,故单尺度训练的效果更好。最后在SVM和Softmax的对比实验中说明,SVM的优势并不明显,故直接用Softmax将整个网络整合训练更好。

四、Faster RCNN

Faster RCNN的创新思路是:

Faster RCNN 将SS这样的提取候选区域的算法整合到网络中。由于SS等算法是CPU实现,这样不仅解决了SS等算法速度慢的问题,而且与神经网络相结合,共享前面的卷积计算,使得计算效率更高。

而其他部分则与Fast RCNN 差异不大。故这里主要讲 Region Proposal Networks(RPN) 的设计和训练思路。
在这里插入图片描述
上图是RPN的网络流程图,即也是利用了SPP的映射机制,从conv5上进行滑窗来替代从原图滑窗。不过,要如何训练出一个网络来实现与selective search相类似的功能呢?

思路:先通过SPP映射机制根据一一对应的点从conv5映射回原图,设计不同的固定初始尺度训练一个网络。就是给它大小不同(但设计固定)的region图,然后根据与ground truth 的重叠率给它打上正负标签,让它学习里面是否有物体即可。

这就变成作者介绍RCNN时提出的方法,训练出一个能检测物体的网络,然后对整张图片进行滑窗判断。不过测试时,由于无法判断region 的尺度和scale ratio,故需要多次放缩,估计判断一张图片是否有物体就需要很久。如何降低这一部分的复杂度?要知道我们只需要找出大致的地方,无论是精确定位位置还是尺寸,后面的工作都可以完成。这样,与其用小网络简单的学习(这样估计和蒙差不多了,反正有无物体也就50%的概率),还不如 用深的网络,固定尺度变化,固定scale ratio 变化,固定采样方式(反正后面的工作能进行调整,更何况它本身就可以对box 的位置进行调整)来降低任务复杂度。

这里有个很不错的地方,就是在前面可以共享卷积计算结果,这也算是用深度网络的另一个原因吧。而这三个固定,我估计也就是为什么文章叫这些proposal 为anchor 的原因。这个网络的结果,就是卷积层的每个点都有有关于k个achor boxes的输出,包括是不是物体,调整box相应的位置。这相当于给了比较死的初始位置(三个固定),然后来大致判断是否是物体以及所对应的位置,这样RPN网络也就完成了它应该完成的使命,剩下的交给其他部分完成。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值