版权声明:转载时,请务必注明文章出处网址,谢谢! https://blog.csdn.net/Gentleman_Qin/article/details/84403313 </div>
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-3019150162.css">
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-3019150162.css">
<div class="htmledit_views" id="content_views">
<p>论文名称:《 SSD: Single Shot MultiBox Detector 》</p>
论文下载:https://arxiv.org/pdf/1512.02325.pdf
论文代码:https://github.com/weiliu89/caffe/tree/ssd
SSD 的思想:
图片被送进网络之后先生成一系列 feature map,传统一点的one-stage框架会在 feature map(或者原图)上进行 region proposal 提取出可能有物体的部分然后进行分类,这一步可能非常费时,所以 SSD 就放弃了 region proposal,而选择直接生成一系列 defaul box(筛选出prior boxes投入训练),然后以prior box 为初始bbox,将bboxes回归到正确的GT位置上去,预测出的定位信息实际上是回归后的bboxes和回归前的(prior box)的相对坐标。整个过程通过网络的一次前向传播就可以完成。
1. 网络结构
1、SSD 同时使用多个卷积层的输出来做分类和位置回归:
SSD 采用不用卷积层的 feature map 进行综合,将 VGG16 的最后两层全连接改为卷积层并额外增加四个卷积层来达到构造网络。对于这 5 个不同尺度的卷积层输出的 feature map,作者分别采用不同的 3x3 的卷积核进行卷积,一个输出分类的置信度(condfidence),一个输出回归的 localization。
从图中可以看到 SSD 将 conv4_3、conv7、conv8_2、conv9_2、conv10_2、conv11_2 都连接到了最后的检测、分类层做回归。
先回顾下 YOLO 的结构,YOLO 在训练时 ground truth 和 bbox 是一一对应的关系(ground truth 对应到其中心位置所在区域中 IOU 最大的那个 bbox 来计算 loss),如果有两个 ground truth 的尺寸和位置都比较相近,就很有可能对应到同一个区域的同一个 bbox,这种场景下必然会有一个目标无法识别。为了解决这个问题 SSD 的作者把 YOLO 的结构做了如下优化:
a、重新启用了 Faster R-CNN 中 anchor 的结构
在 SSD 中如果有多个 ground truth,每个 anchor(原文中称作 default box,取名不同而已)会选择对应到 IOU 最大的那个 ground truth。一个 anchor 只会对应一个 ground truth,但一个 ground truth 都可以对应到大量 anchor,这样无论两个 ground truth 靠的有多近,都不会出现 YOLO 中 bbox 冲突的情况。
b、同时使用多个层级上的 anchor 来进行回归
作者认为仅仅靠同一层上的多个 anchor 来回归,还远远不够。因为有很大可能这层上所有 anchor 的 IOU 都比较小,就是说所有 anchor 离 ground truth 都比较远,用这种 anchor 来训练误差会很大。例如图 2 中,左边较低的层级因为 feature map 尺寸比较大,anchor 覆盖的范围就比较小,远小于 ground truth 的尺寸,所以这层上所有 anchor 对应的 IOU 都比较小;右边较高的层级因为 feature map 尺寸比较小,anchor 覆盖的范围就比较大,远超过 ground truth 的尺寸,所以 IOU 也同样比较小;只有图 2 中间的 anchor 才有较大的 IOU。通过同时对多个层级上的 anchor 计算 IOU,就能找到与 ground truth 的尺寸、位置最接近(即 IOU 最大)的一批 anchor,在训练时也就能达到最好的准确度。
SSD算法直接预测目标的坐标和类别,没有生成候选框的过程。网络直接在VGG16网络的基础上进行修改。
SSD网络=基础网络+辅助结构
基础网络:VGG16(阶段1~阶段5)
辅助结构:fc6,fc7 àconv6,conv7
添加4个卷积层(conv6_2,conv7_2,conv8_2,conv9_2)
2.1用于检测的多尺度特征图
(1)这些层逐渐减小尺寸
(2)允许预测多个尺度的检测
(3)每个特征层用于预测检测的卷积模型是不同的
2.2 用于检测的卷积预测器
(1)使用一组卷积滤波器生成一组固定的检测预测
(2)3×3×p小卷积核
►物体类别得分
►相对于默认框的坐标偏移
2.3 Default boxes
其实作用就是为了获取网格对应的训练真值。可能是因为人工标注的真值没办法与上面的 k 个 bbox 对应,所以作者新建 k 个 default box 作为训练时的真值。每个 default box 的长宽比例保持固定。SSD 训练图像中的 groundtruth 需要赋予到那些固定输出的 boxes 上。
default box 在不同的 feature 层有不同的 scale,在同一个 feature 层又有不同的 aspect ratio,因此基本上可以覆盖输入图像中的各种形状和大小的 object
每个Default boxes预测C个类别得分和4个offset
▪ m×n feature map + (c+4)×k滤波器 à (c+4)×k×m×n 输出
▪ 类似 Faster R-CNN 中的anchor boxes
论文中使用了几种不同分辨率的feature map。
▪Feature map cell是Feature map分成的每个小格(例如上图b的8*8)。
▪Default box 是每个小格上对应的一系列box。
▪Prior box是指实际中选取的default。
Default boxes 与 Prior box:
每个输入检测器的feature map 的每个像素生成 4或6 个框,这些框就是default box,不同的特征图生成的default boxes的大小不同,各有对应的计算公式,每个default box 相对于其对应的 feature map cell (特征图对应像素点)的位置是固定的。 在每一个 feature map cell 中,我们要 predict 得到的 box 与 部分精选(1:3)出的default box 之间的 offsets(在原始输入图片上的相对位移),以及每一个 box 中包含物体的 score(每一个类别概率都要计算出)。
对于一个位置上的 k 个 boxes 中的每一个 box,我们需要计算出 c 个类中每一个类的 score,还有这个 box 相对于与它匹配的default box 的 4 个偏移值(offsets)。于是,在 feature map 中的每一个 feature map cell 上,就需要有(c+4)×k 个 filters得到对应数量的值。对于一张m×n 大小的 feature map,即会产生 (c+4)×k×m×n 个输出结果。所以理论上会生成(38*38*4 + 19*19*6 + 10*10*6 + 5*5*6 + 3*3*4 + 1*1*4)= 8732 个 default boxes。
prior box是指实际中选择的要投入训练过程的 default box(每一个 feature map cell 不是 k 个 default box 都取)。 default box 是一种概念,prior box 则是实际的选取。训练中一张完整的图片送进网络获得各个 feature map,总共生成8732 个 default boxes,而后开始确定正负样本以投入训练。
将 default box 与本张图像中任一 groundtruth box 配对,找到最大的IOU,只要两者之间的 jaccard overlap 大于一个阈值(论文中阈值为 0.5),便设为候选正样本,其他为候选负样本。候选正样本和候选负样本经过筛选后投入训练。
- 匹配策略: 训练阶段建立GT和default对应关系,开始先匹配每个GT框与default框最大jaccard 重叠的那个default,确保每个GT框有一个匹配的default框,然后匹配default框与GT框 jaccard 重叠高于阈值 0.5 的default框。这样就允许网络对多个重叠的default框预测获得高置信度,而不是只选择最大重叠的一个。候选正样本的数量也由此提升。
举个列子:假设一个训练图片中有 2 个 ground truth box,从输入所有的检测器 feature map 中获取的 default boxes 一共有 8732 个,可能分别有 10、20 个 default box 能分别与这 2 个 ground truth box 匹配上。
正负样本区分:(通过定位信息(iou)初步划分,而后通过loss把hard example留下,loss越大越hard)
1. 正样本获得
已经确定 default box,结合 ground truth,下一步要将 default box 匹配到 ground truth 上,从 groudtruth box 出发给每个 groudtruth box 找到了最近(IOU最大)的 default box 放入 候选正样本集。然后再从 default box 出发为 default box 集中寻找与 groundtruth box 满足 IOU>0.5 的的default box放入候选正样本集。
2. 负样本获得(这是一个难例挖掘的过程)
在生成 prior boxes 之后,会产生很多个符合 ground truth box 的 positive boxes(候选正样本集),但同时,不符合 ground truth boxes 也很多,而且这个 negative boxes(候选负样本集),远多于 positive boxes。这会造成 negative boxes、positive boxes 之间的不均衡。训练时难以收敛。
将每一个GT上对应prior boxes的分类loss 进行排序。
对于候选正样本集:选择loss最高的m个 prior box 与候选正样本集匹配 (box 索引同时存在于这两个集合里则匹配成功),匹配不成功则删除这个正样本(因为这个正样本loss太低,易被识别,所以不在难例里,已经很接近 ground truth box 了,不需要再训练);
对于候选负样本集:选择最高的m个 prior box 与候选负样本集匹配,匹配成功的则留下来作为最后的负样本,不成功剔除出候选负样本,因为他们loss不够大,易被识别为背景,训练起来没难度没提升空间。
3. 举例:假设在这 8732 个 default box 里,经过 FindMatches 后得到候选正样本 P 个,候选负样本那就有 8732−P个。将 prior box 的 prediction loss 按照从大到小顺序排列后选择最高的 M个 prior box。如果这 P 个候选正样本里有 a 个 box 不在这 M 个 prior box 里,将这 a个 box 从候选正样本集中踢出去。如果这 8732−P个候选负样本集中有 b个在这 M 个 prior box,则将这b个候选负样本作为正式负样本。即删除易识别的正样本,同时留下典型的负样本,组成1:3的prior boxes样本集合。SSD 算法中通过这种方式来保证 positives、negatives 的比例。
2.4 Hard example mining
example mining 是选择出特定样本来计算损失函数;从实际问题出发 hard example 应该就是指定位较困难或分类较困难或者两者都困难的候选框。SSD 的 caffe 中支持 negative mining 和 hard example mining,当 share_location 参数为 true 时,只支持 negative mining。
Hard negative example 或 Hard positive example 的定义需要首先确定某个候选框是 negative example 还是 positive example。比如 SSD 中将与任意 gt_bbox 的 IOU 超过给定阈值 overlap_threshold(multibox_loss_param 中的一个字段,SSD 默认为 0.5)的当作正样本,即前景类别为正样本,背景类别为负样本。比如,极端的例子,当图像中没有 gt_bbox 时,那么所有的 default bboxes 都是 negative example。
SSD 中 negative mining 只计算分类损失而不计算定位损失,而 hard example mining 对分类损失和定位损失都进行计算。
SSD 的 negative mining 的过程为:
0) 生成default bboxes,每个检测器对应特征图生成的default boxes数目为n*n*6或n*n*4;
1)匹配default boxes,将每个 default box 与 ground truth 匹配,保证每个ground truth 都能对应多个default boxes,避免漏检;
2)衡量default boxes,当第 i 个 default box 被匹配到第 j 个 gt_bbox,那么计算其属于背景类别的 softmax loss 或 cross entropy loss 值;
3) 筛选default boxes, 计算完所有default boxes 的分类 loss后,按照 loss 排序,选择 loss 较大且与任意 gt_bbox 之间的 iou 小于 阈值neg_overlap 的样本中的前 3*num_positive 个负样本(保证留下的负样本“够坏”,同时保证1:3的正负比例)。
而后,这正负比为1:3的部分default boxes就是筛选全体default box后剩下的prior boxes,用这些prior box作为参考,对所有预测框其进行分类和回归,进行反向传播更新网络参数,即训练。
2. 训练过程
(1)每一个 prior box 经过Jaccard系数计算和真实框的相似度。
(2)阈值只有大于 0.5 的才可以列为候选名单;假设选择出来的是N个匹配度高于百分之五十的框。
(3)我们令 i 表示第 i 个默认框,j 表示第 j 个真实框,p表示第p个类。那么xi,jp 表示 第 i 个 prior box 与 类别 p 的 第 j 个 ground truth box 相匹配的Jaccard系数,若不匹配的话,则xi,jp=0 。
(4)总的目标损失函数(objective loss function)为 localization loss(loc) 与 confidence loss(conf) 的加权求和。
3. 创新点
(1)使用多尺度特征maps进行目标检测。
(2)小卷积滤波器来预测固定的一组默认边界框的类别得分和框偏移。
(3)为了实现高检测精度,我们从不同尺度的特征图产生不同尺度的预测,并通过纵横比明确地分开预测。
(4)即使在低分辨率输入图像上,这些设计特征也可实现简单的端到端训练和高精度,从而进一步提高速度与精度之间的权衡。
4. 存在问题
SSD的缺点是对小尺寸的目标识别仍比较差,还达不到Faster R-CNN的水准。这主要是因为小尺寸的目标多用较低层级的anchor来训练(因为小尺寸目标在较低层级IOU较大),较低层级的特征非线性程度不够,无法训练到足够的精确度。