在介绍SSD的整个网络之前,我们先介绍几个名词
Single Shot:目标定位和分类是在同一个前向传播网络中完成的。
MultiBox:这是由Szegedy等人开发的一种边界盒回归技术。
Detector:网络是一个对象检测器,它也可以对检测到的对象进行分类。
从编程的角度来看:
前向传播:图像输入进去,经过VGG-16网络,生成特征图,然后再卷积,再生成特征图,把所有这些特征图利用起来,结合预测框,去检测目标。
反向传播:把前向传播的结果,跟真实的目标位置,类别结果做比较,从而求解各个参数。
网络结构
我们先看SSD的整个网络结构图。
从上图中可以看到,SSD是建立在VGG-16体系结构之上,但放弃了全连接层。VGG-16之所以被用作基本网络,是因为它在图像分类任务中具有很强的性能,并且在迁移学习上有助于提高问题解决效果。与原始VGG完全连接层不同,SSD添加了一组辅助卷积层(从conv6开始),从而能够在多个尺度上提取特征,并逐步减小每个后续层的输入大小。
图中重要数据说明
Classifier: conv: 3 * 3 * ( 4 * ( classes + 4 ) )和Classifier: conv: 3 * 3 * ( 6 * ( classes + 4 ) )是什么意思。用原文中的图来说明。
classes 表示预测类别的个数,classes +4中4表示预测框的四个坐标,6 * ( classes + 4 )中6表示特征图上,每个格子设置的预测框个数,3*3表示特征图分块的大小。由于整个特征图用的卷积核参数是一样的,所以对于一个特征图,就有6 * ( classes + 4 )个卷积核,对应3 * 3 * ( 6 * ( classes + 4 ) )个卷积输出。
SSD的本质就是在不同尺度的图像上,采用不同的窗口去检测目标,只不过加了一个GPU加速,使得这种窗口检测变快了。有了这样的知识理解,那理解SSD甚至其他任何检测用神经网络就容易多了。
特征图
特征图就是图像经过卷积之后的结果。下图显示图像的特征图:
从图上可以看到,对于不同的卷积层,图像特征的表现方式是不一样的,那么在不同层做特征图的检测,就为多尺度的目标检测提供了可能。
负样本处理
在训练过程中,由于大多数边界框的IoU较低,因此会被认为是负面训练样本。在训练集中加入一些负样本,是因为网络还需要学习并明确告知什么是不正确的检测。
损失函数
SSD的损失函数由两部分组成,
置信度损失:测量网络对计算出的边界框对象类别的置信度,分类交叉熵被用来计算这种损失。
位置损失:测量网络的预测边界框与训练集的真实边界框之间的距离,这里使用L2范数。
在不深入研究数学的情况下,总体的损失函数定义为:
multibox_loss = confidence_loss + alpha * location_loss
α项帮助平衡位置损失的贡献。和一般的深度学习一样,我们的目标是找到最能降低损失函数的参数值,从而使我们的预测更接近实际情况。
更多关于SSD的知识点:
点一:更多的默认框会使得检测结果更精确,但是会影响速度。
解释:可以理解为,检测窗口越多,那么覆盖到目标的概率也就会越大
点二:由于检测器在多个分辨率的特征上运行,在多个层上有多个盒子也会产生更好的检测效果
解释:跟上面的解释类似
点三:80%的时间都花在了VGG-16的基础网络上:这意味着,使用一个更快、同样精确的网络,SSD的性能可能会更好
解释:笔者会在后续更新mobilenet的相关知识,并在移动端实际应用,敬请关注。
点三:SSD混淆了具有相似类别的对象(例如动物)。
解释:很可能是因为,相似的类别共享了相同的位置信息。
点四:SSD在较小的对象上会产生较差的性能。
解释:这是显而易见的,因为默认框并不能覆盖到小目标,而且目标较小时,通过层层卷积之后,所保留的信息也就所剩无几了。
关注"麻瓜智能"获取更多信息.