嵌入式视觉应用中的机器学习

作者:Nick Ni 和 Adam Taylor

目前嵌入式视觉领域最热门的话题之一就是机器学习。机器学习涵盖多个行业大趋势,不仅在嵌入式视觉 (EV) ,而且在工业物联网 (IIoT) 和云计算中均发挥着极为显赫的作用。对不熟悉机器学习的人来说,很多时候机器学习是通过神经网络创建和训练来实现的。神经网络一语极为宽泛,包含相当数量的截然不同的子类别。这些子类别的名称一般用于识别被实现的网络的具体类型。这些网络均在大脑皮层上建模,在大脑皮层中每个神经元接收输入、处理输入并将其传达给另一个神经元。因此神经元一般由输入层、多个隐藏内部层和一个输出层组成。

图1:简单的神经网络

图1:简单的神经网络

在最简单的层面上,神经元获得输入,施加权重给输入,然后在加权输入总和上执行传递函数。结果随后传递给隐藏层中的另一个层,或传递给输出层。将一级的输出传递给另一级且不构成循环的神经网络被称为前馈神经网络 (FNN),而那些有反馈、内含定向循环的神经网络则被称为递归神经网络 (RNN)。在众多机器学习应用中极为常用的神经网络是深度神经网络 (DNN)。这类神经网络拥有多个隐藏层,能实现更复杂的机器学习任务。为确定每层使用的权重和偏差值,需要对神经网络进行训练。在训练过程中,该神经网络施加有一定数量的正确输入和错误输入,并使用误差函数教授网络所需的性能。训练深度神经网络可能需要庞大的数据集来正确训练所需性能。

机器学习最重要的应用之一是嵌入式视觉领域,各类系统正在从视觉使能系统演进为视觉引导自动化系统。嵌入式视觉应用与其他更简单的机器学习应用的区别在于它们采用二维输入格式。因此,在机器学习实现方案中,通过使用称为卷积神经网络 (CNN) 的网络结构,因为它们能够处理二维输入。CNN 是一类前馈网络,内置多个卷积层和子采样层以及一个单独的全连通网络,以执行最终分类。鉴于 CNN 的复杂性,它们也归属深度学习类别。在卷积层中,输入图像被细分为一系列重叠的小模块。在进行进一步的子采样和其它阶段之前,该卷积的结果先通过激活层创建激活图,然后应用到最终的全连通网络上。CNN 网络的具体定义因实现的网络架构而异,但它一般会包含至少下列元:
● 卷积 – 用于识别图像中的特征
● 修正线性单元(reLU)- 用于在卷积后创建激活图的激活层
● 最大池化 – 在层间进行子采样
● 全连通 - 执行最终分类

这些元中每一个元的权重通过训练决定,同时 CNN 的优势之一在于训练网络相对容易。通过训练生成权重需要庞大的图像集,其中既有需要检测的对象,也有伪图像。这样能让我们为 CNN 创建所需的权重。由于训练流程中所涉及的处理要求,训练流程一般运行在提供高性能计算的云处理器上。

框架
机器学习是一个复杂的课题,尤其是在每次不得不从头开始,定义网络、网络架构和生成训练算法的时候。为帮助工程师实现网络和训练网络,有一些行业标准框架可供使用,例如 Caffe 和 Tensor Flow。Caffe 框架为机器学习开发人员提供各种库、模型和 C++ 库内的预训练权重,同时提供 Python 和 Matlab 绑定。该框架能让用户无需从头开始即能创建网络并训练网络,以开展所需的运算。为便于重复使用,Caffe 用户能通过 model zoo 共享自己的模型。Model Zoo 提供多种能根据所需的专门任务实现和更新的模型。这些网络和权重定义在 prototxt 文件中。在用于机器学习环境时,prototxt 文件是用于定义推断引擎的文件。

图2:定义网络的 Prototxt 文件实例

图2:定义网络的 Prototxt 文件实例

实现嵌入式视觉和机器学习
基于可编程逻辑的解决方案,例如异构赛灵思 All Programmable Zynq® -7000 SoC(片上系统)和 Zynq® UltraScale+™ MPSoC 等多处理器片上系统 (MPSoC) 越来越广泛地用于嵌入式视觉应用。这些器件将可编程逻辑 (PL) 架构与处理系统 (PS) 中的高性能ARM® 内核完美组合在一起。这种组合形成的系统拥有更快的响应速度,极为灵活便于未来修改,并且提供了高能效解决方案。对许多应用来说低时延决策与响应循环极为重要。例如视觉引导自主机器人,响应时间对避免给人员造成伤害、给环境造成破坏至关重要。缩短响应时间的具体方法是使用可编程逻辑实现视觉处理流水线和使用机器学习推断引擎实现机器学习。在这方面使用可编程逻辑,与传统解决方案相比可减少系统瓶颈问题。在使用基于 CPU/GPU 的方法时,运算每一阶段都需要使用外部 DDR,因为图像不能在有限内部缓存内的功能间传递。可编程逻辑方法使用内部 ARM 按需提供缓存,允许采用流媒体方法。避免在 DDR 内存储中间元不仅可降低图像处理的时延,而且还能降低功耗,甚至提高确定性,因为无需与其他系统资源共享访问。

图 3:可编程逻辑实现的好处

图 3:可编程逻辑实现的好处

使用赛灵思提供的 reVISION™ 堆栈,在异构 SoC 中能轻松实现图像处理算法和机器学习网络。基于 SDSoC™ 工具,reVISION 能同时支持传统图像应用和机器学习应用。在 reVISION 内部,同时支持 OpenVX 和 Caffe 框架。为支持 OpenVX 框架,内核图像处理功能可被加速到可编程逻辑中,以创建图像处理流水线。同时机器学习推断环境支持可编程逻辑中的硬件优化库,以实现执行机器学习实现方案的推断引擎。

图4:reVISION 堆栈

图4:reVISION 堆栈

reVISION 提供与 Caffe 的集成,这样实现机器学习推断引擎就如同提供 prototxt 文件和经训练的权重一样简单,框架负责处理其余工作。然后使用 prototxt 文件对运行在处理系统上的 C/C++ 调度器进行配置,以加速可编程逻辑中硬件优化库上的神经网络推断。可编程逻辑用于实现推断引擎,内含 Conv、ReLu 和 Pooling 等功能。

图5:Caffe 流程集成

图5:Caffe 流程集成

机器学习推断引擎实现方案中使用的数值表示系统也对机器学习性能有重要作用。机器学习应用正越来越多地使用更高效的降精度定点数值系统,例如 INT8 表达式。与传统的浮点 32 (FP32) 方法相比,使用定点降精度数值系统不会造成显著的精度下降。因为与浮点相比,定点数学在实现难度上也明显更低,转而采用 INT8 能在一些实现中提供更高效、更快速的解决方案。使用定点数值系统对在可编程逻辑解决方案中的实现方案而言相当理想,reVISION 在可编程逻辑中能与 INT8 表达式协同工作。这些 INT8 表达式方便在可编程逻辑中使用专门的 DSP 模块。在使用相同的内核权重时,这些 DSP 模块架构能实现最多两个并发 INT8 乘法累加运算供执行。这样不仅能提供高性能实现方案,而且还能够降低功耗。只要采用,可编程逻辑的灵活性也还便于实现进一步降精度定点数值表达系统。

图6:不同权重表达的网络精度。

图6:不同权重表达的网络精度。

资料来源: https://arxiv.org/pdf/1510.00149v5.pdf

真实性能
在真实环境中,reVISION 堆栈能带来明显优势。在嵌入式视觉应用中使用机器学习的应用实例之一,如车辆避碰系统。在 reVISION 中针对赛灵思 UltraScale+ MPSoC 并开发相关应用,使用 SDSoC 在可编程逻辑中按需为各项功能加速以达到优化性能,能明显改善响应性。在都用于实现 GoogLeNet 解决方案的条件下,将 reVISION MPSoC 的响应时间与基于 GPU 的方法进行对比,差异相当明显。reVISION 设计能在 2.7ms 内发现潜在的碰撞事件并启动车辆制动(使用的批量规模为 1),而基于 GPU 的方法则需要用时49ms-320ms(具体取决于其实现方案)(对大批量规模)。GPU 架构需要大批量规模才能实现合理的吞吐量,但会以牺牲响应时间为代价,而 Zynq 在批量规模为 1 的情况下也能以极低时延实现高性能。这种反应时间上的差异可以决定碰撞发生与否。

总结
机器学习将继续成为众多应用的重要推动因素,尤其是在视觉导向机器人或所谓的“协作机器人”中。将处理器内核与可编程逻辑结合的异构 SoC, 能创建非常高效、极具响应性且可重配置的解决方案。像reVISION 这样的堆栈的推出,首次将可编程逻辑的好处带给了更广阔的开发者社群,同时还缩短了解决方案的开发时间。

了解更多有关赛灵思“嵌入式视觉”,“机器学习”相关的方案和技术,敬请点击官网:
https://china.xilinx.com/applications/megatrends/video-vision.html