python ssd目标检测_【目标检测】SSD

1. 动机(motivation)

在SSD之前,目标检测的主流方法主要分为两大类:

  • two-stage:以R-CNN系列为代表,这类方法通常包括两个部分,第一部分先使用selective search、卷积神经网络等筛选出一些proposal boxes,然后第二部分再对这些proposal boxes进行分类和回归。这就相当于进行了两次分类和回归,因此检测的准确率较高,但是可想而知检测的速度也就比较慢了。
  • one-stage:以YOLO为代表,这类方法的主要思路就是在图片的不同位置进行密集采样,然后使用CNN网络提取特征并直接进行分类和回归,整个过程只要一步就可完成。这种方法的优势是检测速度快,但是检测的准确率却不是很高。

于是为了让检测过程又快又准确,SSD就被提出来了。SSD借鉴了YOLO的one-stage的思想,直接对bbox进行回归和分类,同时也参考了Faster R-CNN中的anchor机制来提升准确率。通过将两种方法的优点结合,并加以改进,SSD保持了很快的检测速度,同时还提高了检测的准确率。

2. 创新(Innovation)

和YOLO类似,SSD也是one-stage的检测方法,即使用一个神经网络直接进行分类和回归,但是为了提高准确率,SSD做了以下改进:

  • Multi-scale feature map:使用多尺度的feature map来进行检测。在base network之后加了几层卷积,这些卷积层会逐渐减小feature map的size,然后在不同size的feature map上进行检测,进而实现了一个多尺度的检测。因为不同size的feature map的感受野不同,因此可以检测不同大小的物体,比较大的特征图,感受野较小,适合检测相对较小的物体,而较小的特征图,感受野较大,适合检测相对较大的物体。如下图中,
    的feature map中蓝色框更适合来检测猫,而
    的feature map中红色的框更适合来检测狗。

v2-df7e69b923e73d46e96e3a1454ee829c_b.jpg
图1 multi-scale feature map
  • Convolutional predictors;在YOLO中使用全连接层来进行分类和回归,但是在SSD中改为使用卷积层,对于
    的feature map,用两个
    的卷积核分别进行分类和定位,然后得到预测结果。
  • Default boxes and aspect ratios;我们之前分析过YOLO的缺陷,首先YOLO中每个cell只预测两个bbox和一个类别,这就限制了能预测重叠或邻近物体的数量,同时YOLO直接预测bbox的位置,这样会增加训练难度。因此在SSD中就借鉴Faster R-CNN中的anchor机制,为feature map中的每个点设置几个不同尺寸和宽高比的default boxes(anchors),然后以这些anchors为基准去拟合ground truth box,这样就减小了训练的难度。同时,在SSD中通过计算anchor和ground truth box的IoU来确定哪个anchor负责哪个物体,而不是像YOLO一样通过物体的中心点来确定,这样就能更好的预测那些重叠或近邻的物体。

3. 网络结构(Architecture)

在文中,SSD使用VGG16来做为base network,然后在VGG16的基础上添加了新的卷积层以获得不同size的feature map,具体的网络结构如下图所示:

v2-f448d6e13767259c740611b4a0a40214_b.jpg
图2 SSD网络结构

首先对基础网络VGG16进行了修改,其中Conv5_3之前的卷积层保持不变,而原来的FC6和FC7分别变成

的卷积层Conv6和Conv7,去掉了原来的dropout和FC8层。此外,还将池化层pool5由原来的
变成
,为了配合这种变化,Conv6的卷积采用的是
的空洞卷积(空洞卷积可参考:Jacqueline:【目标检测】R-FCN)。在基础网络之上SSD又添加了新的卷积层,例如图中的Conv8_2,Conv9_2,Conv10_2,Conv11_2。其中,Conv4_3,Conv7,Conv8_2,Conv9_2,Conv10_2和Conv11_2层输出的特征图用于检测。因为Conv4_3比较靠前,norm会比较大,因此会对Conv4_3输出的特征图先进行了一个L2 normalization,减少其和后边检测层的差异。最终一共有6个特征图,大小分别为(38,38),(19,19),(10,10),(5,5),(3,3),(1,1)。然后在不同size的特征图上设置不同大小和个数的default boxes(anchors),Conv4_3特征图上有4个anchor,Conv7有6个,Conv8_2有6个,Conv9_2有6个,Conv10_2有4个,Conv11_2有4个,所以最终anchor的数量为:

为了预测每个anchor的类别和位置offset,SSD将这6个的特征图分别输入到两个

的卷积中进行结果预测。其中,classifier的卷积输出维度为:
, regressor的卷积输出维度为:
。如下图所示,对
的feature map上的每一点都设置6个anchor,然后用于定位的卷积使用
的卷积核,输出
的定位结果,用于定位的卷积使用
的卷积核,输出
的分类结果,21是类别数。

v2-b38ea1fc9129d4f22a00a6264731604e_b.jpg
图3 卷积层预测

如下图所示,负责localization的卷积,会输出

个anchor的offset预测值,共4维
,负责classification的卷积,会输出
个anchor的类别预测,共21维。例如,对于input image中的一个anchor(红色虚线框),SSD会预测一个4维的offset,根据offset对该anchor进行位置变换,就可以得到最终预测的box(红色实线框),同时,SSD也预测该anchor所属的类别,最终得到
,所以box的类别是car。按照同样的过程,我们可以得到个box以及对应的类别。

v2-c47db514180adf58977708c87171f298_b.jpg
图4 卷积层输出

得到检测结果之后,再进行非极大值抑制(NMS)来删除掉多余的boxes,便得到最终的检测结果。NMS的具体过程可以参考我这篇文章:Jacqueline:【目标检测】基础知识:IoU、NMS、Bounding box regression

v2-259e1d067d64e153c92159c46e7fa392_b.jpg
图5 NMS

4. 训练(Training)

4.1 匹配策略(Matching Strategy)

在训练时,我们首先要确定哪个anchor对应哪个ground truth box。在SSD中主要采取了两种匹配策略;(1)对于每个ground truth box,首先将它匹配给和它有最大的IoU(jaccard overlap)的anchor。这样可以保证对于每一个ground truth box都有一个anchor来对应。这些和ground truth对应的anchor为正样本,然后没有匹配到的anchor为负样本,由于一张图中ground truth较少,而最后得到的anchor数量又很多,所以这种方法就会导致正负样本的极不平衡,所以需要第二种匹配策略来缓解。(2)第二种匹配策略就是对于剩余的anchor,如果它和某个ground truth box的IoU大于某个阈值(0.5),那么将这个ground truth box匹配给这个anchor,如果某个anchor和多个ground truth box的IoU大于阈值,那么选择IoU最大的ground truth进行匹配。这样一个ground truth就对应多个anchor,但是每个anchor只能对应一个ground truth。

4.2 Hard negative mining

虽然在上述的匹配过程中一个ground truth可以对应多个anchor,但是由于ground truth box的数量和anchor的数量相差好几个量级,所以正负样本的数量还是很不均衡,因此文中采取了Hard negative mining策略。具体就是:对所有的负样本按照置信度loss(预测背景的置信度越小,loss越大)进行降序排列,然后选取top-k个作为负样本,以保证正负样本的比例为1:3。实验证明,这样可以加快收敛速度,使得整个训练过程更稳定。

4.3 损失函数(Loss Function)

目标检测算法的损失函数一般分为两个部分:置信度误差 (confidence loss)和位置误差(localization loss),SSD的损失函数同样也是这两部分的加权和:

v2-8cddcdf28ab82dcb60dd683ea16a921f_b.png

其中,

是正样本的个数,
为1。如果
,那么loss就为0。
为ground truth,
为类别置信度预测值,
是位置预测值,
为ground truth的位置值。其中置信度误差采用softmax loss,位置误差采用smooth L1 loss。

置信度误差

置信度误差是计算预测的类别置信度

和ground truth类别之间的误差,使用softmax loss:

v2-43d1b471fe40b526912d40f3ef55629b_b.png

其中,

是一个指示器,当
时,表示第
个anchor和第
个ground truth相匹配,且ground truth的类别为
,当
时,就代表第
个anchor为负样本,没有匹配的ground truth box。

位置误差

位置误差是用来计算预测的位置信息和ground truth位置信息之间的误差:采用的是smooth L1 loss:

v2-de42902ebf160a778aa247b8ff899a04_b.png

和Faster R-CNN相同,预测结果输出的4个值分别为anchor的中心点和宽高的offset(

),而位置信息的ground truth值为anchor
和ground truth box
之间的offset(
),如下式。所以smooth L1主要是计算两者之间的误差。

v2-000293a4d274cf0fa43d0415e8392611_b.jpg

4.4 anchor设置

SSD会为不同size的feature map设置不同大小和数目的anchor。在SSD300中,共有6个feature map,每层对应的anchor数分别为4,6,6,6,4,4。而每层feature map都有两个参数min_size和max_size,分别代表该层上anchor的最小scale和最大scale。其中,每层的anchor的scale按照下式进行计算:

v2-72a12a23f66871b6d9b7b46d8590c5f9_b.png

其中,

为feature map的个数,
为0.2,
为0.9。第k层的min_size为
,第k层的max_size为

如下图所示,在计算anchor时,首先,为feature map上的每个点都设置两个正方形的anchor,其中小正方形的长用min_size来表示,大正方形的长用

来表示。

v2-66177fcb0b3efb4ee5b369e75416c98b_b.jpg
图6 anchor的设置

此外,每个点还有多个长方形的anchor,长方形anchor的数目每层也不同,由每层anchor的数目决定,长方形anchor的长宽由下式决定:

v2-7dedbd4236085d056723d374862cb95a_b.png

其中,ratio为长宽比,值域为{

}。当ratio=1时,anchor就是那个小正方形。

计算好anchor的位置之后,我们还需要判断anchor是否超出图片的边缘,对于超出图片边缘的anchor,我们需要进行clip,如下图所示:

v2-cb46e220df8997243700b5f6f4115ff3_b.jpg
图7 clip

4.5 数据扩增(Data Augmentation)

为了提高算法对不同size和shape的object的鲁棒性,SSD对训练数据进行了数据扩增,主要方法包括:有水平翻转(horizontal flip),随机裁剪(random crop),颜色扭曲(color distortion),随机采集块域(Randomly sample a patch)等。

5. 测试(Testing)

整个测试过程比较简单,就是将测试样本输入到SSD网络中,然后网络会为每个anchor输出类别和位置预测结果。之后,根据类别的预测值确定每个anchor的类别,并过滤掉那些属于背景的anchor,然后根据类别置信度阈值过滤掉置信度较低的anchor。对于留下来的anchor,再根据预测的位置offset进行位置变换,得到预测的box。得到预测的box之后,再根据box的类别置信度进行降序排列,然后保留前k个box。最后进行NMS,去掉重叠度高的box,NMS之后剩下的box就为最终的检测结果。

6. 性能比较

最后,给出一张性能比较图,图中包括了two-stage和one-stage的比较经典的目标检测算法,并对这些算法的检测速度和精确度进行了比较。可以看出,SSD300的的检测速度和精确度都高于这些算法。而SSD512可以获得更高的精确度,但是检测速度也会慢一些,但也和YOLO的检测速度持平,而且也快于two-stage的方法。

v2-97b3de23e322c6b11dc77f53e32a9842_b.jpg
图8 性能比较

总结

本文提出了一种新的one-stage的目标检测方法SSD,主要包括以下的改进和创新:使用多尺度feature map,使用卷积层来进行预测,在不同层设置不同大小和数目的anchor,限制正负样本的比例、数据扩增。这些改进使得SSD检测的速度和准确度都优于state-of-the-art。但是,SSD也仍有不足之处,那就是在小目标检测方面,其准确度仍然不敌Faster R-CNN。

本文都是根据个人理解编写的,希望可以帮到大家。此外,如有误,烦请指正。如果喜欢,请点赞哦,谢谢~

我将持续更新目标检测领域的经典paper,欢迎大家订阅哦!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值