Faster R-CNN流程简述

原文链接:
https://blog.csdn.net/a8039974/article/details/82899596
https://blog.csdn.net/Mr_health/article/details/84970776
Faster R-CNN网络具体构造推荐:
https://blog.csdn.net/guo1988kui/article/details/82015153
BBR推荐文章:
https://blog.csdn.net/zijin0802034/article/details/77685438
RPN推荐文章:
单独设置某层学习率:
https://blog.csdn.net/xiangjiaojun_/article/details/85812248
先上总图:
在这里插入图片描述
此图最上方为VGG16网络块用于提取图片特征,下方从3 x 3卷积层至proposal均是RPN网络部分,右边就是Fast R-CNN部分了。

先讲一下RPN部分

在这里插入图片描述
此图是RPN计算输出框架图

RPN 的输入是卷积特征图,输出是图片生成的 proposals(包括分数score和ROI池化输出推荐区域特征图)。proposal的坐标信息和类别会保存在文件中。

图中已经把VGG16部分和RPN画在了一起,红框部分即VGG16的卷积块。图中部分名词解释如下:

名词释义
‘data’单张图像数据im_blob=[1,3,H,W]
‘im_info’一幅图像中所有ground truth的坐标和类别[x1,y1,x2,y2,cls]
‘gt_boxes’图像的宽高和缩放比例 height,width,scale = [[im_blob.shape[2], im_blob.shape[2], im_scale[0]]]
‘rpn_labels’每个anchor对应的类别(1——fg,0——bg,-1——ignored),shape=[1,1,A*height,width]

其他名词将会在后文进行详细解释。
首先,RPN网络接受VGG16网络提取过后的特征图conve5_3作为输入,经过3 x 3的卷积核移动窗口在每个节点生成9个(论文中是size = [1282,2562.5122], ratio = [1:1,1:2, 2:1])不同尺度的Anchors(锚框)。

Anchors的作用是分类和回归得到Proposal,因此全连接层后须接两个子连接层

  1. 那么图中的rpn_cls_score就是分类层 classification 输出的结果,用于判断Anchors标记的部分属于bg还是fg,向量维数为 2k (k是指Anchors锚框数,这里就是9,2k就是总图中的18)。
  2. rpn_bbox_pred就是回归层 regression 输出的结果,回归层利用了边框回归 BBR 通过计算框内特征向量经过一定参数计算出最终输出的预测框proposal信息,也就是这里的 rpn_bbox_pred
  3. 同时data 、im_info、gt_boxes组成了 rpn-data,之后又分为rpn_labels,rpn_bbox_target, rpn_bbox_inside_weighs, rpn_bbox_outside_weighs.

再之后,rpn_cls_score 一方面经过形状变换(rpn_cls_score_reshape)后得到 rpn_cls_prob ,用于分类损失函数后,再转变回来作为score分数作为输出结果的一部分。

如果不是训练而是直接测试的话,就先不考虑损失函数,计算出预测框proposal,最后将获取的proposal保存在python pickle文件中。RPN网络工作就做完了。

之后就讲一下损失函数如何运作:

参考原文链接:https://blog.csdn.net/Mr_health/article/details/84970776
Faster R-CNN总损失函数
1 N c l s ∑ i L c l s ( p i , p i ∗ ) + λ N r e g ∑ i p i ∗ L r e g ( t i , t i ∗ ) \frac1N_{cls}\sum_iL_{cls}(p_i,p^∗_i)+ \fracλN_{reg}\sum_ip^*_iL_{reg}(t_i,t^∗_i) N1clsiLcls(pi,pi)+NλregipiLreg(ti,ti)
这里的 p i , p i ∗ p_i,p^*_i pi,pi分别对应 rpn_cls_prob (
rpn_cls_score 经过形状变换(rpn_cls_score_reshape)后得到 )与 rpn_labels, 前面已知rpn_cls_score 为每个框针对每种类别打的分数,也就是置信度,后者就是正负标签。
t i , t i ∗ t_i,t^*_i ti,ti 就是预测框与锚框的偏差量和真实框与锚框的偏差量,分别对应着 rpn_bbox_predrpn_bbox_target
λ λ λ 是分类损失函数和回归损失函数的平衡权重

接下来说一下训练过程:
在这里插入图片描述
此图为RPN损失函数计算框架。
从网络结构图中可以看出,input-data(RoIDataLayer)的下一层是rpn-data(AnchorTargetLayer),rpn-data计算所有anchors与ground truth的重叠比例IoU,从中筛选出一定数量(256)的正负样本组成一个minibatch,用于RPN网络的训练,这一层的输出有如下属性:

1‘rpn_label’:每个anchor对应的类别(1——fg,0——bg,-1——ignored),shape=[1,1,A*height,width]
2‘rpn_bbox_targets’:anchor与ground truth的回归参数[dx,dy,dw,dh],shape=[1,A*4,height,width]
3‘rpn_box_inside_targets’:回归损失函数中的样本权值,正样本为1,负样本为0,相当于损失函数中的p*,shape=[1,A*4,height,width]
4‘rpn_box_outside_targets’:分类损失函数和回归损失函数的平衡权重,相当于λ,shape=[1,A*4,height,width]

注:height、width为特征图conv5-3的高宽,A=9为Anchor种数
对于分类损失rpn_loss_cls,输入的rpn_cls_scors_reshaperpn_labels分别对应分类损失中的 p p p p ∗ p^* p;对于回归损失,输入的rpn_bbox_predrpn_bbox_targets分别对应 t t t t ∗ t^* trpn_bbox_inside_weigths对应回归损失中的 p ∗ p^* p ,相当于掩码MASK,类似[1 1 1 1 0 0 0 0 … ]这样的,rpn_bbox_outside_weights对应 λ 。
RPN分类损失函数:
1 N c l s ∑ i L c l s ( p i , p i ∗ ) \frac1N_{cls}\sum_iL_{cls}(p_i,p^∗_i) N1clsiLcls(pi,pi)

RPN网络的产生的anchor只分为前景和背景,前景的标签为1,背景的标签为0。在训练RPN的过程中,会选择256个anchor,256就是公式中的 N c l s N_{cls} Ncls
在这里插入图片描述
在这里插入图片描述

假设我们RPN网络的特征图大小为38×50,那么就会产生38×50×9=17100个anchor,然后在RPN的训练阶段会从17100个anchor中挑选Ncls个anchor用来训练RPN的参数,其中挑选为前景的标签为1,背景的标签为0。步骤如下:

  1. 第一步,将其reshape变为(17100,2),行数表示anchor的数量,列数为前景和背景,表示属于前景和背景的分数。
  2. 第二步,将RPN的label也reshape成(17100,),即分别对应上anchor,然后从中选出不等于-1的,也就是选择出前景和背景,数量为Ncls,返回其index,为rpn_select。
  3. 第三步,根据index选择出对应的分数。
  4. 第四步,根据rpn_label和rpn_cls_score计算交叉熵损失。再之后就是除以个数(Ncls)求平均。

RPN回归损失函数:
λ N r e g ∑ i p i ∗ L r e g ( t i , t i ∗ ) \fracλN_{reg}\sum_ip^*_iL_{reg}(t_i,t^∗_i) NλregipiLreg(ti,ti)
在这里插入图片描述
R是smoothL1 函数,就是我们上面说的,不同之处是这里σ = 3,RPN训练(σ = 1,Fast RCNN训练),![在这里插入图片描述](https://img-blog.csdnimg.cn/20200227200900749.png)
在这里插入图片描述
在把proposal数据送给fast r-cnn使用之前,需要进行一些操作。除了用ROI池化层对图像尺寸进行统一外,还有:
RPN网络输出的proposal如何组织成Fast R-CNN的训练样本:

  • 对每个proposal,计算其与所有ground truth的重叠比例IoU 筛选出与每个proposal重叠比例最大的ground
    truth 如果proposal的最大IoU大于0.5则为目标(前景),标签值(label)为对应ground
    truth的目标分类;如果IoU小于0.5且大于0.1则为背景,标签值为0

  • 从2张图像中随机选取128个proposals组成一个minibatch,前景和背景的比例为1:3

  • 计算样本proposal与对应ground
    truth的回归参数作为标定值,并且将回归参数从(4,)拓展为(4(N+1),),只有对应类的标定值才为非0。

  • 设定训练样本的回归权值,权值同样为4(N+1)维,且只有样本对应标签类的权值才为非0。

在源码实现中,用于训练Fast R-CNN的Proposal除了RPN网络生成的,还有图像的ground truth,这两者归并到一起,然后通过筛选组成minibatch用于迭代训练。Fast R-CNN的损失函数也与RPN类似,二分类变成了多分类,背景同样不参与回归损失计算,且只考虑proposal预测为标签类的回归损失。

之前的RPN只是粗略地把内容标出来分为fg和bg两类,那么接下来就需要fast r-cnn网络进一步分类回归。

接下来就到了fast r-cnn网络

在这里插入图片描述
图中左方为 RPN 计算输出框架图,中间的那些 fc 之类的就是fast r-cnn的计算层了,右边则是损失函数需要的信息

可以看到红框标记的就是共享的卷积层部分了,用于提取特征图,把特征图送入ROI池化层,再加上rois中的信息(proposal和ground truth的边框信息)选出推荐区域特征图进行 ROI 池化操作。

首先设置参数适应训练任务,在预处理数据时,调用的不再是gt_roidb方法,而是rpn_roidb,通过使用类imdb的静态方法merge_roidb,将rpn_roidb和gt_roidb归并为一个roidb,因此数据集中的’boxes’属性除了包含ground truth,还有RPN网络生成的proposal,可通过上一步保存的proposal文件直接读取。

最后为两个子连接层——分类层(cls)和回归层(reg),如下图所示,和RPN的输出类似,只不过输出向量的维数不一样。如果类别数为N+1(包括背景),分类层的向量维数为N+1,回归层的向量维数则为4(N+1)。

Fast RCNN分类损失函数

RPN的分类损失时二分类的交叉熵损失,而Fast RCNN是多分类的交叉熵损失(当你训练的类别数>2时,这里假定类别数为5)。在Fast RCNN的训练过程中会选出128个rois,即Ncls = 128,标签的值就是0到4。
Fast RCNN回归损失函数
这就和RPN是一样的了,不多赘述。

最后就是Faster R-CNN训练流程:

  • 训练RPN网络,用ImageNet模型M0初始化,训练得到模型M1
  • 利用第一步训练的RPN网络模型M1,生成Proposal P1
    使用上一步生成的Proposal,训练Fast R-CNN网络,同样用ImageNet模型初始化,训练得到模型M2
  • 训练RPN网络,用Fast R-CNN网络M2初始化,且固定卷积层参数,只微调RPN网络独有的层,训练得到模型M3
  • 利用上一步训练的RPN网络模型M3,生成Proposal P2
  • 训练Fast R-CNN网络,用RPN网络模型M3初始化,且卷积层参数和RPN参数不变,只微调Fast R-CNN独有的网络层,得到最终模型M4

对于共享卷积层的理解
RPN 和 Fast R-CNN都有一个VGG16的卷积层,而这个层的参数是共享的,训练两个层的时候,都是输入相同的图片,都经过这道卷积层提取特征,得到conve5-3的特征图。

Faster RCNN中rpn里的边框回归和最后的边框回归,两次回归有什么区别?
本质上没有区别,都是回归predict box和groundtruth box之间的关系。但是frcnn作为一个two stage的检测器,在rpn中第一次回归候选框时已经过滤了大部分无意义的负样本,这样最后回归检测框时能做到较大部分one stage方法精确的目的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值