目标检测——Faster RCNN网络

文章目录

  • 整体网络架构
    • Conv layers
    • RPN网络(Region Proposal Networks)
      • Anchors
      • RPN主体部分
      • proposal Layer
    • RoI pooling层
    • Classification
  • 实验结果

原文链接: Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
代码: https://github.com/chenyuntc/simple-faster-rcnn-pytorch

整体网络架构

目标检测——Faster RCNN网络_第1张图片

Conv layers

    第一部分是RPN和后期分类网络共享的全卷积层(ZF的前5层或者VGG的前13层),目的是生成一个featrue map,以方便后续区域建议的生成,之所以可以输入任意的图片,是因为输入之后把所有图片统一放缩成了M×N。在Faster RCNN Conv layers中对所有的卷积都做了扩边处理(pad=1,即填充一圈0),导致原图变为 (M+2)x(N+2)大小,再做3x3卷积后输出MxN 。正是这种设置,导致Conv layers中的conv层不改变输入和输出矩阵大小;Conv layers中的pooling层kernel_size=2,stride=2。这样每个经过pooling层的MxN矩阵,都会变为(M/2)x(N/2)大小。综上所述,在整个Conv layers中,conv和relu层不改变输入输出大小,只有pooling层使输出长宽都变为输入的1/2,一个MxN大小的矩阵经过Conv layers固定变为(M/16)x(N/16)!这样Conv layers生成的feature map中都可以和原图对应起来。
目标检测——Faster RCNN网络_第2张图片

RPN网络(Region Proposal Networks)

Anchors

      锚点位于所述滑动窗口的中心,并与比例和高宽比相关。 3 scales and 3 aspect ratios一共可以生成9个Anchors。 For a convolutional feature map of a size W × H (typically ∼2,400), there are WHk anchors in total.(对于一个尺寸为W × H的图像,在每一个像素点都能生成K个Anchor,一共有W × H × K和Anchors)。
目标检测——Faster RCNN网络_第3张图片

RPN主体部分

    第二部分是真正RPN的主体部分,先在featrue map上用小窗口滑动,将每个滑动小窗口都映射成一个低维度的向量(255-d),因为Conv layers中最后一层输出通道数是255,相当于又融合了周围3×3维度的空间信息,同时通道数没有发生变化;之后同时输入到两个全连接网络当中,得到bounding-box的回归之后的坐标box-regression layer (reg)同时剔除太小和超出边界的proposals以及每个anhcor要分有目标的positive anchor和没有目标的negative anchor (cls)。
    全部anchors拿去训练太多了,训练程序会在合适的anchors中随机选取128个postive anchors+128个negative anchors进行训练。
目标检测——Faster RCNN网络_第4张图片
    下图是RPN第一个支路(cls)的第一层1×1的网络结构,可以看出输出通道数为18层,正好对应9个anchor对应的positive和negative的概率。后面接softmax分类获得positive anchors,也就相当于初步提取了检测目标候选区域box,实现了对anchor的初步筛选。目标检测——Faster RCNN网络_第5张图片
    下图是RPN第二个支路1×1的网络结构,目的是实现bbox-regression。输出通道数是36,这里相当于feature maps每个点都有9个anchors,每个anchors又都有4个用于回归的变量需要训练。 [ d x ( A ) , d y ( A ) , d w ( A ) , d h ( A ) ] \left[d_{x}(A), d_{y}(A), d_{w}(A), d_{h}(A)\right] [dx(A),dy(A),dw(A),dh(A)]
目标检测——Faster RCNN网络_第6张图片
    下图是bbox-regression的具体工作和理论支撑:
目标检测——Faster RCNN网络_第7张图片

proposal Layer

    Proposal Layer负责综合所有 [ d x ( A ) , d y ( A ) , d w ( A ) , d h ( A ) ] \left[d_{x}(A), d_{y}(A), d_{w}(A), d_{h}(A)\right] [dx(A),dy(A),dw(A),dh(A)]变换量和positive anchors,计算出精准的proposal,送入后续RoI Pooling Layer。还是先来看看Proposal Layer的caffe prototxt定义:
目标检测——Faster RCNN网络_第8张图片
    Proposal Layer有3个输入:positive vs negative anchors分类器结果rpn_cls_prob_reshape,对应的bbox reg的 [ d x ( A ) , d y ( A ) , d w ( A ) , d h ( A ) ] \left[d_{x}(A), d_{y}(A), d_{w}(A), d_{h}(A)\right] [dx(A),dy(A),dw(A),dh(A)]变换量rpn_bbox_pred,以及im_info;另外还有参数feat_stride=16。
    对于im_info:一副任意大小PxQ图像,传入Faster RCNN前首先reshape到固定MxN,im_info=[M, N, scale_factor]则保存了此次缩放的所有信息。然后经过Conv Layers,经过4次pooling变为WxH=(M/16)x(N/16)大小,其中feature_stride=16则保存了该信息,这些都是用来计算Proposal 相对于原图MxN的位置[x1, y1, x2, y2]。
    到这里定位工作基本上结束,后面大体都是对于proposals的分类工作。

RoI pooling层

目标检测——Faster RCNN网络_第9张图片
    由于proposal是对应MXN尺度的,所以首先使用spatial_scale参数将其映射回(M/16)X(N/16)大小的feature map尺度;再将每个proposal对应的feature map区域水平分为pooled − _{-} w × \times × pooled − _{-} h的网格;对网格的每一份都进行max pooling处理。这样处理后,即使大小不同的proposal输出结果都是pooled − _{-} w × \times × pooled − _{-} h固定大小,实现了固定长度输出。
目标检测——Faster RCNN网络_第10张图片

Classification

目标检测——Faster RCNN网络_第11张图片
(1)、对于之前RoI pooling生成大小为7x7=49的proposal festure map,输入卷积层、full connect层和softmax计算每个proposal具体属于那个类别,输出cls_prob概率向量,实现了物体识别的功能;
(2)、在之前回归结果的基础之上,再次利用bounding box regression获得每个proposal的位置偏移量bbox_pred,用于回归更加精确的目标检测框。

实验结果

目标检测——Faster RCNN网络_第12张图片

你可能感兴趣的:(深度学习——图像处理,深度学习,神经网络,pytorch,python,计算机视觉)