理解基于深度学习的目标检测算法

理解基于深度学习的目标检测算法

前言

原文地址:UNDERSTANDING DEEP LEARNING FOR OBJECT DETECTION
基本没有改变作者的原意,在很少的地方有微小的改动。


随着卷积神经网络(CNN)的出现,我们在计算机视觉任务(如目标检测,图像分割,分类等)方面取得了令人瞩目的进步。为了理解视觉场景中对象之间的动态和交互,我们需要对顺序和关联信息进行建模,以便在时间和空间中联系目标。在深度学习中,这可以通过递归神经网络和基于图的方法来实现。然而,在介绍和解释这些先进方法之前,首先要了解当前最先进的目标检测算法的发展及其需要解决的问题,对进行进行深入的研究是非常有帮助的。

在这篇博文中,我将探讨深度学习目标检测的重要工作。我将介绍这些方法如何随着时间的推移而演变并比较它们的差异和相似之处。通过展示每种方法的创新和局限性,以及后来的方法如何解决以前的问题,每次非常有趣的调整都得到了一个小而优雅的改善。

1. Two-stage Methods: R-CNN系列的演变

(1) R-CNN (Ross Girshick, et al., 2014):

R-CNN 算法结合 region proposalsCNN 特征在目标检测任务中得到了非常突出的结果。 region proposals 本质上是具有分数的候选框,指在 boxes 内存在对象的可能性。

Screenshot from 2018-05-05 15-11-11

图片来源: Ross Girshick, et al., 2014

R-CNN 的工作方式简单。 它首先使用选择性搜索 (Selective search) 算法,通过过度分割 (over-segment) 初始化,自下而上,基于相似性将相邻的小 segment 迭代地分组为更大区域的层次结构 (参考另外一篇,Selective search 算法的理解),以生成约 2000 个与类别无关的 region proposals。 由于大多数 CNN 仅适用于固定大小的输入,因此 R-CNN 将每个区域 resize 为相同的大小。 那些扭曲的区域 (warped region) 通过CNN (在 R-CNN 中是修改后的 AlexNet,包含 5 个卷积层和 2 个完全连接的层)。 这些 CNN 特征最终将被输入分类器,该分类器计算每个区域的每个类的概率。 R-CNN在 PASCAL VOC 2010 上实现了 53.7% 的平均精度 (mAP),在 PASCAL VOC 2012 上实现了 62% 的平均精度 (mAP)。

(2) SPPnet (Kaiming He, et al., 2015):

SPPnet 是将不同大小的图片输入 CNN(R-CNN 是将扭曲的区域输入 CNN)

再考虑一下R-CNN。为了在CNN中使用全连接 (FC) 层,我们需要确保输入具有相同的大小。但是,每个图像有大约 2000 个 region proposals,大小不同。 R-CNN 将不同大小的区域扭曲成具有相同大小的区域。这意味着:对于许多小区域,例如,一个有1000像素,我们必须将其重新 resize 为一个具有5000像素的区域。当我们将其输入 CNN 以计算 feature maps 时,那些 5000-1000 = 4000 个额外像素需要额外的计算,这导致检测速度慢。实际上,这是CNN中的常见技术问题:由于完全连接的层,它们需要固定的输入尺寸。

SPPnet 巧妙地通过将空间金字塔池(SPP)添加到 CNN 中来解决此限制,因为它可以输入大小变化的图片,并输出固定长度。 SPP最初被称为空间金字塔匹配,这是计算机视觉中特征提取和匹配最成功的方法之一。这个想法最初是由 Svetlana Lazebnik et al. in 2006 提出。

Screenshot from 2018-05-09 11-39-05.png

Spatial Pyramid Pooling Layer. 图片来源: Kaiming He, et al., 2015

与 R-CNN 一样,SPPnet 首先为每个图像生成约 2000 个 region proposals,但是不将它们变形为相同的大小,不是对每个区域生成 feature maps,SPPnet 仅生成整个图像的特征映射。 然后,SPPnet将候选框 “投影” 到整个图像的卷积层的最终特征图上,这样只需要通过一次卷积层。 但是,在输入到全连接层之前,需要确保具有相同大小的特征图,因此对每个候选框的特征图进行裁剪,如下图有三个不等大小的特征图,将每个特征图都平均切成 4 等分,取每一部分中最大的值,如下图最底部,就获得了大小相同的特征图了,这个过程就是 SPP 参与的结果。

img如果我们使用 SPP 将边界框划分为固定数量的部分,例如,我们将每个区域划分为 36 个部分,就使用6×6 分割。如果我们选择多级分割,例如,3×3 分割和 6×6 分割,我们称之为 2 级空间金字塔,就得到了 3×3 和 6×6 分割后的特征。在最大池化之后,我们将每个部分的最大值放入一个大小为 3×3 + 6×6 = 45 的向量中,这样不同大小的特征图经过这个金字塔后得到了相同大小的向量。

在 SPPnet 中,它定义了 4级空间金字塔,其大小分别为 1×1, 2×2, 3×3 和 6×6。如果我们遵循上述过程,最终在每一个卷积层通道获得 50 维(1×1 + 2×2 + 3×3 + 6×6 = 50)的向量。总共有 256 个通道,所以我们将得到一个固定大小为 256×50 的特征表示。通过此步骤,我们可以将这些固定大小的特征输入完连接层,并将它们提供给分类器,例如,二进制线性 SVM 分类器。通过这种方式,我们只运行一次CNN。与R-CNN相比,SPPnet 测试时间快 24~102 倍。

(3) Fast R-CNN (Ross Girshick, 2015):

R-CNN的快速版本

在上文中可知 SPP 层可以提高 R-CNN 的效率,但 SPPnet 和 R-CNN 仍然需要分别训练三个模块:CNN模块(特征提取),分类模块( 获得类别得分)和回归模块(收紧边界框)。 这使得训练效率非常低。

Screenshot from 2018-05-05 17-22-08

Fast R-CNN architecture. 图片来源: Ross Girshick, 2015

Fast R-CNN的主要贡献在于它通过 hierarchical samplingmulti-task loss 实现端到端训练 (end to end training)。在训练期间,分层采样随机梯度下降 (SGD) 的 mini batches:首先按照 R / N 来采样 region proposals,其中 N 是 mini batch 数量,R 是图像的总数。以这种方式,来自相同图像的 region proposal 可以在前向和反向传播中共享计算和内存。multi-task loss 将分类损失和边界框回归损失结合在一起,以便它可以同事优化 softmax 分类器和边界框回归器。论文中有更多细节。

Fast R-CNN 使用 Region of Interest (RoI) 池化,如上文所述,它是一个 1 级空间金字塔池。Fast R-CNN 在 PASCAL VOC 2012 上 mAP 提高到 66% (R-CNN, 62%),训练速度提高 9 倍,测试时间提高 213 倍。与 SPPnet 相比,Fast R-CNN 可以将 VGG16 的速度提高 3 倍,测试速度提高10 倍。

roi_pooling-1.gif

2×2 RoI pooling layer 示例. 图片来源: deepsense.ai.

(4) Faster R-CNN (Shaoqing Ren, et al., 2016):

更快,趋向于实时目标检测

根据我们上面讨论的内容,可以看到,对于两阶段目标检测器,我们需要首先生成 region proposals 并获取候选框的位置,然后我们在这些位置应用分类以获得最终检测结果。 在 R-CNN 和 Fast R-CNN 中,region proposals 全部由 Selective search 生成,其大约为 2s / image。 除了选择性搜索,SPPnet 还使用 EdgeBoxes(region proposals 的另一种方法),但它仍然消耗0.2s /image。 region proposals 的计算暴露出一个 bottleneck。 我们需要以更快的速度获得更可靠的 region proposals。

Screenshot from 2018-05-06 11-21-15

The main structure of Faster R-CNN. 图片来源: Shaoqing Ren, et al., 2016

Faster R-CNN 使得实时目标检测又进了一步。 它建立在 Fast R-CNN 的基础上,但用 Region Proposal Network (RPN) 替换掉 Selective search 算法来生成 region proposals。 该网络将任意大小的图像作为输入,每个图像约 10ms 内计算出一组 object proposals。

img

Explanation of Region Proposal Network. 图片来源: Shaoqing Ren, et al., 2016

在RPN中,滑动窗口在最后一个卷积层生成的特征图 (51x39x256)上滑动。在每个滑动窗口的中心,RPN 同时预测具有不同 ratio,不同 scale 的 9 个边界框,称之为 anchors。那么将会得到 (51x39x9=17901) 个候选框,对这些候选框位置的分排序,选择得分靠前的,例如前 2000 个 anchors输入给回归层和分类层。将由分类器和回归器最终检测目标是否出现在框中出现。 更准确地说,RPN 预测 anchor 是背景或前景目标的可能性,并精修 anchor。RPN 与 Fast R-CNN检测网络是统一,可以端到端地训练。Faster R-CNN 接近于实时的检测速度了。使用 VGG16 达到 140ms/frame(7fps),使用 ZF 可以达到 55ms/frame(18fps)。详情参考论文或Faster R-CNN 笔记

(5) Mask R-CNN (Kaiming He, et al., 2017):

倾向于精确的像素级分割

到目前为止,我们已经讨论了边界框格式的目标检测。 但是,边界框仅提供对象的粗略位置。 对于许多机器人任务,不仅要检测对象的位置,还要检查如何与对象进行交互。 这需要在边界框中对对象进行精细分割。 还可以想象,如果两个对象彼此非常接近,它们的边界框可能会重叠很多。 系统需要弄清楚一个边界可能部分覆盖另一个对象。

Screenshot from 2018-05-06 19-35-47

Mask R-CNN framework. 图片来源: Kaiming He, et al., 2017

Mask R-CNN 通过添加 Fully Convolutional Network (FCN) 来解决这个分割 (segmentation) 的问题,FCN 作为第二个分支与基础的 Faster R-CNN 并行运行。这个新分支专注于预测每个感兴趣区域的像素级 mask segmentation,而旧分支 Faster R-CNN 仍然专注于 anchors 点坐标的分类和回归。

然而,如果完全遵循 Faster R-CNN 中的技术,我们将在 Mask R-CNN 中遇到一个问题:在 Faster R-CNN 中,我们使用 region proposal 来裁剪特征图,而特征图通常比原始图像小得多(例如:原始图像为 256 x 256,特征图可能是是 32 x 32)。为了将一个 region of interest “投影” 到一个较小的尺度,我们只需要计算两个尺寸之间的比例,并按比例计算位置。通常,新计算的位置是十进制数,我们将此数字取整(第一次量化)。然后,RoI 池化层再次量化它成一个固定大小的区域(第二量化)。这些粗略的空间量化使得 RoI 和提取的特征之间产生错位。在 Faster R-CNN 中这不是问题,因为它的输入和输出不是 pixel-to-pixel 对准的设计,而这对于 Mask 分支是至关重要的。

Screenshot from 2018-05-06 19-38-55

Bilinear interpolation in RoIAlign. 图片来源: Kaiming He, et al., 2017

Mask R-CNN 提出名为 RoIAlign 的新层来解决这个问题。 它在 “region proposal projection” 之后保留计算位置的浮点数。 然后我们将区域划分为 bins,例如上图中的 RoI 划分为 2x2 的 bins。 对于每个 bin,Mask R-CNN使用来自特征图上的附近网格点的双线性插值 (bilinear interpolation) 来创建 4 个采样点。 然后我们只需要在每个 bin 中取这 4 个点的最大值来完成最大池化。

到目前为止,我们已经讨论了R-CNN 系列,遵循两阶段框架的方法:

  • region proposal 阶段
  • 检测阶段

当然这类算法在检测速度上和训练难度上存在问题,有没有简化的框架?


2. Single Stage Methods — Detection without Proposals

(1) YOLO (v1): You Only Look Once (Joseph Redmon, et al., 2016)

Screenshot from 2018-05-07 10-51-34.png The architecture of YOLO. 图片来源: Joseph Redmon, et al., 2016

YOLO v1 是第一款可在 Titan X GPU 上实现 45fps 速度的实时目标检测器,其更快的版本可达到155fps(在 PASCAL VOC 2007上测试)。 与两阶段方法不同,这种快速检测器背后的核心思想是单个卷积网络,由卷积层和2个完全连接的层组成,同时预测边界框位置和类别。

Screenshot from 2018-05-07 11-21-09.png

Key steps in YOLO. Image resource: Joseph Redmon, et al., 2016

YOLO 将整个图像作为输入,首先将其划分为 S×S 网格。 在该网格的每个单元格中,YOLO 预测 C 个条件类概率 (conditional class probability)。 每个网格单元还预测 N 个边界框和 N 个对应的对象分数,告知每个边界框内是否有对象。 在测试时,条件类概率乘以每个框的对象性得分,给出每个框的 confidence。

YOLO 对全局图像进行操作。 这与基于 region proposals 的方法不同(仅考虑边界框内的特征)。 这种能力使得 YOLO 的背景错误数量少于 Fast R-CNN 的一半。

自 2016 年以来,Joseph Redmon 一直致力于如何提高 YOLO 的准确性。 总共有 v1,v2,v3 三个版本(截至今天)。
关于 YOLO v1 算法详细的可以参考,YOLO 学习总结

(2) SSD: The Single Shot MultiBox Detector (Wei Liu, et al., 2016)

The Single Shoe MultiBox Detector (SSD) 在目标检测领域做出了重要贡献。 它明显优于以前的工作(在PASCAL VOC 2007):** 59fps,mAP为74.3%**, 而 Faster R-CNN:7fps,mAP为73.2%,YOLOv1:45fps,mAP为63.4%。

Screenshot from 2018-05-07 16-11-37.png

SSD framework. Image resource: Wei Liu, et al., 2016

通过将与 Faster R-CNN 和 YOLO v1 进行比较来理解SSD。 类似于通过在 Faster R-CNN 中的特征图上滑动而预测的 anchors,SSD 特征图上的每个单元格预测在各种宽高比 (aspect ratio) 的边界框。 然而,SSD不是使用这些框来裁剪特征并将它们输入分类器,而是同时为每个框中的每个对象类别生成分数。更具体地说,对于每个框,预测框位置和分类分数。

Screenshot from 2018-05-07 16-19-06.png

A comparison between SSD and YOLO. Image source: Wei Liu, et al., 2016

将 SSD 与YOLO v1 进行比较也非常有趣,因为它们都是早期的单阶段检测算法。 SSD 建立在基础网络(早期版本的 VGG 和某些更高版本的 Residual-101)之上,但添加了额外的多尺度卷积特征层 (multi-scale convolutional feature layers),类似于 ResNets 中的跳过连接。 这些层起着重要作用:它们逐渐减小尺寸,并在多个尺度上预测结果。 这意味着我们可以使用高分辨率的特征图来检测小对象和低分辨率的特征图来检测大对象。 SSD 还使用相对低分辨率的输入实现高精度(使用低分辨率输入可以提高检测速度)。 如果您现在回想一下YOLOv1,它只能在单个比例的特征图上运行,如 Joseph Redmon 等人在 2016 年提到的,这是YOLOv1 的一个限制:它很难扩展到在新的或不寻常的宽高比中检测目标。

(3) SSD 和 YOLO 的升级版:

YOLO 和 SSD 之后,又取得了更多的进展,并实现了更先进的性能。 比较重要的包括:

SSD with Recurrent Rolling Convolution (Jimmy Ren, et al., 2017).

回顾一下 SSD。 使用多尺度 multi-scale feature layers,每层中的 feature maps 独立负责其对应 scale 的输出。 可以通过整合来自每个特征层的所有结果来生成最终检测。而 Jimmy Ren,et al. 提出 Recurrent Rolling Convolution(RRC)以通过在所有特征层之间共享计算来改善这种“独立性”,同时保持每个输出结果,用于最终检测。

** DSSD: Deconvolutional Single Shot Detector (Cheng-Yang Fu, et al., 2017)**

Deconvolutional SSD 建立在 SSD 之上,但用 Residual-101 取代了 VGG。 它还添加了额外的反卷积层,以提高 特征图层的分辨率。 通过这种改进,它可以在 VOC007上,6fps,81.5% mAP。

YOLO v2 (2017) & YOLOv3 (2018): Better versions of YOLO

Screenshot from 2018-05-09 15-12-15.png

How to improve YOLO from 63.4 mAP to 78.6 mAP. Image source: YOLO v2 (2017)

Joseph Redmon 通过在 2017 年和 2018 年宣布两个更好的版本来不断改进 YOLOv1。在 YOLOv2 中,在 VOC2007 上 67fps,76.8 mAP。 它通过添加上表中总结的各种想法来改进 YOLOv1。 从 63.4 到 78.6 mAP。

(4) RetinaNet (Tsung-Yi Lin, et al., 2018):

亮点是 The Focal Loss

img

Comparison among state-of-the-art detectors. 图片来源: Tsung-Yi Lin, et al., 2018

现在,快速比较一下两级和单级检测的准确度:在COCO数据集中,最精确的两级检测是 Feature Pyramid Network (FPN),其实现了 36.2% 的AP,同时最精确的单级检测是 Deconvolutional Single Shot Detector (DSSD),仅达到 29.9% 的AP。

从上图可以看出,YOLO,SSD,DSSD 等单级检测器的精度通常低于两级检测器器。这是因为所谓的类别失衡 (class imbalance)。两阶段检测器使用选择性搜索 (Selective search),边缘框 (Edgeboxes) 或 RPN 等方法在第一阶段生成 1k-2k 候选框,可以过滤掉许多背景样本,以确保候选框足够好,然后再将它们输入分类的第二阶段。然而,对于单级检测器,由于网络不知道 box 在哪里,它们必须在每个窗口预测 N 个boxes。为了密集地覆盖空间,对于一个图像,会生成很多不同 scale 和 ratio 的候选位置,总共通常有~10万个候选位置。这些位置包含许多背景区域,这些区域很容易使模型正确分类为无对象。但是,由于我们将所有边界框的损失平均化,因此背景区域对于学习的影响等同于边界框。这使得训练效率低(不是指速度慢,指不能有效的学习到目标相关的有用特征)。为了使网络真正学习更多有效的信息,我们需要有一些重点:网络需要更多地关注难样本 (hard samples),同时花费更少的时间在像背景这样的简单样本上。

为了解决这一类不平衡问题,RetinaNet 提出了一种称为 Focal loss 的新损失函数,它增加了一个依赖概率的权重来幅调交叉熵损失。

img

img

img

二元交叉熵损失 CE(p, y) 中,p 是预测概率,y 是 ground truth 标签,γ 是固定数字(γ= 2在RestinaNet中效果最好)。 可以通过这种方式直观地理解这个等式:如果模型对一个图像有信心,则该图像上的损失权重几乎为零。 这意味着:这个样本对学习没有用,我们需要进一步缩小它。 但是,如果模型第一次看到一个对象,则对估计没有信心,此样本的损失权重会更高,模型知道此样本更重要。

随着这种新的损失,该模型可以更多地关注难样本,而不是关注背景。 这使得 RetinaNet 在COCO数据集上的性能优于以前的单级检测器,精度为 37.8 AP,但速度慢:~5fps。


3. Discussion Part 1: Which detector is better?

我们通常需要在速度和精度之间取得一个平衡。 各种 state-of-art 目标检测算法速度和精度的比较如下。

Screenshot from 2018-05-07 21-52-15

Comparison of different detectors on speed and accuracy on COCO dataset. 图片来源: YOLOv3 (2018)

如图所示,YOLO3 速度最快,但精度最低:22ms/image,28.2 mAP,而单级 RetinaNet 检测器获得精度最高,但速度最慢:198ms/image,37.8mAP。

我们还需要考虑被检测目标的大小。 下图比较了不同物体尺寸时 YOLOv2,SSD 和 Faster R-CNN的性能。

Screenshot from 2018-05-07 17-36-21

Comparison among YOLO, SSD and Faster R-CNN on various object sizes. 图片来源: cv-tricks.com

可以通过查看他们的网络结构来尝试理解这个图表。 上文已经讨论过 SSD 和 YOLO 的局限性。 对于 Faster R-CNN,它使用多个池化层,这意味着当 feature maps 传播到最后一层时,分辨率要小得多。 分辨率低,检测器很难找到小物体的细节。


4. Discussion Part 2: Challenges

对于目标检测面临的挑战。

(1) Unseen Object Categories

img

Could the detector know the objects that it has not seen before? Image source: zero-shot detectors

大多数目标检测依赖于对大量数据集的训练,但如果计算机在训练期间没有见过目标,则他们不知道目标的类别和位置。 对于人类,我们有时可以将这个新对象的物理属性与我们的知识库进行比较并进行粗略猜测。 最近,许多工作如 zero-shot detectors,半监督学习被应用,尽可能少地使用标签来上述的局限性,但它仍然是一项非常困难的任务。个人认为 reinforcement learning 也会是一个趋势。

(2) Reason different objects in the same category

Screenshot from 2018-05-09 17-32-15.png

Can robots distinguish those objects by their unique properties? Image resource

作为机器视觉的研究人员,目标之一是让机器人在我们的日常生活中真正帮助人们。 有时,我们需要机器人找到同一类别中的物体中人类真正需要的东西。 如果我告诉一个机器人:我需要一个盘子来放这个蛋糕。 我希望机器人可以考虑蛋糕的大小并拿起一个小盘子。 同样,我希望机器人可以推理类似类型的物体,但不同的颜色,形状,图案,位置,材料等有较小的差异的物体,比如区分大白菜和娃娃菜。

(3) Task-driven Detections:

Attention 是很有趣的。 对于人类而言,即使在同一图像上,我们的关注点也会有很大差异。 这是因为我们有不同的(a)目的和兴趣(b)背景和过去的经历(c)情绪等等。想知道 intention-driven 的目标检测能否使检测变得更加智能。 我对 intention-driven 的理解是:根据我们的目的直接或间接地检测我们需要注意的那些目标。 例如,如果我们的目的是将车停在商店附近,但没有空位。 系统能否注意(a)刚从商店出来并走向某辆停着的汽车(b)有车的人? 这样我就可以试着等待,如果真的是他买完东西准备开车离开,那就很幸运,我有一个空位了。对于医学图像分析也很重要:系统能否定位到图像中需要更多关注的某些部分? 这可以帮助医生更快地诊断患者。

Of course, there are still many unsolved topics in this area and there is still a long way towards human-level object detection.

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值