关靖涛
(广东海洋大学计算机科学与工程学院,广东 阳江 529500)
关键字:人工智能物联网;神经网络;嵌入式系统;微控制器
随着神经网络技术的不断普及,我们可以清晰的看到它对生活产生的各种变化,从起初将卷积神经网络应用到了汽车的自动驾驶和人脸识别等各个场景,到现在自然语言处理的集大成模型——ChatGPT 的出现带来了更人性化的人机交互体验,无一不体现出其重要性。目前神经网络标准的开发流程是先根据需求采集合适的数据并对其进行分类标记,再搭建特定的神经网络模型,随后通过使用高算力、高性能的服务器来对目标模型进行训练,根据结果不断对其权重参数或模型架构进行调整和优化,在获得了满意的准确率和推导能力之后便将模型部署到系统中,常规的部署方案是采用“远程”的推导方式,即用户端负责数据的采集并使用某种通信方法将其传送到服务器中进行处理和推导[1],得到的结果再传送回用户端的执行单元中,经判断决定本地设备该执行何种类型的动作。
用户端的本地设备只参与了“数据采集”与“动作执行”的两个步骤,核心设备仍然是神经网络模型所在的服务器端。这种传统的部署方法随着芯片计算能力的提升产生了许多变化与创新,其中人工智能物联网(AIoT)就是其中新的应用方向,它是由人工智能(AI)和物联网(IoT)相互融合、相互促进后诞生的新兴技术,目标是丰富感知层的执行能力,通过借助高性能的芯片,让传感节点来辅助完成神经网络模型推导过程中更多的重要步骤,甚至可以将规模不大、算力要求不高的模型下放到节点中,使整个系统能具备离线推导的能力。本文则解释如何将神经网络模型推导过程中数据预处理这一步骤的内容移植到本地的嵌入式设备,直接为神经网络模型提供可用的数据,拓展人工智能网络在工业发展和智能家具等领域的使用场景。
卷积神经网络(Convolutional Neural Networks,CNN)是深度学习最具代表性的算法之一,它是一种包含了卷积运算并且带有深度结构的前馈神经网络,常适用于图像识别或手写识别等。卷积神经网络是通过使用不同大小的卷积核对目标图像的窗口或部分区域进行采样和特征抽取,最后利用这些特征来构建出目标图像的分类或表示内容。在此重点讨论其使用的数据的类型和对输入数据的处理方法。
卷积神经网络的处理对象是图像,那么输入到模型中的自然是与图像相关的数据,在对模型进行训练或推导时,常用的输入数据就分为单通道图像(灰度图)和多通道图像,获得的图像在经过一系列步骤处理后才可进行使用。
通常原始的图像数据复杂度高,并且可能会含有大量噪声等不利因素,直接使用会影响神经网络的准确率和运行效率,因此输入的图像必须要完成各种预处理操作[2]。而常规的数据预处理方法包括滤波去噪、去均值、归一化或白化等相关操作。以下对归一化和去均值两种常用的处理方法做简单的介绍。
1)归一化。归一化的目的是为了让不同维度的数据具有相同的分布,有利于卷积神经网络在训练的过程中更好的优化自身网络的权重和偏置,以下为线性归一化的表达式:
式中,xnew为归一化后的目标值,xorg为需要进行归一化的原始值,xmax、xmin分别为卷积神经网络模型输入张量中的最大值与最小值。观察公式可知在转换完成后输入张量中的所有数据可以标准化映射成在[0,1]区间的任何一数值,借此可以缩小输入数值的范围,做到降低模型的收敛速度和提高模型泛化等能力。
2)去均值。当输入的张量中有过大的均值时,会导致参数的梯度过大,因此需要使用去均值的方法来处理数据。将张量中的原特征值减去均值后的结果即为新的特征值,处理后的数据各个维度都中心化为0,从而避免过多的数据偏差。
循环神经网络(Recurrent Neural Network,RNN)是以序列数据作为输入,并且在序列的演进方向进行递归,其所有循环单元都按照链式连接的递归型神经网络。因为循环神经网络具有记忆性、参数共享以及图灵完备等特点,使得它对序列的非线性特征的学习具有优势,是深度学习中除卷积神经网络外的另一个重要算法。
循环神经网络应用的场景很多如语音识别、语音助手和机器翻译等,且可以和卷积神经网络进行结合来开发复杂应用,如使用卷积神经网络对图片的特征进行分类后让循环神经网络来生成对应的文字描述等。
循环神经网络处理的对象是序列,这里“序列”的这个元素其实是我们生活中常见的连续并存在某种关联的信息数据。
当下循环神经网络最流行的应用场景是自然语言处理(Natural Language Processing,NLP),目标是让计算机识别和理解人类使用的自然语言并执行与其对应的命令或动作,但无论是语音识别还是多语种翻译,最终都是将文本转换成序列信息来进行循环神经网络模型的推导和训练,下文也以序列作为网络的使用对象展开讲解。
循环神经网络在训练和部署这两个不同的阶段时针对输入的信息会有不同的处理步骤,由于本文主题是以训练后的网络模型为前提下进行框架设计的,因此该节要处理的数据应是训练数据集之外的输入内容,而且系统内应保存有训练完成的词嵌入矩阵及字典等内容来辅助完成操作。
(1)分词 在部署模型的硬件系统中,无论是从存储设备或者是网络上获得的文本信息,在加载后都是以字符串的形式等待处理,首先第一个步骤是将这一连串的句子进行分词,其中包括去除标点符号、去除停用词、同义词替换、区分大小写或辨别姓名等操作。
得到了分词的数组后,下一个步骤则对数组中的特征词和字典中的内容进行匹配,获取其整型编号并映射到程序的存储空间中。
(2)独热编码 独热编码又称为一位有效编码,采用N位的状态寄存器来对N个状态进行编码,使用在文本数据的预处理时,需要根据字典中总单词的大小来决定独热向量的维度,比如说此时与部署的神经网络模型匹配的字典中单词的总数量为500,则要转化的独热向量维度是500。每个单词的独热向量与其映射的整型编号相关联。
独热编码的特点是使每个单词都是单独一维,单词之间的特征完全相互独立,但缺点也非常明显,如果字典的单词过多时,每个单词的维度会非常高,导致构建循环神经网络时需要计算巨量的权重参数,因此使用词嵌入来对独热向量进行降维。
在框架设计中,需要根据设备的实际性能来挑选输入序列的处理手段,若是字典的总容量不高,微控制器性能强劲,则可以直接上传独热向量,甚至可以在本地中利用词嵌入矩阵转换成稠密向量再发送到上位机,否则只需要发送映射后的序列即可。
本节内容讲解数据预处理框架的实现方法,先根据部署的网络类型设计硬件结构,选取合适的微控制器和外设等,随后根据前文所阐述的两种神经网络模型的数据处理方法来制定程序算法。同时该节内容也介绍如何将预处理框架嵌入已有的硬件系统中,以及框架后续功能扩展的思路和尝试等。
搭建硬件系统时需要重点注意匹配两个方面的内容:
一是硬件系统的实际功能,若是项目设计时开发的系统是针对图像进行识别的话,在设备上就不需要增加一些与功能不相关的设备如麦克风、电机等;二是考虑系统稳定运行时的性能要求,神经网络模型的运算大多都牵涉到浮点数和矩阵的运算,开发初期就应明确芯片对浮点数的处理能力,系统正常运行时是否需要进行高强度高密度的计算任务,确定适不适宜装载预处理框架等。
本次搭建和测试预处理框架所选用的硬件如图1 所示,该产品的核心采用了Cortex-M4 架构的STM32F407微控制器,其内部包含浮点运算单元(Floating Point Unit,FPU)和DCMI 数字图像采集接口,大大提高了对浮点数运算和读写图像的速度;另外开发板中已经集成了Wifi 和Bluetooth 等通信模块,搭载预处理框架后无需再外接设备就能将采集到的声音或图像信息直接传送到附近物联网系统的网关单元中。
图1 搭载预处理框架的开发板
另一方面,若是有需求在原有的物联网系统上进行改造升级的,则需评估以下内容:原有微控制器的性能是否能满足要求;原有的硬件设备是否留有足够的接口进行扩展;原有的系统是否已经配备了通信模块,是否需要额外增加多种通信方式;是否有扩展外部存储空间,存储空间的大小是否合适。当满足了改造的条件之后,再根据神经网络模型的类型来增加必要外设,即可完成原有系统的改造了。
预处理框架中软件层面上的核心则是实现数据预处理方法的代码化,简而言之就是将文字方法和公式转化成可执行的代码,至于对何种预处理方法进行转换则要根据实际的开发情况而定。本节对前文中卷积神经网络和循环神经网络讲解的预处理方法进行程序的算法设计,如图2、图3 所示。
图2 图片数据预处理程序算法
图3 文本数据预处理程序算法
图2 是针对卷积神经网络中常规的图片预处理程序的算法过程,在实际的测试环节中,使用本文搭建的硬件系统进行测试,处理一张200 万像素的三通道图像总共耗时约30ms,该处理速度已经符合了现实生活中大部分应用场景中的性能要求了。
同理,图3 为循环神经网络模型的数据预处理程序算法,根据项目开发时设定的输入序列结构来选择独热向量或者是映射后的序列作为程序的处理结果发送到上层应用。在实际的测试中框架的运行效果会随着使用的字典大小变化而产生波动,若是模型使用字典的词汇量较大,不对输入进行独热编码而是直接发送映射后的序列显然占用硬件系统的资源更少,发送速度更快,反之独热编码的处理结果更合适字典容量较小的情况。
基于前文对预处理框架的设计思路,将编辑好的代码烧录到开发板中作为传感节点,实现对预处理框架的性能测试;通过节点处理采集到的图像或序列数据,然后传送到已经部署神经网络模型的上位机中进行推导,观察和评估预处理框架的实际运行效果。
(1)CNN 环境下的测试 本次测试在卷积神经网络的环境下选用的模型是YOLO 算法,对目标环境进行实时的、多角度的识别和监控。该测试系统的监控频率为30Hz,传感节点通过摄像头OV2640 获取图像信息,图像分辨率设置为800×600,实际的运行结果如图4 所示。
图4 双模式的识别效果对比
图4a 显示图像为常规系统的识别结果,图4b 则是在加载了预处理框架后的检测图像。在实际观察中两种模式都能稳定的保持30Hz 的刷新频率。同样的为了验证预处理框架是否会影响神经网络模型推导的准确率,本次测试分别统计了3 000 次、5 000 次与10 000 次的推导,对比两种模式下的识别情况,具体数据见表1。
表1 双模式准确率对比
由以上的数据可看出在搭载预处理框架的情况下,模型的准确率仍然能够保持95%以上,再结合实际的运行效果,可以得出结论:在目前的设置下,将图像识别中数据预处理的步骤放到速度较慢的传感器节点中,不但不会影响监控系统运行,上层服务器还能释放出的部分性能,在后续的维护中加以利用,进一步优化网络模型的结构,提高系统的表现。
(2)RNN 环境下的测试 在针对循环神经网络的工作环境中,本次测试选用了经典的Seq2Seq 模型来实现机器翻译的应用。此时通过串口向传感节点发送需要翻译的句子,节点在处理输入数据后将序列信息发送到神经网络模型进行推导翻译,其效果如图5 所示。
图5 翻译效果图
从图5 可看到在传送节点中输入需要翻译的英文句子后,节点通过预处理框架将句子整理成长度为20 的序列信息发送到上层应用,最终经过算法推导得到正确的翻译结果。在这里由于本次使用的字典容量为1k,若对输入序列进行独热编码并直接发送独热向量会对节点造成不必要的资源浪费,故系统在正常运行时仅传输了与单词对应的词汇编号。
前文已经通过测试初步实现了预处理框架在人工智能物联网中的应用,在实际的工业设计中还能根据任务需求的改动进行功能的扩展[3],本节内容先是评估了测试系统在执行框架后的剩余资源和整体性能,分别提出了在框架中增加中数据增强和词嵌入矩阵的两种功能设计思路。
先是适用于卷积神经网络的数据增强功能,它是一种提高模型泛化能力的有效手段,原理是修改原始数据,包括对图像进行旋转、平移、错切或缩放等一系列操作,从而加入新的训练数据,在后期对卷积神经网络模型的权重参数更新的时候会有更加积极的作用,预防过拟合的出现,而在程序的改动中只需要简单的调整图片的特征值即可。
这里使用了前文YOLO 监控系统,在程序代码中设定为每10min 一次,截取当前画面进行处理并保存到本地存储,作为下次模型优化时的训练集数据。该功能对截取的图片进行一系列的修改,如旋转或镜像等,以保证数据集的多样式。
另一方面循环神经网络的扩展功能则是尝试将词嵌入矩阵加入到框架当中,由于深度学习在常规的自然语言处理应用中会加入词嵌入层,对输入端的独热向量进行降维,获得包含丰富特性信息的稠密向量来进行推导,而词嵌入层本质是一个矩阵,其内部数据在前期训练结束后便长期保持,直至下一次模型的更新或修改,因此利用这个特点可尝试将其存放在本地存储中,预处理框架可根据独热向量查找到对应特征词的稠密向量作为最后的处理结果,发送到上层应用[4]。
本文讲解了数据预处理框架的设计步骤,分别采用了卷积神经网络和循环神经网络两种模型中常见的预处理方法作为框架中程序的核心算法,部署在以STM32F407微控制器为核心的硬件设备中进行测试,并提出了若干个功能扩展的思路。在实际的工业环境中使用该数据预处理框架有诸多的好处,除了能提高神经网络模型的推导效率,提供多种途径增强和优化数据便于项目后期的维护和更新,还能对现有的硬件系统进行适配,从而进行人工智能项目的部署,降低研发的成本和门槛,还能让深度学习的技术进一步普及到更多的应用场景,促进物联网向人工智能物联网方向发展与壮大[5]。