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