什么是Faster R-CNN算法?

Faster R-CNN是Fast R-CNN的进一步改进,它的主要特点是:

  1. 使用RPN(Region Proposal Network)网络替代Selective Search,生成区域提议。
  2. RPN共享卷积层特征,并学习区域提议与物体/非物体分类。
  3. Fast R-CNN部分保持不变。

主要包含:

  1. 卷积层:提取图像特征maps。
  2. RPN:在特征maps上生成区域提议,输出物体概率和提议框。
  3. RoI Pooling:根据RPN提议框对特征maps进行max pooling,输出固定大小特征。
  4. 全连接层:完成区域分类和边界框回归。
  5. 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网络融合,实现端到端的检测训练。