- arxiv: http://arxiv.org/abs/1512.02325
- paper: http://www.cs.unc.edu/~wliu/papers/ssd.pdf
- slides: http://www.cs.unc.edu/%7Ewliu/papers/ssd_eccv2016_slide.pdf
- github(Official): https://github.com/weiliu89/caffe/tree/ssd
- video: http://weibo.com/p/2304447a2326da963254c963c97fb05dd3a973
- github: https://github.com/zhreshold/mxnet-ssd
- github: https://github.com/zhreshold/mxnet-ssd.cpp
- github: https://github.com/rykov8/ssd_keras
- github: https://github.com/balancap/SSD-Tensorflow
- github: https://github.com/amdegroot/ssd.pytorch
- github(Caffe): https://github.com/chuanqi305/MobileNet-SSD
1、设计理念
SSD和YOLO一样都是采用一个CNN网络来进行检测,但是却采用多尺度的特征图,基本架构如下所示,下面将从SSD核心设计理念总结为一下三点:
(1)采用多尺度特征图用于检测
所谓多尺度即采用大小不同的特征图,CNN网络一般前面的特征图比较大,后面会逐渐采用stride=2的卷积或者pool来降低特征图大小,如上图所示,一个比较大的特征图和一个比较小的特征图,都用来检测,这样做的好处是比较大的特征图来检测相对较小的目标,而小的特征图负责检测大目标,如下图所示,8*8的特征图可以划分更多的单元,其每个单元的先验框尺度比较小。
(2)采用卷积进行检测
与YOLO最后采用全连接层不同,SSD直接采用卷积对不同的特征图进行提取检测结果。对于形状m × n × p的特征图,只需要采用3 × 3 × p这样笔记哦啊小的卷积核得到检测值。
(3)设置先验框
在YOLO中,每个单元预测多个边界框,但是其都是相对这个单元本身(正方块),但是真是目标的形状是多变的,YOLO需要在训练过程中自适应目标的形状。SSD借鉴了Faster R-CNN中anchor的理念,每个单元设置尺度或者长宽比不同的先验框,预测的边界框(bounding boxes)是以这些先验框为基准的,在一定程度上减少训练难度。一般情况下,每个单元会设置多个先验框,其尺度和长宽比存在差异,如下图所示,每个单元使用了4个不同的先验框,图片中猫和狗分别采用最适合它们形状的先验框来进行训练。
SSD的检测与YOLO不太一样,对于每个单元的先验框,都能输出一套独立的检测值,对应一个边界框,主要分为两个部分。第一部分是各个类别的置信度或者评分,值得注意的是SSD将背景也当作一个特殊的类别,如果检测目标共有c个类别,SSD其实需要预测c + 1 个置信度值,其中第一个置信度指的是不含目标或者属于背景的评分。在预测过程中,置信度最高的那个类别就是边界框所属的类别,特别地,当第一个置信度最高时,表示边界框中并不包含目标。第二部分就是边界框location,包含4个值(cx,cy,w,h),分别表示边界框的中心坐标以及宽高,但是真实预测值其实只是边界框相对于先验框的转换值。
2、网络结构
SSD采用VGG作为基础模型,然后在VGG16的基础上新增了卷积层来获得更多的特征图用于检测。SSD的网络结构如下图所示,上图是SSD模型,下面是YOLO模型,可以明显看到SSD利用了多适度的特征图做检测。
3、创新点
- 多尺度特征图
- 利用卷积进行检测
- 设置先验框
4、参考
- https://blog.csdn.net/xiaohu2022/article/details/79833786
- https://handong1587.github.io/deep_learning/2015/10/09/object-detection.html#ssd
- https://blog.csdn.net/qq_35451572/article/details/80320708