原作者:Wei Liu1, Dragomir Anguelov2等 笔记整理:ganyongdong 2020.10.6
如有错误或者不清楚之处,欢迎指正交流,如需转载请注明出处
论文:https://arxiv.org/abs/1512.02325
代码:https://github.com/weiliu89/caffe/tree/ssd 推荐->https://github.com/lufficc/SSD.git
参考:https://zhuanlan.zhihu.com/p/79854543 https://zhuanlan.zhihu.com/p/65484308
摘要
- 设置默认框(default box),类似于anchor box,具有不同的尺寸和宽高比。
- 联合多种分辨率下的特征图来检测不同尺寸的object,而不是直接对图像resize。
- 一阶段目标检测方法,实现了简单的端到端训练。
- 实验结果显示:在VOC2007,300x300输入,TitanX情况下,mAP=74.3%,FPS=59
网络结构
整个网络是由三大部分组成:
- VGG Backbone
- Extra Layers
- Multi-box Layers
<img src="../image/ssd网络结构.png" width = "800" alt="ssd网络结构" align=center />
把vgg16后面3个全连接层替换成卷积层,用3x3卷积提取不同尺寸的特征图,在不同尺寸的特征图进行预测,之后用非极大值抑制得到结果。
默认框(default box)
在每个特征图的单元格的中心设置一系列尺度和大小不同的初始框,这些初始框都会反向映射到原图的某一个位置,如果某个初始框的位置正好和真实目标框的位置重叠度很高,那么就通过损失函数预测这个初始框的类别,同时对这些初始框的形状进行微调,以使其符合我们标记的真实目标框。
和yolo的anchor不同的是,ssd将其应用于几个不同分辨率的特征图,在多个特征图上使用不同形状的默认框。
多尺度特征图
在backbone网络末端,替换成了卷积层,这些卷积层尺寸逐渐缩小,并允许网络在多个尺度上预测。
训练过程的匹配策略(默认框和真实标签框关联匹配)
将默认框与所有的真实标签框配对,只要两者之间的雅可比重叠值(jaccard overlap)大于某个阈值(比如 0.5)
损失函数
损失函数由位置损失和分类置信度损失的加权和成
:第i个默认框和第p类的第j个真实标签框相匹配的指示器,大于重叠阈值为1,小于重叠阈值为0
其中:
:已经匹配好的默认框的个数(如果N=0,就设置当前损失为0)
:预测框和默认框之间的偏移
:真实标签框和默认框之间的偏移
其中:
:默认框
选择默认框的尺寸和宽高比
对选择默认框有作者给出了一套推荐公式,但是针对不同数据集还是不同,如何最优是一个开放性的问题。
其中,是0.2,是0.9。意味着最底层是0.2,最高层是0.9,期间所有大小按规律递增。
设定5种宽高比 ,则计算每个默认框的长度与宽度:
对于长宽比为1的,另外增加一个默认框,,所以特征图每个位置有6个默认框。
正负样本平衡(难例挖掘)
没有使用所有的负样本,而是先把负样本根据置信度损失进行从大到小排序,然后为每个默认框只选择分值最高的那些样本,这样做的目的是使得正负样本的比例不超过1:3。这样还可以使得优化更快,训练更平稳。
数据增强
对每个图像随机采取以下策略之一进行采样:
- 使用整张原始输入图像
- 采样一个片段,使得与目标物体的最小的雅可比重叠为0.1,0.3,0.5,0.7,0.9之一。
- 随机采样一个部分
每个采样部分的大小为原图的[0.1,1],长宽比在1/2和2之间。如果真实标签框的中心位于采样部分内,则保留重叠部分。在上述采样步骤之后,将每个采样片大小调整为固定大小,并以0.5的概率进行水平翻转,还有对图片做一些光度扭曲的操作。
预测的时候
对图像提取不同尺寸的特征图,每个特征图平铺分布着默认框,然后为每个default box生成每个类别的得分和box的偏移量,得到输出空间,用非极大值抑制得到检测结果。
网友评论