计算机系统应用教程网站

网站首页 > 技术文章 正文

「AI」目标检测第二话:Fast R-CNN和Faster R-CNN

btikc 2024-09-14 01:04:45 技术文章 21 ℃ 0 评论

编者按:上次我们探讨了下R-CNN和SPP-Net对于目标检测领域的冲击,让人们开始越来越重视深度学习,但是他们也各自有明显的缺点,如训练的复杂性和图片识别的实时性,那么我们应该怎样去改进他们呢?

文章作者:TeddyZhang

责任编辑:TeddyZhang

Fast R-CNN (ICCV 2015)

这篇论文,一看题目就知道了,研究如何对R-CNN进行加速,作者是R-CNN的一作Ross Girshick,是真大佬啊,这篇论文作者只有他自己,有种“无敌是多么的寂寞”的感受,在使用深度网络VGG-16时相比R-CNN,训练阶段快9倍,测试阶段快213倍,相比于SPP-Net,训练阶段快3倍,测试阶段快了10倍,一起来看看大佬是如何对R-CNN进行加速的,上次提到了SPP-Net通过共享卷积的方式也对R-CNN进行了加速!

论文地址:https://arxiv.org/abs/1504.08083

代码地址:https://github.com/facebookresearch/Detectron

算法总览:

不得不说,这次终于解决了多阶段训练的问题,这也是趋势吧,我们需要一些端到端的训练方式,而特征共享,或许会有更好的效果呢!Fast R-CNN的网络将整幅图像和region proposal作为输入,与SPP-Net类似,经过卷积层提取feature map后,经过RoI pooling后输出固定大小的特征图,然后输入到全连接层,但不同于SPP和R-CNN的是,经过fcs的特征向量分支为两个同级的输出层:一个用于分类,即类别个数+1个Softmax概率估计。另一个用于边框回归,输出检测框位置信息的纠正值。作者在讲自己的模型前先喷了下R-CNN和SPP-Net,哈哈,比如:训练繁琐(multi-stage),使用log损失微调网络,使用SVM做分类,特征文件写入磁盘,边框回归等等。但对于SPP-Net,微调算法不能更新SSP Layer之前的卷积层。

Multi-Stage/Task

R-CNN和SPP都有一个共同的缺点,就是多阶段训练的,训练步骤很繁琐,这也导致了模型不论在训练阶段还是测试阶段都很慢,所以作者提出来我们能不能将分类和边框回归当做两种任务在同一网络一起来进行优化处理呢?这就是Muti-Task Pipeline!这样做的好处:1.训练可以更新整个网络(优化SPP-Net中的空间金字塔~)2.不需要磁盘进行特征的缓存处理,重要的时候不用来回读取磁盘文件,这样速度会快很多

网络结构

点击此处添加图片说明文字 ?

RoI pooling层

RoI pooling层实质就只是SPP-Net中的空间金字塔池化层的一个level,即使用max pooling将RoI(h * w)的特征转换成为固定大小的feature map(如7x7,与输入RoI大小无关)。

微调网络

梯度更新整个网络: 作者首先说明了SPP-Net无法更新低于空间池化层的权重的原因,因为每个样本RoI来自不同的图像中,通过SPP层进行反向传播就非常低效,其每个RoI的感受野也很不相同,通常跨越整幅图像。所以作者提出了更有效的训练策略,利用训练期间的参数共享,每个mini-batch读取N幅图,然后在每张图片进行抽样R/N个RoI,这样的话RoI在FP和BP时其参数都是可以共享的,这样的话,可以极大的提高训练速度,作者实验:当N=2, R=128时,这种方式要比从128张不同的图像各取一个RoI要快64倍。但作者有个疑虑,同一张图片的RoI相关性很近,会不会有影响,但经过测试对收敛速度几乎没有影响。注意取的RoI要尽量正负样本平衡,其中25%的RoI是与ground-truth bounding box的IoU > 0.5的object proposal,标记为相应的class, 剩下75%的RoI是IoU在0.1-0.5之间的object proposal,标记为背景,而0.1以下的就是hard example。Hard Example Mining不是很理解?还有OHEM?挖坑,这篇论文以后读 !

OHEM论文地址: https://arxiv.org/pdf/1604.03540.pdf

多任务损失函数:

总loss包括分类误差和边框回归误差两种,但需要注意的是,当预测框标定为背景时,不计算定位误差,所以公式为:

算法总结

优点:

●解决了R-CNN和SPP-Net的多stage训练的方式,利用多任务的方式去训练整个网络

●使用softmax去代替SVM进行多分类的预测,从而实现了端到端的训练

●实现了卷积网络的权重共享,使用RoI pooling来保持多尺度的输入●实验发现数据集增加可以提高mAP,SVD可以对网络进行加速

●在VOC2012的mAP提升到了68.4%,而R-CNN为62.4%

缺点:

●region proposal的提取还是通过selective search,并且只能在CPU中运行这个算法,所以这个阶段浪费了大量时间。

Faster R-CNN (NIPS 2015)

经过了SPP-Net和Fast R-CNN的互相吹捧和诋毁,两个作者又联手实现了一个对R-CNN更快加速的算法,即Faster R-CNN。首先分析下之前的Fast R-CNN,它使用了Softmax代替了SVM的二分类,然后把多阶段变成了多任务的算法,但是由于产生region proposal算法是selective search,只能在CPU上运行,而且由于其不是CNN网络,所以Fast R-CNN并不是真正意义上的end-to-end网络。我们既然知道了这个缺点,那么在Faster R-CNN中作者就提出来能不能把region proposal用一个CNN网络产生,这样既可以在GPU下运行又可以完全实现end-to-end?事实证明可以的,作者提出了RPN网络,使得检测算法在VGG16的模型中实现了5ps,做到了实时检测。

论文地址:https://arxiv.org/abs/1506.01497

代码地址(Pytorch):https://github.com/jwyang/faster-rcnn.pytorch

算法总览

我们通过上图的结构,可以看出,faster R-CNN摒弃了使用selective search算法,使用了一个RPN的网络去生成候选框,首先让输入图像经过CNN网络,得到一个feature map,然后我们一方面利用RPN网络去产生候选框,然后把候选框在feature map的区域经过RoI pooling产生一个尺度固定的特征向量,接着进入全连接层做分类以及边框回归。并且,使得RPN和Fast R-CNN共享了CNN特征。作者在论文中介绍了几种相应训练方式!

RPN(区域建议网络)

RPN的输入为一个feature map,输出有两个分支,一个是cls层,用来判断是否有目标,另一个是reg层,用来产生一系列的目标建议框。在RPN中,我们会使用nxn的滑动窗口来遍历整个feature map,每个滑动窗口会产生K个不同尺度,不同比例的建议区域,我们称为Anchors,文中K=9,n=3,所以每个anchor在clf层会产生2k的分数(目标与非目标),而在reg层产生4k个位置信息。

作者在实现faster R-CNN时,设置了每张图片的最大尺寸为1000x600,如果小于这个尺寸,用padding去填充,如果大于这个尺寸,等比例缩放至小于该尺寸,然后进行padding,这样就保证了输入图片比例的基本不变,也就保证了目标的比例不变。这样最后的feature map的W*H大约为2400,即产生WHk个anchors。而faster R-CNN中,anchor有以下性质:●位移不变性:作者使用滑动窗口生成anchor,而不是像MultiBox使用K-mean的聚类算法,这样的话如果目标在一幅图中进行平移或其他变换,仍然可以检测出,由于K-mean的聚类算法依赖于起始点,不具有位移不变形●多尺度anchor:作者对比了图像金字塔,这种方法图像在多个尺度上进行resize进行检测,然后进入到CNN网络,但比较费时间,于是使用了多尺度的anchor在一个特征图上进行滑动窗口检测,更加高效!

网络结构

共享卷积层使用VGG-16或者是ZF网络

损失函数

了训练RPN,文中 对每个anchor赋予二值(是目标或非目标)类标签。对两种anchors赋予正标签:1. 和真值框有最高交并比的anchor/anchors;2. 和任何一个真值框的IoU高于0.7。对和所有真值框IoU都低于0.3的anchor赋予负标签。其他的anchors不作为训练目标。损失函数如下:

使用这个loss函数来对RPN网络进行训练,十分的类似Fast R-CNN算法。i表示mini-batch的序号,其中Pi是anchor被预测为目标的概率,而标签Pi*在正标签为1,负标签为0。在reg层使用的是L1损失,cls层为两类的log损失,由于Ncls为mini-batch的数量,本文为256,但是经过计算一个feature map要产生大约2400个anchor,所以我们设置λ为10以平衡两者的权重,从而达到了归一化。

RPN和Fast R-CNN共享特征

这里作者给出了一些方法,如下:

1.交替训练:首先训练RPN,使用proposals训练Fast R-CNN。网络使用Fast R-CNN微调,然后用来初始化RPN,迭代这个过程,这也是作者实验时用的方法!

2.近似联合训练:在每次SGD迭代时,前馈计算生成区域推荐,看作训练Fast R-CNN检测器的预计算推荐。反馈传播中共享层传播RPN和Fast R-CNN结合的损失。这种方式忽略了关于推荐框坐标的导数。

3.非近似联合训练:Fast R-CNN中的 RoI pooling层接收卷积特征和预测的bounding boxes作为输入,这时反向传播会涉及到box corrdinates.这时需要RoI poling层关于box coordinates是可微的。

这里我们探讨一下交替训练第(4步)的细节:第一步:我们使用上面的loss去训练RPN,并使用预训练的Imagenet模型初始化卷积网络,端到端的微调RPN。第二步:我们使用第一步产生的建议区域,分离的训练一个Fast R-CNN网络,也是对卷积网络进行预训练的Imagenet模型初始化,这两步不共享卷积层第三步:使用检测网络初始化去单独的进行RPN训练,固定卷积层,只对RPN进行微调第四步:固定共享卷积层,微调Fast R-CNN的分支层,这样就可以形成了一个统一的网络了

算法总结

作为R-CNN的最强改进版,当然其优点很多啦,速度快,准确率高!

优点:

●优化了建议区域的产生方式,使其真正实现了end-to-end训练

●在GPU上达到了实时(5fpsbased VGG & 17fps based ZF)

●精度高了,COCO检测42.1%,而Fast R-CNN为39.3%

缺点:商用的话速度依然是问题,(模型轻量化或者one-stage算法)


归纳总结

经过这一轮的改进后,R-CNN系列基本结构已经进化完成,首先,采用了共享卷积的方式对候选区域提取特征,其次,为了适合不同候选区域的尺寸,我们采用了ROI Pooling进行尺度的固定化,最后,我们将多阶段的训练方式改变为多任务的训练方式,从而使模型训练更为简单和方便~



文章由『运筹OR帷幄』原创发布

如需转载请在公众号后台获取转载须知

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表