![faff45bb4ed77ddbb9dee970fab0e7be.png](https://i-blog.csdnimg.cn/blog_migrate/29e07900e240094f45554b890d3b839c.jpeg)
前言
上一篇我们说到YOLO将候选框提取与分类统一为一个回归问题,相对于R-CNN系列的"看两眼",YOLO只需要Look Once。
YOLO简洁且速度快,但是YOLO难以检测小目标,而且定位不准。相比YOLO,SSD采用CNN来直接进行检测,而不是像YOLO那样在全连接层之后做检测。另外SSD提取了不同尺度的特征图来做检测,大尺度特征图可以用来检测小物体,而小尺度特征图用来检测大物体;再由SSD采用了不同尺度和长宽比的先验框Prior boxes,在Faster R-CNN中叫做锚Anchors。这几点重要改进使得SSD在一定程度上克服这些缺点。
论文名称:
SSD: Single Shot MultiBox Detector
论文下载:
https://arxiv.org/pdf/1611.10012.pdfarxiv.org论文解读:
![1142a6565adcca245d591d44bbda4327.png](https://i-blog.csdnimg.cn/blog_migrate/ae8c4062fcd100bf078fa2e43d8ae4ce.jpeg)
SSD和YOLO都是采用一个CNN网络来进行检测,但是却采用了多尺度的特征图,其基本架构如上图所示。下面将SSD核心设计理念总结为以下三点:
1 采用多尺度特征图用于检测
![bb2b3fb29cefb795a068f1c310e9b0a6.png](https://i-blog.csdnimg.cn/blog_migrate/b4f04b7f3c80f7c89cf383379d5ff3a1.png)
所谓多尺度采用大小不同的特征图,CNN网络一般前面的特征图比较大,后面会逐渐采用stride=2的卷积或者pool来降低特征图大小。如上图所示,一个比较大的特征图和一个比较小的特征图,它们都用来做检测。这样做的好处是比较大的特征图来用来检测相对较小的目标,而小的特征图负责检测大目标,8x8的特征图可以划分更多的单元,但是其每个单元的先验框尺度比较小。
2 采用卷积进行检测
与YOLO最后采用全连接层不同,SSD直接采用卷积对不同的特征图来进行提取检测结果。对于形状为m×n×p的特征图,只需要采用3×3×p这样比较小的卷积核得到检测值。
3 设置先验框
在YOLO中,每个单元预测多个边界框,但是其都是相对这个单元本身,然而真实目标的形状是多变的,YOLO需要在训练过程中自适应目标的形状。而SSD借鉴了Faster R-CNN中anchor的理念,每个单元设置尺度或者长宽比不同的先验框,预测的边界框bounding boxes是以这些先验框为基准的,在一定程度上减少训练难度。一般情况下,每个单元会设置多个先验框,其尺度和长宽比存在差异,如下图所示,可以看到每个单元使用了4个不同的先验框,图片中猫和狗分别采用最适合它们形状的先验框来进行训练。
![a7535d35d0cba78dd8b907b336b19291.png](https://i-blog.csdnimg.cn/blog_migrate/f0acbe8476899c5dc7d3849c1484c7fe.jpeg)
网络结构
SSD采用VGG16作为基础模型,然后在VGG16的基础上新增了卷积层来获得更多的特征图以用于检测。SSD的网络结构如下图所示。上面是SSD模型,下面是Yolo模型,可以明显看到SSD利用了多尺度的特征图做检测。模型的输入图片大小是300×300。
![1142a6565adcca245d591d44bbda4327.png](https://i-blog.csdnimg.cn/blog_migrate/ae8c4062fcd100bf078fa2e43d8ae4ce.jpeg)
采用VGG16做基础模型,首先VGG16是在ILSVRC CLS-LOC数据集预训练。然后借鉴了DeepLab-LargeFOV,分别将VGG16的全连接层fc6和fc7转换成3×3卷积层 conv6和1×1卷积层conv7,同时将池化层pool5由原来的stride=2的2×2变成stride=1的3×3。为了配合这种变化,采用了一种Atrous Algorithm,其实就是conv6采用扩展卷积或带孔卷积Dilation Conv,其在不增加参数与模型复杂度的条件下指数级扩大卷积的视野,其使用扩张率dilation rate参数,来表示扩张的大小,如下图所示,(a)是普通的3×3卷积,其视野就是3×3,(b)是扩张率为2,此时视野变成7×7,(c)扩张率为4时,视野扩大为15×15,但是视野的特征更稀疏了。Conv6采用3×3大小但dilation rate=6的扩展卷积。
![70592380d01b860700fece659aa4c397.png](https://i-blog.csdnimg.cn/blog_migrate/99f03ef0d3a55b05485818ca993d99a4.jpeg)
然后移除dropout层和fc8层,并新增一系列卷积层,在检测数据集上做finetuing。
训练过程
1 先验框匹配
在训练过程中,首先要确定训练图片中的ground truth与哪个先验框来进行匹配,与之匹配的先验框所对应的边界框将负责预测它。在YOLO中,ground truth的中心落在哪个单元格,该单元格中与其IOU最大的边界框负责预测它。但是在SSD中却完全不一样,SSD的先验框与ground truth的匹配原则主要有两点:
- 首先,对于图片中每个ground truth,找到与其IOU最大的先验框,该先验框与其匹配,这样,可以保证每个ground truth一定与某个先验框匹配。通常称与ground truth匹配的先验框为正样本,反之,若一个先验框没有与任何ground truth进行匹配,那么该先验框只能与背景匹配,就是负样本。
- 其次,对于剩余的未匹配先验框,若某个ground truth的IOU大于某个阈值,那么该先验框也与这个ground truth进行匹配。这意味着某个ground truth可能与多个先验框匹配,这是可以的。但是反过来却不可以,因为一个先验框只能匹配一个ground truth,如果多个ground truth与某个先验框IOU大于阈值,那么先验框只与IOU最大的那个ground truth进行匹配。
下图为一个匹配示意图,其中绿色的GT是ground truth,红色为先验框,FP表示负样本,TP表示正样本。
![ae477c7f94762d524b9e0173edc74f20.png](https://i-blog.csdnimg.cn/blog_migrate/7e146dee99e30ec2ca222fd9a56345f0.jpeg)
尽管一个ground truth可以与多个先验框匹配,但是ground truth相对先验框还是太少了,所以负样本相对正样本会很多。为了保证正负样本尽量平衡,SSD采用了hard negative mining,就是对负样本进行抽样,抽样时按照置信度误差(预测背景的置信度越小,误差越大)进行降序排列,选取误差的较大的top-k作为训练的负样本,以保证正负样本比例接近1:3。
2 损失函数
损失函数定义为位置误差locatization loss与置信度误差confidence loss的加权和:
其中
![165438324c22006b5e3498de83e4254a.png](https://i-blog.csdnimg.cn/blog_migrate/e06b0c1712443c5ff04819e9a1633a85.png)
![fb4216824d9936a5dfa2dd834654d678.png](https://i-blog.csdnimg.cn/blog_migrate/7e4815c33a29b5177aa2a6b7bd67ba16.png)
由于
对于置信度误差,其采用softmax loss:
![ea16dbe5d078882fa958eab973c518a8.png](https://i-blog.csdnimg.cn/blog_migrate/5943b3378afcd7dd28367f6aceb52656.png)
权重系数
3 数据增强
采用数据增强Data Augmentation可以提升SSD的性能,主要采用的技术有水平翻转(horizontal flip),随机裁剪加颜色扭曲(random crop & color distortion),随机采集块域(Randomly sample a patch)(获取小目标训练样本),如下图所示:
![16f7058527a1a206c00ae5976967536d.png](https://i-blog.csdnimg.cn/blog_migrate/72111a8475ffb08c79eb3fe17e53455b.jpeg)
![5e8c76def3b2821ec77102af7677a699.png](https://i-blog.csdnimg.cn/blog_migrate/0eca47c35918b0ddd6ec0bb76b66b50a.jpeg)
预测过程
预测过程比较简单,对于每个预测框,首先根据类别置信度确定其类别(置信度最大者)与置信度值,并过滤掉属于背景的预测框。然后根据置信度阈值(如0.5)过滤掉阈值较低的预测框。对于留下的预测框进行解码,根据先验框得到其真实的位置参数(解码后一般还需要做clip,防止预测框位置超出图片)。解码之后,一般需要根据置信度进行降序排列,然后仅保留top-k(如400)个预测框。最后就是进行NMS算法,过滤掉那些重叠度较大的预测框。最后剩余的预测框就是检测结果了。
优缺点
SSD在Yolo的基础上主要改进了三点:多尺度特征图,利用卷积进行检测,设置先验框。这使得SSD在准确度上比YOLO更好,而且对于小目标检测效果也相对好一点。
小目标往往更依赖浅层特征,因为浅层特征有更高的分辨率,然而对语义区分较差。SSD检测和分类一起做,会把一些检测到但是分类模糊,分数不高的结果过滤掉。所以对于小目标检测效果虽然比YOLO好,但是还是有缺陷。
参考
小小将:目标检测|SSD原理与实现zhuanlan.zhihu.com![611f761fd397a8bc73bb07cfc11a6202.png](https://i-blog.csdnimg.cn/blog_migrate/6a2bfcf5256eba9c457f191cf8bc5f0a.jpeg)
![7bcdc4b512408635b2f1e6e83a308884.png](https://i-blog.csdnimg.cn/blog_migrate/5687997ec7901065f9f474413b6a9236.jpeg)