模型简介
SSD是一种单阶段目标检测算法,通过卷积神经网络进行特征提取,并在不同的特征层进行检测输出,实现多尺度检测。它采用了anchor的策略,预设不同长宽比例的anchor,并在每个输出特征层上预测多个检测框。SSD框架包括了多尺度检测方法,浅层用于检测小目标,深层用于检测大目标。
模型结构
SSD和YOLO是两种单阶段目标检测算法,它们在最终输出边界框的方式上有所不同。SSD通过卷积得到最后的边界框,而YOLO则采用全连接的形式得到一维向量,再对向量进行拆解得到最终的检测框。
模型特点
SSD使用多尺度特征图来进行目标检测,其中大尺度特征图用于检测小物体,小尺度特征图用于检测大物体。SSD采用卷积对不同特征图进行检测,并使用预设的边界框(anchor)来指导预测框的尺寸微调,相比于YOLOv1的全连接层预测,这种方式更容易训练。
环境准备
数据准备与处理
SSD算法通过对每个训练图像进行随机采样,使模型对于不同大小和形状的输入对象更加鲁棒。采样方式包括使用整个原始输入图像、采样一个与原始图片交并比为0.1, 0.3, 0.5, 0.7或0.9的区域,或者随机采样一个区域。采样区域的大小为原始图像大小的[0.3, 1],长宽比在1/2和2之间。如果真实标签框中心在采样区域内,则保留两者重叠部分作为新图片的真实标注框。最后,将每个采样区域大小调整为固定大小,并以0.5的概率水平翻转。
数据集创建和构建
训练过程
(1)先验框匹配
SSD模型在训练时通过匹配ground truth与先验框来确定正负样本。首先,每个ground truth会与IOU最大的先验框匹配,未匹配的先验框则被视为负样本。其次,对于未匹配的先验框,如果其IOU大于设定阈值,也会被匹配到对应的ground truth。为了平衡正负样本比例,SSD采用了hard negative mining策略。需要注意的是,一个先验框只能匹配一个ground truth,而一个ground truth可以匹配多个先验框。
(2)损失函数
损失函数使用的是上文提到的位置损失函数和置信度损失函数的加权和。
(3)数据增强
对创建好的数据增强方式进行数据增强,并使用SSD模型训练60个epoch。训练集和验证集由create_ssd_dataset类创建,batch_size为5,图像尺寸为300×300。损失函数为位置损失函数和置信度损失函数的加权和,优化器为Momentum,初始学习率为0.001。使用LossMonitor和TimeMonitor监控训练过程,并设置每10个epoch保存一次模型。
评估
自定义eval_net()类对训练好的模型进行评估,调用了上述定义的SsdInferWithDecoder类返回预测的坐标及标签,然后分别计算了在不同的IoU阈值、area和maxDets设置下的Average Precision(AP)和Average Recall(AR)。使用COCOMetrics类计算mAP。模型在测试集上的评估指标如下。
总结
SSD(Single Shot MultiBox Detector)是Wei Liu在ECCV 2016提出的一种目标检测算法。它采用了多尺度的特征图来检测不同大小的目标,并利用anchor boxes策略有效地预测边界框和类别。SSD算法在COCO数据集上取得了较好的性能,在网络复杂度和计算量方面也优于之前的算法。本文详细介绍了SSD算法的网络结构、特点、模型训练以及评估过程。