目标检测RCNN进阶之路-Rcnn,Fast rcnn Faster rcnn

目标检测RCNN学习之路-Rcnn,Fast rcnn Faster rcnn

R CNN

Rcnn(Rich feature hierarchies for accurate object detection and semantic segmentation)可以说是目标检测的开山之作,后续的Fast Rcnn,Faster Rcnn都是Rcnn的延续与优化。其实早在Rcnn之前,Overfeat已经使用深度学习做目标检测了,但是Rcnn是第一个正真工业级应用的解决方案。其方法将mAP在VOC2012最好结果的基础上提高了30%达到了53.3%,作者归结为一下两个因素:
1.在候选区域自上而下使用大型卷积神经网络CNNS,用以定位和分割物体。
2.当带标签的训练数据不足时,先针对辅助任务进行有监督预训练,在进行特定任务的调优,就可以产生明显的性能提升。
R CNN命名是将Regions with CNN features。作者也将效果和Overfeat比较了下,发现RCNN效果明显优于Overfeat.
注:Overfeat改进了Alexnet,并用图像缩放和滑窗方法在test数据集上测试网络,提出了图像定位方法,最后通过一个卷积网络来进行分类,定位和检测。
RCNN思路
论文中作者给出了思路:
1 给定一张图片,从图片中提取2000个类别无关的候选区域(region proposal),即候选区域提取
2 对每个给定候选区域利用CNN抽取一个固定长度的特征向量,即特征提取
3 对每个区域利用特定类别数据的线性SVM进行分类(有多少类就有多少线性SVM分类器)
输出结果就是候选区域大小和其类别。
目标检测RCNN进阶之路-Rcnn,Fast rcnn Faster rcnn_第1张图片
候选区域如何提取:
objectness,selective search,category-independen object proposals,Ciresan,multi-sacle combinatorial grouping等
R CNN采用的是Selective Search算法。
Selective Search:https://blog.csdn.net/small_munich/article/details/79595257
特征提取:
为了计算region proposal的特征,我们首先需要对图像进行转换,使他符合CNN的输入,网络中CNN只能接受固定大小的输入。作者使用了一种简单方法,无论region propoasl多大和宽高比,在候选区域周围加上16个padding,在进行各向异性缩放,使其变为所需大小,经对比发现 这种方法精度更高
各向异性缩放:不管图像是否形变,直接缩放到所需大小。
测试阶段物体检测
测试阶段我们用selective Search抽取2000个regions propoasl,然后变形,通过CNN前向传播计算出特征,然后我们使用每个类别训练出的SVM给整个特征向量中的每个类别打分。然后给出一张图像中所有打分区域,然后使用NMS(每个类别独立进行)
,最后得出目标框和类别。相比之前的方法,两个特性使检测变得高效,首先,CNN参数共享,其次CNN特征向量相比其他通用方法维度较低。
训练:
1.使用ILSVR2012分类数据集对CNN预训练。
2.根据需求实现参数调优,我们使用了变形后的推荐区域对CNN参数进行SGD训练。对于所有的推荐区域,当和正式标注的框的IOU大于0.5,认为是正例,否则认为是反例,学习率设定为0.001,这使得调优不会对初始化破坏。
可视化学习到的特征
我们都知道,在卷积神经网络中,第一层可以直接用来显示,而且肉眼可视,通常他们是为了捕捉物体边缘,及突出的颜色信息,但越往后的卷积层越抽象,这个时候进行可视化就是一个挑战了。
Zeiler 和 Fergus 提出了一种基于反卷积手段的可视化研究,但 R-CNN 的作者直接提供了一个没有参数的方法,简单直接。
思路是挑选一个特征,把它当作物体分类器,然后计算他们处理不同候选区域的activation值,这个值代表特征对这块区域响应,然后将activation作为分数排名,取前几名并显示候选区域,就可大致明白这个feature大概意思。
框架精简
RCNN采用Alexnet作为预训练模型,经过作者在 PASCAL 上不做 fine-tune 处理,直接测试,可以发现 fc7 的意义没有 fc6大,甚至移除后,mAP结果指标没有影响,甚至移除fc6和fc7并没有多大的损失,所以图像特征提取主要是卷积层的作用。当做了fine tune后,fc6与fc7提升效果明显,所以结论是pool5从预训练数据中的到了物体的泛化能力,而能力提升主要是通过特定区域的fine tune。

总结:RCNN这篇文章中有许多值得我们学习的手段和观点。

Fast R CNN

RCNN不足之处:
1.训练的时候需提取图片大约2000个regions proposal ,而提取的regions proposal有大量重复特征,造成特征提取重复,浪费了大量时间。
2.测试的时候也会和训练一体,提取大量重复特征,计算冗余。
3.每个SVM分类器都需要单独训练,浪费大量时间和空间。
Fast R CNN正式解决R CNN问题诞生的。
网络结构:
Fast R CNN特征提取网络采用5个池化层,和5到13个不等的卷积层的三种网络作为特征提取网络:CaffetNet,VGG_CNN_M_1024,VGG16,同时这些网络初始化Fast RCNN之前需要修改:
1.Rol pooling layer 取代网络的最后一个池化层。
2.最后一个FC层和Softmax被替换成用于分类的softmax层和box尺度的回归层。
3.输入到网络是两组数据,一组是图片,另外一组是通过selective search筛选出的regions proposal。
具体结构见下图:
目标检测RCNN进阶之路-Rcnn,Fast rcnn Faster rcnn_第2张图片
Fast RCNN思想
由上图可知,Fast RCNN大概流程,具体如下:
1.输入一张包含众多ROI(regions of interest)图片,并通过特征提取网络CNN,得到输入图片的feature map。
2.把已经生成好的ROI(方法仍然采用RCNN中的selective search,不过这个已经是生成好的,保存在磁盘中)输入网络中,并选择ROI对应在feature map上的区域。
3.把feature map上对应的ROI区域池(Roi pooling layer)化成固定大小的feature map,并通过全连接拉伸成固定大小的特征向量。
4.特征向量被分类支路和回归支路分享,分类支路用softmax做分类,回归支路用于box尺寸修正。
流程中细节会在下面展示。
ROI生成:
依然采用R CNN中Selective search,选取2000个左右的regions of interesting,每个ROI会和真实图片的grounding truth计算IOU,若IOU=>0.5,则会把该ROI当作前景并给与类别标签,其余则会被当作背景处理。
Roi Pooling layer
作用:是将不同大小的feature map池化成统一大小。
具体操作:一个尺寸为w,h的feature map需要池化成大小为W,H的feature map,可以计算出池化的尺寸为(w/W)*(h/H),即用这个计算出的窗口去作池化就可以得到固定大小的feature map,原文中的每一个Roi pooling都是独立的
微调网络
首先随即去N张图片,每张图片取R/N个Rols,网络再一次每次微调中将softmax分类器和bbox回归器一起优化,区别于R CNN分开优化,微调中还涉及多任务损失,小批量取样,Rol pooling反向传播,SGD超参数等。
损失函数
损失函数分为分类误差和定位误差
分类采用交叉熵作为分类得损失函数: 在这里插入图片描述
回归采用smooth1作为损失函数:在这里插入图片描述
g是Smooth 1误差:在这里插入图片描述
总代价函数:在这里插入图片描述
采用Smooth 1误差作为损失函数的原因是:相比于L2损失函数,其对离群点、异常值(outlier)不敏感,梯度变化相对更小,训练时不容易跑飞,见下图。
目标检测RCNN进阶之路-Rcnn,Fast rcnn Faster rcnn_第3张图片
训练过程:
1.对训练集中的图片,用selective search提取出每一个图片对应的一些proposal,并保存;
2.对每张图片,根据图片中bounding box的ground truth信息,给该图片的每一个proposal标记类标签,并保存,IOU>0.5则前景,否是背景。
3.使用mini-batch=128,25%来自非背景标签的proposal,其余来自标记为背景的proposal;
测试过程:
1.用selective search方法提取图片的2000个RoL,并保存到文件;
2.将图片输入到已经训好的多层全卷积网络,对每一个proposal,获得对应的eatrue map;
3.对每一个featrue map,进行Rol池化,得到固定大小的feture map,并将其输入到后续的FC层,最后一层输出类别相关信息和boundinf box的修正偏移量(x,y,w,h),x,y为是RoI相对于图片左上角的位置,w,h为中心位置;
Fast RCNN实现1
实现2
参考资料:
论文
Fast R-CNN
[Fast RCNN算法详解](https://blog.csdn.net/shenxiaolu1984/article/details/5## 标题1036677)

Faster RCNN

Fast RCNN依然存在这测试时间很久的问题,因为在测试阶段需要通过selective search提取RoI区域,因此为了解决这个问题提出了Faster RCNN.
网络结构
目标检测RCNN进阶之路-Rcnn,Fast rcnn Faster rcnn_第4张图片
从上图我们可看出,该网络是由4部分组成:
1.卷积层:用于提取图片特征,输入整张图片,输出为图片的feature map
2.RPN网络:用于选取RoI区域,代替之前的selective search选取RoI,这也是Faster RCNN和Fast RCNN 区别最大的地方,具体细节见下文。
3.RoI pooling和Faster RCNN一样,将不同大小的输入转换成固定长度的输出。
4.分类和回归,用于对候选区域分类和修正目标区域位置。
基础网络(特征提取网络)
作者采用了ResNet,因为其网络强大,层次深,学习能力强,泛华能力强
ResNet采用了参差块和BN是模型更加容易训练。
RPN(regions proposal network)
1.Anchors
anchors是固定尺寸的边界框(矩形),是通过利用不同的尺寸和比例在图片上放置得到的boxes,作为预测object位置的参考位置,anchors是相对原图放置的到的boxes,因此在特征图上anchors大小需要除以下采样倍数。
2.anchors提取规则(下面是举例,论文中实际是每个点9个anchor)
我们在得到卷积层提取的特征图后,假若特征图大小为60x40,下采样倍数为16倍,特征图映射回原图可以对应60x40个区域,我们会在原图的60x40区域内生成anchor(中心对应生成),每个区域生成)9个(3种大小不同x3种长宽比例不同),假如anchor大小为(160,160),(80,80)等,那么对应的在特征图上大小为(10,10)(5,5),那么会一共生成60x40x9=21600个。
3.RPN工作原理
Feature map进入RPN后,先进行一次3x3的卷积,同样,特征图大小不变依然是60x40,数量为512,这样做目的是为了进一步集中信息,接着两个1x1的卷积,见下图
目标检测RCNN进阶之路-Rcnn,Fast rcnn Faster rcnn_第5张图片
图中
rpn_cls:(60x40x512 )特征图 (1x1x512x18)卷积核 卷积结果==>60x40x9x2
60x40x9x2意思是逐像素对9个anchor box进行二分类,类别是 有目标和没有目标。
rpn_bbox:(60x40x512)特征图(1x1x512x36)卷积核 卷积结果==>60x40x9x4.
60x40x9x4.意思是逐个像素对9个anchor box作回归,得到anchor box (x,y,w,h)的偏移量,用以修正anchors box尺寸位置。
在这里插入图片描述
RoI Pooling
和faster rcnn一样的方式,见fast rcnn

最终的分类回归层
抛开RPN不谈,剩下Faster rcnn网络其实就是一个fast rcnn,RPN主要是用来提取RoI的,得到RoI后通过RoI pooling后,对特征图进行全连接,得到分类支路和回归支路,分类支路利用softmax预测类别,回归支路用回归预测位置偏移,用以修正bbox位置,得到更好的(x,y,w,h)。

训练

网络由RPN+Fast RCNN组成,这两个网络都是共用一个特征提取网络,因此论文中是进行多步训练方法,对每个模块分别训练在合并训练的权重,但是发现进行end-end联合训练效果更好。
RPN+Fast R CNN交替训练:
1.单独训练rpn(ImageNet-pre_train + fine-tune),得到rpn1,CNN1
2.单独训练fast rcnn(ImageNet-pre_train + fine-tune),结合第一步的region proposal,得到fast-rcnn1,CNN2
3.fine-tune rpn1 on CNN2,得到rpn2(共享卷积层)
4.fine-tune fast-rcnn1 on CNN2,结合第三步的region proposal,得到fast rcnn2(共享卷积层)
RPN训练
RPN有两个输出,像素的anchor二分类和anchor的边框回归调整。
训练时,对所有的 anchors 分类为两种类别. 与 ground-truth object 边界框的 Intersection over Union (IoU) 大于 0.5 的 anchors 作为 有目标物前景;小于 0.1 的作为 没有目标物背景,随机采样 anchors 来生成batchsize=256 的 mini-batch,尽可能的保持 foreground 和 background anchors 的比例平衡.
RPN损失函数
RPN 对 mini-batch 内的所有 anchors 采用 binary cross entropy 来计算分类 loss. 然后,只对 mini-batch 内标记为 foreground 的 anchros 计算回归 loss. 为了计算回归的目标targets,根据 foreground anchor 和其最接近的 groundtruth object。
RPN后处理
得出的anchors一般都会有比较多的重叠,为了降低计算量,采用NMS(非极大抑制)筛选anchors,一般设定IOU为0.6.
NMS处理后根据score对前N个anchors排序,论文中取了前面2000个anchors,score我认为是前面二分类的计算结果。
NMS参见
Fast RCNN训练
输出在上文中讲了是通过softmax预测的类别和box的位置偏移。训练的时候proposal与任何一个 ground-truth box 的 IoU 大于 0.5 的 proposals 被设为正确的 boxes. IoU 在 0.1 到 0.5 之间时设为 background.随机采集一个平衡化的 mini-batch=64,其中,25% 的 foreground proposals(具有类别class) 和 75% 的background proposals.
Fast RCNN损失函数
类似于 RPNs 的 losses,对于选定的 proposals,分类 loss 采用 multiclass entropy loss;对于 25% 的 foreground proposals 采用 SmoothL1 loss 计算其与 groundtruth box 的匹配,Fast R-CNN 全连接网络对每个类别class 仅输出一个预测值,当计算边框回归loss 时需谨慎. 当计算 loss 时,只需考虑正确的类别。
Fast RCNN后处理
类似于 RPN,Fast R-CNN 最终输出一堆带有类别 class 的objects.为了调整边界框,需要考虑概率最大的类别的 proposals. 忽略概率最大值为 background class 的proposals.当得到最终的 objects 时,并忽略被预测为 background 的结果,采用 class-based NMS. 主要是通过对 objects 根据类别class 分组,然后根据概率排序,并对每个独立的分组采用 NMS 处理,最后再放在一起.最终得到的 objects 列表,仍可继续通过设定IOU阈值的方式,来限制每个类的 objects 数量.
Faster RCNN:
虽然是两部训练网络但是在预测的时候是一次就可实现而不像Fast RCNN那样需要重新提取图片的proposal,其中的RPN主要作用就是替代selecive search,自动的搜索proposal,但是其anchor是大小固定的9种box,其在比较固定的环境下效果很好,但是在复杂环境中,特别是目标大小变化较大的情况下效果有待商榷。
总结:RCNN基本的网络结构,损失函数,技巧基本基本介绍完毕,Faster RCNN是目前应用较为广泛的目标检测模型,不仅适用于目标检测对于语义分割也能有较好的效果过如在此基础上的Mask RCNN就是在其基础上改进的,若有问题,望指正。
参考:
Faster R-CNN - 目标检测详解
Faster RCNN 学习笔记
原始图片中的ROI如何映射到到feature map?
python代码 Faster R CNN
论文原文

你可能感兴趣的:(计算机视觉目标检测,目标检测,R,CNN,Fast,R,CNN,Fster,R-CNN)