CV_01 SSD算法的简单理解(入门级别)
一. 写这篇博文的初衷
其实在很多论坛也好,贴吧也罢已经有了很多关于SSD算法的剖析与理解,但大部分都比较学术和深奥,博主在初学的时候也是遇到了不少难以理解的问题,在反复地学习之后,有了一些比较浅显的理解与感悟,因此在这里与大家分享一下,当然不免会出现比较低级的错误,如果有错误的地方还请读者大大们踊跃地提出来,我们一起进步。
二. 什么叫SSD?
SSD算法,其英文全名是Single Shot MultiBox Detector,翻译成中文就是:“单激发多框探测器”,Single shot就指明了SSD算法属于one-stage方法,MultiBox指明了SSD是由多个bounding box来完成预测的。那么问题来了什么叫one-stage,什么又叫做bounding box呢?
1. one-stage VS two-stage
简单地来说,计算机在做目标检测的时候,通常需要做两件事,第一件事是【目标在哪(定位)】,第二件事是【目标是啥(分类)】。因此人们就根据这两件事,把目标检测分为了两大类,一类叫做two-stage,另一类就叫做one-stage。对于two-stage来说,它会先生成一些候选区域,这些区域有可能会包含一个待检测目标(定位),紧接着再采取一些后续操作来区分每个候选区域里具体包含了哪些目标(分类)。对于one-stage来说,它则是通过一次网络就同时得到了被检测物体的位置信息和分类信息。因此可以看出来:two-stage的精确度更高,而one-stage的速度更快。
2. bounding box
bounding box翻译成中文来说就是“边界框”,从字面上不难理解,它是用来区分框内物体与框外背景的一个工具。也就是说当一张图片中出现了bounding box的时候,其实就明确地告诉了你图片中所存在的被检测物体的位置,有了这个“边界框”之后,就可以针对边界框内被检测物体的特征来完成对它的分类操作。
三. SSD算法的网络架构及实现流程
大家对这张图肯定不陌生(我把小汽车换成了小猫咪)。
- 在特征提取环节我加入三个不同颜色的框框把SSD目标检测网络切分成了三个部分。第一个部分(黄色)做的事情就是为了防止图像失真从而将待传入网络的图片进行 300x300x3 的resize处理。第二个部分(蓝色)就是SSD网络对VGG16深度卷积神经网络的“调用”,也就是先让传入网络中的图像先过一遍VGG16深度卷积神经网络提取出一大堆特征。第三个部分(红色)就是SSD算法新颖的地方,就是它在VGG16的基础上又新增了四个卷积层,从而进行了更多次的特征提取,来获得更多数量的特征层。在每一个特征层的上边都有一组 “数字x数字x数字” 的标注,对于这个标注的理解其实可以简单地把它想做把图像分割成了多少个网格,比如 38x38x512 就可以理解为将一张图片分割成了 38x38 个小网格并进行了512次的特征提取。
- 在获取完这些特征层并对图像添加了网格之后,就需要来添加先验框了!这里以SSD作者的解释为例(如下图):可见右边这两个feature map中的虚线部分,就是我们提前根据每个网格的中心而添加的先验框(def box)。这也就是我们为什么要在特征提取环节要对图像绘制网格的原因了。
对应SSD网络架构图中标识,可以看出来我们一共添加了:38x38x4 + 19x19x6 + 10x10x6 + 5x5x6 + 3x3x4 + 1x1x4 = 8732个先验框。也就得到了类似于以下的结果。
- 在获得了这么多的先验框(def box)之后,分别判断这8732个先验框中有没有我们需要的物体,如果有的话就把它标记出来,当然在利用这些先验框所得到的框中肯定会有一些比如发生了与被检测物体重合的情况,之后就需要我们对这些框的得分和重合情况进行判断,利用非极大抑制的方法找到我们需要的框并且标记出它所属于的种类,这样就算完成了SSD检测算法的检测过程了。
四. 博文推荐
由于博主这篇博文是为了让新手更加轻松地去理解SSD算法,实际上SSD算法的巧妙之处并不止这些,如果您想要进一步深入地去了解SSD算法,请移步以下大佬的博文。
如有问题,敬请指正。欢迎转载,但请注明出处。