RCNN--Fast RCNN---Faster RCNN

目标检测是以图像分类为基础的,希望大家对图像分类有一个不错的掌握,目标检测最难的是代码模块的理解,建议多看多查。

目标检测可以分为两个大分支:

One-Stage:SSD、YOLO

Two-Stage:FASTer-RCNN 

One-stage:是基于anchors直接进行分类以及调整边界框

Two-Stage:1通过专门的模块生成候选框(RPN),寻找前景以及调整边界框(针对anchors)

                      2 基于上一步生成的候选框进一步进行分类以及调整边界框(peoposals)

优点:one-stage更快;two-stage更准确


R-cnn(region with cnn feature)

Faster r-cnn发展过程过程:r-cnn到fast r-cnn再到faster r-cnn

用深度学习进行目标检测的开山之作(2014),作者:Ross Girshick

在这篇论文之前,也有一个关于深度学习的目标网络(over fat)但是效果不如r-cnn。传统的目标检测都是通过人为定义特征的方式进行检测,准确率只有30%,r-cnn出来之后提升了大约30个点。

【论文主要特点】(相对传统方法的改进)

速度: 经典的目标检测算法使用滑动窗法依次判断所有可能的区域。本文则(采用Selective Search方法)预先提取一系列较可能是物体的候选区域,之后仅在这些候选区域上(采用CNN)提取特征,进行判断。

训练集: 经典的目标检测算法在区域中提取人工设定的特征。本文则采用深度网络进行特征提取。使用两个数据库: 一个较大的识别库(ImageNet ILSVC 2012):标定每张图片中物体的类别。一千万图像,1000类。 一个较小的检测库(PASCAL VOC 2007):标定每张图片中,物体的类别和位置,一万图像,20类。 本文使用识别库进行预训练得到CNN(有监督预训练),而后用检测库调优参数,最后在检测库上评测。

R-cnn的步骤大约分为4步:

候选区域生成: 一张图像生成1K~2K个候选区域 (采用Selective Search 方法)

特征提取: 对每个候选区域,使用深度卷积网络提取特征 (CNN)

类别判断: 特征送入每一类的SVM 分类器,判别是否属于该类

位置精修: 使用回归器精细修正候选框位置

 

Rcnn的所有模块,后面的网络就会慢慢的加入新的模块,直至成为端对端的网络。

候选框区域生成:使用Selective Search方法(SS算法)从一张图像生成约2000-3000个候选区域。实现过程:

1使用一种过分割手段,将图像分割成小区域

2查看现有小区域,合并可能性最高的两个区域。重复直到整张图像合并成一个区域位置

合并规则:

颜色(颜色直方图)相近的

纹理(梯度直方图)相近的

合并后总面积小的

合并后,总面积在其BBOX(边界框,一般分为人工标注、预测识别两种。)中所占比例大的

3输出所有曾经存在过的区域,所谓候选区域

特征提取:

把提取的2000个图片全部reshape成227*227大小的尺寸。

paper试验了两种不同的处理方法:

(1)各向异性缩放:这种方法很简单,就是不管图片的长宽比例,管它是否扭曲,进行缩放就是了,全部缩放到CNN输入的大小227*227

(2)各向同性缩放,因为图片扭曲后,估计会对后续CNN的训练精度有影响,于是作者也测试了“各向同性缩放”方案。有两种办法:先扩充后填充,先裁剪后填充。对于上面的异性、同性缩放,文献还有个padding处理,上面的示意图中第1、3行就是结合了padding=0,第2、4行结果图采用padding=16的结果。经过最后的试验,作者发现采用各向异性缩放、padding=16的精度最高。

输入到我们图像分类网络。这里的分类网络结构中的全连接层去掉,就是展平处理之后不进入linear。我们就会得到一个特征向量。每个向量都是4096维度。就有2000x4096这样的向量。

特征向量送入每一类的svm分类器:

将2000X4096维特征与20个SVM组成的权值矩阵4096X20相乘获得2000X20维矩阵表示每个建议框是某个目标类别的得分。(这里以PASCAL VOC有20个类别)针对每一个向量,用svm分类器去判断是不是属于某个类别。

分别对上述2000X20维矩阵中每一列即每一类进行非极大值抑制剔除重叠建议框,得到该列即该类中得分最高的一些建议框。

然后用非极大值抑制(字面理解就是不一致极大值)剔除重叠建议框(对分类矩阵的每一列):

 

 4 使用回归器修正候选框位置

 位置精修: 目标检测问题的衡量标准是重叠面积:许多看似准确的检测结果,往往因为候选框不够准确,重叠面积很小。故需要一个位置精修步骤。 回归器:对每一类目标,使用一个线性脊回归器进行精修。正则项λ=10000。 输入为深度网络pool5层的4096维特征,输出为xy方向的缩放和平移。 训练样本:判定为本类的候选框中和真值重叠面积大于0.6的候选框。

其实这里可以分为两步。第一步是上一步筛选出来的20个类别的建议框之后(从【2000,20】个建议框中筛选得到的),会对这些建议框进一步筛选,每个类别的建议框(【2000,1】筛选得到的)中会与标注该类别的真实grounf_truth计算IOU,筛选出大于阈值的候选框。

第二步是对于上一步【2000,20】个候选框中筛选出来的,找到该候选框对应当的第二步提取得到的4096维的向量(从【2000,4096】中筛选),用20个回归器分别对20个类别中剩余的建议框回归操作(分类器输出为【目标建议框中心X偏移量,Y偏移量,边界框高度缩放因子,宽度缩放因子】),通过得到的输出对于边界框进行调整。

 

 

R-CNN存在的问题:

1测试速度慢

测试一张图片约53s(CPU)。用Selective Search算法提取候选框用时约2秒,一张图像内候选框之间存在大量重叠,提取特征操作冗余。

2训练速度慢:过程及其繁琐

3训练所需空间大:

对于SVM和bbox回归训练,需要从每个图像中的每个目标候选框提取特征,并写入磁盘。对于非常深的网络,如VGG16,从VOCO7训练集上的5k图像上提取的特征需要数百GB的存储空间。

 



 

Fast R-CNN(没错论文名字也是它,还是同一个作者,在同一年提出来的)、

Fast R-CNN是作者Ross Girshick继R-CNN后的又一力作。同样使用VGG16作为网络的backbone,与R-CNN相比训练时间快9倍,测试推理时间快213倍,准确率从62%提升至66%(再Pascal VOC数据集上)。

流程:

1.一张图片生成1k~2k个候选区域(使用Selective Search方法);

2.将整幅图像输入到CNN网络中,得到相应的特征图,再将SS算法生成的候选框投影到特征图上获得相应的特征矩阵(参考的spp-net);

3.将每个特征矩阵通过ROI(Region of Interest) pooling层缩放到7x7大小的特征图,接着将特征图展平通过一系列全连接层得到预测结果。

 

改进问题:

一:测试速度慢

RCNN一张图像内候选框之间大量重叠,2000张图片进行特征提取操作,冗余。

本文将整张图像归一化后直接送入深度网络。然后才加入候选框信息(取特征图上的2000张图)。

二:训练所需空间大

RCNN中独立的分类器和回归器需要大量特征作为训练样本。

本文把类别判断和位置精调统一用深度网络实现,不再需要额外存储。

三:训练速度慢

2000张的样本训练想不慢都难

作者使用Mini-batch sampling,每张图片选出64张ROI进行训练,这里面包括正样本也包括负样本(背景)。

四:输入必须统一

Fast RCNN在数据的输入上并不对其有什么限制,而实现这一没有限制的关键所在正是ROI Pooling层。该层的作用是可以在任何大小的特征映射上为每个输入ROI区域提取固定的维度特征表示。

拿到我们训练样本后,我们将训练样本的候选框,通过ROI pooling层将它缩放到统一大小。步骤:将roi的特征层划分为49等份,然后对每一份进行平均池化下采样操作。就得到7x7的特征矩阵。Roi pooling层进行展平处理,再经过两个全连接层,得到ROI feature vector,之后并联两个全连接层。其中一个做目标概预测,另一个做位置回归。

这时候因为有两个并行的全连接层,那么就应该有两个loss函数进行反向传播。

 



 

Faster R-CNN

Faster R-CNN是作者Ross Girshick继Fast R-CNN后的又一力作。同样使用VGG16作为网络的backbone,推理速度在GPU上达到5fps(包括候选区域的生成),准确率也有进一步的提升。在2015年的ILSVRC以及coco竞赛中获得多个项目的第一名。(fast rcnn的ss部分在cpu上需要2秒)

提出了RPN(region proposal network)

Rpn结构:

对于生成的特征图,使用3x3的卷积层,步距1,padding为1,这样卷积后的特征图大小与输入的一致。3x3矩阵可以把每个像素点都覆盖。

对于特征图上的每个3x3滑动窗口,计算出滑动窗口中心点对应原始图像上的中心点,并计算出k个anchor boxes(这里的特征图所含像素已经非常少了,已经是卷积池化好几层之后的操作了。然后用原图的大小/特征图,得到步距(倍率),然后针对在特征图上某中心点的位置(x,y)*倍率,就得到原图对应的中心点,以这个点为坐标生成k个anchor boxes)。

同时,你的滑动窗口要生成原图位置上的k个anchores是前景还是背景,也要去调整位置4k。理解2k、4k你去图中看一下我画线对应位置就能理解了。

 

论文中给出了3种anchor的尺度{128,256,512}

三种比列{1:1,1:2,2:1}

每个滑动窗口在原图上都对应有3x3=9个anchor

原论中:提出了三种尺度128x128、256x256、512x512和三种比例1:1、1:2、2:1的anchor,因此每个位置在原图上都对应有3x3=9个anchor。对于一张1000x600x3的图像,大约有20k个anchor,忽略超过图像边界的anchor后,剩下约6k个anchor。对于RPN生成的候选框之间存在大量重叠,基于候选框的cls得分,采用非极大值抑制,IoU设为0.7,这样每张图片只剩下2000个候选框。

特征图对应原图的位置叫感受野。下面是感受野的计算,在图像分类的vgg的博文中也有讲解。但提出一个问题,感受野没有anchor大,这也是可以的,用因为在现实中,你可能看到物体的一小部分就知道这个物体是什么。

训练RPN中采用的正负样本:

对于上万的anchor中我们随机采样256个anchor,我们想让正负样本的比例大约为1:1,如果正样本不够128我们用负样本填充。就是如果我们的正样本只有100个,我们需要256-100=156个负样本。

如何定义正样本和负样本:

i  anchor/anchors 与某个真实box(标注的准确的)有最大的IOU值

ii 或者一个anchor和任意真是box的IOU>0.7

论文中说,第i是第ii条的补充,一般以ii为条件,都能找到很充足的正样本,但是有特殊情况,就需要第i条补充。

负样本:和所有真实box的IOU<0.3的anchor

正样本和负样本之外的anchor都丢弃掉(这做的是RPN的训练,用不到那么多anchors,test的时候可就不同了)

RPN Multi-task loss RPN损失计算:分类损失+边界框回归损失。

平衡参数计算下来和1/Ncls是差不多的,在pytorch官方实现过程中,这部分直接使用的1/Ncls。

原论文中是上面那种计算,pytorch官方是下面那种计算。

对应anchor真实标注位置,是计算来的。

 

 




 

 

 

 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值