物体检测系列之SSD原理介绍
最近在看深度学习用在物体检测上的论文,看到https://arxiv.org/abs/1512.0232 这篇论文,感觉方法的效果很强而且又快,虽然自己看不懂:),后来翻了几篇博文才开始有些明白原理,特此记录一下,方便以后复习,理解能力有限,不喜勿喷。好了,废话不多说,参考的博文链接都放在最后那里了。
物体检测简要介绍
所谓物体检测就是要把一张图片中的某些物体准确定位和分类出来,由于图片中的物体大小尺度不一,所以物体检测的方法要求要能检测出图片中不同大小尺度的图片,传统方法主要是基于滑动窗口的形式,通过变化窗口的大小来解决物体大小尺度不一的问题,而这样的方法因为产生太多的窗口往往速度慢而且特征提取的效果也一般导致最后检测物体的效果一般,而深度学习以来的方法基本上都是通过产生候选区域(region proposal,这里说的候选区域都是矩形的,方法有selective search[6]和RPN[7]等)的方式来解决大小尺度不一的问题,这类方法可以分为两类:一类是先用某种方法产生候选区域,然后再在这些区域上进行分类和准确定位(两步走),比如像fast rcnn、faster rcnn等;另一类是直接将图片中的物体分类和定位出来(一步走),像SSD、YOLO等。后面这类方法也需要用到候选区域,在SSD中候选区域的产生就体现在多尺度网络+default box上(后面会介绍)。多尺度网络的作用在于产生不同的sacle候选区域,default box的作用在于产生不同respect ratio的候选区域。scale不同可以理解为区域的面积不同,而respect ratio不同可以理解为区域的面积相同但长宽比不同。关于物体检测的更多介绍可以看[5]。
整体架构
直接上图了(图片来自原论文):
如图所示,模型分为两大块,一个是base network(图中那个有虚线的长方体),用的是VGG网络的一直到conv5_3层,作用是特征提取,另一个是多尺度网络,就是虚线长方体之后的的那些小长方体(统称为多尺度网络),他们其实也是经过卷积层得到的feature map,只不过它们的尺度不一,作用主要是让得到的候选区域的scale不同,在多尺度网络上还用了default box一起来做分类和定位。
多尺度网络(涉及scale)和default box(涉及respect ratio)
多尺度网络就是一系列不同大小的feature map层,比如在上面那张图中多尺度网络各层的feature map的尺度分别为38x38x512,19x19x512,10x10x512,5x5x512。由于这些feature map上的每一个点对应原图的receptive field不同,从而可以实现了图片不同的scale的区域的特征提取。比如说38x38x512这个feature map的位置(0,0,0:512)这个位置提取了原图(300x300x3)中的(0:20,0:20,0:2)这个区域的特征,而19x19x512这个feature map的位置(0,0,0:512)这个位置提取了原图(300x300x3)中的(0:40,0:40,0:2)这个区域的特征(只是打个比方,并不是说一定是对应这个区域~)。但由于包围物体的bounding box可能是长的长方形也可能是高的长方形还有可能是正方形,所以就算提取了(0:20,0:20,0:2)这个区域的特征,还要考虑物体的不同形状,这也就引入了default box的概念,defaul box就是面积相同但长宽比不同的一些矩形,比如在考虑长宽比(resepct ratio)为1,0.5,2的default box,那么在提取了原图中(0:20,0:20,0:2)这个区域的特征后,预测时候就要考虑对有3种default box,如果假设类别一共有20种,加上背景就有21种,那么在38x38x512这个feature map的位置(0,0,0:512)提取的特征就要预测出3x(21+4)各值(3是default box的数量,21是类别数量,4是这个default box的位置,每一个default box都要计算它属于每个类的可能性)。考虑一个mxnxp的feature map,每个位置采用k个default box,加上背景一共有c个类别,用3x3xp的convolutional filter去做预测,那么每个位置输出就为kx(c+4),最后得到的输出就为kx(c+4)xmxn。这里还有一个很重要的问题是,我们不知道38x38x512的位置(0,0,0:512)到底对应到原图的哪个区域,所以作者提出(图片来自[4]):
这里第一点的sk是第k层的feature map的一个位置与原图大小的比列值,通过这个值我们可以计算出第k层的feature map的各个位置对应到原图是哪些位置,一旦对应到了原图的位置,在通过respectio ratio就能把不同大小规模的default box对应回原图的位置,从而可以在训练时计算label和在预测时做nms,可能你听不懂我这里在说什么,建议你看一下[4]中的代码解析,就会明白些这些公式的含义(只不过那里的代码时用step来去代替sk这个变量的)。
用[4]中的一张图来表示很贴切(图片来自[4]):
训练过程
由于训练过程是一个监督学习的过程,那么我们就一定得有标签,对于一张图片,在输出进网络后得到的是所有default box的所有类别得分和4个位置,而我们所拥有的只是这张图片的grown truth的bounding box的位置(以下简称 gtbb),我们要通过gtbb来得到所有default box的label和位置信息,所采取的原则如下图(图片来自[1]):
上图中第一个原则主要是为了防止所有default box的iou(jaccard overlap)都小于0.5。
对于一个default box,他可能与多个gtbb的iou都大于0.5,这时我们选择iou值最大的哪个gtbb对应的标签和位置作为这个default box的标签和位置。这里会遇到的一个问题是样本类别不平衡,就是被标为背景的default box的数量可能远远多于被标为非背景的类别的default box的数量,作者在训练过程中保持非背景和背景的类别数量的比例为3:1,然后得到了比较稳定的效果(具体怎样保持这个比例的我也不懂,只有啃代码才搞得懂了~~)。
还有一个很关键的一点,这个网络的loss function的定义是什么?因为我们不仅仅要得到物体的类别,还要得到物体的位置,所以loss function中包含这两项,分类的loss采取的是cross entropy,位置的loss采取的是bounding box regression(见[7])。如下图所示(图片来自[3]):
data augmentation
数据增强对最后mAP的提升很有效果,作者采用了如下的数据增强策略(图片来自[4]):
最后的实验结果就看论文吧~
图片基本上都是从参考那里的链接里‘盗’来的,不喜勿喷~
总结
- 论文中获得不同大小规模的候选区域的方法很值得学习
参考
[1] http://blog.csdn.net/u010167269/article/details/52563573 (论文阅读:SSD: Single Shot MultiBox Detector)
[2] https://www.bbsmax.com/A/gGdX0Vepd4/ (SSD论文阅读(Wei Liu——【ECCV2016】SSD Single Shot MultiBox Detector))
[3] https://zhuanlan.zhihu.com/p/24954433 (SSD)
[4] https://zhuanlan.zhihu.com/p/25100992 (SSD关键源码解析。ps:非常推荐,看了里面的代码解析才对论文中的几个公式有了些理解)
[5] https://mp.weixin.qq.com/s__biz=MzAwNjcyOTIwNA==&mid=2659250017&idx=1&sn=d5e96d2aa2cd0985ffd86bf8f49294b1&chksm=807cb3fab70b3aec9eaf6a8c2f0530f424dc56468a83b3b381881b734b02d369b912b4ac7961&mpshare=1&scene=1&srcid=0623XKEeCxrPB7sNdQxCyJdN#rd
[6]http://blog.csdn.net/mao_kun/article/details/50576003
[7]http://blog.csdn.net/zy1034092330/article/details/62044941