Faster RCNN

Faster RCNN

看这篇文章之前,建议先看如下两篇文章。理解Anchor和RPN之后,就会很轻松理解Faster RCNN。

  1. Faster RCNN 中的Anchor
  2. Faster RCNN 中的RPN解析
    Faster RCNN

介绍

Faster RCNN 网络由四部分组成,分别是作为backbone的卷积层,RPN,RoI Pooling和最后的全连接层部分。

  1. backbone是纯卷积网络,主要用于提取特征,常用的是VGG和ResNet网络。其特征会RPN和全连接层共享。
  2. Region Proposal Networks是Faster RCNN的净化。RPN用于生成候选框,分类分支通过softmax判断某个anchor属于positive/negative;回归层用于修正anchors生成精确的候选框。
  3. RoI Pooling层meger backbone的feature map和RPN的proposal,便于后续的全连接层
  4. 全连接层用于计算候选框的类别和框框最终的精确位置。

RoI Pooling

RoIl Pooling的输入包括两项,一项是backbone的feature map,另一项是RPN的proposal,尺寸大小各不一样,但是RoI pooling后紧接着全连接层,全连接层的输入要是固定的。所以RoI pooling的作用就是将不同尺寸的输入输出相同的尺寸。如下面的定义如下,经过RoI Pooling之后的feature map 大小为pooled_w * pooled_h,即7*7。为了输出固定尺寸的特征图,RoI Pooling也是属于池化操作,只不过它的kernel大小是动态变化的。

RPN生成的proposal对应Faster RCNN 网络输入大小M*N,使用参数spatial_scale: 0.0625 将其映射到 ( M / 16 ) × ( M / 16 ) \left( M /16 \right) \times \left( M /16 \right) (M/16)×(M/16)大小的feature map,然后再将proposal对应的feature map均分为pooled_w * pooled_h网格。对每一网格进行max pooling运算。这样输出结果的尺寸大小为pooled_w * pooled_h。

layer {
  name: "roi_pool5"
  type: "ROIPooling"
  bottom: "conv5_3"
  bottom: "rois"
  top: "pool5"
  roi_pooling_param {
    pooled_w: 7
    pooled_h: 7
    spatial_scale: 0.0625 # 1/16
  }
}

Loss Function

L ( { p i } , { t i } ) = 1 N c l s ∑ i L c l s { p i , p i ∗ } + λ 1 N r e g ∑ i p i ∗ L r e g ( t i , t i ∗ ) L\left ( \left \{ p_{i} \right \}, \left \{ t_{i} \right \} \right ) = \frac{1}{N_{cls}}\sum _{i} L_{cls} \left \{ p_{i}, p_{i}^{*}\right \} + \lambda \frac{1}{N_{reg}}\sum _{i}p_{i}^{*}L_{reg}\left( t_{i}, t_{i}^{*} \right) L({pi},{ti})=Ncls1iLcls{pi,pi}+λNreg1ipiLreg(ti,ti)

参数解释:

  • i i i指的是mini-batch中第 i i i个anchor的下标
  • p i p_{i} pi 指anchor i i i包含一个物体的预测概率
  • p i ∗ p_{i}^{*} pi是ground-truth label,如果anchor是positive,那么 p i ∗ = 0 p_{i}^{*}=0 pi=0;如果anchor是negative, p i ∗ = 0 p_{i}^{*}=0 pi=0
  • t i t_{i} ti是一个表示预测bbox4个参数坐标的向量
  • t i ∗ t_{i}^{*} ti是一个表示与某一个positive anchor相关联的ground-truth box的4个参数坐标的向量
  • L c l s L_{cls} Lcls是分类loss,是两个类的log loss
  • L r e g L_{reg} Lreg是回归loss, L r e g ( t i , t i ∗ ) = s o o m t h L 1 ( t i − t i ∗ ) L_{reg}\left( t_{i}, t_{i}^{*} \right) = soomth_{L1} \left( t_{i} - t_{i}^{*} \right) Lreg(ti,ti)=soomthL1(titi)
  • p i ∗ L r e g p_{i}^{*}L_{reg} piLreg仅仅对positive anchors( p i ∗ = 1 p_{i}^{*} = 1 pi=1)激活,对negative anchors p i ∗ = 0 p_{i}^{*} = 0 pi=0无效。
    s o o m t h L 1 ( x ) = { 0.5 x 2 i f ∣ x ∣ < 1 ∣ x ∣ = 0.5 o t h e r s i z e soomth_{L1}\left( x \right) = \left\{\begin{matrix} 0.5 x^{2} & if\left | x \right | <1 \\ \left | x \right | = 0.5 & othersize \end{matrix}\right. soomthL1(x)={0.5x2x=0.5ifx<1othersize
    损失函数的两项分别被 N c l s N_{cls} Ncls N r e g N_{reg} Nreg正则化,并且存在一个参数 λ \lambda λ
    t x = ( x − x a ) / w a , t y = ( y − y a ) / h a , t w = l o g ( w / w a ) , t y = l o g ( h / h a ) , t x ∗ = ( x ∗ − x a ) / w a , t y ∗ = ( y ∗ − y a ) / h a , t w ∗ = l o g ( w ∗ / w a ) , t h ∗ = l o g ( h ∗ / h a ) , \begin{matrix} t_{x} = \left( x - x_{a} \right) / w_{a}, \qquad t_{y} = \left( y - y_{a} \right) / h_{a}, \\ t_{w} = log \left( w/ w_{a} \right) , \qquad t_{y} = log \left( h/ h_{a} \right) , \\ t_{x}^{*} = \left( x^{*} - x_{a} \right) / w_{a}, \qquad t_{y}^{*} = \left( y^{*} - y_{a} \right) / h_{a} , \\ t_{w}^{*} = log \left( w^{*} / w_{a} \right) , \qquad t_{h}^{*} = log \left( h^{*} / h_{a} \right), \end{matrix} tx=(xxa)/wa,ty=(yya)/ha,tw=log(w/wa),ty=log(h/ha),tx=(xxa)/wa,ty=(yya)/ha,tw=log(w/wa),th=log(h/ha),

训练方式

Faster RCNN 训练方式有两种,第一种是交替优化方法(alternating optimization),即rpn + fast RCNN,训练了两次,第二种是近似联合训练(approximate joint training),也就是end-to-end的训练方式。

交替优化训练

交替优化
backborn卷积网络我们简称为pre-model,引用已经训练好的VGG,ZF或者ResNet权重。Faster RCNN可看做RPN + Fast RCNN(pre-model + FC)的结合体。

  • step One :基于pre-model,训练RPN网络。pre-model和RPN都会被更新。
  • step Two :利用生成好的RPN网络提取proposals,训练Fast RCNN。
  • step Three :基于第二步训练得到的pre-model,第二次训练RPN网络,训练过程中pre-model冻结。
  • step Four :利用第三步训练的RPN网络提取proposals,仍然冻结pre-model,训练Fast RCNN。

注:

  1. pre-model在第一步和第二步训练时,都会更新,两次更新的pre-model的参数是不一样的,这意味着pre-model是不共享的
  2. 第三步和第四步的pre-model保持相同并且训练过程中冻结权重。那么第三步训练时更新RPN,第四步训练时更新FC权重。这就是共享

近似联合训练

交替优化训练Faster RCNN分为四步,较繁琐,我们希望能够end-to-end训练并且Faster RCNN的精度保持不变。

下图是py-faster-rcnn的训练网络结构截图和RPN loss部分的Prototxt定义。

近似联合训练

layer {
  name: 'rpn-data'
  type: 'Python'
  bottom: 'rpn_cls_score'
  bottom: 'gt_boxes'
  bottom: 'im_info'
  bottom: 'data'
  top: 'rpn_labels'
  top: 'rpn_bbox_targets'
  top: 'rpn_bbox_inside_weights'
  top: 'rpn_bbox_outside_weights'
  python_param {
    module: 'rpn.anchor_target_layer'
    layer: 'AnchorTargetLayer'
    param_str: "'feat_stride': 16"
  }
}

layer {
  name: "rpn_loss_cls"
  type: "SoftmaxWithLoss"
  bottom: "rpn_cls_score_reshape"
  bottom: "rpn_labels"
  propagate_down: 1
  propagate_down: 0
  top: "rpn_cls_loss"
  loss_weight: 1
  loss_param {
    ignore_label: -1
    normalize: true
  }
}

layer {
  name: "rpn_loss_bbox"
  type: "SmoothL1Loss"
  bottom: "rpn_bbox_pred"
  bottom: "rpn_bbox_targets"
  bottom: 'rpn_bbox_inside_weights'
  bottom: 'rpn_bbox_outside_weights'
  top: "rpn_loss_bbox"
  loss_weight: 1
  smooth_l1_loss_param { sigma: 3.0 }
}
  • rpn_bbox_inside_weights :用来设置正样本回归 loss 的权重,默认为 1(负样本为0,即可以区分正负样本是否计算 loss)。
  • rpn_bbox_outside_weights : 用来平衡 RPN 分类 Loss 和回归 Loss 的权重。

mmdet/models/detectors/two_stages.py中的forward_train函数,记录Faster RCNN 端到端训练时losses的组成。Faster RCNN将rpn的loss和roi的loss记录在一个字典中。

losses

查看训练日志,rpn的loss,rpn_loss_cls和rpn_cls_bbox,和roi的loss,loss_cls和loss_bbox是在一个字典中同时训练的,从而达到端到端的方式。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CRdEwOOm-1615629854470)(./1614233153898.png)]

附录

Python Template

在**.prototxt文件中,可以定义自己设计的层。类型type必须是Python;必须存在定义至少一个module和layer参数的python_param字典。module指向你实施定义层的文件名称(不带.py后缀),layer指向定义类的名称。你可以通过param_str传递参数到这层中。比如在py-faster-rcnn/models/pascal_voc/VGG16/faster_rcnn_end2end/train.prototxt**中自定义的proposal层。实施层的py文件为py-faster-rcnn/lib/rpn/proposal_layer.py,定义了一个类为ProposalLayer。

layer {
  name: 'proposal'
  type: 'Python'
  bottom: 'rpn_cls_prob_reshape'
  bottom: 'rpn_bbox_pred'
  bottom: 'im_info'
  top: 'rpn_rois'
  python_param {
    module: 'rpn.proposal_layer'
    layer: 'ProposalLayer'
    param_str: "'feat_stride': 16"
  }
}

参考

  1. Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
  2. 目标检测网络Faster RCNN详解(一)
  3. 一文读懂Faster RCNN
  4. 深入浅出理解Faster RCNN
  5. mmdetection
  6. py-faster-rcnn
  7. netscope,caffe可视化工具
  8. Prototxt Template
  9. Rich Feature Hierarchies for Accurate Object Detection and Semantic Segmentation
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Faster-RCNN是一种用于目标检测的深度学习网络。它的训练过程可以分为三个步骤。首先,在第一步中,使用预训练的ImageNet权重来初始化网络的共享卷积层,然后随机初始化Faster-RCNN特有的层。接下来,在第二步中,使用第一步训练好的共享卷积层和Faster-RCNN特有层来初始化Faster-RCNN网络,并只对特有部分进行微调。最后,在第三步中,再次使用ImageNet的预训练权重来初始化Faster-RCNN网络的共享卷积层,然后训练整个Faster-RCNN网络。在这个过程中,共享卷积层和Faster-RCNN特有层的权重都会被更新。\[2\]\[3\] Faster-RCNN的网络框架包括一个共享卷积层和两个子网络:区域建议网络(Region Proposal Network,RPN)和目标分类网络。RPN用于生成候选目标区域,而目标分类网络用于对这些候选区域进行分类和定位。RPN通过滑动窗口在不同位置和尺度上生成候选框,并使用锚框来对这些候选框进行调整和筛选。然后,目标分类网络对这些候选框进行分类,确定它们是否包含目标,并对目标进行精确定位。整个网络的训练过程是通过最小化分类误差和边界框回归误差来进行的。 总的来说,Faster-RCNN是一种用于目标检测的深度学习网络,通过共享卷积层和两个子网络(RPN和目标分类网络)来实现目标的检测和定位。训练过程包括三个步骤,其中使用预训练的ImageNet权重来初始化网络的共享卷积层,并通过微调和更新权重来提高网络的性能。\[2\]\[3\] #### 引用[.reference_title] - *1* [【15】Faster-RCNN网络详细解读](https://blog.csdn.net/qq_33612665/article/details/111354100)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [一文读懂Faster RCNN(大白话,超详细解析)](https://blog.csdn.net/weixin_42310154/article/details/119889682)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

马鹤宁

谢谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值