这个文章是对目标检测的经典论文《SSD: Single Shot MultiBox Detector》的一些笔记。笔记基本按照文章的结构来的,并参考引用了深度之眼CV方向Paper班的PPT。
论文下载地址 https://arxiv.org/abs/1512.02325
摘要
1. 提出了SSD目标检测算法
- 基于端对端学习的目标检测
- 将边界柜的输出空间离散化为一组默认框(来自于不同层次的特征图)
- 基于这组默认框进行各类别的预测
- 可以检测不同大小(不同像素精度)的物体
2. 介绍了SSD的性能
- 300*300分辨率的输入, VOC2007测试集上获得74.3%Map和59FPS
- 512*512分辨率的输入,获得了76.9%的Map, 比最先进的FasterRCNN的准确率还要高
1. 引言
1. 介绍了当前目标检测的常用方法
- Step1: 提出候选框
- Step2: 对每个框重新取样像素或特征
- Step3: 应用高精度分类器分类
2. 介绍了当前目标检测方法的缺点
- 计算量太大,速度慢,不适合实时系统
- 此外,部分算法提升速度通常以降低精度为代价
3. 简单介绍了SSD的改进
- 不需要预先提出候选框
- 不需要像素或者特征的重采样
- 采用了多尺度的filters
- 在多个层次的特征图上进行预测, 即使是低分辨率的输入, 也一样可以达到不错的效果
4. 简单介绍了SSD的成果
- 速度和精度大幅度提升
5. 介绍了SSD的贡献
- SSD方法的核心是使用小卷积滤波器来预测特征图上固定的一给默认边界柜的类别分类和位置偏移
- 为了实现高检测精度,从不同尺度的特征图上产生不同尺度的预测,并且通过宽高比来明确地分离预测
- 这些设计特征得到了简单的端到端的训练和高精度,进一步提高速度和精度的权衡,即使输入是相对低分辨率的图像
- 实验包括在PASCAL VOC, MS COCO和ILSVRC上评估不同输入大小模型耗时和精度分析,并与一系列最新的先进方法进行比较
补充
1. Faster Rcnn算法介绍
- Feature Extraction 使用CNN提取特征
- RPN网络生成 Proposal
- RoiPooling利用Proposal和CNN提取的Feature得到固定大小的Feature map
- Classification and Regression 利用RoiPooling得到的Feature进行分类和位置回归
- 在Feature Extraction的最后一层特征上产生Anchor,每个像素点产生3种Ratio,3种Scale的Anchor.
2. Yolo算法介绍
- 将物体检测这个问题定义为Bounding Box和分类置信度的回归问题
- Yolo算法采用一个单独的CNN模型实现End-to-End的目标检测, Yolo将全图划分为S*S的格子, 每个格子负责中在该格子的目标检测, 采用一次性预测所有格子所含目标的bbox,定痊置信度以及所有类别概率向量来将问题一次性解决(one-shot)
2.单点多尺度目标检测器(SSD)
SSD整体的网格结构图如下所示
1. SSD default box设计
1.1 default box数量
default box 在不同的feature层有不同的scale, 在同一个feature层又有不同的aspect ratio, 因此基本上可以覆盖输入图像中各种开关和大小的object, default box的总数为
38
×
38
×
4
+
19
×
19
×
6
+
10
×
10
×
6
+
5
×
5
×
6
+
3
×
3
×
4
+
1
×
1
×
4
)
=
8732
38\times38 \times 4 + 19 \times 19 \times 6 + 10 \times10\times6+5\times5\times6+3\times3\times4+1\times1\times4)=8732
38×38×4+19×19×6+10×10×6+5×5×6+3×3×4+1×1×4)=8732
1.2 default box公式
s
k
=
[
0.2
,
0.34
,
0.48
,
0.62
,
0.76
,
0.9
]
,
a
r
=
{
1
,
2
,
3
,
1
/
2
,
1
/
3
}
s_{k} = [0.2, 0.34, 0.48, 0.62, 0.76, 0.9], a_{r} = \{1, 2, 3, 1/2, 1/3\}
sk=[0.2,0.34,0.48,0.62,0.76,0.9],ar={1,2,3,1/2,1/3}
宽求解公式:
w
k
a
=
s
k
a
r
w_{k}^{a}=s_{k}\sqrt{a_{r}}
wka=skar
高求解公式:
s
k
′
=
s
k
s
k
+
1
s_{k}^{'}=\sqrt{s_{k}s_{k+1}}
sk′=sksk+1
2. SSD匹配策略(正负样本选取)
将default box和ground truth box按照IOU(交并比,即两个矩形边界的交集面积除以合并面积的比值)进行匹配,匹配成功(值大于设定的阈值,如本文为0.5)则为正例, 否则则为负例.
3. SSD损失函数
- 位置损失: 只对与正样本求位置损失, 损失函数使用Smooth L1
L l o c ( x , l , g ) = ∑ i ∈ P o s m ∈ { c x , c y , w , h } N ∑ c x , c y , w , h } x i j k smooth L 1 ( l i m − g ^ j m ) L_{l o c}(x, l, g)=\sum_{i \in P o s_{m} \in\{c x, c y, w, h\}}^{N} \sum_{c x, c y, w, h \}} x_{i j}^{k} \operatorname{smooth}_{\mathrm{L} 1}\left(l_{i}^{m}-\hat{g}_{j}^{m}\right) Lloc(x,l,g)=i∈Posm∈{cx,cy,w,h}∑Ncx,cy,w,h}∑xijksmoothL1(lim−g^jm)
g ^ j c x = ( g j c x − d i c x ) / d i w g ^ j c y = ( g j c y − d i c y ) / d i h \hat{g}_{j}^{c x}=\left(g_{j}^{c x}-d_{i}^{c x}\right) / d_{i}^{w} \quad \hat{g}_{j}^{c y}=\left(g_{j}^{c y}-d_{i}^{c y}\right) / d_{i}^{h} g^jcx=(gjcx−dicx)/diwg^jcy=(gjcy−dicy)/dih
g ^ j w = log ( g j w d i w ) g ^ j h = log ( g j h d i h ) \hat{g}_{j}^{w}=\log \left(\frac{g_{j}^{w}}{d_{i}^{w}}\right) \qquad \hat{g}_{j}^{h}=\log \left(\frac{g_{j}^{h}}{d_{i}^{h}}\right) g^jw=log(diwgjw)g^jh=log(dihgjh) - 置信度损失: 参与损失的样本使用难例挖掘策略,损失函数使用Softmax Loss
L c o n f ( x , c ) = − ∑ i ∈ P o s N x i j p log ( c ^ i p ) − ∑ i ∈ N e g log ( c ^ i 0 ) where c ^ i p = exp ( c i p ) ∑ p exp ( c i p ) L_{c o n f}(x, c)=-\sum_{i \in P_{o s}}^{N} x_{i j}^{p} \log \left(\hat{c}_{i}^{p}\right)-\sum_{i \in N e g} \log \left(\hat{c}_{i}^{0}\right) \quad \text { where } \quad \hat{c}_{i}^{p}=\frac{\exp \left(c_{i}^{p}\right)}{\sum_{p} \exp \left(c_{i}^{p}\right)} Lconf(x,c)=−i∈Pos∑Nxijplog(c^ip)−i∈Neg∑log(c^i0) where c^ip=∑pexp(cip)exp(cip) - 总损失: 位置损失和置信度损失加权求和
L ( x , c , l , g ) = 1 N ( L c o n f ( x , c ) + α L l o c ( x , l , g ) ) L(x, c, l, g)=\frac{1}{N}\left(L_{c o n f}(x, c)+\alpha L_{l o c}(x, l, g)\right) L(x,c,l,g)=N1(Lconf(x,c)+αLloc(x,l,g))
4. SSD难例挖掘策略
- 选取所有正样本,数量k
- 对所有负样本求loss, 递减排序,取前3 k k k
- k k k个正样本, 3 k k k个负样本参与损失计算
5. SSD数据增强
- 数据增强目的:使得算法对输入的不同大小和不同形状的目标具有更好的鲁棒性
- 数据增强方法:水平翻转、裁剪、放大和缩小等
- 数据增强效果:通过采用数据增强明显提升了算法的性能
6. SSD对比Faster RCNN
- SSD跟Faster Rcnn相比,在精度(MAP指标)几乎保持不变的情况下,速度提升非常多,达到实时级别
- SSD属于端对端学习
- default box在不同特征图上有不同的大小
7. SSD对比Yolo
- SSD与Yolo相比,不仅速度快,同时精度大幅提高
- SSD用CNN来直接进行检测,而YOLO v 1 _{v1} v1使用全连接进行检测
- SSD在多个层次上进行检测,增加了多尺度的鲁棒性
- SSD采用了Faster Rcnn中的Anchors技术,利用不同宽高比行验框进行对象检测,而YOLO v 1 _{v1} v1没有使用Anchors技术
3. SSD实验
3.1实验设置
- 基础网络: VGG16, 在ILSVRCCLS-LOC数据集上预训练
- 类似于deepLab-LargeFOV, 将fc6和fc7转换为卷积层, 从fc6和fc7两层采样得到参数
- 将pool5从 2 × 2 − s 2 2\times2-s2 2×2−s2更改为 3 × 3 − s 1 3\times3-s1 3×3−s1, 并使用atrous算法填"洞"
- 删除了所有的Dropout层和fc8层
- 使用SGD对这个模型进行fine-tune, 初始学习率为0.001, 0.9的momentum, 0.0005的weight decay, 并设batch为32
- 使用conv4_3, conv7(fc7), conv8_2, conv9_2, conv10_2和pool11来预测位置和置信度
- 用“xavier” 方法初始化所有新添加的卷积层的参数
- 由于conv4_3的大小较大( 38 × 38 38\times38 38×38), 因此只在其上放置3个默认框:一个0.1比例的框,和另外纵横比为1/2和2的框,对于所有的其它层,设置6个默认框
- conv4_3层采用L2正则化技术,将特征图中的每个位置处的特征范数缩放为20
3.2 SSD中使用的Atrous介绍
- 空洞卷积又名扩张卷积,向卷积层引入一个称为"扩张率(dilation rate)的新参数, 该参数定义了卷积核处理数据时各值的间距
- 优点: 在相同的计算条件下, 空洞卷积提供了更大的感受野。空洞卷积经常用在实时图像分类中。当网络层需要较大的感受野,但计算资源有限而无法提高卷积核数量或大小时,可以考虑空洞卷积。