Fast R-CNN是R-CNN的加速版本,它的主要改进是:
- 共享卷积特征:不再为每个区域提议重复提取CNN特征,而是在整张图像上提取特征一次,然后针对每个提议区域进行RoI Pooling以获得固定长度的特征向量。
- 增加多任务损失: join分类和回归任务,一同训练网络。
- 使用softmax分类器代替SVM。
主要步骤是:
- 输入图像传入 conv layers,提取特征maps。
- Selective Search生成区域提议。
- RoI Pooling layer针对每个提议区域在特征maps上进行max pooling,输出固定大小的特征向量。
- 连接RoI Pooling层和全连接层,以softmax分类每个区域和bounding box回归。
- 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多任务训练。这个改进极大缩短了训练和测试时间,使得检测模型的应用更为广泛。