参考:https://blog.csdn.net/u011746554/article/details/74999010
(Region Proposal Network)区域生成网络
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最大的不同,其他地方几乎一样。