天天看点

目标检测之RPN

参考:https://blog.csdn.net/u011746554/article/details/74999010

(Region Proposal Network)区域生成网络

目标检测之RPN

RPN网络中利用anchors和softmax初步提取出foreground anchors作为候选区域。

1)

layer {

name: “rpn_cls_score”

type: “Convolution”

bottom: “rpn/output”

top: “rpn_cls_score”

convolution_param {

num_output: 18 # 2(bg/fg) * 9(anchors)

kernel_size: 1 pad: 0 stride: 1

}

}

那么为何要在softmax前后都接一个reshape layer?

便于softmax分类,

从caffe的实现形式说起,在caffe基本数据结构blob中以如下形式保存数据:

blob=[batch_size, channel,height,width]

对应至上面的保存bg/fg anchors的矩阵,其在caffe blob中的存储形式为[1, 29, H, W]。

而在softmax分类时需要进行fg/bg二分类,所以reshape layer会将其变为[1, 2, 9H, W]大小,

即单独“腾空”出来一个维度以便softmax分类,之后再reshape回复原状。

caffe softmax_loss_layer.cpp的reshape函数的解释,非常精辟:

"Number of labels must match number of predictions; "

"e.g., if softmax axis == 1 and prediction shape is (N, C, H, W), "

"label count (number of labels) must be NHW, "

“with integer values in {0, 1, …, C-1}.”;

2)

layer {

name: “rpn_bbox_pred”

type: “Convolution”

bottom: “rpn/output”

top: “rpn_bbox_pred”

convolution_param {

num_output: 36 # 4 * 9(anchors)

kernel_size: 1 pad: 0 stride: 1

}

}

生成anchors -> softmax分类器提取fg anchors -> bbox reg回归fg anchors -> Proposal Layer生成proposals

Faster-RCNN = Fast-RCNN + RPN

RPN(FCN):

任意分辨率的图像,经过RPN,得到一个feature map。

feature map上的每一个点映射回原图,得到这些点的坐标。

然后这些点周围取一些提前设定好的区域,如选取每个点周围5x5的一个区域,这些选好的区域可以用来训练RPN。

假设我们对feature map上的每个点选取了K个anchor,feature map的大小为HWC,那么我们再对这个feature map做两次卷积操作,输出分别是HWnum_classK和HW4K,分别对应每个点每个anchor属于每一类的概率以及它所对应的物体的坐标。

那么怎么训练这个网络呢?

网络的loss function:一个用于分类的softmax loss、一个用于回归的smooth L1 loss

输出对应的ground truth也很好得到,对于每个anchor,如果它和图片中某个物体的IOU(面积的交/面积的并)大于一个阈值,就认为它属于这一类,否则认为是背景,对于那些是背景的anchor回归的loss就是0,其他anchor位置的ground truth就是它们所对应的物体的位置。

RPN其实就是关键的地方就在于选取了一些anchor然后进行pixel-wise的学习

RPN缺点:

最大的问题就是对小物体检测效果很差。

假设输入为512512,经过网络后得到的feature map是3232,那么feature map上的一个点就要负责周围至少是16*16的一个区域的特征表达,那对于在原图上很小的物体它的特征就难以得到充分的表示,因此检测效果比较差。

SSD: Single Shot MultiBox Detector很好的解决了这个问题。

SSD可以理解为multi-scale版本的RPN,它和RPN最大的不同在于RPN只是在最后的feature map上预测检测的结果,而最后一层的feature map往往都比较抽象,对于小物体不能很好地表达特征,而SSD允许从CNN各个level的feature map预测检测结果,这样就能很好地适应不同scale的物体,对于小物体可以由更底层的feature map做预测。这就是SSD和RPN最大的不同,其他地方几乎一样。