什么是Fast R-CNN算法?代码讲解

Fast R-CNN是R-CNN的加速版本,它的主要改进是:

  1. 共享卷积特征:不再为每个区域提议重复提取CNN特征,而是在整张图像上提取特征一次,然后针对每个提议区域进行RoI Pooling以获得固定长度的特征向量。
  2. 增加多任务损失: join分类和回归任务,一同训练网络。
  3. 使用softmax分类器代替SVM。

主要步骤是:

  1. 输入图像传入 conv layers,提取特征maps。
  2. Selective Search生成区域提议。
  3. RoI Pooling layer针对每个提议区域在特征maps上进行max pooling,输出固定大小的特征向量。
  4. 连接RoI Pooling层和全连接层,以softmax分类每个区域和bounding box回归。
  5. NMS进行结果过滤。

Fast R-CNN的关键代码如下:

python
import torch 
from torch.nn import functional as F

# 特征提取
features = CNN(im)  

# 区域池化
rois = torch.from_numpy(proposals)
pooled_features = RoI_pooling(features, rois)

# 区域分类和边界框回归
logits = FC_classifier(pooled_features)
probas = F.softmax(logits, dim=1)
bboxes = FC_regressor(pooled_features)

# 损失函数
cross_entropy_loss = F.cross_entropy(logits, rois_labels)
smooth_l1_loss = F.smooth_l1_loss(bboxes, rois_deltas) 
loss = cross_entropy_loss + smooth_l1_loss

在上述代码中:

  • CNN提取图像特征
  • RoI Pooling对每个提议区域进行max pooling,输出固定长度特征
  • 全连接层同时完成区域分类和框回归
  • softmax得到类别概率,smooth_l1_loss计算框回归loss
  • join分类loss和回归loss作为网络的total loss

相比R-CNN,Fast R-CNN的主要提高在于共享卷积层特征和join多任务训练。这个改进极大缩短了训练和测试时间,使得检测模型的应用更为广泛。