python ssd目标检测_目标检测:SSD(ECCV 2016)

v2-d535741e4c27f6dd760e7b1fe5d180af_1440w.jpg?source=172ae18b

在以R-CNN为base的Two-Stage算法蓬勃发展时,Overfeat,SSD,YOLO等One-Stage算法也在不断的进行改进和优化,接下来我将介绍SSD算法(Single Shot MultiBox Detector),这也是我经常使用的一种目标检测算法,准确来说使用它的变种(Mobilenet-SSD)。因为它可以实时跑在CPU上,读研嘛,也要工作赚钱的嘛。接下来就一起来看看SSD算法的思路和其创新点!

论文地址:

Single Shot MultiBox Detector​arxiv.org

代码地址:

qfgaohao/pytorch-ssd​github.com
v2-6574254c56800405f1d2177e0b82129b_ipico.jpg

算法总览

v2-431777374b741343115963b857f0d64a_b.jpg

首先作者对比了YOLO,可以看出,SSD是一个全卷积网络,没有全连接层,并且其特征是在不同的尺度上进行提取的(Conv4-3, fc7, conv5-2, conv7-2, conv8-2, conv9-2),然后组合进行回归和分类。对比R-CNN系列,SSD又是一个one-stage的网络,并没有像faster R-CNN有另外的分支RPN,所以提高了检测速度,但是精度略有下降,那么让我们一起来看看SSD网络具体如何实现的?

预选框(PriorBox)

既然没有了RPN网络,那么SSD的预选框怎么产生呢?作者是每个feature map的像素点作为一个小网格去产生预选框,由于一共在6个feature map上进行分类和检测,所以在不同的feature map上每个像素点会产生不同数量的预选框,分别是4,6,6, 6,4,4。而相应的feature map大小(以SSD300为例)为38x38, 19x19, 10x10, 5x5, 3x3, 1x1。所以总的预选框的数量为8732个。而这些框的比例有(1, 2, 3,

,
)。如下图:

v2-a894d3c977c619c79dbce74739c326f5_b.jpg

可以看到,在不同尺度的feature map上会产生不同比例的框,那我们如何确定这些预选框的尺寸呢?作者也给出了自己的算法,意思就是每个像素点产生的框面积一样,但尺度不一样,这样就可以算出来预选框的长和宽,以及所需要的位置坐标。这里要注意,可能产生的预选框跟真实框的位置仍然有很大差距,但是无所谓,因为我们还有BB回归呢!

当预选框为6时,这时会产生两个1x1的预选框,最小边长为min,最大边长为

。这些都可以在代码的配置文件找到,而矩形预选框的长和宽可以通过长宽比以及面积得到,如下图:(论文也有详细的描述)

v2-e67b043a1739743336c7232cc948c0c1_b.jpg

最终的公式为,已知SSD使用的feature map是6层,所以m=6

v2-7c9a404565d8e6f0af9ead0f7f21e682_b.png

本文中

。其他的可以根据上式推导出来,而且在第一个feature map层
,

网络结构

作者使用的是VGG_16,其特征提取挺好的,就是速度有些慢,所以我们在落地项目中经常使用mobilenet或者shufflenet来提高检测速度,同时获取一个还不错的准确度。

损失函数

作者在论文中叫做Multi Loss,但其实质还是一个做边框位置回归和另外的分类误差。没有什么新的东西。对于分类我们使用交叉熵损失函数,对于边框回归就是BB回归了,我们在R-CNN里面见到了很多次了。

v2-02e3377629985baa85c075d165c89fed_b.png

其中

我们初始化为1,那么confidence loss和location loss分别就是

v2-66cbc3abba57e8e50262e42743dce6be_b.jpg

其中

第i个预选框匹配到了第j个class为p类的GT框,location loss使用的是L1损失。

匹配策略

  • 一开始我们把每一个真实框去匹配到有最大jaccard overlap的default box中,并保证每一个真实框都对应一个default box,这是原始的MultiBox的匹配策略。
  • 然后,我们把default box匹配到任意的真实框,只要其jaccard overlap大于设定的阈值就可以(本文为0.5),这样就允许更多的default box匹配到真实框,使得定位更精确。

jaccard overlap实质上就是两个框的交并比,也叫做IOU!

v2-814679a9164101eb699f55adcdc39916_b.jpg

Hard negative mining

当我们匹配好了之后,经过上面的计算后,我们知道SSD300产生8732个预选框,但是一张图片的目标肯定没有这么多,这样就造成了class的极度不平衡。所以我们在实际训练时,不能用全部的负样本,我们通过筛选出置信度较高的负样本并使其正负样本比为1:3。这样就会优化很快并且训练时候很稳定。

Data augmentation

为了使模型更加具有鲁棒性,我们对每一张图像随机进行如下选择:

  • 使用原图
  • 采样一个patch,使得其最小的jaccard overlap为0.1, 0.3, 0.5, 0.7或 0.9
  • 随机采样一个patch

采样的 patch 是原始图像大小比例是[0.1,1],aspect ratio在1/2与2之间,当 groundtruth box 的 中心(center)在采样的patch中时,保留重叠部分。在这些采样步骤之后,每一个采样的patch被resize到固定的大小,并且以0.5的概率随机的 水平翻转(horizontally flipped),SSD的数据增强部分对准确度有了很大的提升,大概提高了3%的mAP值!

测试效果

v2-5bca7e83fc147fe80bd81dd5b6e8a64d_b.jpg

算法总结

优点:

  • 速度快,one-stage算法,在不逊于Faster R-CNN的情况下,提升了速度
  • 采用多尺度的特征图去提取特征进行分类(大的特征图对应小目标的信息
  • 采用全连接,实现了端到端,且和多种BackBone Net可以融合

缺点:

  • 小目标的检测仍然是不好的,因为300到38中间降采样了8倍,小目标的位置信息可能已经丢弃,所以小目标的召回率不高
  • 需要手动的去调节预选框的大小和比例,有很强的人工依赖性!

参考文献:

【1】Ren, S., He, K., Girshick, R., Sun, J.: Faster R-CNN: Towards real-time object detection with region proposal networks. In: NIPS. (2015)

【2】Sermanet, P., Eigen, D., Zhang, X., Mathieu, M., Fergus, R., LeCun, Y.: Overfeat: Integrated recognition, localization and detection using convolutional networks. In: ICLR. (2014)

【3】Redmon, J., Divvala, S., Girshick, R., Farhadi, A.: You only look once: Unified, real-time object detection. In: CVPR. (2016)

4Long, J., Shelhamer, E., Darrell, T.: Fully convolutional networks for semantic segmentation. In: CVPR. (2015)

5He, K., Zhang, X., Ren, S., Sun, J.: Spatial pyramid pooling in deep convolutional networks for visual recognition. In: ECCV. (2014)

6W. Liu, D. Anguelov, D. Erhan, S. Christian, S. Reed, C.-Y. Fu, and A. C. Berg. SSD: single shot multibox detector. In ECCV, 2016.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值