当前位置:   article > 正文

目标检测篇——Faster R-CNN_1、faster r-cnn

1、faster r-cnn


本文为学习记录和备忘录,对代码进行了详细注释,以供学习。
内容来源:
★github: https://github.com/WZMIAOMIAO/deep-learning-for-image-processing

★b站:https://space.bilibili.com/18161609/channel/index

★CSDN:https://blog.csdn.net/qq_37541097


1. Faster R-CNN理论

1.1 R-CNN(Region with CNN feature)

1.1.1 R-CNN概述

R-CNN可以说是利用深度学习进行目标检测的开山之作。

论文全称:Rich feature hierarchies for accurate object detection and semantic segmentation

论文链接Rich feature hierarchies for accurate object detection and semantic segmentation

1.1.2 R-CNN流程

RCNN算法流程可分为4个步骤

  • 一张图像生成1K~2K个候选区域(使用Selective Search方法);
  • 对每个候选区域,使用深度网络(图片分类网络+特征提取网络)提取特征;
  • 特征送入每一类的SVM 分类器,判别是否属于该类 ;
  • 使用回归器精细修正候选框位置;
    rcnn流程

①候选区域的生成:
利用Selective Search(SS)算法通过图像分割的方法得到一些原始区域,然后使用一些合并策略将这些区域合并,得到一个层次化的区域结构,而这些结构就包含着可能需要的物体。

②对每个候选区域,使用深度网络提取特征:
将2000候选区域缩放到227x227pixel,接着将候选区域输入事先训练好的AlexNet CNN网络,获取4096维的特征得到2000×4096维特征矩阵。(去掉最后的全连接层,得到1个特征向量)

③特征送入每一类的SVM 分类器,判别是否属于该类:
将2000×4096维特征矩阵与20个(基于PASCAL VOC数据集,有20个类别)SVM组成的权值矩阵4096×20相乘,获得2000×20维矩阵(评分矩阵)表示每个建议框是某个目标类别的得分。分别对上述2000×20维矩阵中每一列即每一类进行非极大值抑制剔除重叠建议框,得到该列即该类中得分最高的一些建议框。
rcnn分类器

④使用回归器精细修正候选框位置:
对NMS处理后剩余的建议框进一步筛选。接着分别用20个回归器对上述20个类别中剩余的建议框进行回归操作,最终得到每个类别的修正后的得分最高的 bounding box。
修正候选框
如图,黄色框口P表示建议框Region Proposal,绿色窗口G表示实际框Ground Truth,红色窗口表示Region Proposal进行回归后的预测窗口,可以用最小二乘法解决的线性回归问题。

1.1.3 R-CNN框架

rcnn框架

1.1.4 R-CNN存在的问题

  • 测试速度慢:测试一张图片约53s(CPU)。用Selective Search算法提取候选框用时约2秒,一张图像内候选框之间存在大量重叠,提取特征操作冗余。
  • 训练速度慢:过程及其繁琐
  • 训练所需空间大:对于SVM和bbox回归训练,需要从每个图像中的每个目标候选框提取特征,并写入磁盘。对于非常深的网络,如VGG16,从VOC07训练集上的5k图像上提取的特征需要数百GB的存储空间。

1.2 Fast R-CNN

1.2.1 Fast R-CNN概述

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

论文全称:Fast RCNN

论文链接Fast R-CNN

1.2.2 Fast R-CNN流程

Fast R-CNN算法流程可分为3个步骤

  • 一张图像生成1K~2K个候选区域(使用Selective Search方法)
  • 将图像输入网络得到相应的特征图,将SS算法生成的候选框投影到特征图获得相应的特征矩阵与RCNN不同
  • 将每个特征矩阵通过ROI pooling缩放到7x7大小的特征图,接着将特征图展平通过一系列全连接层得到预测结果(与RCNN不同,ROI:Region of Interest,在RCNN中专门训练了SVM分类器,对候选区域进行分类,而且专门训练了回归器,对候选区域边界框进行调整。而在Fast R-CNN中将其结合在一个网络中,不需要单独训练

fastrcnn流程
①R-CNN依次将候选框区域输入卷积神经网络得到特征。通过SS算法得到2000个候选框,则需要进行2000次正向传播。这样会存在大量的冗余。而Fast-RCNN将整张图像送入网络,紧接着从特征图像上提取相应的候选区域。这些候选区域的特征不需要再重复计算。注:训练数据的采样需分正样本和负样本。

②ROI Pooling Layer
将候选框通过ROI Pooling Layer缩放至统一的尺寸(7×7大小)
fastrcnn中roipooling
ROI Pooling Layer实现原理:
将候选框对应的特征矩阵划分为7×7=49等分,对每一个区域执行最大池化下采样,得到7×7的特征矩阵。无论候选区域的特征矩阵是什么大小,都统一缩放为7×7大小的特征矩阵,这样就可以不限制输入图像的尺寸
ROI原理

③目标概率预测分类器和边界框回归器
(i)目标概率预测分类器
目标概率预测分类器位置
目标概率预测分类器输出N+1个类别的概率(N为检测目标的种类, 1为背景)共N+1个节点。
目标概率预测分类器输出
(ii)边界框回归器
边界框回归器位置
边界框回归器输出对应N+1个类别的候选边界框回归参数(dx , dy , dw, dh ),共(N+1)×4个节点。
边界框回归器输出
利用预测的回归参数得到最终回归边界框的方法
在这里插入图片描述

先做平移:
在这里插入图片描述

再做尺度缩放:
在这里插入图片描述

Px,Py,Pw,Ph分别为候选框的中心x,y坐标,以及宽高;
G^x,G^y,G^w,G^h分别为最终预测的边界框中心x,y坐标,以及宽高;
候选边界框回归参数为(dx, dy, dw, dh);

1.2.3 Fast R-CNN损失函数

Fast R-CNN损失函数
其中,p是分类器预测的softmax概率分布p=(p0,…,pk),u对应目标真实类别标签,tu对应边界框回归器预测的对应类别u的回归参数,v对应真实目标的边界框回归参数。
λ是一个平衡系数,用于平衡分类损失和边界框损失。[u≥1]是艾弗森括号,当u≥1,这一项为1,否则,这一项为0。在这里,候选框确实对应着所需检测的某个类别当中,即正样本。这是才有必要计算边界框回归损失。当u=0时,即候选框区域为背景时,也就没有边界框回归损失这一项了。

  • 分类损失:
    在这里插入图片描述
  • 边界框回归损失:
    在这里插入图片描述
    其中,
    在这里插入图片描述

1.2.4 Fast RCNN框架

fastrcnn框架

1.2.5 Fast RCNN存在的问题

对比RCNN和Fast RCNN,Fast RCNN将特征提取、分类和边界框回归已经融入到一个CNN中,虽然Fast RCNN比RCNN推理速度快了200多倍,但是推理一张图片还是需要很长时间,它的瓶颈在SS算法上,因此在接下来的Faster RCNN中通过RPN(Region Proposal Network)来解决这个问题。
作者在Faster RCNN中将Region proposal融入到CNN网络中,这样就可以形成一个端对端的训练过程。


1.3 Faster R-CNN

1.3.1 Faster R-CNN概述

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

论文全称:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks

论文链接Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks

1.3.2 Faster R-CNN流程

Faster R-CNN算法流程可分为3个步骤:

  • 将图像输入网络得到相应的特征图。
  • 使用RPN结构生成候选框,将RPN生成的候选框投影到特征图上获得相应的特征矩阵。
  • 将每个特征矩阵通过ROI pooling层缩放到7x7大小的特征图,接着将特征图展平通过一系列全连接层得到预测结果。

即Faster R-CNN可以看作是RPN+Fast R-CNN

1.3.3 RPN(Region Proposal Networks)网络结构

rpn网络结构概述
基于上图,RPN中,在特征图上用滑动窗口进行滑动,每滑动到1个位置,就生成1个一维向量,在这个一维向量的基础上,再通过两个1×1卷积分别输出目标概率和边界框回归参数。

①这里生成的一维向量的维度由特征图深度决定,使用ZF网络作为backbone时,它的特征图深度channel为256,则生成的一维向量为256-d。若使用VGG16作为backbone,它的特征图深度channel为512,则生成的一维向量为512-d

②2k针对k个anchor boxes,即针对每一个anchor生成2个概率一个是它为背景的概率,一个是它为前景的概率
rpn中分类器
每两个score为一组,对应1个anchor。以第1组为例,假设它对应着图中的一个anchor,则它为背景的概率是0.1,它为所需要检测的目标的概率是0.9。注:这里只是预测其是背景还是前景,并没有对其进行分类。

针对每个anchor又会生成4个边界框回归参数,所以是4k。
rpn中回归器
每四个边界框回归参数为一组,对应1个anchor。其中,dx、dy是anchor的中心坐标预测的偏移量,dw、dh是对anchor宽度和高度的调整。经过边界框回归参数的调整,希望尽可能地框选出目标。

③对于特征图上的每个3x3的滑动窗口,计算出滑动窗口中心点对应原始图像上的中心点,基于该中心点,计算出k个anchor boxes。注意anchor boxes与proposal不同,对anchor boxes利用RPN生成的边界框回归参数调整后才生成proposal,anchor中可能包含所要检测的目标,也可能不包含所要检测的目标。

每个anchor box都是给定的大小和长宽比例。因为所需检测的目标大小不同,长宽比例也不同,所以根据经验,在Faster RCNN中,给出3种尺度(面积)的anchor box,每种面积对应3种不同长宽比例:三种尺度(面积):{1282,2562,5122},三种比例为{1:1,1:2,2:1}。则每个位置(每个滑动窗口)在原图上都对应有3×3=9个anchor

对于ZF网络而言,3×3的滑动窗口在原图上感受野为171×171。对于VGG16而言,3×3的滑动窗口在原图上感受野为228×228。以VGG16为例,虽然感受野为228×228,但是依然能够预测比它大的边界框,如256×256的anchor。原文中作者认为,通过小的感受野去预测比它大的边界框是有可能的,因为通过物体可见的一小部分,我们也可能大概地猜出这个目标完整的区域。可以形象地记忆为窥一斑而知全豹

④对于一张1000x600x3的图像,大约有60x40x9(20k)个anchor,忽略跨越边界的anchor以后,剩下约6k个anchor。对这些anchor利用RPN生成的边界框回归参数调整后生成proposal。对于RPN 生成的候选框之间存在大量重叠,基于候选框的cls得分,采用非极大值抑制,IoU设为0.7,这样每张图片只剩2k个候选框。这样和前面SS算法中生成的候选框个数就差不多了。

⑤训练数据的采样:每张图片将会生成生成上万个anchor,原论文中从中随机采样256个anchor,由正样本和负样本构成,比例大概为1:1。如果正样本个数不足128的话,就用负样本进行填充。
正样本:(i)与ground-truth box的IoU最大的那个anchor。(ii)与ground-truth box的IoU大于0.7的anchor。
负样本:与ground-truth box的IoU小于0.3的anchor。
对于正样本和负样本之外的anchor,就可以全部丢弃掉。

1.3.4 RPN Multi-task loss

RPN Multi-task loss
Pi表示第i个anchor预测为真实标签的概率;Pi*当为正样本时为1,当为负样本时为0;ti表示预测第i个anchor的边界框回归参数;ti*
表示第i个anchor对应的ground-truth box的边界框回归参数;Ncls表示一个mini-batch中所有样本数量256;Nreg表示anchor位置的个数(不是anchor的个数),约为2400。可理解为grid cell的个数;λ是一个平衡参数,用来平衡分类损失和边界框回归损失,值为10。
原论文中说,该公式可以进一步化简,使:
在这里插入图片描述
①分类损失:
(i)按照原论文理解,是多分类交叉熵损失(Softmax Cross Entropy)
在分类层中,会预测生成2k个参数。即对应一个anchor有2个预测值,分别表示前景和背景概率。损失函数为:
在这里插入图片描述
Pi表示第i个anchor预测为真实标签的概率;Pi*当为正样本时为1,当为负样本时为0;

下面展示一个示例:
rpn多分类损失
对于第1个anchor,真实标签为1,即此anchor内部有所要检测的物体。则此时对应真实标签的概率即为目标的概率为0.9,则Lcls = -ln(0.9)。
对第2个anchor而言,对应真实标签为0,那么这里的是对应背景的概率,为0.2。这一项的损失为Lcls = -ln(0.2)。

(ii)也可用二分类交叉熵损失(Binary Cross Entropy)。需要注意的是,如果使用二分类交叉熵损失,那么分类层预测的结果个数为k个而不会2k个,即cls layer有k scores。对每一个anchor只预测1个值,如果趋近于0,则代表是背景,如果趋近于1,则代表是前景,此时分类损失计算公式为:
在这里插入图片描述
Pi表示第i个anchor预测为真实标签的概率;Pi*当为正样本时为1,当为负样本时为0;

下面展示一个示例:
rpn二分类损失
对于第1个anchor,真实标签为1,则Pi*=1,Pi=0.9,则损失为:
在这里插入图片描述
对第2个anchor,真实标签为0,则Pi*=0,Pi=0.2则损失为:
在这里插入图片描述
②边界框回归损失:
边界框回归损失函数为:
在这里插入图片描述
ti表示预测第i个anchor的边界框回归参数,包含:
在这里插入图片描述
其是由reg layer直接预测得到的,不是计算而得。

ti*表示第i个anchor对应的ground-truth box的边界框回归参数,包含:
在这里插入图片描述
其是根据anchor所对应的真实的ground-truth box和anchor的坐标计算而得的。

1.3.5 Faster RCNN训练方法

原论文中采用分别训练RPN以及Fast R-CNN的方法
(1)利用ImageNet预训练分类模型初始化前置卷积网络层参数,并开始单独训练RPN网络参数;
(2)固定RPN网络独有的卷积层以及全连接层参数,再利用ImageNet预训练分类模型初始化前置卷积网络参数,并利用RPN 网络生成的目标建议框去训练Fast RCNN网络参数。
(3)固定利用Fast RCNN训练好的前置卷积网络层参数,去微调RPN网络独有的卷积层以及全连接层参数。
(4)同样保持固定前置卷积网络层参数,去微调Fast RCNN网络的全连接层参数。最后RPN网络与Fast RCNN网络共享前置卷积网络层参数,构成一个统一网络。

而现在,直接采用RPN Loss+ Fast R-CNN Loss的联合训练方法

1.3.6 Faster RCNN框架

fasterrcnn框架
将Region proposal、Feature extraction、Classification、Bounding-box regression这4个部分全部融合在一个CNN网络中,实现了端对端的训练过程。


1.4 Feature Pyramid Networks(FPN)

1.4.1 FPN概述

针对Faster R-CNN而言,使用FPN结构的话,cocoAP提升2.3个点,pascalAP提升3.8个点。

论文全称:Feature Pyramid Networks for Object Detection

论文链接Feature Pyramid Networks for Object Detection

fpn与其他网络
图a是特征图像金字塔的结构,针对要检测不同尺度的目标的时候,将图片缩放到不同尺度,比如图中将图片缩放到4个不同的尺度,针对每个尺度的图片,都依次经过算法进行预测。但该方法的问题在于生产多少个尺度的图片,就需要去重新预测多少次,这样效率很低。
图b将图片通过backbone得到最终的特征图,然后在最终的特征图上进行预测。这种方法的问题在于,在小目标的预测上效果不是很好。
图c与SSD算法类似,将图片输入给backbone,在backbone正向传播过程中的得到的不同的特征图上分别去预测。
图d即是FPN结构,与图c对比发现,图d不是简单地在backbone不同的特征图上进行预测,而是将不同特征图进行融合,然后在融合后的特征图上进行预测。

1.4.2 FPN细节

fpn架构
这里所采用的不同的特征图都是按2的整数倍进行选取,例如最底层的特征图,假设其高和宽为28×28,则上一层特征图高和宽为14×14,再上一层为7×7。
针对backbone上的每一个特征图,首先都会使用1×1卷积(原论文中1×1卷积的卷积核个数为256,即最终得到的特征图的深度都为256),其目的是调整backbone不同特征图的channel(backbone上不同层次的特征图深度不同,一般是越来越多)。
然后将上面的特征图进行2倍的上采样(简单的邻近插值算法实现2倍上采样),比如最上层7×7大小,经过2倍的上采样变为14×14,与通过1×1卷积之后得到的特征图的shape相同,即可进行add操作。(2倍上采样保证高和宽相同,1×1卷积保证深度相同)然后对得到的特征图进行进一步处理即可得到预测结果。

1.4.3 FPN示例

fpn示例
①假设以ResNet-50作为backbone,输入图像是640×640×3的rgb三通道图像。将Conv2_x、Conv3_x、Conv4_x、Conv5_x一系列残差结构对应的特征图命名为C2、C3、C4、C5。将这些特征图通过1×1卷积调整其channel,然后再从C5到C2进行融合:C5得到的特征图(20×20×2048)经过1×1卷积后( 20×20×256)再经过上采样后变为40×40×256,而C4得到的特征图(40×40×256)与上述上采样后的特征图shape相同,因此可以进行add融合。然后融合得到的特征图再进行上采样,再与C3经过1×1卷积的特征图进行融合。然后再进一步上采样,再进一步融合……

②在得到新的特征图后,后面再接上3×3的卷积层,这里的3×3卷积层是对融合后的特征图进行再一次的融合依次得到P2、P3、P4、P5,在P5的基础上进行下采样(k=1×1,s=2)得到P6。注意P6只用于RPN部分,不在Fast R-CNN部分使用,即RPN生成proposal时会在P2、P3、P4、P5、P6这5个特征图上进行预测,但Fast R-CNN部分只会在P2、P3、P4、P5这4个特征图上进行预测。

③之前在讲Faster R-CNN时,通过RPN网络生成得到一系列的proposal,然后将proposal映射到特征图上,然后将映射的这部分特征输入到Fast R-CNN中得到最终预测结果。而在FPN中,首先通过RPN在P2至P6上进行预测proposal,将预测得到的proposal映射到P2至P5上,然后通过Fast R-CNN得到最终的预测结果

④由于在RPN网络中生成了多个预测特征层,则可以在不同的预测特征层上针对不同尺度的目标进行预测。在Faster R-CNN中,只有一个预测特征层,在这个预测特征层上生成不同尺寸不同比例的anchor,但是在FPN中,不同预测特征层会针对不同的面积。如P2是相对较低层的特征层,保留更多的底层细节信息,更适合去预测小型目标,那么将面积为32×32,比例为1:2,1:1,2:1的anchor在P2上生成。针对P3,使用面积为64×64,比例仍是这3个的anchor。P4中anchor面积为128×128,P5中anchor面积为256×256,P6中anchor面积为512×512。即anchor尺度(面积)有:{32×32,64×64,128×128,128×128,512×512},anchor比例有**{1:2,1:1,2:1}**。

⑤针对不同的预测特征层,RPN和Fast RCNN的权重共享

⑥通过RPN得到一系列的proposal后,应该映射到对于的预测特征层上呢?通过下面的公式计算:
在这里插入图片描述
通过计算得到的k即表示应该在哪一个预测特征层上进行预测,k值为2至5,对应P2至P5。
[]表示向下取整。k0设置为4。w,h指预测得到的proposal在原图上的宽度和高度。
例如宽和高都为112,则计算可得k=3,表示将proposal映射到在P3预测特征层上进行预测。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/113964
推荐阅读
相关标签
  

闽ICP备14008679号