SSD原理及Pytorch代码解读——总览

这篇博客记录我在学习《深度学习之PyTorch物体检测实战》一书中关于SSD(Single Shot Multibox Detecor)这一算法的理解,以及pytorch代码的解读。
pytorch复现代码链接:https://github.com/dongdonghy/Detection-PyTorch-Notebook/tree/master/chapter5/ssd-pytorch
虽然本篇博客会提到关于SSD的一些原理介绍,但是更多是侧重于pytorch代码方面的介绍,如果对SSD的原理感兴趣可以去网上搜索,有很多文章都已经介绍的很详细了。

总览

对于目标检测任务来说,一般有两种比较主流的框架,一种是Two stages,另外一种是Single shot。前者是Faster RCNN为代表,即首先利用RPN网络进行感兴趣区域生成,然后再对该区域进行类别的分类与位置的回归,这种方法优缺点很明显,虽然显著提升了精度,但也限制了检测速度。后者以以YOLO系列/SSD为代表,一次性完成classification+bounding box regression,这种利用回归的思想,虽然使速度有了明显的提升,但是精度方面也下降了不少。

下面先简单了解一下SSD的流程和算法思想。
SSD算法的算法流程如图下所示,输入图像首先经过了VGGNet的基础网络,在此之上又增加了几个卷积层,然后利用3×3的卷积核在6个大小与深浅不同的特征层上进行预测,得到预选框的分类与回归预测值,最后直接预测出结果,或者求得网络损失。整个过程中可以看出,SSD只进行了一次框的预测与损失计算,属于一阶网络。由于利用了多个特征图,SSD实现了较好的检测精度。
SSD原理及Pytorch代码解读——总览相比于其他算法,SSD的改进可以总结为以下四点:

  1. 数据增强:SSD对原始数据做了充分的增强工作,主要包括光学变换与几何变换。
  2. 网络骨架:SSD并没有直接使用VGG作为特征提取网络,而是在其卷积模块基础上,通过进一步延伸了4个卷积模块,获取不同尺度下的特征图,这些特征图具有不同的尺度与感受野,便于检测不同尺度的物体。
  3. ·PriorBox与多层特征图:与Faster RCNN类似,SSD利用了固定大小与宽高的PriorBox作为区域生成,但与Faster RCNN不同的是,SSD不是只在一个特征图上设定预选框,而是在6个不同尺度上都设立预选框,并且在浅层特征图上设立较小的PriorBox来负责检测小物体,在深层特征图上设立较大的PriorBox来负责检测大物体。
  4. 正、负样本的选取与损失计算:利用3×3的卷积在6个特征图上进行特征的提取,并分为分类与回归两个分支,代表所有预选框的预测值,随后进行预选框与真实框的匹配,利用IoU筛选出正样本与负样本,最终计算出分类损失与回归损失

整个计算过程如下:
SSD原理及Pytorch代码解读——总览