YOLO目标检测
上QQ阅读APP看书,第一时间看更新

前言

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

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

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

但是,当我再回顾自己这段学习的心路历程时,还是觉得这样的学习方式,诸如选择适合初学者的论文、选择通俗易懂又全面的科普文章等,具有太多的偶然性。如果迟迟没有找到合适的文章,那就不能理解什么是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网络的教程类图书,也是一本对初学者较友好的目标检测入门书。同时,请允许我以这么一本基础书来为各位读者抛砖引玉。