RCNN系列(3):Faster R-CNN—使用区域提议网络的实时目标检测

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kevin_zhao_zl/article/details/86476699

论文地址: Faster R-CNN:Towards Real-Time Object Detection with Region Proposal Networks
pytorch实现:github链接

1. 介绍

  Faster R-CNN通过对区域候选框提议方法的革新对目标检测框架的精度和速度[训练和推断]进行了大幅度的改善,提出使用RPN网络进行候选框提议,Faster R-CNN的架构如下图所示:
在这里插入图片描述
  Faster R-CNN框架包括四个部分:

  1. Conv Layers
  2. RPN网络
  3. RoI 池化
  4. Classifier

1. Conv Layers

  Conv Layers的作用是提取特征图为后续的模块提供输入,在Conv Layers这一模块中包含13个卷积层,13个Relu层和4个池化层,对于所有的卷积层,kernel_size=3,pad=1,stride=1;对于所有的池化层,kernel_size=2,pad=0,stride=2。卷积层能够保持输出和输入的尺寸一致,而每经过一个池化层,图像都会变为原来的一半,有四个池化层所以最终ConvLayers的输出是输入的 1 16 \frac{1}{16}

2. Region Proposal Network(RPN)

  RPN用于区域提议,通过softmax判断前后景,再利用bounding box 回归进行anchors的位置修正,也就是说RPN实际上是包含两条路径的,最终该模块包含一个Proposal层会剔除较小的和越界的提议。
  这一模块中有几个值得注意的点。

2.1 Anchors

  Anchors实际上是一种多尺度检测的方法用于捕获不同大小的物体,anchor的尺寸是根据图像尺寸设定的,文中采用3种尺度和3种长宽比即每个位置上取九个anchor,对于该模型来说,Conv Layers的输出是ceil(800/16) x ceil(600/16) 的特征图,最终会产生ceil(800/16) x ceil(600/16) x 9个anchor,ceil是向上取整函数。
  得到anchors之后首先RPN会判断该anchors属于前景还是背景,再利用边界框回归进行位置调整,最终将包含类别判定和位置信息的anchor输入到proposals层,该层综合这两个信息,计算精确的前景Anchors,总之RPN的工作流程如下:

  • 生成Anchors,对Anchors做边界框回归
  • 对Anchors做二分类,根据前景分类分数进行降序排序,取前pre_nms_topN个anchors
  • 限定图像边界,非极大值抑制
  • 取前post_nms_topN个anchors作为最终的proposals
      这一过程中,已经包含了对Anchors映射回原图是否超出边界做了判断,所以此处的输出是对应原始输入图像尺度的。

3. RoI池化

  对于传统的CNN来说,其输入和输出的尺寸应该是固定的,吐过输入图像大小不定,较为简单的方法有两种,一是crop一部分图片输入网络,这样就破坏了图像的完整结构,二是wrap成需要的大小传入网络,这样回破坏图像的形状信息。
  而proposals正好是各种大小不一的矩形框,需要RoI池化来继续宁尺寸的调整,具体的工作流程如下:

  • 使用spatial_scale参数将对应原始输入图像尺度的proposals映射到输入特征图尺度
  • 将每个proposal对应的feature map区域分为pooled_w x pooled_h的网格
  • 对网格的每一份进行最大池化操作
      这样得到了最终的尺寸大小一致的proposals了。

4. Classifier

  从RoI池化层获得的 7 × 7 7\times7 大小的proposal feature maps后送入后续网络后:

  1. 通过全连接层和sofmax对proposals进行分类
  2. 再次对proposals进行边界框回归
      因为该阶段全连接层的参数也是训练好的,也进一步验证了RoI池化层的必要性。

5. 训练阶段

  1. 已训练好的主干网络上训练RPN网络
  2. 利用RPN网络产生proposals
  3. 第一次训练Fast R-CNN
  4. 第二次训练RPN
  5. 再次产生proposals
  6. 第二次训练Fast R-CNN
      训练RPN时候的损失函数:
    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([p_i],[t_i])=\frac {1}{N_{cls}}\sum_iL_{cls}(p_i,p_i^*)+\lambda\frac{1}{N_{reg}}\sum_ip_i^*L_{reg}(t_i,t_i^*)

  其中: L c l s ( p i , p i ) L_{cls}(p_i,p_i^*) 是一个对数损失, L r e g = ( t i , t i ) i x , y , w , h s m o o t h L 1 ( t i u v i ) L_{reg}=(t_i,t_i^*)\sum_{i \in {x,y,w,h}}smooth_{L_1}(t^u_i-v_i) ,又
s m o o t h L 1 ( x ) = { 0.5 x 2 , i f x < 1 x 0.5 , o t h e r w i s e smooth_{L_1}(x)=\begin{cases} 0.5x^2,&if |x|<1\\ |x|-0.5,&otherwise \end{cases}
   s m o o t h L 1 ( x ) smooth_{L_1}(x) 是一个 L 1 L_1 损失,相比于 L 2 L_2 ,对离群点不敏感。当回归目标无界,使用 L 2 L_2 损失需要进行谨慎地学习率的调整以避免梯度爆炸, L 1 L_1 损失则消除了这种敏感性。

欢迎扫描二维码关注微信公众号 深度学习与数学   [每天获取免费的大数据、AI等相关的学习资源、经典和最新的深度学习相关的论文研读,算法和其他互联网技能的学习,概率论、线性代数等高等数学知识的回顾]
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/kevin_zhao_zl/article/details/86476699