前言
数字化时代的核心是智能化。随着人工智能技术的逐步成熟,越来越多的智能化应用不断涌现,这必然要求信息行业从业人员具备一定的人工智能知识和技术。人工智能最突出的两个技术应用领域是计算机视觉和自然语言。计算机视觉处理的是图像或视频,自然语言处理的是语音或语言。由于计算机视觉采用的CNN神经元结构提出较早,技术方案也较为成熟,因此本书着重介绍计算机视觉技术。
在整个计算机视觉领域,本书重点讲述二维和三维目标检测技术,主要基于两方面的考虑:一方面,目标检测技术是当前计算机视觉中最具有应用价值的技术,大到自动驾驶中的行人和车辆识别,小到智慧食堂中的餐盘识别,应用领域非常广泛,无论是日常生活中的视频监控,还是专业领域的路面铺装质量监控,都是目标检测技术的具体应用演绎;另一方面,目标检测神经网络一般包含骨干网络(特征提取网络)、中段网络(特征融合网络)、预测网络(头网络)、解码网络、数据重组网络、NMS算法模块等单元,这些算法模块单元构成了基于深度学习的神经网络设计哲学,后续的注意力机制或多模态神经网络可以被视为这些模块的不同实现方式。
从计算机视觉的新手到目标检测专家的进阶过程,要求开发者不仅要具备数据集和骨干网络设计的基本技能,也要具备中段网络、预测网络的设计技能,更要具备根据边缘端部署和云端部署的要求,调整网络结构的能力。可以说,学会了目标检测技术,开发者就拥有了计算机视觉的完整技术栈,就具备了一个较为全面的技能去应对其他计算机视觉项目。
本书的编程计算框架采用TensorFlow,它是深度学习领域应用最为广泛的编程框架,最早由谷歌公司推出,目前已被广泛用于全球各大人工智能企业的深度学习实验室和工业生产环境。互联网上大部分的人工智能前沿成果都是通过TensorFlow实现的。TensorFlow提供比较齐全的数据集支持和快速的数据管道,支持GPU和TPU的硬件加速。TensorFlow支持多种环境部署。开发者可通过TensorFlow Serving工具将模型部署在服务器上,也可通过TensorFlow Lite工具将模型转换为可在边缘端推理的TFLite格式。TensorFlow升级到2.X版本之后,可支持EagerMode的立即执行模式,这使得它的编程更加直观和便于调试。
本书并不执着于讲授高深的计算机视觉基础理论,也不是简简单单地堆砌若干代码样例,而是采用了“理论”“代码”“数据流图”一一对应的书写方式。理论有利于读者建立知识的深度,代码有利于读者培养动手能力,数据流图有利于读者快速领会算法原理。希望本书作者对计算机视觉技术的“抽丝剥茧”,能帮助读者在建立计算机视觉能力地图时,不仅具有理论理解的深度,还具有动手实践的宽度。
最后,为避免混淆,有必要厘清两个概念——人工智能和深度学习。人工智能是指使计算机应用达到与人类智慧相当的水平,深度学习是指运用深度神经网络技术使计算机应用达到一定的智能水平。人工智能指向的是“效果”,深度学习指向的是“方法”,二者不能画等号。实现人工智能目标的方法肯定不止深度学习这一种,还包含传统的信息化手段和专家逻辑判断。但以目前的技术水平,深度学习所能达到的智能水平是比较高的,所以大家一般都用人工智能来指代深度学习,也用深度学习来指代人工智能,因此本书对二者不做严格的区分。
为什么写作本书
作者在做以目标检测为主题的讲座报告或技术分享时,发现听众普遍对人工智能技术很感兴趣,但是又不知从何处下手。目标检测技术的确涉及多种理工科基础知识和技能。首先是数学,涉及矩阵计算、概率分布;然后是编程,涉及计算框架API和面向对象的Python等语言的编程技巧;最后是数据处理,涉及数字图像处理算法和嵌入式系统。每种基础知识和技能都对应着高等教育中的一门课程,开发者似乎都有所了解,但深究起来又理解得不够深刻。高等教育偏向于垂直领域的深度,并没有刻意将跨领域的知识融会贯通。因此,本书在讲授目标检测原理和应用的同时,还深度介绍了涉及的理论知识,希望能够帮助读者在理论和实践上都达到一定的高度。
为避免读者在阅读公式和代码时感觉到抽象,作者在编写过程中有意着重围绕较为形象的数据流来阐释原理,尽量使用数据结构图来展示算法对数据的处理意图和逻辑。相信读者在理解了输入/输出数据流结构图的基础上,面对公式和代码时不会感到晦涩。
作者发现许多企业在初期涉足人工智能时,由于对人工智能不甚了解,通常会陷入“模型选型→性能不理想→修改失败→尝试其他模型→再次失败”的怪圈。目前有大量现成的目标检测代码可以下载,简单配置后就能快速成功运行,但作者仍建议读者从基础的数据集处理入手,理解目标检测的数据流图和损失函数,理解模型量化和模型编译,才能自由地组装骨干网络、中段网络和预测网络,才能让自己设计的神经网络在边缘端独立运行。在实际工作中,我们需要计算机视觉解决的问题不尽相同,我们所使用的边缘计算硬件也五花八门,但不同模型和不同硬件在本质上有异曲同工之处,作者希望所有人工智能从业人员都能扎实地掌握某种框架下具有代表性的模型的设计和编译,这样在计算机视觉领域甚至自然语言领域自然能有所创新。
关于本书作者
作者本科毕业于天津大学通信工程专业,硕士研究生阶段就读于厦门大学,主攻嵌入式系统和数字信号底层算法,具备扎实的理论基础。作者先后就职于中国电信集团公司和福建省电子信息(集团)有限责任公司,目前担任福建省人工智能学会的理事和企业工作委员会的主任,同时也担任谷歌开发者社区、亚马逊开发者生态的福州区域负责人,长期从事计算机视觉和自然语言基础技术的研究,积累了丰富的人工智能项目经验,致力于推动深度学习在交通、工业、民生、建筑等领域的应用落地。作者于2017年获得高级工程师职称,拥有多项发明专利。
本书作者GitHub账号是fjzhangcr。
本书主要内容
本书共5篇,第1篇、第2篇重点介绍以YOLO为代表的一阶段目标检测神经网络;第3篇、第4篇重点介绍目标检测神经网络在云端和边缘端的部署,其中对边缘端的量化原理进行了重点介绍;第5篇重点介绍当前较为流行的自动驾驶的数据计算原理和目标检测。本书实用性非常强,既适合对计算机视觉具有一定了解的高等院校本科生、研究生及具有转型意愿的软件工程师入门学习,又适合计算机视觉工程项目研发和运营人员参考阅读。
第1篇,以知名计算机视觉竞赛任务为例,旨在介绍目标检测应用场景下的基本概念和约定,以及数据标注工具和格式,使读者具备特征融合网络、预测网络的设计能力。对于数据后处理技术则介绍了解码网络、数据重组网络、NMS算法等后处理算法,在此基础上结合各式各样的骨干网络,读者就可以搭建完整的一阶段目标检测神经网络模型了。
第2篇,旨在向读者展示目标检测神经网络的训练全流程。本篇从数据集制作到损失函数设计,从训练数据监控到NaN或INF异常处理,特别是对不同损失函数的设计,进行了非常详细的原理性阐述。相比神经网络设计,损失函数的设计是最具有可解释性的,也是计算机视觉研究中比较容易出成果的一个研究方向。
第3篇,旨在运用目标检测神经网络的训练成果,搭建完整的目标检测推理模型。推理模型支持云端部署和边缘端部署。对于云端部署,以主流的亚马逊云为例进行介绍;对于边缘端部署,以谷歌Coral开发板为例,介绍神经网络量化模型的基础原理和模型编译逻辑。
第4篇,结合作者主导过的智慧交通、智慧后勤等项目,旨在介绍实际计算机视觉数据增强技术,以及神经网络性能评估的原理和具体应用。本篇还结合应用同样广泛的算能科技(比特大陆)SE5边缘计算网关和瑞芯微RK3588边缘计算系统,介绍实际项目中如何使用边缘计算硬件加速人工智能的产业化应用。根据边缘计算硬件特性对神经网络进行针对性修改,是真正考验一个开发者对神经网络理解程度的试金石。跟随本书介绍熟练掌握2~3款边缘计算硬件,就能更快速地将计算机视觉应用到实际生产中,在具体应用中创造价值。
第5篇,旨在将读者引入三维计算机视觉中最重要的应用领域之一:自动驾驶。围绕KITTI数据集,本篇介绍了自动驾驶数据的计算原理,并重点介绍了PointNet++等多个三维目标检测神经网络。
附录列表说明了本书所参考的目标检测源代码、Python运行环境搭建,以及TensorFlow的基本操作。对基本操作有疑问的读者,可以根据附录中的说明登录相关网站进行查阅和提问。
当前市面上有能力提供边缘计算硬件的厂商众多,各个厂商对产品性能的描述不尽相同。
第一,开发者应当破除“总算力迷信”,分清单核心算力和核心数量这两个参数。这是因为目前边缘计算硬件的标称算力一般是多核心的累计算力,依靠堆积核心无法提高中小模型的推理速度。
第二,开发者应当认清评测模型的算力开销,这是因为不同厂商对评测模型的边界定义不同。例如,大部分厂商的评测模型往往不包含解码网络、数据重组网络和NMS算法,甚至有些不包含预测网络,通过不同的网络所测试出的结果是不具备可比性的。
第三,开发者应当重点关注边缘计算硬件的算子支持情况和生态建设。如果边缘计算硬件所支持的算子门类齐全,那么意味着模型被迫做出的改动比较小;反之,模型需要进行大量的算子替换甚至根本无法运行。优良的开发者生态意味着遇到问题可以很快搜索到解决方案,加快研发进度。建议在选择边缘计算硬件之前先登录官方网站和GitHub感受不同生态的差异。
第四,开发者应当破除“硬件加速迷信”。边缘计算硬件有它固有的局限性。例如,几乎所有的边缘计算硬件都不擅长处理某些CPU所擅长处理的算子,如Reshape、Transpose等。另外,NMS算法这一类动态尺寸矩阵的计算也是无法通过边缘计算硬件进行加速的,要解决NMS算法的耗时问题,就需要借鉴自然语言模型的注意力机制,在神经网络设计层面解决,但要注意注意力机制的资源开销问题。
如何阅读本书
本书适合具备一定计算机、通信、电子等理工科专业基础的本科生、研究生及具有转型意愿的软件工程师阅读。读者应当具备计算机、通信、电子等基础知识,学习过高等数学、线性代数、概率论、Python编程、图像处理等课程或具备这些基础知识。如果对上述知识有所遗忘也无大碍,本书会帮助读者进行适当的温习和回顾,力争成为一本可供“零基础”的人阅读的目标检测和专业计算的专业书籍。
但这毕竟是一本大厚书,读者应该怎样利用这本书呢?
如果读者希望快速建立目标检测神经网络的设计能力,那么建议读者阅读本书的第1篇和第2篇。第1篇重点介绍了目标检测神经网络的结构性拼装方法,介绍了除骨干网络外的中段网络、预测网络、解码网络、数据重组网络、NMS算法等。第2篇重点介绍了目标检测数据集和神经网络训练技巧,对于神经网络训练中不可避免的NaN和INF现象给出了翔实的原因剖析和解决方案建议。对神经网络基础原理不了解或对封装性较强的骨干网络感兴趣的读者,可以参考作者的《深入理解计算机视觉实战全书:关键算法解析和深度神经网络设计》或其他相关书籍。
如果读者希望了解神经网络在部署阶段的相关知识,那么建议读者阅读本书的第3篇和第4篇。第3篇重点介绍了亚马逊云端部署和Edge TPU边缘端部署,特别为神经网络量化模型的基本原理着墨较多,也基于项目实践介绍了算子替换的具体技巧。第4篇基于作者完成的几个人工智能项目,介绍了数据增强技术和神经网络性能评估原理。合理运用数据增强技术,相信能为读者的应用锦上添花。
如果读者希望从二维计算机视觉跨入三维计算机视觉甚至自动驾驶领域,建议读者以本书的第5篇作为入门文档。第5篇虽然受篇幅限制无法着墨太多,但所介绍的KITTI自动驾驶数据集计算原理和若干三维计算机视觉神经网络是三维计算机视觉的入门必备知识。
本书遵循理论和实践相结合的编写原则。理论和实践相结合意味着读者无须提前了解晦涩的理论,直接通过代码加深理论理解即可。理论和实践相结合更加凸显了理论的重要性,数学是工科的基础,理论永远走在技术前面。建议读者务必按照本书的篇章顺序,以动手实践本书所介绍的计算机视觉编程项目为契机,从零开始打好目标检测的基础,更快上手其他计算机视觉技术(如三维计算机视觉、图像分割、图像注意力机制、图像文本多模态等)。另外,需要声明的是,由于本书涉及实际工程知识较多,所以在书中偶有将计算机视觉称为机器视觉的地方,机器视觉是计算机视觉在实际工程中的应用。
致谢
感谢我的家人,特别是我的儿子,是你平时提出的一些问题,推动我不断地思考人工智能的哲学和原理。这门充斥着公式和代码的学科背后其实也有着浅显直白的因果逻辑。
感谢求学路上的福州格致中学的王恩奇老师,福州第一中学的林立灿老师,天津大学的李慧湘老师,厦门大学的黄联芬、郑灵翔老师,是你们当年的督促和鼓励让我有能力和勇气用学到的知识去求索技术的极限。
感谢福建省人工智能学会的周昌乐理事长,谷歌全球机器学习生态系统项目负责人Soonson Kwon,谷歌Coral产品线负责人栾跃,谷歌中国的魏巍、李双峰,亚马逊中国的王萃、王宇博,北京算能科技有限公司的范砚池、金佳萍、张晋、侯雨、吴楠、檀庭梁、刘晨曦,以及福州十方网络科技有限公司,福建米多多网络科技有限公司,福州乐凡唯悦网络科技有限公司,还有那些无法一一罗列的默默支持我的专家们,感谢你们一直以来对人工智能产业的关注,感谢你们对我在本书写作过程中提供的支持和无微不至的关怀。
最后,还要感谢电子工业出版社计算机专业图书分社社长孙学瑛女士,珠海金山数字网络科技有限公司(西山居)人工智能技术专家、高级算法工程师黄鸿波的热情推动,这最终促成了我将内部培训文档出版成图书,让更多的人看到。你们具有敏锐的市场眼光,你们将倾听到的广大致力于投身人工智能领域的开发者的心声与我分享,坚定了我将技术积淀整理成书稿进行分享的决心。在本书的整理写作过程中,你们多次邀请专家对本书提出有益意见,对于本书的修改完善起到了重要作用。
由于作者水平有限,书中不足之处在所难免,作者的GitHub账号为fjzhangcr,敬请专家和读者批评指正。
张晨然
2023年4月