论文:R-FCN: Object Detection via Region-based Fully Convolutional Networks (CVPR 2016)
代码:PureDiors/pytorch_RFCN
动机
残差网(ResNets)和GoogLeNets等在分类任务中的表现优越,但在检测任务中却表现不佳。其网络结构基本由卷积层组成,随着网络变深,目标的位置信息越来越模糊,这不利于目标的定位
分类任务注重平移不变性(目标的位置不影响对其类别识别),但检测任务需要兼顾位置信息:
- Faster R-CNN将RoI pooling层插入到两组卷积层之间,打破了平移不变性。创建了一个更深的RoI-wise子网,以提高准确性,但未共享每个RoI的计算而降低了速度(每个 Sample RoI 都要经过全连接层计算一遍)
改进
- 以ResNet101作为Backbone(采用全卷积网络),充分共享计算
- 去除RoIRooling层,采用PS Roi Pooling,平衡平移不变性(translation-invariance)和平移可变性(translation-variance)
Faster RCNN流程
feature_maps = process(image)
ROIs = region_proposal(feature_maps)
for ROI in ROIs
patch = roi_pooling(feature_maps, ROI)
class_scores, box = detector(patch) # 含两个全连接层
class_probabilities = softmax(class_scores)
RFCN流程
feature_maps = process(image)
ROIs = region_proposal(feature_maps)
score_maps = compute_score_map(feature_maps)
for ROI in ROIs
V = region_roi_pool(score_maps, ROI)
class_scores, box = average(V) # 明显计算量更少
class_probabilities = softmax(class_scores)
R-FPN详解
Backbone
:ResNet-101去掉最后的平均池化和全连接层,紧接着conv_5x采用
1
×
1
1\times1
1×1卷积将特征维度从2048降至1024,对于分类部分(回归部分类似):
- 采用 1 × 1 1\times1 1×1卷积得到 k 2 ( C + 1 ) k^2(C+1) k2(C+1) 维度的 score maps
- 将 roi 划分成 k × k k\times k k×k个bin
- 对不同位置的bin进行Pooling(平均),例如,下图中的第一块黄色只取左上角的bin(通道范围: 1 → C + 1 1\to C+1 1→C+1),最后一块淡蓝色只取右下角的bin(通道范围: C + 2 → 2 C + 2 C+2\to 2C+2 C+2→2C+2)。合并得到薄的特征图,通道数 K 2 ∗ ( C + 1 ) → ( C + 1 ) K^2*(C+1)\to (C+1) K2∗(C+1)→(C+1)
- 在每个通道(每个通道对应一个类别)上进行vote(平均),得到 C+1 维向量,经过sofmax各类别的概率
【1】
score maps
:通道为
k
2
(
C
+
1
)
k^2(C+1)
k2(C+1) ,每个颜色块通道为
C
+
1
C+1
C+1,
k
2
k^2
k2为bin数量,
C
+
1
C+1
C+1为类别数,以黄色层为例:负责预测目标左上角得分,黄色层的每一个像素值表示该处为一个目标的左上角的得分,所以采用的是selective pooling,下图应该非常清楚(Instance-sensitive Fully Convolutional Networks)
selective pooling
:在 RoI 上进行 selective pooling,注意不是整个 score maps
实验
参考文献
【1】【目标检测】R-FCN
【2】物体检测之R-FCN
【3】R-FCN算法及Caffe代码详解
【4】R-FCN:基于区域的全卷积检测网络
【5】【深度学习R-FCN】——深刻解读R-FCN网络结构
【6】ROI Align 在 R-FCN 中的推广:PSROI-Align(附代码)
【7】Understanding Region-based Fully Convolutional Networks (R-FCN) for object detection