YOLO目标检测

978-7-115-62709-4
作者: 杨建华李瑞峰
译者:
编辑: 傅道坤

图书目录:

详情

本书主要介绍基于视觉的YOLO框架的技术原理和代码实现,并讲解目标检测领域中的诸多基础概念和基本原理,在YOLO框架的基础上介绍流行目标检测框架。本书分为4个部分,共13章。第1部分介绍目标检测领域的发展简史、主流的目标检测框架和该领域常用的数据集。第2部分详细讲解从YOLOv1到YOLOv4这四代YOLO框架的网络结构、检测原理和训练策略,以及搭建和训练的YOLO框架的代码实现。第3部分介绍两个较新的YOLO框架——YOLOX和YOLOv7,着重讲解其设计理念、网络结构和检测原理。第4部分介绍DETR、YOLOF和FCOS在内的流行目标检测框架和相应的代码实现。本书侧重目标检测的基础知识,包含丰富的实践内容,是目标检测领域的入门书,适合对目标检测领域感兴趣的初学者、算法工程师、软件工程师等人员学习和阅读。

图书摘要

版权信息

书名:YOLO目标检测

ISBN:978-7-115-62709-4

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。


版  权

著    杨建华 李瑞峰

责任编辑 傅道坤

人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

读者服务热线:(010)81055410

反盗版热线:(010)81055315

内 容 提 要

本书主要介绍基于视觉的YOLO框架的技术原理和代码实现,并讲解目标检测领域中的诸多基础概念和基本原理,在YOLO框架的基础上介绍流行目标检测框架。

本书分为4个部分,共13章。第1部分介绍目标检测领域的发展简史、主流的目标检测框架和该领域常用的数据集。第2部分详细讲解从YOLOv1到YOLOv4这四代YOLO框架的网络结构、检测原理和训练策略,以及搭建和训练的YOLO框架的代码实现。第3部分介绍两个较新的YOLO框架—YOLOX和 YOLOv7,着重讲解其设计理念、网络结构和检测原理。第4部分介绍DETR、YOLOF和FCOS在内的流行目标检测框架和相应的代码实现。

本书侧重目标检测的基础知识,包含丰富的实践内容,是目标检测领域的入门书,适合对目标检测领域感兴趣的初学者、算法工程师、软件工程师等人员学习和阅读。

前  言

我本人很喜欢物理学家费曼先生,尤其是他的科学精神,我的治学过程受他的启发很大。当我涉足一个新的知识领域时,只有当我能够完全推导出这个知识领域的知识框架时,才会认为自己已经学会并掌握了这个知识。

在我第一次投入目标检测领域时,首要建立的就是这一领域的知识体系。然而,我发现如此热门的领域竟然连一本较为系统的、理论与实践相结合的入门书都没有。虽然能够在网上搜索到很多带有“目标检测”字眼的技术图书,可是读上几章就发现前半部分充斥着太多机器学习和深度学习的基础概念和公式,等熬过阅读这些基础内容的时间,充满期待地去读后半部分时,却又觉得干货太少,大多时候只停留在对某个流行的目标检测框架已开源代码的讲解,以大量篇幅介绍怎么训练开源代码,怎么测试开源代码,又怎么在自己的数据集上使用开源代码。当我想了解设计一个目标检测网络的方法、制作训练所需的正样本的原理及其实现方法、损失函数的原理、一个目标检测框架的逻辑的时候,我就迷失在了这些文字的汪洋大海里。

相反,在很多技术大牛的博客文章和一些技术论坛中,我逐步掌握了一些工作的技术内核,学习了他们搭建网络的技术路线、制作正负样本的数学原理、各种损失函数的效果和目标检测框架的内在逻辑等知识。在有了这些技术基础后,通过不断地模仿和思考,我也逐渐写出了一套自己的目标检测项目代码,这对我日后去阅读新的目标检测论文、开展前沿工作、上手开源代码都带来了很大的帮助。这不仅让我掌握了一些微观上的操作细节,也让我对目标检测领域有了宏观上的把握。

但是,当我再回顾自己这段学习的心路历程时,还是觉得这样的学习方式,诸如选择适合初学者的论文、选择通俗易懂又全面的科普文章等,具有太多的偶然性。如果迟迟没有找到合适的文章,那就不能理解什么是YOLO检测器,什么又是Detection with Transformers框架。同时,大多数开源代码的上手难度较高,“九曲十八弯”的嵌套封装往往让初学者刚上手就迷失在了一次又一次的代码跳转里,更不用说要将一堆堆零散的知识串联成一个可以印刻在大脑里的认知框架。

在我写下这段文字时,深度学习仍旧是以实践为主,它的重要分支—目标检测也依旧是以实践为主的研究领域,但很多相关图书往往只停留在基础知识的讲解上,所使用的代码也是网上现成的开源代码,这对于初学者来说通常是不友好的。

在某个闲暇的傍晚,我仰靠在实验室工位的椅子上,思索着刚看完的论文,正被其中云山雾绕般的复杂理论所困扰,那一刻,灿烂的夕阳照亮了灰白的天花板,一切都被温暖的橘色所笼罩,焕发出鲜活的色彩。我坐直身子,凝视着窗外远处被柔和的夕阳所点缀的大楼,心旷神怡。忽然间,我萌生了写一系列我所认可的目标检测科普文章的念头,其中既包括对经典论文的解读,又包括原理层面的讲解,最重要的是提供一套可复现的代码,让读者能够从编写代码的角度进一步加深对目标检测的理解,最终将那些我所认为的偶然性都变成必然性。

于是,我开始在知乎上写相关的文章。那时候,我对YOLO很感兴趣,这也是目标检测领域最热门的目标检测架构,因而我选择通过写YOLO相关的科普文章来讲解我所了解的目标检测领域的基础知识。

渐渐地,随着自己对YOLO的认识、对目标检测领域认识的不断加深,我写的科普文章越来越多,内容也越来越详细。同时,随着我代码功底的提升,与科普文章配套的代码实现也越来越丰富。我对自己的科普工作有3点要求:相关论文必须读透、科普内容必须翔实、代码实现必须亲自动手。尤其是第三点,在我看来,是很多科普文章所缺乏的,这些文章最多就是放上已有的开源代码来补充内容。或许,正是因为很多读者能够在我的科普文章中既习得了感兴趣的技术原理,又获得了一份可以运行的、可读性较高的代码,理论与实践相结合,避免了纸上谈兵,所以读者对我的一些文章给出了积极评价和赞赏。

在这两年时间中,我坚持跟进目标检测领域的技术发展,在业余时间里动手实现每一个感兴趣的模块甚至是整个网络架构,配合自己的代码做深度的论文讲解,因此我写出的科普文章越来越多,还创建了以YOLO为核心的目标检测入门知乎专栏。尽管在如今这个讲究“快”的时代,一点一点学习基础知识可能不如直接在现有工作的基础上做一些“增量式改进”来得实在,但我还是坚持自己的理念,继续进行这方面的科普工作。

如今,在人民邮电出版社编辑的赏识下,我有幸能够将这些年来的科普文章汇总成一本技术图书,对我来说,这是对我科普工作的一大肯定。我很希望本书能够填补该领域中入门图书的空白,为初学者提供一个较好的入门资料。同时,也由衷地希望这本书能够抛砖引玉,引来更多的专业人士拨冗探讨,引导后人。

那么,回到这本书所要涉猎的技术领域:什么是目标检测(object detection)?

在计算机视觉领域中,目标检测是一个十分基础的计算机视觉问题,是图像分类(image classification)这个相对简单且更基础的任务的诸多下游任务中的一个重要分支。在图像分类任务(如图0-1所示)中, 我们设计一个分类器(classifier)模型,期望这个分类器能够识别出给定图像的类别,例如输入一张有关猫的图像,我们希望分类器能够判别出输入图像中的目标是一只猫,如图0-1所示。

图0-1 图像分类任务

不过,尽管能够识别出“猫”这一类别,但对于其所处的空间位置却几乎是不知道的。因此,图像分类任务有着明显的局限性。不同于图像分类任务,在目标检测任务中,我们需要设计一个检测器(detector)模型,期望这个检测器能够识别出图像中我们所感兴趣的目标,这里对于“识别”的定义既包括识别出每个目标的类别,又要定位出每个目标在图像中的位置。例如,输入一张图像,如图0-2所示,我们希望检测器能够识别出图像中的“猫”和“电视机”,并采用边界框的形式来标记目标在图像中所处的空间位置。

图0-2 目标检测任务

乍一看,这样的任务对人类来说是一件易如反掌的事情,多数人几乎不需要经过相关的培训和训练,即可识别和定位出现于我们视野中的物体。然而,就是这么一个对人类来说再简单不过的任务,对计算机而言,却是十分困难的。

直到21世纪初,随着深度学习中的卷积神经网络(convolutional neural network,CNN)技术的兴起,目标检测才得到了长足的发展。尽管在此之前,已经出现了一批基于传统人工视觉特征(如HOG特征)的方法,然而目标检测在真正意义上的突破还是从深度学习时代开始的。

目标检测发展至今,可以说是百家争鸣,百花齐放,不同的算法有着不同的特色和优势,倘若我们一一讲来,这将会是一本长篇且有趣的综述类图书。但同时也会使这本书变得厚重无比,成为长期放于书架、与尘土作伴的“大部头”。这并不是我的初衷。

不论是哪一个科学领域,总会有几个代表性的工作时常被人提起。在目标检测领域中,YOLO(You Only Look Once)便是这样的工作之一。YOLO是一个具有里程碑意义的存在,以在GPU上的实时检测速度和简洁的网络架构两大特点而一鸣惊人,打破了R-CNN系列工作的神话,结束了基于two-stage方法的检测框架的统治时代,掀开了基于深度学习的目标检测领域的新篇章,创建了新的目标检测范式,为这一领域注入了新鲜的、更具有潜在研究价值的新模式。在后续许多出色的工作中,我们都能够看到YOLO的影子。

时至今日,YOLO网络已从最开始的YOLOv1发展出YOLOv2、YOLOv3和YOLOv4等多个版本。在GitHub上,由非YOLO官方团队实现的YOLOv5也备受研究者的青睐,以及由旷视科技公司发布的YOLOX再度将YOLO工作推向了新的高峰。2022年,美团公司发布的工业部署友好型的YOLOv6和YOLOv4的作者团队新推出了YOLOv7,再一次刷新了YOLO系列的性能上限。随着这些优秀的研究者们不断致力于优化和改善YOLO框架,YOLO几乎成了目标检测任务的代名词,是当前目标检测社区较活跃,也是较受欢迎的工作。或许终有一天,YOLO将被这个时代所抛弃,但在目标检测发展史中,YOLO所筑下的里程碑将永远屹立。

正因如此,我斗胆选择以YOLO为核心,写下这本以“入门目标检测”为宗旨的技术图书。本书可能是第一本以实践为出发点来讲解YOLO网络的教程类图书,也是一本对初学者较友好的目标检测入门书。同时,请允许我以这么一本基础书来为各位读者抛砖引玉。

本书的组织结构

本书包含四大部分,共13章。以下是本书各章内容的简要介绍。

第1部分是“背景知识”,涉及第1章、第2章的内容。

第1章,“目标检测架构浅析”。详略得当地介绍了自深度学习时代以来的目标检测的发展简史,以简略的笔墨向读者铺开这一技术发展的画卷。在这一章中,作者列出了若干经典的目标检测框架,如R-CNN系列和YOLO系列,讲述了当前目标检测领域的两大技术流派:两阶段和单阶段。同时,介绍了当前流行的目标检测架构,包含主干网络、颈部网络和检测头三大部分,这为以后的改进和优化工作提供了较为清晰的路线和准则。目标检测发展得已较为成熟,由于篇幅有限,作者无法将每一部分的所有工作都罗列出来,因此只能挑选其中极具代表性的工作进行介绍。在了解了相关原理后,建议读者顺藤摸瓜地去了解更多的相关工作,丰富知识体系。

第2章,“常用的数据集”。介绍了目标检测领域常用的两大数据集:PASCAL VOC数据集和MS COCO数据集,其中,MS COCO数据集是最具挑战性的、当下诸多论文中必不可少的重要数据集之一。了解这些数据集的基本情况,是入门目标检测领域的基本功之一,有助于读者开展后续工程或学术方面的工作。

第2部分是“学习YOLO框架”,涉及第3章~第8章的内容。

第3章,“YOLOv1”。详细讲解经典的YOLOv1工作,包括网络结构、检测原理、训练中的标签分配策略、训练模型的策略以及前向推理的细节。通过本章的学习,读者将正式迈过目标检测领域的门槛,对目标检测任务建立基本的认识,掌握基于YOLO框架的检测技术路线,这有助于开展后续的学习和研究工作。

第4章,“搭建YOLOv1网络”。在第3章所学习的YOLO相关知识的基础上,通过对YOLOv1的网络结构做适当的改进,着手编写相关的网络结构的代码。本章的代码实现环节将有助于提升读者对目标检测框架的认识,使其对如何基于现有的深度学习框架搭建目标检测网络有一定的基本了解。

第5章,“训练YOLOv1网络”。本章进一步编写YOLOv1的项目代码,在第4章的基础上,本章主要编写读取数据、预处理数据、搭建模型、实现标签匹配、实现训练和测试代码以及可视化检测结果等诸多代码实现内容。通过学习本章,读者将对如何搭建一个目标检测框架并实现训练和测试等必要的功能有一个较为清晰的认识。这些认识也将对读者日后开展深入研究、快速掌握其他开源代码的架构起着很大的作用。

第6章,“YOLOv2”。介绍了自YOLOv1之后的新一代YOLOv2网络,着重介绍了YOLOv2所采用的各种改进和优化方式,有助于读者了解包括批归一化层、先验框、多尺度训练等在内的关键技术。这些技术都是当前主流的目标检测框架中不可或缺的部分。同时,还对YOLOv2做了一次复现,有助于读者从代码实现的角度进一步加深对YOLOv2的认识,同时巩固搭建目标检测项目的代码能力。

第7章,“YOLOv3”。介绍了YOLOv3检测框架的技术原理和细节。自YOLOv3开始,YOLO系列工作的整体面貌就基本确定下来:强大的主干网络和多尺度检测架构。这两点在后续的每一代YOLO检测器中都能清晰展现。同时,也讲解了YOLOv3的代码实现,完成对复现的YOLOv3的训练和测试。

第8章,“YOLOv4”。介绍了YOLOv4检测框架的技术原理和细节,着重介绍了相较于YOLOv3的诸多改进。同时,也讲解了复现YOLOv4的相关代码实现,进一步引导读者从实现的角度加深对YOLOv4的认识和理解,帮助读者巩固和强化对一个完整的目标检测项目代码的认知和实现能力。

第3部分是“较新的YOLO框架”,涉及第9章、第10章的内容。

第9章,“YOLOX”。介绍了新一代的YOLO框架,讲解了YOLOX对YOLOv3的改进以及新型的动态标签分配,并动手实现了一款较为简单的YOLOX检测器。

第10章,“YOLOv7”。介绍了YOLOv7检测框架的技术原理,主要介绍了YOLOv7所提出的高效网络架构的实现细节,并动手实现了一款较为简单的YOLOv7检测器。

第4部分是“其他流行的目标检测框架”,涉及第11章、第12章和第13章的内容。

第11章,“DETR”。介绍了掀起Transformer在计算机视觉领域中的研究浪潮的DETR,讲解了DETR的网络结构,并通过讲解相关的开源代码来展现DETR的技术细节。

第12章,“YOLOF”。介绍了新型的单级目标检测网络,讲解了YOLOF独特的网络结构特点和所提出的标签匹配,并通过代码实现的方式复现了YOLOF,进一步增强读者的代码能力。

第13章,“FCOS”。介绍了掀起无先验框检测架构研究浪潮的FCOS检测器,填补了前文对于无先验框技术框架的空白,加深了读者对无先验框检测架构的理解和认识。FCOS是这一架构的经典之作,也是常用的基线模型,同时,无先验框技术框架也是当下十分受欢迎的框架。

本书特色

1. 较为全面的YOLO系列内容解读

本书以YOLO系列为核心,围绕这一流行的通用目标检测框架来开展本书的技术讲解、代码实现和入门知识科普等工作。本书翔实地讲解了自YOLOv1到YOLOv4的发展状况和相关技术细节。尽管在本书成稿时,YOLOv4已经算是“古董”了,但即便是这样一个“古董”,最新的YOLO检测器也没跳出YOLOv4的技术框架,无非是在每一个模块中采用了最新的技术,但其基本架构是一模一样的。因此,在学习YOLOv4后,就能在宏观上对YOLO框架的发展有足够清晰的认识,同时在微观上了解和掌握相关的技术细节,为日后读者自学更新的YOLO检测器做足了相关知识储备,也为后续的改进和优化夯实了基础。书中也提供了大量图片以帮助读者更加直观地理解YOLO系列。

2. 作者编写的开源代码

完整、可复现的开源代码是本书最大的亮点。本书不仅详细地讲解了YOLO系列所涉及的理论知识,更是在此基础上编写了大量的相关代码。正所谓“纸上得来终觉浅,绝知此事要躬行”,只有通过阅读代码、编写代码和调试代码,才能对YOLO具备更加全面的认识,而这些认识又会为入门目标检测领域提供大量的正反馈。本书的绝大多数代码是由作者亲手编写,部分实现也借鉴了现有的开源代码,而非简单地借用或套用已开源的YOLO项目代码作为范例,或者投机取巧地解读YOLO开源项目。每一次代码实现环节都对应一份完整的目标检测项目代码,而非零散的代码块,其目的是让读者能够一次又一次地建立起对完整的目标检测项目的认识。本书的诸多经验和认识都是建立在作者编写的大量丰富代码的基础上,使得读者既能够在阅读此书时对YOLO建立起一个感性认识,同时又能够通过阅读、模仿、编写和调试代码建立起对YOLO的理性认识。

3. 经典工作的解读和代码实现

除YOLO之外,本书还讲解了流行的目标检测框架(如DETR、YOLOF和FCOS),同时,也提供了由作者编写的完整的项目代码,以便读者阅读、复现和调试。通过学习这些YOLO之外的工作,有助于读者将从YOLO项目中学到的知识横向地泛化到其他检测框架中,进一步加深对目标检测的认识,同时还能够纵向地摸清、看清目标检测领域的发展趋势,掌握更多的技术概念,为后续的“践行”做足准备。

本书读者对象

本书主要面向具有一定神经网络基础知识、了解深度学习的基本概念、想要踏踏实实地夯实目标检测基础知识的初学者。同时,对于在工作中对YOLO框架有一定涉猎,但缺乏对相关技术的了解和掌握,并打算学习相关技术、掌握基础概念的算法工程师和软件工程师也同样适用。

本书采用自底向上、由浅入深、理论与实践相结合的讲解方式,帮助读者建立起较为扎实的目标检测知识体系,有助于开展后续的研究工作。

阅读本书需具备的基础知识

由于本书不会去讲解过多的机器学习和深度学习的基本概念,因此希望读者在阅读此书时,已经具备了一些机器学习、神经网络、深度学习和计算机视觉领域相关的基础知识。同时,我们也希望读者具备Python语言、NumPy库和PyTorch深度学习框架使用基础,以及对流行的计算机开源库OpenCV的基本操作有所了解和使用经验。

另外,为了能够顺利调试本书提供的开源代码,还需要读者对Ubuntu操作系统具有一些操作经验。尽管本书的大多数代码也能在Windows系统下正常运行,但不排除极个别的操作只能在Ubuntu系统下运行。同时,读者最好拥有一块性能不低于GTX 1060型号的显卡,其显存容量不低于3GB,并且具备安装CUDA、cuDNN和Anaconda3的能力,这些硬件和软件是运行本书代码的必要条件。

致谢

感谢我的导师李瑞峰对我这些年的博士课题研究的支持和指导,感谢我的父亲和母亲的支持,也感谢我所在实验室的师兄、师弟和师妹的支持。没有你们的支持,就不会有这本书,是你们给予了我创作的动机、勇气和决心,是你们的支持赋予了我工作的最大意义。

感谢人民邮电出版社的傅道坤编辑在本书的创作过程中提供指导、审阅书稿并反馈大量积极的修改建议,感谢人民邮电出版社的单瑞婷编辑在本书的审阅和校对阶段所付出的努力和不辞辛劳的帮助,也感谢人民邮电出版社的陈聪聪编辑的赏识以及杨海玲编辑提供的帮助和支持。

感谢人民邮电出版社的工作人员为科技图书的普及做出的贡献。

资源与支持

资源获取

本书提供如下资源:

本书源代码;

书中彩图文件;

本书思维导图;

异步社区7天VIP会员。

要获得以上资源,您可以扫描右方二维码,根据指引领取。

提交勘误

作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。

当您发现错误时,请登录异步社区(https://www.epubit.com),按书名搜索,进入本书页面,单击“发表勘误”,输入勘误信息,单击“提交勘误”按钮即可(见下图)。本书的作者和编辑会对您提交的勘误进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。

与我们联系

我们的联系邮箱是contact@epubit.com.cn。

如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。

如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们。

如果您所在的学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。

如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接发邮件给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。

关于异步社区和异步图书

“异步社区”(www.epubit.com)是由人民邮电出版社创办的IT专业图书社区,于2015年8月上线运营,致力于优质内容的出版和分享,为读者提供高品质的学习内容,为作译者提供专业的出版服务,实现作者与读者在线交流互动,以及传统出版与数字出版的融合发展。

“异步图书”是异步社区策划出版的精品IT图书的品牌,依托于人民邮电出版社在计算机图书领域30余年的发展与积淀。异步图书面向IT行业以及各行业使用IT技术的用户。

第1部分 背景知识

第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]和 YOLOv33]这两个工作。但由于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 小结

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

相关图书

深入Activiti流程引擎:核心原理与高阶实战
深入Activiti流程引擎:核心原理与高阶实战
Serverless核心技术和大规模实践
Serverless核心技术和大规模实践
深入浅出Windows API程序设计:编程基础篇
深入浅出Windows API程序设计:编程基础篇
Spring Cloud微服务架构实战
Spring Cloud微服务架构实战
读源码学架构:系统架构师思维训练之道
读源码学架构:系统架构师思维训练之道
设计模式之美
设计模式之美

相关文章

相关课程