1. R-CNN
Rich feature hierarchies for accurate object detection and semantic segmentation [CVPR14] pdf
- 在输入图片上通过selective search方法选择RoI,也就是Region Proposal(候选框),R-CNN中的R就来自于这个词。
- 对于每个proposal,通过CNN提取特征
- 对于提取的特征,bbox回归确定边界框位置,SVM用来做分类确定目标的类别。
R-CNN问题:
- 要有专门的训练目标函数:log loss, hinge loss, least squares
- 训练麻烦而且时间长
- 推断过程也很慢
对于每个候选区域用一个CNN,后来出现的SPPNet解决了输入尺寸不确定的问题:
SPPNet提出了空间金字塔池化,将输出不同尺寸的feature map通过SPP层变成固定的长度的全连接层输入
2. Fast R-CNN
Fast R-CNN [ICCV15] pdf
- 用一个convnet施加在输入图片上(卷积共享,提升速度)。
- 在这个convnet输出的feature map上找到输入图片上对应的RoI,特征图上的区域就是输入图像上RoI的特征。
- 将这些区域的特征分别通过RoI pooling层(借鉴SSPNet的思想),变成固定长度的全连接层输入
- 分类和回归也放入到网络中去。
Fast R-CNN问题:
图像进入网络之前还需要在CPU上用传统算法ss找RoI,这步操作占据了检测时间的大部分,差不多两秒。
3. Faster R-CNN
Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks [NIPS15] pdf
- 用一个convnet施加在原始输入图片上
- 在这个convnet输出的feature map上施加一个Region Proposal Network (RPN),用来代替之前在原始图像上的传统方法。产生很多个候选框。RPN后接也两个loss,classification loss为二分类,判断这个框是不是物体,用来过滤不要的候选框,bbox regression loss微调给定的边框,使之anchor box可以更接近gt的框。
- 后面的步骤和RCNN一样,classification loss为多分类。
RPN
- 经过VGG或者ZFNet产生的特征图作为RPN的输入。
- 在特征图上执行3x3的滑窗操作,每个滑窗对应的区域映射为低维特征(256-d for ZF and 512-d for VGG, with ReLU following),后接两个全连接分支:一个分类一个回归。
- 每个3x3滑窗的中心,在原始图像上对应的感受野上有 k k k个anchor boxes(论文中是9个:3个尺度和对应的3个长宽比),所以每个滑窗会得到2k个分类结果和4k个回归结果。
- 假如特征图大小有
W
×
H
W\times H
W×H,则会产生
W
×
H
×
k
W\times H\times k
W×H×k个anchors.
论文输出特征图60x40,大概要2w个框
RPN具有平移不变性
训练RPN
为了训练RPN,需要对每个anchor构造一个二分类的label,即这个框是不是物体。
标记为正标签:i)跟gt的IOU最大的框为正. ii)跟gt的IOU大于0.7的为正。
标记为负标签:跟gt的IOU小于于0.3的为负。大于0.3小于0.7的对损失函数不做贡献。
损失函数:
L
c
l
s
L_{cls}
Lcls:log loss,
L
r
e
g
L_{reg}
Lreg:smooth L1.
λ
=
10
\lambda =10
λ=10
回归的损失求的是预测和真实之间一种变换的因子,
t
i
t_i
ti,
t
i
∗
t_i^*
ti∗由下面公式给出:
RPN训练细节
SGD
mini-batch为1,因为一张图像就产生很多个框。在一张图像中随机选256个anchor
将特征图上超过边界的框过滤掉,不过在测试过程中,超过边界的框不过滤,需要clip,也就是超出的部分切掉。
通过NMS,设置阈值0.7,将重叠的框再过滤掉。
然后再在这些框中取top128做正样本。