OpenCV深度学习应用与性能优化实践
上QQ阅读APP看书,第一时间看更新

前言

为什么要写这本书

图像和视频由最基本的点(像素)组成,众多的像素按照一定规则排列组成了我们所熟知的图像,一系列的图像组成了我们所认识的视频。从2013年开始,随着智能手机的普及,全球进入了大数据时代。除了数据本身的多样性,文件数目呈指数级增加,数据的大小也在大规模增长。其中,最典型的是图像和视频数据的爆发式增长,这不仅源于分辨率和帧率的不断提高(分辨率从标清到高清,从4K到8K,帧率从25FPS、60FPS到120FPS),更多是源于采集设备的多样化和各种基于图像视频的社交软件的流行。图像和视频数据的分析与处理已经在目前的大数据处理中占据了举足轻重的地位。如何对图像和视频数据进行高效快捷的分析与处理是摆在软件工程师面前的一个重要问题,而OpenCV是我们解决这个问题的一个很好选择。

OpenCV是一个计算机视觉开源软件库,它提供了大量的图像视频处理的算法工具。在最近几年,随着深度学习的爆发,计算机视觉的算法研究全面转向了深度学习方法,OpenCV也应需增加了对深度学习的支持。目前,OpenCV已经广泛应用于基于深度学习的图像分析处理领域,具体的应用场景包括但不限于右图展示的各领域。

我们团队的伙伴们深耕在视频处理和框架领域十几年。近几年,在开源深度学习框架的GPU加速方面相继有了很多积累。与此同时,我们时常会收到来自各方的关于OpenCV和深度学习的咨询,内容从初步入门到高级结构和应用,不一而足。于是,我们就萌生了把所积累的知识以中文图书的形式分享给更多人的想法。

作者团队

吴至文曾为OpenCV贡献了Vulkan加速代码,在2018年欧洲嵌入式Linux峰会(Embedded Linux Summit Europe 2018)上分享了OpenCV中深度学习总体结构、实现细节和硬件加速相关的话题 参见https://osseu18.sched.com/event/FwGX?iframe=no。(见下图)。演讲材料可以在Linux基金会的官网下载 参见https://events19.linuxfoundation.org/wp-content/uploads/2017/12/Deep-Learning-in-OpenCV-Wu-Zhiwen-Intel.pdf。

郭叶军是FFmpeg深度学习模块的代码维护者,曾参与开源的OpenCL驱动(Beignet)的开发,参与向Khronos OpenCL提供了两个扩展库:cl_intel_acceleerator 参见https://www.khronos.org/registry/OpenCL/extensions/intel/cl_intel_accelerator.txt。和cl_intel_motion_estimation 参见https://www.khronos.org/registry/OpenCL/extensions/intel/cl_intel_motion_estimation.txt。。他也是本书主要架构的贡献者,在2019年5月参与本书的整体重构和重写时,对作者团队提出了更高的质量目标要求,几乎重写了之前的14万字内容,使书稿达到目前的可以出版的状态。

我是视频处理和框架团队的研发经理,于2018年与2019年的中国架构师大会(http://sacc.it168.com/)上分别介绍了OpenCV深度学习和AI在FFmpeg/Gstrea项目libxcam(github/intel/libxcam)的维护者,为图像处理算法提供了CPU指令集级别的加速,对图形图像处理、摄像头相关软件开发和视频处理有很深的认识。我们参加CVPR会议的Face Antispoof官方源代码也存放在libxcam项目中。

我们团队的前成员李鹏为OpenCV深度学习模块提供了OpenCL FP32和FP16的加速方法。这里面的贡献包含了团队前成员龚志刚在clCaffe加速工作中的基本思想。

本书的贡献者还包括来自华中科技大学的张鹏、李雨霏和来自湖南大学的陈祎婧。

我们希望借这次撰写OpenCV深度学习书籍的机会和大家分享一下我们的技术积累,打破语言的壁垒,方便更多的国内开发者获利于开源、反馈开源,让开源开发方式可以更好地助力科技发展,创造更大的社会价值。

本书特色

本书由资深架构师利用业余时间倾情奉献,他们很多是OpenCV贡献者、算法的开发者。本书还特别结合硬件结构、优化的流程和方法,保证内容深度的同时注重实用性和可操作性,因此本书适合从初学者、高级工程师到架构师的各层面读者。

读者对象

·图像视频处理架构师;

·图像视频开发人员;

·图像视频应用架构师;

·深度学习应用开发人员;

·深度学习算法工程师;

·图像视频相关的管理人员;

·其他对视频技术感兴趣的人员。

如何阅读本书

我们希望读者可以准备一个运行环境,一边运行代码,一边阅读本书。OpenCV是一个开源的计算机视觉库,它的开发和维护都遵循开源软件的工作方式,而开源作为一种软件开发方式正在被越来越多的公司和组织所采用。我们希望读者在学习过程中能够积累一些开源软件的使用和调试技巧,迈出探索开源世界的第一步。下面是本书的脉络,供读者参考。

第1章首先介绍OpenCV的背景和基础,以及机器学习、深度学习的基础知识,在第1章结束时从一个简单对象分类的例子开始展开介绍如何使用OpenCV深度学习模块。

第2章主要介绍OpenCV深度学习模块的架构和实现原理。为了使读者更好地理解深度学习模块,第2章首先介绍深度学习的数学基础,然后从程序员的角度去解析深度学习的结构。接着从深度学习模块的分层架构展开,结合语言绑定及不同的正确性/性能测试以更进一步地了解OpenCV深度学习模块。接下来从使用者的角度,介绍深度学习模块相关的函数接口、Layer类、Net类。然后深入地介绍DNN引擎的实现,内容包括模型导入、推理引擎内存分配,以及卷积、激活、池化、全连接等典型层类型的原理讲解。第2章还将介绍深度学习架构层面的优化方法,如层的融合、内存的复用等。最后介绍深度学习模块支持的各种加速方法和硬件设备,以及如何使用它们。

在理解了深度学习模块的架构和实现原理之后,我们继续从GPU、CPU及第三方库的角度深入探讨深度学习模块的加速实现。

第3~5章的主题是利用GPU的并行计算能力加速深度学习计算。第3章讨论并行计算的基础知识和Intel GPU的硬件结构。在此基础上,第4章和第5章将详细讲解深度学习模块的OpenCL和Vulkan加速。

第6章将讨论CPU的硬件知识,以及深度学习模块的CPU加速方法。读者可以了解到OpenCV中使用到的各种CPU加速的技巧,如指令集SIMD加速的具体方法。近些年,Halide语言因其跨平台特点备受开发者的关注。OpenCV也引入了Halide的加速方法,所以本书也向读者深入浅出地谈了Halide,以及基于Halide的深度学习模块加速。Intel的OpenVINO软件包提供了各种Intel硬件平台(包括CPU、GPU、FPGA、Movidius)的深度学习加速实现,在OpenCV中也有引入,对应的是Intel推理引擎后端,该章也将做详细介绍。

第7章将介绍常用的深度神经网络可视化工具TensorBoard(适用于TensorFlow网络格式)和Netscope(适用于Caffe网络格式)。本章将详细讲解针对Intel硬件平台的性能分析和调优工具VTune。第7章最后给出了高阶程序优化的思路和方法。

本书的另一个重点是应用实践。在第8章和第9章中,我们讲解基于深度学习的应用实践的具体细节,包括用深度学习方法处理计算机视觉的基本问题及一个完整的、实践性很强的人脸识别项目。

请看到本书的学生关注一下Google Summer of Code项目,之前很多年OpenCV社区就多次参加过,我所在的Intel Media and Audio团队已经作为导师组连续带了三届学生。学生们可领项目为开源社区做一些贡献。开源社区欢迎大家积极贡献代码,不管是提供新的例子,还是修掉某个小问题,或者提交新的功能。

勘误和支持

由于笔者水平有限,编写时间仓促,书中难免会出现一些错误或者不准确的地方,恳请读者批评指正。如果你有更多的宝贵意见,欢迎给我们发电子邮件,作者电子邮箱:zhaojuanamy@163.com。你也可以通过机械工业出版社联系我们,期待能够得到你们的真挚反馈,在技术之路上互勉共进。本书配套资源可到www.hzbook.com本书所在页面下载。

致谢

特别感谢我们的领导傅文庆,一年半以来一直支持、鼓励我们,直到我们将这本书完成。

特别感谢来自湖南大学的陈祎婧、来自华中科技大学的张鹏。他们贡献了第8章,为读者展示了一个完整的端到端人脸识别应用的开发细节。

特别感谢来自华中科技大学的李雨霏利用自己的业余时间,贡献了语义分割部分的内容,并提出自己的见解,更好、更完善地向读者展示语义分割。

特别感谢我的同事宋瑞岭对本书的校验及在OpenCL、GPU/CPU方面的补充和讨论。

特别感谢我的同事付挺、傅林捷对初稿的仔细审阅。

尽信书不如无书,大家还是需要结合自己的平台来实验。

赵娟

[1] 参见https://osseu18.sched.com/event/FwGX?iframe=no。

[2] 参见https://events19.linuxfoundation.org/wp-content/uploads/2017/12/Deep-Learning-in-OpenCV-Wu-Zhiwen-Intel.pdf。

[3] 参见https://www.khronos.org/registry/OpenCL/extensions/intel/cl_intel_accelerator.txt。

[4] 参见https://www.khronos.org/registry/OpenCL/extensions/intel/cl_intel_motion_estimation.txt。