最近接触SSD,这篇入门文章不错,故翻译之。
原文链接:https://towardsdatascience.com/understanding-ssd-multibox-real-time-object-detection-in-deep-learning-495ef744fab
这篇文章的目的是给出SSD MultiBox目标检测技术的直观解释。本文试图用最少的数学理论,引导你理解这个框架,其中包括解释MultiBox算法。读完本博文,希望您对SSD有更好的理解,并能够自己尝试应用它。
自从AlexNet在2012年的ImageNet大规模视觉识别挑战赛(ILSVRC)大显身手而风靡全球,深度学习已成为图像识别任务的前沿方法,效果远超传统的计算机视觉方法。在计算机视觉领域,卷积神经网络在图像分类方面表现出色。给定一组标签化的数据集(比如狗,猫),训练好的网络能预测给定图片最有可能的类别。
如今,深度学习网络在图像分类领域已经超越人类,显示了这项技术的强大。然而,人类做的更多,我们在观察并与世界交互时,不仅仅时对图像分类,还定位并分类视野中的每一个元素。这是一项很复杂的任务,机器在这方面目前还无法与人类匹敌。事实上,我认为当目标检测技术实际效果很好时,机器则更好地认知真实的场景。
The Region-Convolutional Neural Network (R-CNN)
几年前,研究人员探索CNNs带给计算机视觉领域的飞跃,研究出R-CNN来处理目标检测的任务,即定位和分类。一般而言,R-CNN是一种特殊类型的CNN,它能够定位并检测图像中的对象:网络输出通常是一组边界框,他们与每个检测到的对象边缘很接近,以及每个检测到对象的类别信息。下图显示了典型的R-CNN输出结果:
R-CNN领域有一份详尽的论文清单,希望深入理解的读者可以从以下三部曲的论文开始:
正如你想的那样,后续的每一篇的论文都提出了改进R-CNN的开创性工作,致力于开发更快的网络,目的是实现实时目标检测。上面显示的一系列工作取得的成就是令人惊叹的,但没有一个能创建一个实时目标检测器。略过细节,上述网络的以下问题被确定:
- 数据训练很笨重并过于耗时
- 训练分为多个阶段(比如:训练候选区域(region proposal) vs 分类器)
- 网络在推断阶段很慢
幸运的是,过去几年中,出现了新的架构可以解决R-CNN及其后续结构的瓶颈,从而实现实时目标检测。最著名是YOLO(You Only Look Once)和SSD MultiBox(Single Shot Detector)。本文讨论SSD,一旦了解SSD的原理,就更容易理解YOLO。
Single Shot MultiBox Detector
关于SSD:论文《Single Shot MultiBox Detector》(由C. Szegedy等人撰写)于2016年11月底发布,其在物体检测任务的性能和精度方面达到了新记录,在标准数据集(如PascalVOC和COCO)上每秒处理59帧,得分超过74%(均值平均精度 )。为了更好地理解SSD,我们首先解释这个架构的命名含义:
- Single Shot:这表示定位目标和分类的任务是在网络的一次前向传递中完成的
- MultiBox:这是Szegedy等人开发的边界框回归技术的名称。 (我们会简要介绍一下)
- Detector:网络是一个对象探测器,它也对这些探测到的对象进行分类
架构
如上图所示,SSD的架构是建立在传统的VGG-16结构上,但丢掉原来的全连接层。选用VGG-16结构作为基础网络的原因是它的优秀的图像分类性能和适合用于迁移学习以提高精度的特性。 取代原来的VGG全连接层的是一组辅助卷积层(从conv6起),这能够以多个比例提取特征,并逐渐减小每个后续层的输入大小。
MultiBox
SSD的边界框回归技术是受Szegedy在MultiBox上的工作的启发,是一种用于未知类别的边框坐标建议方法。有趣地是,在MultiBox的工作上,Inception-style的卷积网络被使用。接下来看到的1x1卷积有助于降低维度(“channel“),“高度”和“宽度”保持不变。
SSD中MultiBox的损失函数也包括两个关键的部分:
- Confidence Loss:这部分衡量网络对计算出的边框为目标的信心程度。使用的分类交叉熵计算Loss
- Location Loss:这个指标衡量网络预测的边界与训练数据中真实的边界的误差,使用L2-Norm计算。
如果数学上不深入研究的话(如果您对此有兴趣并希望得到更严谨的论证方法,请阅读论文),最终,目标检测的Loss的表达式为:
multibox_loss = confidence_loss + alpha * location_loss
变量alpha用于平衡定位部分的loss。如传统的深度学习过程,目标是找到使得损失函数尽可能低的参数值,从而使我们的预测更接近实际情况。
MultiBox Priors 和 Iou
围绕边框生成的逻辑实际上比我之前所说的复杂多了。但不用害怕:它仍属于可以解决的范畴。
在MultiBox中,研究人员引入了所谓的priors(或者叫anchors,在Faster R-CNN术语中)。priors是预先计算好的,固定大小的边框,它们与真实的边框分布很接近。
事实上,这些priors的挑选原则是两者的交叉比例(又名IoU,有时也称为Jaccard指数)大于0.5。 正如你可以从下面的图片中推断出的,0.5的IoU仍然不够好,但是它为边界框回归算法提供了一个强有力的起点 - 与采用随机坐标的策略预测相比,这是一个好得多的方式! 因此,MultiBox从priors开始预测,试图接近真实边界框。
最终的架构(回顾图Architecture of multi-scale convolutional prediction of the location and confidences of multibox,以供参考)包含每个feature map cell(8x8,6x6,4x4,3x3,2x2)的11个priors,并且在1x1特征映射上仅包含一个,从而每个图像总共有1420个priors, 从而实现多尺度输入图像的稳健覆盖,以检测各种尺寸的物体。
最后,MultiBox只保留最小化定位(LOC)和置信度(CONF)损失的前K个预测。
SSD Improvements
回到SSD上,做了一些改动,使这个网络更有能力对目标进行定位和分类。
Fixed Priors:与MultiBox不同,每个feature map cell都对应着一组不同尺寸和高宽比的默认边界框。 这些priors是基于人工规则精心选择(计算)的,而在MultiBox中,priors的选中规则是IoU对于ground true超过了0.5。 理论上,应该允许SSD适应任意的输入,而不需要前面的预训练的阶段。 例如,假设我们为每个feature map cell配置b个默认边界框,包括2个对角相对点(x1,y1)和(x2,y2),并且要对c个类进行分类,则在给定的大小为f = m * n的feature map,SSD将计算f * b *(4 + c)个值。
Location Loss: SSD使用平滑的L1-Norm来计算location loss。尽管不如L2-Norm那么精确,但仍然非常有效,并为SSD提供了更多的操作空间,因为它不会尝试在边界框预测中实现“像素完美”(即几个像素的差异几乎不会被注意到 我们中许多人)。
Classification: MultiBox不执行对象分类,而SSD则执行对象分类。 因此,对于每个预测的边界框,针对数据集中的每个可能的类来计算一组c类预测。
Training & Running SSD
Datasets
您需要具有真实边界框和分配的类标签(每个边界框指定一个类别)的训练和测试数据集。 Pascal VOC和COCO数据集是一个很好的起点。
Default Bounding Boxes
建议配置一组不同尺度和高宽比的默认边界框,以确保可以捕获大部分物体。 SSD论文中,每个feature map cell有大约6个边界框。
Feature Maps
feature map(即卷积层的结果)是图像在不同尺度上的主要特征的表示,因此在多个特征图上运行MultiBox能增加了任何目标(大和小)最终被检测,定位与分类的概率。 下面的图片展示了网络如何“看到”feature map上的给定图像:
Hard Negative Mining
训练过程中,大多数边界框的IoU都较低,会被认为是负样本,因此训练集可能会出现样本不均衡。因此,建议不要使用所有负样本,而要保持约3:1的负正样本比例。 你需要保持负样本的原因是因为网络也需要学习和被明确告知什么是不正确的检测。
Data Augmentation
SSD的作者指出,像许多其他深度学习程序一样,数据增强对于网络的泛化性能,即对于各种目标的输入变得鲁邦至关重要。 为此,他们以不同的IoU比率(例如0.1,0.3,0.5等)和random patches生成具有原始图像patches的额外训练样本。 此外,每个图像也以0.5的概率随机地水平翻转,从而确保潜在目标以相似的可能性出现在左侧和右侧。
Non-Maximum Suppression (NMS)
考虑到inference阶段SSD前向过程中生成大量boxes,通过非最大抑制技术修剪大部分边界框是必要的:小于confidence loss 阈值ct(例如0.01 )和IoU小于lt(例如0.45)的boxes被丢弃,并且只保留前N个预测。 这确保最可能的预测被保留,而更多噪音的预测被删除。
Additional Notes On SSD
SSD的论文还作了以下的观察:
- 更多的default boxes会带来更精确的检测,但耗时增加
- 由于detector以多种分辨率运行于特征上,因此在多个图层上使用MultiBox也会导致更好的检测
- 80%的时间花在基础VGG-16网络上:这意味着,使用更快,同样精确的网络,SSD的性能可能会更好
- SSD将具有相似类别的对象(例如动物)混淆。这可能是因为定位是基于多个类的
- SSD-500(使用512x512输入图像的最高分辨率版本)在Pascal VOC2007上实现了最佳的mAP,达到了76.8%,但是速度降低到22 fps。因此SSD-300在59 fps下具有74.3 mAP更好的折衷。
- SSD在较小的对象上产生较差的性能,因为它们可能不会出现在所有功能地图中。增加输入图像分辨率缓解了这个问题,但并未完全解决这个问题
Playing With SSD
网上有一些现成的SSD实现,包括轮文作者的原始Caffe代码。 就我而言,我选择了PaulBalança的TensorFlow实现,可在github上获得。为了更好地理解一切如何结合在一起,阅读代码以及论文是值得的。
我最近还决定通过使用SSD来重构一个使用传统计算机视觉技术的项目Vehicle Detection。我用SSD输出的一个小Gif显示它非常好用:
Beyond SSD
在这个领域,最近更多的工作已经产生,我建议在下面的两篇论文中对任何有兴趣在这个领域进一步推动他们的知识的人进行跟进:
YOLO9000:更好,更快,更强(这是论文的标题;不是开玩笑)
Mask R-CNN:在像素级非常准确的instance segmentation
瞧! 我们完成了我们的Single Shot MultiBox Detector巡视。 我试图用简单的术语来解释这一技术背后的概念,尽我所知,用很多图片来进一步说明这些概念并便于理解。 我真的推荐阅读这篇论文(如果你像我一样慢,可能会多次),包括在这项技术的一些数学背后形成良好的直觉,以巩固你的理解力。 如果其中的某些章节能够帮助您理解论文,您可以随时查看该博客。一帆风顺!