目标检测随着深度学习的应用取得了很重要的进展,目前主要的算法主要分为两类,(1) two-stage方法,如R-CNN算法,主要思路是先通过启发式方法(selective search)或者CNN网络产生一系列的候选框,然后对候选框利用回归和分类,该方法的优势是准确率高;(2)one-stage方法,如yolo和SSD,主要思路是均匀的在图片的不同位置进行密集抽样,抽样时可以采用不同的尺度和长宽比,然后利用CNN提取特征后直接进行回归和分类,整个过程只需要一步,其优势是速度快,缺点是训练困难,主要是因为正样本和负样本极不均衡,导致模型准确度稍低,不同算法的性能如下图.
下图为不同算法的基本框图
SSD网络结构如下图所示,利用多尺度特征图进行目标检测,并依次进行边界框回归和分类判断。不同层次的特征图表示不同的语义信息,低层次的特征图代表低层次的语义信息(更多细节,如图像的边),可检测到小目标物体,高层次的特征图代表更高层的语义信息,可检测到大目标物体。因此利用SSD可以检测出小目标物体,实现代码可参考之前一篇关于SSD模型pytorch实现分析的博客。
SSD网络使用了6个不同大小的特征图,利用VGG16网络结构的Conv5_3 层(第一特征层),同时将FC6和FC7变成两个卷积层,FC7(conv7)层的输出作为第二个特征层,后面接多个卷积层得到第三到第六个特征层(Conv8_2、Conv9_2、Conv10_2、Conv11_2),每个网络都是利用 1 ∗ 1 1*1 1∗1和 3 ∗ 3 3*3 3∗3卷积。与YOLO相比,YOLO网络只使用了一层特征来进行目标检测。
下图为输入图像,在每层中的特征大小,以及6个特征图进行检测和分类的default boxes数量统计。
下表为SSD300每个stage特征图输出图像大小、Detector和classifier输出特征大小
表1
stage | name | Output size | Detector | classifier | def.boxes num |
---|---|---|---|---|---|
1 | Conv4_3 | 38 ∗ 38 ∗ 512 38*38*512 38∗38∗512 | 38 ∗ 38 ∗ 16 38*38*16 38∗38∗16 | 38 ∗ 38 ∗ 84 38*38*84 38∗38∗84 | 4 |
2 | FC7 | 19 ∗ 19 ∗ 1024 19*19*1024 19∗19∗1024 | 19 ∗ 19 ∗ 24 19*19*24 19∗19∗24 | 19 ∗ 19 ∗ 126 19*19*126 19∗19∗126 | 6 |
3 | Conv8_2 | 10 ∗ 10 ∗ 512 10*10*512 10∗10∗512 | 10 ∗ 10 ∗ 24 10*10*24 10∗10∗24 | 10 ∗ 10 ∗ 126 10*10*126 10∗10∗126 | 6 |
4 | Conv9_2 | 5 ∗ 5 ∗ 256 5*5*256 5∗5∗256 | 5 ∗ 5 ∗ 24 5*5*24 5∗5∗24 | 5 ∗ 5 ∗ 126 5*5*126 5∗5∗126 | 6 |
5 | Conv10_2 | 3 ∗ 3 ∗ 256 3*3*256 3∗3∗256 | 3 ∗ 3 ∗ 16 3*3*16 3∗3∗16 | 3 ∗ 3 ∗ 84 3*3*84 3∗3∗84 | 4 |
6 | Conv1_2 | 1 ∗ 1 ∗ 256 1*1*256 1∗1∗256 | 1 ∗ 1 ∗ 16 1*1*16 1∗1∗16 | 1 ∗ 1 ∗ 84 1*1*84 1∗1∗84 | 4 |
如下图为stage 4中得到特征图后的处理,其中localization表示进行边界框回归,其中24表示 6 ∗ 4 6*4 6∗4,每个特征点有6个box,每个box使用4个值表示box位置,confidence表示分类判断, 126 = 6 ∗ 21 126=6*21 126=6∗21,每个box输出21个输出表示voc07的21个分类.
box位置回归和分类处理如下,以stage 4中的特征为实例说明.
类似于Faster-RCNN中的Anchor,本文中起名为default boxes,def. boxes的选择直接决定了检测的性能。SSD中根据每个stage的Feature Map的大小,按照固定的Scale和Radio生成Default Boxes。SSD的default boxes的边长宽度为 w k a = s k a r w _ { k } ^ { a } = s _ { k } \sqrt { a _ { r } } wka=skar和高度为 h k a = s k / a r h _ { k } ^ { a } = s _ { k } / \sqrt { a _ { r } } hka=sk/ar,其中 a r a _ { r } ar为高宽比, a r ∈ { 1 , 2 , 3 , 1 2 , 1 3 } a _ { r } \in\left\{ 1,2,3 , \frac { 1 } { 2 } , \frac { 1 } { 3 } \right\} ar∈{1,2,3,21,31},对高宽比为1时为正方形box,还有一个正方形box,边长为 s k ′ = s k S k + 1 s _ { k } ^ { \prime } = \sqrt { s _ { k } S _ { k + 1 } } sk′=skSk+1,每个box的中心坐标为 ( i + 0.5 ∣ f k ∣ , j + 0.5 ∣ f k ∣ ) \left( \frac { i + 0.5 } { \left| f _ { k } \right| } , \frac { j + 0.5 } { \left| f _ { k } \right| } \right) (∣fk∣i+0.5,∣fk∣j+0.5),其中 ∣ f k ∣ |f_k| ∣fk∣表示当前特层的正方形的宽度,上面提到的 s k s_k sk按照下面的公式计算得到,然后乘以对应的输入图像宽度。
s k = s min + s max − s min m − 1 ( k − 1 ) , k ∈ [ 1 , m ] s _ { k } = s _ { \min } + \frac { s _ { \max } - s _ { \min } } { m - 1 } ( k - 1 ) , \quad k \in [ 1 , m ] sk=smin+m−1smax−smin(k−1),k∈[1,m]
其中 s m i n = 0.2 s_{min}=0.2 smin=0.2, s m a x = 0.9 s_{max}=0.9 smax=0.9,下图中的中间框为default boxes,使用的缩放比例为2,1/2;如表1,不同的stage使用的default box数量不同,其中为4的未使用3和1/3的长宽比。实际使用过程中根据实际进行调节boxes的大小。
给定输入图像以及每个物体的Ground Truth,首先找到每个Ground True box对应的default box中IOU最大的最为正样本.然后,在剩下的default box中寻找与Ground Truth 的IOU大于0.5的default box作为正样本.一个Ground Truth可能对应多个正样本default box.其他的default box作为负样本.下图中给定的输入图像和Ground Truth,分别在两个不同尺度(feature map大大小为 8 ∗ 8 , 4 ∗ 4 8*8,4*4 8∗8,4∗4)下的匹配情况,有两个default box与猫匹配( 8 ∗ 8 8*8 8∗8),一个default box与狗匹配( 4 ∗ 4 4*4 4∗4).
通过上述放大得到的正样本数量相对负样本数量会少很多,为了保证样本尽量平衡,SSD采用了hard nagative mining,即对负样本进行抽样,抽样时按照置信度误差(预测背景的置信度越小,误差越大)进行奖序排列,选取误差较大的top-k作为训练的负样本,保证正负样本比例接近1:3.
目标函数为训练过程中的优化标准,目标函数也称损失函数,主要包括位置误差(localization loss,loc) 与置信度误差(confidence loss,conf,分类损失)的加权和,定义 x i j p = { 1 , 0 } x_{ij}^p=\{1,0\} xijp={1,0}为第i个默认框和对应的第j个Ground Truth box,相应的类别为p.目标函数定义为:
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))
其中,N为匹配的默认框.如果N0,loss为0. L c o n f L_{conf} Lconf为预测框 l l l和Ground Truth g g g的Smooth L1 loss, α \alpha α值通过cross validation设置为1.
L 1 ( x ) = { 0.5 x 2 if ∣ x ∣ < 1 ∣ x ∣ − 0.5 otherwise _ { L _ { 1 } } ( x ) = \left\{ \begin{array} { l l } { 0.5 x ^ { 2 } } & { \text { if } | x | < 1 } \\ { | x | - 0.5 } & { \text { otherwise } } \end{array} \right. L1(x)={0.5x2∣x∣−0.5 if ∣x∣<1 otherwise
L l o c L_{loc} Lloc定义如下:
L l o c ( x , l , g ) = ∑ i ∈ P o s m ∈ { c x , c y , w , h } N 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 } 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}∑NxijksmoothL1(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) \quad \hat { g } _ { j } ^ { h } = \log \left( \frac { g _ { j } ^ { h } } { d _ { i } ^ { h } } \right) g^jw=log(diwgjw)g^jh=log(dihgjh)
其中, l l l为预测框, g g g为Ground Truth. ( c x , c y ) (cx,cy) (cx,cy)为补偿后的默认框 d d d的中心, ( w , h ) (w,h) (w,h)为默认框的宽和高.
L c o n f L_{conf} Lconf定义为多类别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)
采用数据扩增(data Augmentation)可提升SSD性能,主要采用的技术有水平翻转(horizontal flip),随机裁剪加颜色扭曲(random crop & color distortion),随机采样块域(Randomly sample a patch)(获取小目标训练样本),如下图所示:
SSD在VOC2007,VOC2012和COCO数据集上的性能如下表所示.SSD512性能好一些,加*的表示使用了数据增强技术,创建了小样本,来提升SSD在小目标上的检测效果,性能会提升.
SSD与其它检测算法对比结果(VOC2007)如下,SSD与Faster-RCNN有同样的准确度,并且与YOLO具有同样快的检测速度.
文中对使用的各种Trick做了分析,下表为各种track组合对SSD性能的影响,从表中可以得出如下结论:
1).数据增强技术对提升mAP作用很大;
本文就SSD实现过程中的几个关键问题进行了总结,主要包括网络模型,default boxes生成,训练策略等;SSD在YOLO的基础上主要进行了三点改进:多尺度特征图,利用卷积进行检测,设置先验框.多尺度检测中利用前几层的卷积进行检测,对小目标检测效果要好一些.
1.https://blog.csdn.net/xiaohu2022/article/details/79833786
2.https://jizhi.im/blog/post/gpu-p6
3.https://zhuanlan.zhihu.com/p/25100992
4.https://zhuanlan.zhihu.com/p/24954433
5.deepsystem.ai
6.https://www.jianshu.com/p/0903b160d554
7.https://blog.csdn.net/neu_chenguangq/article/details/79057655
8.SSD slide