如何快速转型成为一个计算机视觉工程师?

👆点击“博文视点Broadview”,获取更多书讯

计算机视觉行业,经历了从特征工程到深度学习的历史性变迁。近些年来随着神经网络和边缘计算的发展,计算机视觉成为了人工智能行业最先成熟的一个发展分支,广泛应用在工业、交通、后勤、农业、医疗等领域。

01

计算机视觉的发展历程

计算机视觉经历了从特征工程到深度学习的发展阶段,而深度学习又发展出卷积神经网络(Convolutional Neural Network)和视觉转换器(Vision Transformer)的不同实现方式。

传统的特征工程使用大量的人工算子提取图片中的视觉特征,例如边缘提取算子、直线特征提取算子、圆特征提取算子等,其中又以SIFT算法为发展巅峰。

一幅图片经历了全部特征提取算子的处理后,将获得一个特征集合,开发工程师一般需要继续主成分分析、回归分析或支撑向量机(SVM)算法进行特征的手工判别和处理。

这样的计算机视觉工程,不仅耗费开发人员的大量精力,而且不同的项目具有不同的视觉特征,开发成果无法共享,逐渐已经被计算机视觉行业所淘汰。

基于深度学习的计算机视觉技术,已经将特征工程的所有工作完成了自动化。深度学习的计算机视觉,可以自动生成最佳特征提取算子,可以自动为不同特征配置权重,从而最终给出最佳判别。

基于深度学习的计算机视觉技术也经历了两个发展阶段:

  • 第一阶段是以图像卷积运算为核心的卷积神经网络(Convolutional Neural Network)阶段。
  • 第二阶段是以多头注意力机制为核心的视觉转换器(Vision Transformer)阶段。

卷积神经网络阶段的信号处理核心算法是卷积运算(Convolution)。

多个卷积核(Kernel)组成一个滤波器(Filter),多个滤波器组成一个二维卷积层(Convolutional Layer);其中的每个滤波器都相当于一个传统特征工程所使用的特征提取算子,当多个二维卷积层堆叠在一起的时候,卷积神经网络就相当于成千上万个特征提取算子,其性能自然强于传统手工特征提取的处理方式。

从空间映射的角度看,每个算子都将RGB像素域空间的数据映射到低维度特征域,后续算子继续将低维度特征域的数据映射到高维度特征域,不同域的数据通过残差连接进行融合,这些复杂的映射处理是传统手工特征提取的方法无法企及的。

卷积神经网络利用了图像像素点在空间上具有相关性的先验知识,这使得卷积神经网络相对于后续出现的视觉转换器,具有处理效率高,结构相对轻量化的特点,比较适合小数据集应用场景和功耗敏感的边缘端。

经过近些年的发展,基于卷积神经网络的计算机视觉方案已经发展到巅峰,技术成熟,性能稳定,后续出现的基于视觉转换器的计算机视觉方案,其性能也只能和卷积神经网络打个平手。

视觉转换器阶段的信号处理核心算法是多头注意力(Multi-Head Attention)机制。

视觉转换器将图像视为文本,将一幅图像拆分为若干局部图(Patch),如果把每个局部图看成一个词元(Token),那么一幅图像就相当于由一串“词元”组成的一句话。按照自然语言的处理逻辑,需要使用向量嵌入(Embedding)技术将每个词元都变成一个高维向量,那么一幅图像就相当于一个矩阵,其行数等于词元数量,列数等于高维向量的元素个数。后续的处理就很简单了,只需要使用自然语言处理中的多头注意力机制对这些高维向量进行相关性计算,然后再映射到另一个更高维度的空间即可。

视觉转换器的神经网络并没有使用任何图像的先验性知识,而是将整幅图的所有像素点都进行相关性计算,因此图像卷积计算可以看成是多头注意力机制的一个特例,而多头注意力机制可以看成是全画幅的(更复杂的)图像卷积运算。

正是因为视觉转换器并没有使用任何图像领域的先验知识,并且多头注意力机制具有极为简单的矩阵运算,这使得视觉转换器能等效于任何特征处理算子,这无疑带来性能上的大幅提升和更为强大的泛化能力。

视觉转换器将图片视为文本以后,所提取的视觉特征与语言转换器提取的文本特征具有相同的向量结构,非常适合“图像文本多模态”(Multi-Modality)的应用场景,例如从图片生成描述,从描述生成图片等。

但也正是因为基于视觉转换器的神经网络的超强适应性,这使得它的可训练变量数量远远多于卷积神经网络,并且注意力机制的计算量巨大。

一般的卷积神经网络只有数十兆(数千万)的可训练变量,一张具有6G以上显存的计算加速卡即可完成运算加速,但视觉转换器神经网络动则拥有大几十兆(大几千万)甚至上亿的可训练变量,一般需要具有16G以上显存的计算加速卡,并搭配上百万样本规模的数据集,进行长时间训练才能获得良好的训练效果。

总之,基于特征工程的计算机视觉已经被基于深度学习的计算机视觉完全取代;基于卷积神经网络的深度学习计算机视觉具有运算开销小、数据集要求低的特点,比较适合作为专用人工智能,为各行业的具体应用场景提供智能化支撑;基于视觉转换器的深度学习计算机视觉具有通用性强、跨模态计算能力的特点,比较适合作为大模型人工智能,为“图片+文本”的多模态应用场景提供智能化支撑。

02

如何快速切入计算机视觉行业

卷积神经网络是入行计算机视觉的最佳切入点。

基于视觉转换器的神经网络,计算开销和数据集的规模和成本都很高,目前都是大模型一统天下,比较适合大互联网公司面向C端客户提供服务,并不适合作为快速入门的切入点。

反观基于卷积神经网络的计算机视觉,计算开销和数据集都在可承受范围之内,并且搭配上边缘计算硬件,可以快速将人工智能应用从纯软件的“虚拟应用”转变为具有实体形态的“物化产品”,并且卷积神经网络在多模态领域也有一定的用武之地,不少多模态神经网络也使用计算量较低的卷积神经网络提取视觉特征。

各行各业不一定都承受的了基于视觉转换器的多模态大模型,但一定乐于接受性能强、成本低、功耗低的专有人工智能小模型,《深入理解计算机视觉:关键算法解析与深度神经网络设计》一书介绍的卷积神经网络是面向目标检测的,应用极为广泛,是入行计算机视觉的最佳切入点。

计算机视觉行业是对数学基础和编程实操都具有较高要求的行业。希望从事计算机视觉的大学生很多,工程师希望转型从事计算机视觉的人也不少,但能够学精学透的人不多,这是因为基于深度学习的计算机视觉同时具备“知易行难”和“行易知难”的特点。

一方面,深度学习计算机视觉“知易行难”。深度学习的方法论推导有着复杂的理论基础,一个简单的计算函数背后对应着严谨的数学定义,严谨的数学定义对应着复杂的数学符号和公式。即便当你费劲看懂了复杂的数学公式了以后,使用哪个计算框架的哪个函数写出什么样的代码,也是非常痛苦和费劲的事情。

另一方面,人工智能“行易知难”。你可以从互联网上下载大量的人工智能开源代码,跟着配置说明稍微配置一下即可运行成功,运气好的甚至不需要配置即可顺利运行。但你真的读懂这篇开源代码了吗?当遇到实际情况和预设情况不一致的情况,你是否懂得如何修改其中的某些参数,当需要对其进行优化的时候,你是否懂得修改其中的某些行代码,从而更加适配你目前的开发需求。如果希望达到这种境界,你就需要理解开源代码的每一行后面的数学计算逻辑,这对你提出了很高的数学基础知识的要求。

快速切入基于深度学习的计算机视觉是有方法的。

首先,通过写一段不超过30行的代码,就可以完成一个最简单的人工智能应用了以后,你会对模型编译、损失函数、优化器、评估指标有更深刻的认识。这恰好就是本书第一篇所介绍的内容。

然后,您一定希望有一个设计巧妙的一个案例,能够快速体验数据集载入、神经网络建立、神经网络训练的全流程,并把神经网络部署在云端和边缘端。因为这样您就获得了第一个“端到端”的人工智能应用。相信在您跑通第一个人工智能代码,并成功部署第一个人工智能服务的瞬间,您一定会对人工智能产生更浓厚的兴趣。这恰好就是本书第2篇的写作初衷。

进一步,以所体验到的计算机视觉案例为基础,适时的抛出深度学习的数学抽象,给出梯度下降、自动微分的复杂公式,相信您一定不会觉得晦涩和抽象,反而会觉得公式是如此的亲切和好用。此时,您一定会更加理解计算机工程师经常说的一句话“别扯那么多公式!先给我看代码”的含义。这恰好是本书的第3篇所介绍的内容。

再进一步,有了直观体验和数学基础,您就可以继续挖掘神经网络的各种组件,他们的算法原理和使用方法,神经网络训练中的指标监控和行为控制,此时如果您希望使用计算加速硬件的话,我们也给出了具体的使用方法,因为高性能的计算机视觉神经网络的计算资源开销必须使用类似于GPU/TPU这类的加速硬件。这恰好是本书的第4篇所介绍的内容。

最后,在本书第1、2、3、4篇的指导下,您已经拥有了自我探索各种神经网络的基本能力,您需要做的,只是不断了解、拆解、组合各种神经网络组件。根据知名程度,本书在第5篇给出了LeNet5、AlexNet、VGG、ResNet、DarkNet、CSP-DarkNet等经典的卷积神经网络,这些神经网络是图像分割、目标检测的骨干网络,直接决定了各种计算机视觉应用的性能高低。第4篇所做的,正是将这些经典卷积神经网络拆解到“零件级别”,将他们的网络结构、计算原理、资源开销抽丝剥茧讲述清楚,这些知识都是您今后根据实际设计个性化神经网络的知识基础。

本书的前5篇提供了计算机视觉行业所需要的全部基础知识,基于这些基础知识,您可以继续了解第6篇所介绍的三维机器视觉和图卷积神经网络,也可以继续学习本书的后续书籍《深入理解计算机视觉——在边缘端构建高效的目标检测应用》,您可以轻松的在一个嵌入式硬件上构建一个高效率、低功耗、可离网的边缘计算应用。

03

计算机视觉工程师的能力地图

成为一个计算机视觉工程师,必须具备以下能力:环境管理能力、数据集处理能力、数学原理、神经网络原理、训练过程控制、模型设计和使用、计算机视觉成果运用、神经网络拆装能力等。

环境管理的能力,这里包括了软件环境和硬件环境。软件环境包括虚拟环境管理和集成开发工具,硬件环境包括根据数据类型选择并估算硬件算力。感兴趣的读者可以阅读本书的第1章和第11章。

数据集处理能力,这里包括了对开源数据集了解和对个性化数据集的管理。开源数据集包括CIFAR数据集、MNIST时尚数据集、MNIST花卉数据集、MNIST手写数字数据集、ImageNet数据集、Pascal-VOC数据集、MS-CoCO数据集、波士顿房产等,还包括ILSVRC竞赛等。

这些数据集在本书的第2章、第3章、第8章、第11章、第17章均有介绍。个性化数据集的处理能力对于计算机视觉工程师格外重要,因为日常项目中的数据往往需要工程师自己标注和处理。个性化数据处理能力涉及数据的标注、标注文件的解析、样本特征的生成、单样本的生成、TFRecord文件的写入和读取等。个性化数据的处理能力将在本书的第3章进行专门介绍,并在本书的其他章节均有应用。

数学原理,具体包括损失函数原理、神经网络的数学抽象、梯度下降原理、自动微分机制、静态图和动态图编程范式等,这些数学原理涉及了高等数学、高等代数、概率统计等基础数学知识,本书将重要的数学知识进行了温习和梳理,并将公式与编程代码一一对应,从而避免了枯燥的推导,如果希望对深度学习有更基础认识的话,可以重点阅读本书的第5章、第8章、第9章。

神经网络原理,具体包括层组件对象、层算法原理和模型组装。层组件对象包括全连接层、二维卷积层、池化层、批次归一化层、随机失活层、激活层等,层算法原理包括算法行为、API实现、内存开销估算、乘法开销估算等。结合原理和代码的介绍。有了层的原理和实现,我们就可以通过三种方式,将多个层对象组装成一个神经网络模型。这些内容对应本书的第9章和第10章。

训练的过程控制,神经网络是一个函数,训练的过程就是在寻找最优参数的过程,最优的参数能让神经网络的输出和真实值之间有最小的误差。

在训练之前,需要对神经网络进行编译,编译的内容包括损失函数、优化器、评估指标;训练的代码编写方式,需要选择全自动的静态图训练方式还是手工控制的动态图训练方式;训练的过程中,需要使用回调机制,调用早期停止回调函数、检查点保存回调函数、学习率调整回调函数、日志写入回调函数或自定义回调函数。

开启训练后,需要使用TensorBoard实时监控训练过程的损失值、准确率、召回率等各种评估指标,从而避免过拟合现象的发生。

这些训练的过程控制都是笔者在日常项目实施过程中总结出来的,是项目实施中比较常用的,感兴趣的读者可以阅读本书的第2章、第6章、第12章。

模型设计和使用,包括模型设计和模型使用两个层面的内容。模型设计主要指的是设计的哲学,每个成功的神经网络模型背后都蕴藏着一个模型设计的创意。

一个成功的模型设计师,并不是刻板的使用某一个模型,而是根据实际场景的需要,提取众多模型中的可用结构,组合成高效的神经网络模型。

要达到这种境界,需要计算机视觉工程师理解众多模型的关键创意,懂得如何拆解和应用。例如AlexNet神经网络的核心创意在于“二维卷积层+池化层”的微观结构,VGG神经网络的核心在于“若干小核卷积等效于一个大核卷积”的创意,ResNet神经网络的核心在于“残差连接”的微观结构,DarkNet神经网络的核心在于“二维卷积层+批次归一化层+激活层可以等效为一个高性能二维卷积层”的微观结构、CSP-DarkNet神经网络的核心在于多尺度和CSP跨阶段局部残差连接结构。

这些经典神经网络是目前正在被使用的神经网络,其中DarkNet系列神经网络就是知名的YOLO神经网络中最为重要的骨干网络,它们不仅具备理论价值也具备实用价值。

感兴趣的读者可以重点阅读本数据的第13章、第14章、第15章、第16章。模型的使用主要指的是迁移学习和预训练模型的使用,使用预训练模型可以大幅加快神经网络的收敛速度,是目前工程中使用较多的模型使用方式,具体如何使用迁移学习技术,如何加载预训练权重,可以阅读本书的第4章和第17章。

计算机视觉成果运用,包括神经网络的保存和神经网络的部署。

人工智能项目的成果是神经网络,神经网络保存一般分为结构的保存和权重的保存,其中结构的保存一般用于神经网络的分发和部署,权重的保存一般用于再训练,不同保存方式需要遵循不同的保存方法和文件格式。神经网络的部署一般通过云计算部署或边缘计算部署。

其中的云计算部署方式下,神经网络通过TensorFlow Serving部署在一台Linux系统的服务器上,TensorFlow Serving软件能智能的将并发请求打包为一个Batch,调用硬件进行一次推理,即可获得多请求数据的计算结果,是目前人工智能云计算部署中最为常见的部署方式。其中的边缘计算部署方式下,神经网络先后被量化、编译,然后才能在边缘端进行部署。

懂得神经网络的边缘端部署,可以让您的人工智能项目从看不见摸不着的云服务,变为一个可以由充电宝供电的电路板,它拥有一个摄像头,一个嵌入式系统,一个边缘计算加速芯片,一个显示器,它将会是一个可以独立运行的小系统,看得见摸得着。边缘计算,是智能化系统从虚拟走向物化的必经之路。为了最大可能性的帮助开发者面对多变的部署环境,本书对这两种方式均进行了介绍。

特别地,由于边缘计算涉及到嵌入式系统的相关知识,会相对复杂,因此本书专门安排了一个章节完整的展示了一个神经网络的训练、量化、编译过程,并将神经网络下发到开发板,演示了在边缘计算开发板的帮助下,神经网络的推理耗时是如何从150毫秒锐减到2.5毫秒的。感兴趣的读者可以阅读本书的第6章、第7章和第11章。

神经网络拆装能力,包括编程对象的继承和自定义对象组装。

人工智能的模型越来越大,越来越复杂,但其进化逻辑和基础结构都是有迹可循的。不论任何计算机视觉的项目,总离不开负责具体算法执行的层对象、负责数据串联的模型对象,这些编程对象有自由度高的tf.Module对象,也有集成度高的Keras对象,一个经验丰富的计算机视觉工程师应当能灵活调用,并根据实际情况进行修改或重载,感兴趣的读者可以阅读本书的第9章。

自定义对象的组装可以扩展到三维机器视觉和图卷积神经网络,虽然三维机器视觉和二维机器视觉不一样,图卷积神经网络和二维卷积神经网络不一样 ,但他们共享相同的层组件库,也遵循同样的模型组装方法,本书第18章和第19章重点介绍了以PointNet为代表的的三维机器视觉神经网络和以GNN为代表的的图卷积神经网络,方便读者举一反三。

总之,如果把神经网络比喻为一个发动机,把神经网络内部的层结构比喻为这个发动机的零件,只有把每个零件拆出来并装回去,才能说具备了微调甚至设计模型的能力。

跑通一个计算机视觉代码并不代表具备了计算视觉的开发能力,只有逐一对照计算机视觉的能力地图,逐步填满知识空缺,凭借无数个小知识点的扎实理解,才能在人工智能的道路上走得更远。

04

专家力荐

最后,作者只是在感兴趣的人工智能领域深耕多年,并将多年的心得体会汇总成书,未曾想过能获得人工智能行业举足轻重的两位前辈的倾力推荐:厦门大学的周昌乐教授和谷歌的Soonson Kwon。

厦门大学的周昌乐教授是北京大学博士、厦门大学教授、心智科学家、中国人工智能学会理事、福建省人工智能学会理事长,早在2008年就在福建省牵头建立福建省人工智能学会,多年来致力于心智计算和类脑科学的发展,是国内人工智能行业的领军人物之一。多年来周昌乐老师一直保持着学者的好学和谦逊,不断叮嘱从事人工智能行业的后辈戒骄戒躁、扎实跟进全球的人工智能技术进步,参与全球人工智能行业的竞争,不断提高自身的能力和水平,笔者感谢周昌乐老师一直以来的支持和鼓励!

谷歌的Soonson Kwon先生是谷歌全球机器学习生态的项目负责人,同时也负责亚太地区的开发者生态,当Soonson Kwon得知笔者利用人工智能技术,解决了交通领域、农业领域、后勤领域、医疗领域等多个智能化问题后,鼓励笔者将心得体会著成书,并向所有有志于通过技术造福社会的开发者们分享。Soonson Kwon先生相信,在知识的分享中,读者和作者都能获得知识传播的快乐,而且这种快乐是双向的,也是纯粹的。这种从分享中获得的快乐,也一定能够在开发者之间持续的传递下去。

此外,还要感谢求学路上的王恩奇老师、林立灿老师、李慧湘老师、黄联芬老师、郑灵翔老师,感谢谷歌Coral产品线负责人栾跃,谷歌中国魏巍、李双峰,电子工业出版社计算机专业图书分社社长孙学瑛女士、珠海金山数字网络科技有限公司人工智能专家、高级算法工程师黄鸿波,北京算能科技有限公司范砚池、金佳萍、张晋、侯雨、吴楠、檀庭梁、刘晨曦,以及福州十方、福建米多多、福州乐凡唯悦等无法一一罗列的默默支持的专家和企业。

笔者的这本书是写给有志从事计算机视觉行业的“你”的,也是写给自己这些年所从事的专业的。

仰望近些年AI秘籍之盛,可汗牛充栋,笔者俯查本书字句之意,皆皓首穷经。

愿读者可从笔者心血之八九,得佳句之二一,此乃笔者著书之初心。

限时五折优惠,快快扫码抢购吧!

代码语言:javascript
复制
发布:刘恩惠
审核:陈歆懿 

如果喜欢本文欢迎 在看丨留言丨分享至朋友圈 三连<  PAST · 往期回顾  >
Python,30年上位之路!

点击阅读原文,查看本书详情!