目标检测系列之三(SSD)
论文题目是《Single Shot MultiBox Detector》 论文地址:ttps://arxiv.org/abs/1512.02325 SSD是一阶段One Stage方法,SSD算法提取了不同尺度的特征图,既可以检测大目标也可以检测小目标,采用不同大小和长宽比的检测框anchors。 算法步骤: 1) 将图像输入预训练好的分类网络(基于VGG16-Atrous)得到不同大小的特征映射 2) 分别提取Conv4_3、Conv7、Conv8_2、Conv9_2、Conv10_2、Conv11_2层的特征映射feature map,在每个特征映射的每个点构造6个不同大小尺度的bounding box,进行检测和分类来生成一些列bounding box 3) 采用NMS处理不同特征映射的bounding box,删掉部分重叠或者不正确的bounding box,得到最终的检测框。
内容目录
1 Backbone2 Prior box先验框3 损失函数
1 Backbone
SSD基于VGG16(在前面的文章介绍过,深度学习系列(二)卷积神经网络模型(从LeNet-5到Inception V4))的卷积神经网络,并对其进行改动 1) 将VGG16网络的fc6改为3x3卷积,fc7改为1x1卷积,池化层pool5由原来的步长为2的2x2改为步长为1的3x3 2) 引入空洞卷积,将conv6改为空洞卷积层(在前面的文章介绍过,深度学习系列(一)常见的卷积类型),dilation=6,不改变特征图大小但获得更大的感受野 3) 在网络后面增加8个卷积层
SSD还用到了数据增强方法,如水平翻转(randomly horizontal flip)、颜色扭曲(color distortion)、随机扩张(random expansion)、随机patch采样(randomly sample patch)
2 Prior box先验框
SSD借鉴了Faster R-CNN中的anchor概念,给每个feature map的每个点设置尺度和长宽比不同的先验框,真实目标的形状是多变的,在训练过程中需要选择更合适的先验框来学习。
SSD为每个检测层都预定义了不同大小的先验框(Prior boxes), Conv4_3、Conv10_2和Conv11_2分别有4种先验框,而Conv7、Conv8_2和Conv9_2分别有6种先验框,即对应于特征图上的每个像素,都会生成K(prior box种类)个prior box。 网络6个检测层总共预测的边界框数目为8732(38 * 38 * 4 19 * 19 * 6 10 * 10 * 6 5 * 5 * 6 3 * 3 * 4 1 * 1 * 4)。 边界框包含两个部分,一部分是每个类别的置信度,如果有k类的话,SSD会输出k 1个置信度值,第一个置信度值代表边界框是否包含目标,置信度最高的类别就是该边界框的所属类别。另一部分是边界框的位置信息(x,y,w,h)代表边界框的中心坐标和宽高信息,注意这里在实际预测时是边界框相对于先验框的偏移量(offset),如果先验框位置用
表示,其对应边界框用
表示,那么边界框的预测值l其实是b相对于d的转换值:
先验框的匹配过程 在前面会生成大量的先验框,在网络训练过程中需要给每个先验框寻找所对应的真实框,这里需要对先验框进行匹配。 对于每个真实框计算与其IOU最大的先验框,对于剩余的先验框,保留与其IOU大于给定阈值(比如0.5)的一部分,这样每个真实框会匹配很多先验框,但每个先验框只能匹配一个真实框,这样仍然会产生类别不均衡问题,背景先验框的数量远大于目标先验框,因此论文中还使用了Hard negative mining的策略,按照先验框的类别置信度误差从高到低排序,只选择前top_k个先验框作为训练的背景先验框(背景先验框的采样),最终正负样本的比例约1:3。
3 损失函数
SSD的损失函数为多任务损失函数,将分类损失和回归定位损失整合在一起
这里的N为匹配的先验框数目,alpha为权重平衡项,用来平衡分类和定位损失。定位损失和Faster R-CNN一样采用Smooth L1损失:
这里l为预测坐标,d为先验框,g为真实框。分类损失采用多分类交叉熵损失:
参考: https://blog.csdn.net/xiaohu2022/article/details/79833786 https://segmentfault.com/a/1190000021845972