Faster R-CNN是Fast R-CNN的进一步改进,它的主要特点是:
- 使用RPN(Region Proposal Network)网络替代Selective Search,生成区域提议。
- RPN共享卷积层特征,并学习区域提议与物体/非物体分类。
- Fast R-CNN部分保持不变。
主要包含:
- 卷积层:提取图像特征maps。
- RPN:在特征maps上生成区域提议,输出物体概率和提议框。
- RoI Pooling:根据RPN提议框对特征maps进行max pooling,输出固定大小特征。
- 全连接层:完成区域分类和边界框回归。
- NMS:过滤重叠框。
Faster R-CNN的关键代码如下:
python
# RPN区域提议
rpn_logits = rpn_conv(feature_maps)
rpn_probas = F.softmax(rpn_logits, dim=1)
rpn_deltas = rpn_bbox_pred(feature_maps)
# 生成提议框
rpn_rois = generate_rpn_rois(rpn_probas, rpn_deltas)
# RoI Pooling
pooled_features = RoI_pooling(feature_maps, rpn_rois)
# 区域分类和框回归
logits = FC_classifier(pooled_features)
probas = F.softmax(logits, dim=1)
bboxes = FC_regressor(pooled_features)
# 损失函数
rpn_cross_entropy = F.cross_entropy(rpn_logits, rpn_labels)
rpn_smooth_l1 = F.smooth_l1_loss(rpn_deltas, rpn_deltas_targets)
cross_entropy = F.cross_entropy(logits, rois_labels)
smooth_l1 = F.smooth_l1_loss(bboxes, rois_deltas)
loss = rpn_cross_entropy + rpn_smooth_l1 + cross_entropy + smooth_l1
在上述代码中:
- RPN生成区域提议,并计算分类loss和回归loss。
- RoI Pooling和Fast R-CNN保持一致。
- 总loss包含RPN loss和Fast R-CNN loss。
Faster R-CNN的提出使得检测模型的速度和精度有很大提高。RPN替代了较为耗时的Selective Search方法,并与Fast R-CNN网络融合,实现端到端的检测训练。