昨天介绍了特征金字塔网络用于目标检测,提升了多尺度目标检测的鲁棒性,今天开始讲讲One-Stage目标检测算法中SSD算法。这个算法是我平时做工程中最常用到的,严格来说平时最常用的是Mobilenet做Backbone的SSD算法,因为要考虑到实际部署的时候的速度要求,不过原理都一样。
本文提出了仅需要单个卷积神经网络就能完成目标检测的算法,并命名为SSD(Single Shot Detector)。SSD算法将目标框的输出空间离散化为一组在每个特征图位置不同大小和形状的默认框。预测时,网络对位于每个默认框类的物体类别进行打分,并修正默认框位置来更好的匹配物体的位置。此外,SSD网络在不同分辨率的特征图上预测,这样就可以处理大小不同的物体。SSD比那些需要搜索物体候选框的算法简单,因为它完全去除了proposal生成和随后的特征再筛选的过程,把所有的计算封装在一个网络里面。这使得SSD训练起来很容易,可以直接加入到检测系统里面。在PASCAL VOC,COCO,和ILSVRC数据集上的实验也证明,与那些需要object proposal的算法相比,SSD在保证准确性的同时,速度更快。SSD只需一个完整的框架来训练和测试。在NVIDIA Titan X对于一个大小是300 300的输入图像,SSD在VOC2007测试上的MAP是74.3%,速度是59FPS。对于512 512的输入,SSD的MAP是76.9%,比Faster RCNN更准。和其他单阶段的方法比,即便是输入较小的图像,SSD的准确性也会更高。
目前,目标检测系统基本采用以下的流程:假设物体边框,对每个边框内进行特征再采样,最后使用分类器进行分类。这个流程比较流行,基于Faster-RCNN的方法通过选择性搜索在PASCAL VOC, COCO和ILSVRC上检测效果都很好。但是这些方法对于嵌入式设备来说计算量过大,甚至需要高端硬件的支持,对于实时系统来说太慢。最快的检测器-Faster RCNN的检测速度也只能到7FPS。人们尝试了很多其他方法来构建更快的检测器,但是增加速度大多以损失检测精度为代价。本文提出了基于目标检测器的网络(object detector),它不需要为边框进行搜索,但是精度却不降反升。此方法实现了高精度和高速度,在VOC2007 上的测试速度是59FPS,mAP是74.3%;而Faster R-CNN的mAP是73.2%,速度是7FPS;YOLO的mAP是63.4%,速度的是45FPS。速度的提升得益于去除了边框提议(RPN或者Selective Search)和随后的特征再采样。使用了一个小卷积滤波器来预测目标分类和边框位置的偏移,对于不同横纵比检测使用不同的滤波器去处理,然后把这些滤波器应用在后面网络阶段的特征图上,这是为了用检测器检测不同比例的图片,这样我们在相对低分辨率的图像上也能获得高精度的输出,还提升了检测速度。本文的贡献如下:
SSD基于前馈式卷积神经网络,针对那些方框里的目标检测实例,产生一个固定大小边界框集合和分数,紧接着是一个非极大值抑制步骤来产生最后的检测。网络前半部分是个标准结构(用于高质量图片分类),成为基网络。然后对网络增加了辅助结构来实现以下特征:
SSD 在训练中只需一张输入图像和图像中每个目标的ground truth边界框信息。在卷积操作中,我们产生一个默认方框的集合,这些方框在每个位置有不同的纵横比,在一些特征图中有不同的比例,如上图所示。对于每个默认方框,预测它形状的偏移和类别的置信度()。训练时,首先将这些默认方框和 ground truth 边界框对应上。就像图中,作者匹配了2个默认方框,一个是猫,一个是狗,它们被认定为positive, 其余部分被认定为 negative. 模型损失函数是 localization loss(smooth L1) 和 confidence loss(Softmax) 的加权之和。
SSD中default box的概念有点类似于Faster R-CNN中的anchor。不同于Faster R-CNN只在最后一个特征层取anchor, SSD在多个特征层上取default box,可以得到不同尺度的default box。在特征图的每个单元上取不同宽高比的default box,一般宽高比在{1,2,3,1/2,1/3}中选取,有时还会额外增加一个宽高比为1但具有特殊尺度的box。上面那张图展示了在8x8的feature map和4x4的feature map上的每个单元取4个不同的default box。原文对于300x300的输入,分别在conv4_3, conv7,conv8_2,conv9_2,conv10_2,conv11_2的特征图上的每个单元取4,6,6,6,4,4个default box. 由于以上特征图的大小分别是38x38,19x19,10x10,5x5,3x3,1x1,所以一共得到38x38x4+19x19x6+10x10x6+5x5x6+ 3x3x4+1x1x4=8732个default box.对一张300x300的图片输入网络将会针对这8732个default box预测8732个边界框。
训练SSD和训练其他使用区域提议检测器的主要区别是,ground truth信息在固定检测器输出的情况下需要指定到特定的输出。这样,损失函数和反向传播就可以端到端的应用。训练需要选择默认方框的集合,检测比例,以及hard negative mining(也就是不存在目标的样本集合)和数据增强策略。
分类损失是多个类别置信度的 softmax loss:
在交叉验证中设为1。
在PSCAL VOC2012上面:
在COCO数据集上面:
速度和精度的整体对比:
SSD优势是速度比较快,整个过程只需要一步,首先在图片不同位置按照不同尺度和宽高比进行密集抽样,然后利用CNN提取特征后直接进行分类与回归,所以速度比较快,但均匀密集采样会造成正负样本不均衡的情况使得训练比较困难,导致模型准确度有所降低。另外,SSD对小目标的检测没有大目标好,因为随着网络的加深,在高层特征图中小目标的信息丢失掉了,适当增大输入图片的尺寸可以提升小目标的检测效果。
https://github.com/weiliu89/caffe/tree/ssd
https://blog.csdn.net/calvinpaean/article/details/84301031 https://www.jianshu.com/p/e13792628bac
本文分享自 GiantPandaCV 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!