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

整体网络架构

目标检测——Faster RCNN网络

RPN网络(Region Proposal Networks)

    第一部分是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网络
    第二部分是真正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网络
    下图是RPN第一个支路(cls)的第一层1×1的网络结构,可以看出输出通道数为18层,正好对应9个anchor对应的positive和negative的概率。后面接softmax分类获得positive anchors,也就相当于初步提取了检测目标候选区域box,实现了对anchor的初步筛选。目标检测——Faster RCNN网络
    下图是RPN第二个支路1×1的网络结构,目的是实现bbox-regression。输出通道数是36,这里相当于feature maps每个点都有9个anchors,每个anchors又都有4个用于回归的变量需要训练。 [dx(A),dy(A),dw(A),dh(A)]\left[d_{x}(A), d_{y}(A), d_{w}(A), d_{h}(A)\right]
目标检测——Faster RCNN网络
下图是bbox-regression的具体工作和理论支撑:
目标检测——Faster RCNN网络
    到这里定位工作基本上结束,后面大体都是对于proposals的分类工作。

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网络