SSD 论文理解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wwwhp/article/details/85047884

paper:: SSD Single Shot MultiBox Detector(单摄多框检测器)
linkSSD paper
codehttps://github.com/weiliu89/caffe/tree/ssd

摘要

  • 提出目标检测方法SSD:
    • one-stage的检测方法,不需要额外的proposal生成过程;
    • 将bbox的输出空间离散化到每个feature map预设的多长宽比例和多尺度的boxes上;(具体含义是将学习到的bbox直接映射到预设的box上
    • 通过合并不同size feature map的方法来处理检测目标多尺度的问题;
  • SSD性能:
    • 300 × 300 300\times300 的输入分辨率,SSD在VOC07 test数据集上能达到74.3%mAP,59FPS(Titan X);
    • 512 × 512 512\times512 输入分辨率能达到76.9%mAP,比Faster-RCNN的精度更高;
    • 在提升了数据增强策略后性能有了进一步的提升: 300 × 300 300\times300 达到77.2%mAP, 512 × 512 512\times512 达到79.8%mAP;

引言

  • SSD方法带来的提升和贡献:
    • 提出一个one-stage的目标检测方法:在速度比同为one-stage方法YOLO v1快的同时精度能达到two-stage方法Faster-RCNN的水平;
    • SSD的核心思想是用小尺寸卷积核对预设的bbox预测对应的classes score和coord offsets;
    • 在不同尺寸的feature map上预测不同长宽比例的bbox提升检测精度;
    • 实现了同时权衡精度和速度的端到端的目标检测训练框架;
    • 在实验阶段进行了全方位的速度和性能的对比;

Single Shot Detector

本节主要内容是针对SSD算法框架和对应的训练方法进行描述:

  • SSD在训练阶段需要训练图像以及对应object的ground truth label;
  • 在卷积预测阶段:针对不同尺寸feature map上每一个location按照不同长宽比例预测和预设bbox集合相对的坐标偏移和类别置信度;
  • 训练阶段的loss是坐标Smooth L1 loss和类别Softmax loss的加权求和;

SSD model design

SSD原始实现的backbone是VGG-16,在此基础上添加了一些辅助结构以产生最后的检测预测结果:

  • 多尺度feature map检测:SSD同时在多个尺度的feature map上预测结果,相反在YOLO v1的方法中只在单一的feature map预测检测结果;上图SSD pipeline中最终会产生8732个bbox,对此number进行解析:
    • 38 × 38 38\times38 feature map box数目: 38 × 38 × 4 = 5776 38\times38\times4 = 5776
    • 19 × 19 19\times19 feature map box数目: 19 × 19 × 6 = 2166 19\times19\times6 = 2166
    • 10 × 10 10\times10 feature map box数目: 10 × 10 × 6 = 600 10\times10\times6 = 600
    • 5 × 5 5\times5 feature map box数目: 5 × 5 × 6 = 150 5\times5\times6 = 150
    • 3 × 3 3\times3 feature map box数目: 3 × 3 × 4 = 36 3\times3\times4 = 36
    • 1 × 1 1\times1 feature map box数目: 1 × 1 × 4 = 4 1\times1\times4 = 4
  • YOLO v1最后使用全连接层来生成最后的预测结果,SSD则采用 3 × 3 × p 3\times3\times p 直接对输出的特征图进行卷积操作计算预测值(注意:同一个特征图中每个单元的先验框数目相同,每一个单元的先验框的设置<大小和长宽比>不同);
  • 先验框priorBox的设置:针对特征图上每一个cell需要预测k个bbox,因此每一个输出的特征图都需要 ( c + 4 ) k (c+4)k 个卷积核,其中c表示类别数(SSD中将背景也当做特殊的类别,SSD实际要预测c+1个类别置信度,其中包括bbox属于背景的置信度,论文中c类别已经包含了背景这个类别),4表示坐标相关数目,SSD中priorBox的设计参考了Faster-RCNN的anchor boxes,不同的是SSD的priorBox应用在不同分辨率的特征图;
  • 从priorBox到Bbox解析的实现细节(结合Faster-RCNN部分内容):
    • 当背景类的置信度最高时,表示预测的bbox不包含目标,当其他类别置信度最高时就代表bbox所含目标的类别,SSD网络对feature map上的每一个cell的每一个priorBox都要预测两组值 C l a s s e s c o n f 0 c Classesconf_{0\dots c} p c x , p c y , p w , p h (p^{cx},p^{cy},p^{w},p^{h}) ,通常bbox的位置信息由中心坐标和长宽表示,但是实际上SSD的预测值只是priorBox到Bbox的转换值(offset/transformation),SSD里面使用的坐标转换策略和Faster-RCNN相同;
    • 已知先验框 p r i o r B o x = ( d c x , d c y , d w , d h ) priorBox = (d^{cx},d^{cy},d^{w},d^{h}) 和目标边界框 B b o x = ( b c x , b c y , b w , b h ) Bbox = (b^{cx},b^{cy},b^{w},b^{h}) ,其转换过程为: p c x = ( b c x d c x ) / d w ; p c y = ( b c y d c y ) / d h ; p w = l o g ( b w / d w ) ; p h = l o g ( b h / d h ) p^{cx}=(b^{cx}-d^{cx})/d^{w};p^{cy}=(b^{cy}-d^{cy})/d^{h};p^{w}=log(b^w/d^{w});p^{h}=log(b^h/d^{h}) ,在目标检测领域中这个过程叫做bbox位置信息的编码encode,预测解析是其逆向过程为位置信息的解码decode,从预测值和priorBox解析得到预测Bbox;
    • 位置信息解码阶段: b c x = d w p c x + d c x ; b c y = d h p c y + d c y ; b w = d w e x p ( p w ) ; b h = d h e x p ( p h ) b^{cx}=d^{w}p^{cx}+d^{cx};b^{cy}=d^{h}p^{cy}+d^{cy};b^{w}=d^{w}exp(p^{w});b^{h}=d^{h}exp(p^{h}) ;(具体的解析过程可以通过源码实现来学习
    • 当前特征图 m × n m\times n 要预测 m n k ( c + 4 ) mnk(c+4) 个值,一共需要 k ( c + 4 ) k(c+4) 哥卷积核完成特征图的预测值计算过程;

SSD training

SSD训练过程中的关键点是如何将ground truth信息和网络预测输出的信息匹配上,一旦信息匹配上就能端到端的训练了(这里可以理解为预测值和GT值为loss function的两个输入,需要进行相应值的转换才才能符合loss function的输入标准):

  • 匹配策略:在SSD的训练过程中,当预测bbox和任一gt bbox的jaccard overlap(IOU值)大于0.5时都被当做正样本(由于图像中GT很少,目的是防止负样本过多这个样本过少,学习难度大),其实即使是这样训练过程中由于ground truth太少,正负样本还是极度不平衡;
  • 训练目标(loss函数):SSD的损失函数为位置损失函数loc loss和类别置信度损失函数的conf loss的加权和: 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}(L_{conf}(x,c)+\alpha L_{loc}(x,l,g)) ,根据交叉验证求出 α \alpha 为1;其中N表示先验框为正样本的数量,当 N = 0 N=0 时loss设定为0,loc loss代表预测box l和GT box g之间的Smooth L1 loss(绝对值loss),和Faster-RCNN的回归思路相同针对cell ( c x c y ) (cx,cy) 对priorBox d的中心坐标和w h进行回归, L ( x , c , l , g ) = i P o s N m ( c x , c y , w , h ) x i j k s m o o t h L 1 ( l i m g ^ j m ) L(x,c,l,g)=\sum_{i\in Pos}^{N}\sum_{m\in(cx,cy,w,h)}x_{ij}^{k}smooth_{L1}(l_{i}^{m}-\hat{g}_{j}^{m}) ,其中 x i j k ( 0 , 1 ) x_{ij}^{k}\in(0,1) 为1时表示第i个先验框和第j个GT匹配,匹配类别为k,由于 x i j k x_{ij}^{k} 的存在loc loss只针对正样本计算,loc loss输入数据需要特别注意:首先对GT的box进行encode处理得到 g g ^ g\rightarrow\hat{g} ,网络的预测值也是编码值(SSD caffe里面还有variance_encoded_in_target参数为TRUE时候编码需要加上variance,具体看实现吧);置信度loss采用Softmax loss: L c o n f ( x , c ) = i P o s N x i j p l o g ( c ^ i p ) i N e g l o g ( c ^ i 0 ) c ^ i p = e x p ( c i p ) p e x p ( c i p ) L_{conf}(x,c)=-\sum_{i\in Pos}^{N}x_{ij}^{p}log(\hat{c}_{i}^{p})-\sum_{i\in Neg}log(\hat{c}_{i}^{0})其中 \hat{c}_{i}^{p}=\frac{exp(c_{i}^{p})}{\sum_{p}exp(c_{i}^{p})}
  • 先验框的尺寸和长宽比的选择:SSD中大特征图用于检测小目标(底层特征图能捕获图像更多的细节),小特征用于检测大目标,SSD先验框的尺度设计思路为随着特征图size变小先验框尺度线性增加: s k = s m i n + s m a x s m i n m 1 ( k 1 ) , k ( 1 , m ) s_{k}=s_{min}+\frac{s_{max}-s_{min}}{m-1}(k-1),k\in(1,m) ,其中m代表特征图的数目5, s k s_{k} 表示先验框相对于网络输入图像size的比例,论文里面设定 s m i n = 0.2 , s m a x = 0.9 s_{min}=0.2,s_{max}=0.9 ;第一层输出的size单独设置的 s k = s m i n / 2 = 0.1 s_{k}=s_{min}/2=0.1 s k s_{k} 计算过程:1. s m i n , s m a x s_{min},s_{max} 先乘100计算的时候向下取整2. 然后求出步长17对应每一层的 s k = ( 20 , 37 , 54 , 71 , 88 ) s_{k}=(20,37,54,71,88) 3.然后再除以100乘以网络输入图像大小得到 s r = ( 60 , 111 , 162 , 213 , 264 ) s_{r}=(60,111,162,213,264) ;论文里面长宽比设定为 a r ( 1 , 2 , 3 , 1 2 , 1 3 ) a_{r}\in(1,2,3,\frac{1}{2},\frac{1}{3}) ,与此对应的w和h计算方法为 w k a = s r a r , h k a = s r / a r w_{k}^{a}=s_r\sqrt{a_{r}},h_{k}^{a}=s_r/\sqrt{a_{r}} ,除了默认的比例为1的先验框以外还会增加一个额外的框 s ^ k = s k s k + 1 \hat{s}_{k}=\sqrt{s_{k}s_{k+1}} ,因此每一个特征图的cell对应6个先验框,但实际上有三个输出特征层只有4个先验框 ( 1 , 2 , 1 2 , a d d ) (1,2,\frac{1}{2},add) (具体哪几层见多尺度FM检测分析部分);先验框的中心点分布在各cell的中心 ( i + 0.5 f k , j + 0.5 f k ) , i , i [ 0 , f k ] (\frac{i+0.5}{|f_{k}|}, \frac{j+0.5}{|f_k|}),i,i\in[0,|f_{k}|] ,其中 f k f_{k} 为特征图的大小;
  • 困难负样本挖掘:在训练过程中正负样本数量极不平衡,SSD采用hard negative mining方法对负样本进行抽样,按照置信度误差降序排序(负样本背景类别的置信度越小,误差越大),选取误差较大的部分负样本保持和正样本的比例为 3 : 1 3:1 进行训练,能使得训练过程更稳定收敛更快;
  • 数据增强:为了使得模型更加鲁棒,SSD训练阶段采用的数据增强策略如下,其中采集的size为原图的 [ 0.1 , 1 ] [0.1,1] ,长宽比为 [ 1 2 , 2 ] [\frac{1}{2},2] ,每一张图像都有0.5的概率会进行水平翻转;
    • 原始图像输入;
    • 采集块区域是的和目标的IOU值为0.1、0.3、0.5、0.7、0.9;
    • 随机采集块区域;

SSD inference

SSD的预测过程主要分为以下几个阶段:

  • 首先根据类别置信度确定其类别与其对应的置信度值,并过滤掉属于背景的预测框;
  • 根据置信度阈值0.5对预测框进行过滤,对剩下的预测框进行解码和校正,得到预测框真实的位置信息;
  • 根据置信度进行降序排列,保留部分预测框并进行NMS,过滤掉那些重叠度较大的预测框得到最终检测结果;

实验结果

论文中分析了SSD和其他几种既有代表性的检测方法在VOC、COCO等数据集上的性能表现,实验部分的分析比较繁琐在此我就不再多阐述了,直接看表格比较直观:

  • PASCAL VOC2007
  • PASCAL VOC2012
  • COCO
  • 数据增强后提升小目标检测的准确率

总结

  • SSD新特征:多尺度特征图检测,直接使用小卷积核来计算预测结果,设置了priorBox(anchor);
  • SSD性能:速度比YOLO v1快小目标检测效果更好(这也是YOLO v1的缺点),精度和Faster-RCNN这种two-stage检测方法相匹配;
  • SSD可以很方便地部署到大规模系统的目标检测模块上;
  • SSD算法里面有很多实现细节没有列出来,需要阅读源码,目前基于SSD算法的思想出现了许多改进的检测方法(更换backbone只是最基础的一种方法);

猜你喜欢

转载自blog.csdn.net/wwwhp/article/details/85047884