今天,我们来深入探讨嵌入式视觉领域最受瞩目的技术之一——机器学习。这一技术不仅全面渗透到嵌入式视觉(EV)的各个环节,在工业物联网(IIoT)和云计算领域同样扮演着核心引擎的角色。对于初次接触机器学习的开发者而言,它或许显得有些抽象,但本质上,机器学习大多依靠神经网络来构建和训练模型。
“神经网络”这个术语涵盖的范围很广,实际上它包含了许多截然不同的子类别。这些子类别的名称通常直接反映了网络的具体类型。所有神经网络都以大脑皮层为建模基础:每个神经元接收输入信号,经过处理后传递给下一个神经元。因此,一个典型的神经网络由输入层、若干隐藏层和一个输出层组成。

图1:基础神经网络结构示意
在最简单的层级上,神经元接收到输入后,会先为这些输入分配权重,然后对加权后的总和执行传递函数。结果要么传递给下一隐藏层,要么直接输出。这种仅向前传递、不含循环回路的网络,被称为前馈神经网络(FNN);而带有反馈环路、存在有向循环的网络,则称为递归神经网络(RNN)。
在众多机器学习应用场景中,深度神经网络(DNN)是最常用的类型之一。它拥有多个隐藏层,能够处理更为复杂的任务。为了确定每一层所使用的权重和偏置值,神经网络需要进行训练。训练过程中,我们会向网络提供大量正确与错误的输入样本,通过误差函数来引导它学习我们期望的性能表现。要训练出一个性能良好的深度神经网络,通常需要海量的数据集才能达到理想效果。
机器学习最重要的应用领域之一正是嵌入式视觉。许多系统正在从“能够看见”向“能够理解”演进,即从视觉使能系统升级为视觉引导自动化系统。嵌入式视觉应用与其他简单机器学习应用有一个本质区别:它的输入格式是二维的。因此,在实际部署中,卷积神经网络(CNN)被广泛采用,因为它天生适合处理二维输入。CNN本质上属于前馈网络,内部集成了多个卷积层、子采样层,以及一个全连接网络用于最终分类。考虑到其复杂度,CNN通常也被归类为深度学习范畴。
在卷积层中,输入图像会被切分成一系列重叠的小区块。经过卷积操作后,再通过激活层生成激活图,接着进行子采样处理,最后才送入全连接网络。CNN的具体结构虽然各有差异,但通常至少包含以下几个基本组件:
卷积 —— 用于识别图像中的特征;
修正线性单元(ReLU)—— 在卷积后生成激活图的激活层;
最大池化 —— 在层与层之间进行子采样;
全连接 —— 执行最终的分类。
每个组件的权重都依靠训练来确定。CNN的一大优势在于训练相对容易。训练过程需要庞大的图像数据集,其中包含要检测的目标以及伪图像。通过这些数据,可以为CNN生成合适的权重。由于训练涉及的计算量极为庞大,这一环节通常是在云端的高性能处理器上完成的。
框架
机器学习本身是一个复杂的课题,尤其是每次都要从零开始定义网络结构、设计训练算法并反复调整参数。为了帮助工程师减轻负担,业界出现了一些标准框架,例如Caffe和TensorFlow。Caffe框架为开发者提供了丰富的库、模型和预训练权重,并且支持C++库以及Python、Matlab的绑定。有了它,开发者无需一切从零开始,就能创建和训练网络。更棒的是,Caffe用户可以通过Model Zoo共享自己的模型,其中包含许多针对特定任务已经训练好的模型,拿来即可直接使用或进行微调。这些网络和权重的定义通常写在prototxt文件中,在机器学习环境中,prototxt文件就是用来定义推断引擎的。

图2:网络定义prototxt文件示例
实现嵌入式视觉和机器学习
基于可编程逻辑的解决方案,例如异构的赛灵思All Programmable Zynq-7000 SoC和Zynq UltraScale+ MPSoC,如今正越来越广泛地应用于嵌入式视觉领域。这些器件将可编程逻辑(PL)架构与ARM内核的处理系统(PS)完美结合,实现了更快的响应速度、更高的灵活性以及显著的节能效果。对于许多应用而言,低延迟的决策与响应循环至关重要,比如视觉引导的自主机器人,其响应时间直接关系到是否会伤到人或损坏设备。
如何缩短响应时间?一个直接有效的方法就是利用可编程逻辑来实现视觉处理流水线和机器学习推断引擎。这样做能够大幅减少系统瓶颈。相比之下,传统的CPU/GPU方案,每个阶段的数据都必须经过外部DDR,因为有限的内部缓存无法在功能模块之间传递图像。而可编程逻辑方案则借助内部ARM按需缓存,实现流媒体处理。这样不仅避免了中间数据频繁进出DDR,降低了图像处理延迟,还节省了功耗,甚至可以提升确定性——因为无需与其他系统争抢共享资源。

图3:可编程逻辑实现的优势
机器学习推断引擎中使用的数值表示系统,对性能影响也很大。如今,越来越多的机器学习应用开始采用更高效的降精度定点数,例如INT8。与传统的浮点32(FP32)相比,使用INT8带来的精度损失并不明显,但定点运算在硬件实现上要简单得多。因此,改用INT8在某些场景下能够提供更高效、更快速的方案。定点数值系统对于可编程逻辑来说非常理想,reVISION在可编程逻辑中与INT8配合得尤为出色。这些INT8运算可以利用专门的DSP模块,在相同的权重下,一个DSP模块能够同时完成两个INT8乘累加操作。这样一来,不仅性能高,功耗也低。而且,由于可编程逻辑具有足够的灵活性,未来如果需要换成更低位宽的定点数值系统,也容易实现。

图4:不同权重表示下的网络精度对比
