![v2-d535741e4c27f6dd760e7b1fe5d180af_1440w.jpg?source=172ae18b](http://img-02.proxy.5ce.com/view/image?&type=2&guid=46c8dc4f-0e2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/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 Detectorarxiv.org代码地址:
qfgaohao/pytorch-ssdgithub.com![v2-6574254c56800405f1d2177e0b82129b_ipico.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=46c8dc4f-0e2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-6574254c56800405f1d2177e0b82129b_ipico.jpg)
算法总览
![v2-431777374b741343115963b857f0d64a_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=46c8dc4f-0e2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/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](http://img-01.proxy.5ce.com/view/image?&type=2&guid=46c8dc4f-0e2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-a894d3c977c619c79dbce74739c326f5_b.jpg)
可以看到,在不同尺度的feature map上会产生不同比例的框,那我们如何确定这些预选框的尺寸呢?作者也给出了自己的算法,意思就是每个像素点产生的框面积一样,但尺度不一样,这样就可以算出来预选框的长和宽,以及所需要的位置坐标。这里要注意,可能产生的预选框跟真实框的位置仍然有很大差距,但是无所谓,因为我们还有BB回归呢!
当预选框为6时,这时会产生两个1x1的预选框,最小边长为min,最大边长为
![v2-e67b043a1739743336c7232cc948c0c1_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=46c8dc4f-0e2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-e67b043a1739743336c7232cc948c0c1_b.jpg)
最终的公式为,已知SSD使用的feature map是6层,所以m=6
![v2-7c9a404565d8e6f0af9ead0f7f21e682_b.png](http://img-01.proxy.5ce.com/view/image?&type=2&guid=46c8dc4f-0e2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-7c9a404565d8e6f0af9ead0f7f21e682_b.png)
本文中
网络结构
作者使用的是VGG_16,其特征提取挺好的,就是速度有些慢,所以我们在落地项目中经常使用mobilenet或者shufflenet来提高检测速度,同时获取一个还不错的准确度。
损失函数
作者在论文中叫做Multi Loss,但其实质还是一个做边框位置回归和另外的分类误差。没有什么新的东西。对于分类我们使用交叉熵损失函数,对于边框回归就是BB回归了,我们在R-CNN里面见到了很多次了。
![v2-02e3377629985baa85c075d165c89fed_b.png](http://img-01.proxy.5ce.com/view/image?&type=2&guid=46c8dc4f-0e2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-02e3377629985baa85c075d165c89fed_b.png)
其中
![v2-66cbc3abba57e8e50262e42743dce6be_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=46c8dc4f-0e2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-66cbc3abba57e8e50262e42743dce6be_b.jpg)
其中
匹配策略
- 一开始我们把每一个真实框去匹配到有最大jaccard overlap的default box中,并保证每一个真实框都对应一个default box,这是原始的MultiBox的匹配策略。
- 然后,我们把default box匹配到任意的真实框,只要其jaccard overlap大于设定的阈值就可以(本文为0.5),这样就允许更多的default box匹配到真实框,使得定位更精确。
jaccard overlap实质上就是两个框的交并比,也叫做IOU!
![v2-814679a9164101eb699f55adcdc39916_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=46c8dc4f-0e2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/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](http://img-03.proxy.5ce.com/view/image?&type=2&guid=46c8dc4f-0e2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/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)
【4】Long, J., Shelhamer, E., Darrell, T.: Fully convolutional networks for semantic segmentation. In: CVPR. (2015)
【5】He, K., Zhang, X., Ren, S., Sun, J.: Spatial pyramid pooling in deep convolutional networks for visual recognition. In: ECCV. (2014)
【6】W. Liu, D. Anguelov, D. Erhan, S. Christian, S. Reed, C.-Y. Fu, and A. C. Berg. SSD: single shot multibox detector. In ECCV, 2016.