购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

第1章
目标检测架构浅析

通常,在正式迈入一个技术领域之前,往往先从宏观的、感性的层面来认识和了解它的发展脉络是很有益处的,因此,在正式开始学习YOLO [1-3] 系列工作之前,不妨先从宏观的角度来了解一下什么是“目标检测”,了解它的发展简史、主流框架以及部分经典工作。拥有这些必要的宏观层面的认识对于开展后续的学习也是极其有益的。本章将从目标检测发展简史和当前主流的目标检测网络框架两大方面来讲一讲这一领域的发展技术路线。

1.1 目标检测发展简史

在深度学习时代到来之前,研究者们对目标检测的研究路线基本可以划分为两个阶段,先从图像中提取人工视觉特征(如HOG),再将这些视觉特征输入一个分类器(如支持向量机)中,最终输出检测结果。

以现在的技术眼光来看,这种做法十分粗糙,但是已经基本能够满足那时实时检测的需求,并且已经在一些实际场景的业务中有所应用,但那主要得益于人体结构本身不算太复杂、特点鲜明,尤其是行走中的人的模式几乎相同,鲜有“奇行种”。不过,想做出一个可靠的通用目标检测器,识别更多、更复杂的物体,则存在很大的困难,在作者看来,造成这种困难的最根本的原因是我们难以用一套精准的语言或数学方程来定义世间万物。显然,要检测的物体种类越多,模型要学会的特征就越多,仅靠人的先验所设计出的特征算子似乎无法满足任务需求了。

直到2014年,一道希望之光照射进来,拨开了重重迷雾。

2014年,著名的R-CNN [4] 问世,不仅大幅提升了当时的基准数据集PASCAL VOC [12] 的mAP指标,同时也吹响了深度学习进军基于视觉的目标检测(object detection)领域的号角。从整体上来看,R-CNN的思路是先使用一个搜索算法从图像中提取出若干 感兴趣区域 (region of interest,RoI),然后使用一个 卷积神经网络 (convolutional neural network,CNN)分别处理每一个感兴趣区域,提取特征,最后用一个支持向量机来完成最终的分类,如图1-1所示。

图1-1 R-CNN检测流程

通常,搜索算法会先给出约2000个感兴趣区域,然后交给后续的CNN去分别提取每一个感兴趣区域的特征,不难想象,这一过程会十分耗时。为了解决这一问题,在R-CNN工作的基础上,先后诞生了Fast R-CNN [13] 和Faster R-CNN [14] 这两个工作,如图1-2所示,迭代改进了R-CNN这一检测框架的各种弊端,不断完善R-CNN“先提取,后识别”的检测范式。这一检测范式后被称为“两阶段”(two-stage)检测,即 先提取出可能包含目标的区域,再依次对每个区域进行识别,最后经过处理得到最终的检测结果

图1-2 R-CNN家族图谱

而在2015年,又一个革命性的工作—YOLO(You Only Look Once) [1] 问世。不同于R-CNN的两阶段检测范式,YOLO的作者团队认为,提取候选区域(定位)和逐一识别(分类)完全可由一个单独的网络来同时完成,无须分成两个阶段,不需要对每一个特征区域进行依次分类,从而能够减少处理过程中的大量冗余操作,如图1-3所示。

图1-3 YOLOv1检测流程

显然,在这一技术理念下,YOLO只需对输入图像处理一次,即可获得最终的检测结果,因而YOLO在检测速度上具有天然的优势。YOLO所采用的这种端到端的检测方式将定位和分类耦合在一起,同步完成,因此,这类工作被称为“单阶段”(one-stage)检测。显然,相较于以R-CNN为代表的两阶段检测范式,YOLO这类单阶段检测框架理应更加高效、简洁。

在这样的设计理念下,YOLO凭借着其在TITAN X型号的GPU上以每秒处理超过40张图像的检测速度(即40 FPS)超越了当时所有的通用目标检测器。尽管YOLO的检测性能要略逊于当时最新的Faster R-CNN检测器,但其显著的速度优势使其成为一个可以满足实时检测需求的通用目标检测器,许多研究者看到了这一检测器背后所蕴含的性能潜力和研究价值。此后,YOLO以其在检测速度和模型架构上的显著优势一鸣惊人,掀开了目标检测领域的新篇章。

也正是在YOLO框架大火之后,目标检测领域正式诞生了以下两大流派:

● 以R-CNN为代表的two-stage流派;

● 以YOLO为首的one-stage流派。

通常情况下,two-stage框架往往检测精度较高而检测速度却较慢,one-stage框架则恰恰相反,往往检测精度较低但检测速度较快。在很多计算机视觉任务中,精度和速度总是矛盾的,因而促使研究者尝试从二者的矛盾中寻求一个较为平衡的解决方案。随着后续研究者们的不断思考、探索和尝试,如今的one-stage检测框架几乎兼具了性能和速度两方面的优势,实现了极为出色的性能上的平衡。

纵观科学发展史,“大道至简”和“奥卡姆剃刀”原理往往是有效的。也许正因如此,广大研究者和工程师才更加青睐one-stage框架,投入更多的科研精力和资源去优化这一框架,使其得到了长足的发展。这一点从每年发表在计算机视觉顶级会议的目标检测工作中可见一斑,one-stage框架相关工作占据了很大的比重,如SSD [16] 、RetinaNet [17] 和FCOS [18] 等。近来,这一套框架又由方兴未艾的基于Transformer [5] 的DETR系列 [6,7] 做了一次大幅度的革新。可以认为,目标检测的one-stage框架以其更简洁、更具潜力等优势已经成为这一领域的主流框架。

因此,在入门目标检测领域时,学习one-stage框架相关工作是更为契合主流的选择。

注意:

尽管基于深度学习的方法成为了这一领域的主流,但我们不难发现,基于深度学习的方法仍旧延续着传统方法的工作框架,即 先提取特征,再进行分类和定位 。只不过这两部分现在都被神经网络代替了,无须人工设计。因此,虽然传统计算机视觉方法在许多方面被基于深度学习的方法所超越,但其思想仍值得我们借鉴和思考。

1.2 目标检测网络框架概述

从深度学习时代开始,目标检测网络的框架也逐渐地被确定了下来。一个常见的目标检测网络往往可以分为三大部分: 主干网络 (backbone network)、 颈部网络 (neck network)和 检测头 (detection head),如图1-4所示。

图1-4 目标检测网络的组成

主干网络。 主干网络是目标检测网络中最核心的部分,其关键作用就是提取输入图像中的高级特征,减少图像中的冗余信息,以便于后续的网络去做深入的处理。在大多数情况下,主干网络选择的成败对检测性能的影响是十分巨大的。

颈部网络。 颈部网络的主要作用是将由主干网络输出的特征进行二次处理。其整合方式有很多,最为常见的就是 特征金字塔网络 (feature pyramid network,FPN) [19] ,其核心是将不同尺度的特征进行充分的融合,以提升检测器的多尺度检测的性能。除此之外,还有很多单独的、可即插即用的模块,如 RFB [20] 、ASPP [21] 和YOLOv4 [8] 所使用的SPP模块等,这些模块都可以添加在主干网络之后,以进一步地处理和丰富特征信息,扩大模型的感受野。

检测头。 检测头的结构相对简单,其主要作用就是提取类别信息和位置信息,输出最终的预测结果。在某些工作里,检测头也被称为 解码器 (decoder),这种称呼不无道理,因为检测头的作用就是从前两个部分所输出的特征中提取并预测图像中的目标的空间位置和类别,它相当于一个解码器。

总而言之,从宏观角度来看,几乎任何一个检测器都可以分为以上三大部分,如此的模块化思想也有助于我们为其中的每一部分去做改进和优化,从而提升网络的性能。接下来,我们再从微观角度来依次讲解目标检测网络的这三大部分。

1.3 目标检测网络框架浅析

在1.2节中,简单介绍了当前常见的目标检测网络框架的基本部分:主干网络、颈部网络和检测头。本节将详细介绍每一个组成部分。

1.3.1 主干网络

为了检测出图像中目标的类别和位置,我们会先从输入的图像中提取出必要的特征信息,比如HOG特征。不论是基于传统方法还是深度学习方法,提取特征这一步都是至关重要的,区别只在于提取的方式。然后利用这些特征去完成后续的定位和分类。在深度学习领域中,由于CNN已经在图像分类任务中被证明具有强大的特征提取能力,因而选择CNN去处理输入图像,从中提取特征是一个很自然、合理的做法。在目标检测框架中,这一部分通常被称为 主干网络 。很多时候,一个通用目标检测器的绝大部分网络参数和计算都包含在了主干网络中。

由于深度学习领域本身的“黑盒子”特性,很多时候我们很难直观地去理解CNN究竟提取出了什么样的特征,尽管已经有一些相关的理论分析和可视化工作,但对于解开这层面纱还是远远不够的。不过,已经有大量的工作证明了这一做法的有效性。

从某种意义上来说,如何设计主干网络是至关重要的,这不仅因为主干网络占据了一个目标检测器的计算量和参数量的大部分,还因为提取的特征的好坏对后续的分类和定位有着至关重要的影响。在应用于目标检测任务之前,深度学习技术就已经在图像分类任务中大放光彩。尤其是在VGG [22] 和ResNet [23] 工作问世后,图像分类任务几乎达到了顶峰—从不再举办ImageNet比赛这一点就可见一斑。虽然这个领域还在陆陆续续地出现新的工作,诞生了很多出色的主干网络,但当年百花齐放的盛况已成为历史。

深度学习技术能够如此出色地完成图像分类任务,充分表明了这一新技术确实有着不同凡响的特征提取能力。另外,由于ImageNet是图像分类领域中最大的数据集,包含百万张自然图像,因而许多研究者认为经过该数据集训练后的CNN已经充分学会了如何提取“有用”的特征,这对于包括目标检测、语义分割、实例分割等在内的下游任务是有益的。以目标检测任务为例,尽管图像分类任务和目标检测任务有着明显区别,但二者又有着一定的相似性: 都需要对图像中的目标进行分类 。这种相似性为研究者们带来了这样的启发: 能否将训练好的分类网络(如ResNet等)迁移到目标检测网络中呢 ?在经过这样的思考后,一些研究者们便将在 ImageNet数据集上训练好的分类网络做一些适当的调整—去掉最后的global avgpooling层和Softmax层后,便将其作为目标检测网络中的主干网络,并使用在ImageNet数据集上训练好的参数作为主干网络的初始化参数,即“预训练权重”。这一模式也就是后来所说的“ImageNet pretrained”。

大量的工作已经证明,这一模式是十分有效的,可以大大加快目标检测网络在训练过程中的收敛速度,也可以提升检测器的检测性能。虽然主干网络起初并不具备“定位”的能力,但依靠后续添加的检测头等其他网络层在目标检测数据集上的训练后,整体的网络架构便兼具了“定位”和“分类”两大重要能力,而主干网络所采用的预训练权重参数又大大加快了这一学习过程。自此,许多目标检测模型都采用了这样一套十分有效的训练策略。

然而,2019年的一篇重新思考经过ImageNet预训练的模式的论文 [24] 以大量的实验数据证明了 即使不加载预训练权重,而是将主干网络的参数随机初始化,也可以达到与之相媲美的性能 。但为了达到此目的,需要花更多的时间来训练网络,且数据集本身也要包含足够多的图像和训练标签,同时,对于数据预处理和训练所采用的超参数的调整也带来了一定的挑战。这样的结论似乎是很合理的,正所谓“天下没有免费的午餐”(早餐和晚餐也不免费),既然设计了一个主干网络,若是不想在ImageNet数据集上预训练,那么自然就要在目标检测数据集上投入更多的“精力”。因此,目前经过ImageNet预训练的模式仍旧是主流,后续的研究者们还是会优先采用这一套训练模式,来降低研究的时间成本和计算成本。

最后,简单介绍5个常用的主干网络模型。

VGG网络。 常用的VGG网络 [22] 是VGG-16网络。由于其结构富有规律性,由简单的卷积块堆叠而成,因此备受研究者们的青睐。VGG网络也打开了“深度”卷积神经网络的大门,是早期的深度卷积神经网络之一。早期的Faster R-CNN和SSD都使用了这一网络作为主干网络。

ResNet网络。 ResNet [23] 是当下最主流、最受欢迎的网络之一。常用的ResNet是ResNet-50和ResNet-101。ResNet的核心理念是“残差连接”(residual connection),正是在这一理念下,此前令许多研究者困扰的“无法训练大模型”的问题得到了有效的解决。自ResNet工作之后,如何设计一个深度网络已经不再是难题,并且这一系列的工作已在多个计算机视觉领域中大放光彩,其残差思想也启发了其他领域的发展。

DarkNet网络。 DarkNet系列主要包含 DarkNet-19和DarkNet-53两个网络,它们分别来源于YOLOv2 [2] 和 YOLOv3 3] 这两个工作。但由于DarkNet本身是很小众的深度学习框架,且这两个网络均是由DarkNet框架实现的,因此使用这两个主干网络的频率相对较低。

MobileNet网络。 MobileNet系列的工作由谷歌公司团队一手打造,目前已经推出了MobileNet-v1 [25] 、MobileNet-v2 [26] 和 MobileNet-v3 [27] 这3个版本。MobileNet系列的核心技术点是 逐深度卷积 (depthwise convolution),这一操作也是后来绝大多数轻量型CNN的核心操作。相较于前面介绍的以GPU为主要应用平台的大型主干网络,MobileNet着眼于低性能的移动端平台,如手机、无人机和其他嵌入式设备等。

ShuffleNet网络。 ShuffleNet系列由旷视科技公司团队一手打造,目前已经推出了ShuffleNet-v1 [28] 和 ShuffleNet-v2 [29] 两个版本,同样是针对低性能的移动端平台设计的轻量型网络,其核心思想是 通道混合 (channel shuffle),其目的是通过将每个通道的特征进行混合,弥补逐深度卷积无法使不同通道的信息进行交互的缺陷。

还有很多出色的主干网络,这里就不一一列举了。有关主干网络的更多介绍,感兴趣的读者可自行查阅相关资料。

1.3.2 颈部网络

1.3.1节已经介绍了目标检测模型中的主干网络,其作用可以用一句话来总结: 提取图像中有用的信息 。当然,“有用的信息”是一种笼统的描述,尚不能用精确的数学语言来做定量的解释。另外,由于主干网络毕竟是从图像分类任务中迁移过来的,在大多数情况下,这些网络的设计很少会考虑到包括目标检测、语义分割等下游任务,它们提取的特征也就有可能不太适合目标检测任务。因此,在主干网络处理完毕之后,仍有必要去设计一些额外的模块来对其特征做进一步的处理,以便适应目标检测任务。因为这一部分是在主干网络之后、检测头之前,因此被形象地称为 颈部网络

相较于主干网络常使用ImageNet预训练参数,颈部网络的参数的初始化没有太多需要解释的。既然颈部网络的作用是整合主干网络的信息,可供研究者们自由发挥的空间也就大得多,很多颈部网络被相继提了出来。这里我们介绍两种常见的颈部网络。

特征金字塔网络。 特征金字塔网络(feature pyramid network,FPN) [19] 是目前目标检测领域最有名的结构之一,几乎是当下目标检测网络的标准配置,其多尺度特征融合与多级检测思想影响了后续许多目标检测网络结构。FPN认为网络中的不同大小的特征图所包含的信息是不一样的,即浅层特征图包含更多的位置信息,且分辨率较高,感受野较小,便于检测小物体;而深层特征图包含更多的语义信息,且分辨率较低,感受野较大,便于检测大物体。因此,FPN设计了一种自顶向下的融合方式,将深层的特征不断融合到浅层特征中,通过将浅层与深层的信息进行融合,可以有效地提升网络对不同尺度物体的检测性能。图1-5展示了特征金字塔网络的结构。

图1-5 特征金字塔网络的结构

空间金字塔池化模块。 虽然最早的空间金字塔池化(spatial pyramid pooling,SPP)模块是由Kaiming He团队 [30] 在2015年提出的,但在目标检测任务中常用的SPP模块则是由YOLOv3工作的作者团队所设计的SPP结构,包含4条并行的分支,且每条分支用了不同大小的池化核。SPP结构可以有效地聚合不同尺度的显著特征,同时扩大网络的感受野,进而提升模型的性能。SPP模块是一个性价比很高的结构,被广泛地应用在YOLOv4、YOLOv6和YOLOv7等工作中。图1-6展示了SPP模块的网络结构。

还有很多出色的颈部网络,这里就不一一展开细说了,感兴趣的读者可以自行搜索学习。

图1-6 SPP模块的网络结构

1.3.3 检测头

当一张输入图像经过主干网络和颈部网络两部分的处理后,得到的特征就可以用于后续的检测了。大多数的检测框架所采用的技术路线都是在处理好的特征图上,通过部署数层卷积来完成定位和分类。对于这一部分,由于其目的十分明确,而前面两部分已经做了充分的处理,因此检测头的结构通常十分简单,没有太多可发挥的空间,图1-7展示了RetinaNet的网络结构,RetinaNet采用了“解耦”结构的检测头,这是当前目标检测网络中常用的一种检测头结构,它由两条并行的分支组成,每一条分支都包含若干层普通卷积、非线性激活函数以及用于最终预测的线性卷积层。

图1-7 RetinaNet的网络结构(摘自论文 [17]

1.4 小结

本章主要介绍了目标检测领域的发展简史,并着重地讲解了当前主流目标检测网络的组成:主干网络、颈部网络和检测头。通过这一章的学习,读者可以基本了解什么是目标检测,摸清这一领域发展的基本脉络,尤其是能够建立起对当前的主流目标检测网络框架的宏观认识。这一点是十分重要的,很多后续的改进工作都是从这三部分出发,提出各种修改。同时,这种模块化的思想也有助于我们去学习新的目标检测知识和搭建一个完整的目标检测网络框架。 Sc/aO9vYprrFlVNBaiYrIRDg7Rua7Xfj/E6XJAI4BZuh8yoqRa0D4R+Cc9Mv9FsY

点击中间区域
呼出菜单
上一章
目录
下一章
×