SSD论文浅析
Single Shot MultiBox Detectordeepsystems
背景
因为YOLO V1带来的快速的检测速度,而准确率却远不如faster-rcnn,而且前面博文所说,YOLO V1只在一个grid cell中预测一种class,并且只在最后一层的feature map进行box的预测,使得在大小尺寸上难以兼顾到。
本文中提出的SSD,很重要的一点就是将之前基础的网络中的feature map和之后的多尺度feature map一起进行prior boxes的选取,提高了boxes对尺寸的要求。文章中对于prior boxes的选择与faster-rcnn中的anchor技术比较类似。
可以说是 anchor+YOLO的产物了。
网络结构
论文中的网络结构采用的是VGG-16-Atrous,使得conv6(FC6)处的尺寸为19*19(看源码可以理解,dilate=True),这里分别采用两组3*3的卷积(SAME卷积)对各层的feature map进行处理。类似于YOLO的方法。
拿conv4_3举例(以下的尺寸都是以此为例)
第一组:实现localization的regression(x,y,w,h)4个参数,则共需要3*3*512的卷积核4*default boxes个,可能要问default boxes是什么鬼东西
default boxes:对应卷积层尺寸38*38,每一个像素对应产生default boxes个box
如上图 对于8*8和4*4的来说,default boxes=4
这就好办了,我们为了得到regression,卷积出38*38*(4*default boxes)的结果。
第二组:实现每一类的confidence的计算,加入数据集共前景C类,则需要有(C+1)个confidence。又每一个像素default boxes,则可知需要3*3*512的卷积核(C+1)*default boxes个,好了,我们得到了38*38*((C+1)*default boxes)的结果。
实验中将第一组和第二组的结果进行concat,得到38*38*((4+(C+1))*default boxes)的卷积结果
default box不同scale和aspect ratio的选择策略
每一层所取得default boxes不一样。
自此,我们得到了38*38*4 + 19*19*6 + 10*10*6 + 5*5*6 + 3*3*4 + 1*1*4 = 8732个prior box
训练
区分正负样本
正样本:先从GT(ground truth)考虑,将所有与GT最匹配(IoU最大)的prior box标为候选正样本集;
再从prior box考虑,将所有与任一个GT的IoU>0.5的prior box标为正样本集。
负样本:剩下的即负样本
但显然存在负样本过多的问题,论文中没有详细写这么平衡至1:3,源码中应该是有的,有关Hard negative mining技术
loss function分析
一张图可以说明,其中N为正例数目(下文的jaccard overlap其实就是IoU,一毛一样)
SSD 训练的目标函数(training objective)源自于 MultiBox 的目标函数,但是本文将其拓展,使其可以处理多个目标类别。具体过程是我们会让每一个 prior box 经过Jaccard系数计算和真实框的相似度,阈值只有大于 0.5 的才可以列为候选名单;假设选择出来的是N个匹配度高于百分之五十的框吧,我们令 i 表示第 i 个默认框,j 表示第 j 个真实框,p表示第p个类。那么xpij表示 第 i 个 prior box 与 类别 p 的 第 j 个 ground truth box 相匹配的Jaccard系数,若不匹配的话,则xpij=0。总的目标损失函数(objective loss function)就由 localization loss(loc) 与 confidence loss(conf) 的加权求和:
1、N 是与 ground truth box 相匹配的 prior boxes 个数
2、localization loss(loc) 是 Fast R-CNN 中 Smooth L1 Loss,回归 bounding boxes 的中心位置,以及 width、height;confidence loss(conf) 是 Softmax Loss(多了一个是否匹配的系数),输入为每一类的置信度 c(已经归一化的概率)
3、权重项 α,可在protxt中设置 loc_weight,默认设置为 1