近年来,人工智能(AI)技术的突破性进展为嵌入式系统带来了新的生机。AI技术的融入使得嵌入式系统能够更加智能地处理复杂任务, 如图像识别、语音识别、自然语言处理等。这种融合不仅提高了嵌入式系统的智能化水平,还极大地拓展了其应用范围, 使得嵌入式系统在智能家居、智能交通、智能医疗等领域有了更深层次的运用。AI技术的嵌入,已经成为未来嵌入式系统发展 的一个重要趋势。踏入边缘端部署的第一步,我们可以从一个经典的机器学习案例——手写数字识别开始。手写数字识别是AI技术与嵌入式系统融合的一个直观且易于理解的例子。它不仅展示了如何在资源受限的设备上运行复杂的AI算法,而且体现了将智能处理推向数据产生源的重要性,从而减少对云端计算的依赖。
神经网络模型的设计灵感来源于人类大脑的结构。人脑由大量相互连接的神经元组成,这些神经元通过电信号传递信息,帮助我们处理和理解周围的世界。模仿这一过程,人工神经网络(ANN)利用软件构建的人工神经元或节点来解决复杂问题。这些节点被组织成层,并通过计算系统执行数学运算以求解问题。
一个典型的神经网络模型包括三个主要部分:
输入层:负责接收来自外部世界的原始数据,如图像、声音或文本等。输入节点对这些数据进行初步处理后,将它们传递给下一层。
隐藏层:位于输入层与输出层之间,可以有一层或多层。每一层都会对接收到的数据进行分析和转换,逐步提取特征直至形成抽象表示。隐藏层的数量和宽度决定了网络的深度和复杂性。
输出层:最终产生网络的预测结果。根据任务的不同,输出层可能包含单个节点(例如二分类问题中的0或1)或者多个节点(如多类别分类问题)。
为了更直观地理解神经网络的工作原理,我们可以使用在线工具A Neural Network Playground
当神经网络中包含多个隐藏层时,它就被称为深度神经网络(DNN),也即深度学习网络。这类网络通常拥有数百万甚至更多的参数,使得它们能够捕捉到数据内部非常复杂的非线性关系。在深度神经网络中,每个节点之间的连接都有一个权重值,用来衡量两个节点间的关联强度;正权重表示激励作用,而负权重则意味着抑制作用。较高的权重意味着该节点对其相邻节点的影响更大。
理论上讲,足够深且宽的神经网络几乎可以拟合任意类型的输入输出映射。然而,这种能力是以需要大量的训练数据为代价的——相比起简单的浅层网络,深度神经网络往往需要数百万级别的样本才能达到良好的泛化性能。
根据具体应用场景和技术特点,人们开发了多种不同类型的神经网络架构:
在将深度学习模型部署到资源受限的环境中时,模型优化技术扮演着至关重要的角色。这些技术旨在减少模型的大小、降低计算复杂度,并提高推理速度,同时尽量保持或最小化对模型准确性的负面影响。以下是三种常见的模型优化技术:剪枝、量化和蒸馏。
剪枝是一种通过移除神经网络中不重要或冗余的连接(权重)或节点来压缩模型的技术。通常,剪枝是基于权重的绝对值大小来进行的,即认为较小的权重对于模型的重要性较低,可以被安全地删除。
过程:
优点:
挑战:
模型量化是深度学习模型优化的一种关键技术,旨在通过减少模型参数和激活值的数值精度来降低模型的存储需求和计算复杂度。具体来说,量化通常涉及将浮点数(如32位或16位)表示的权重和激活转换为低精度的数据类型(如8位整数或更低),从而实现模型压缩和加速推理。
过程
(1)训练后量化
这是最简单的方法,直接应用于已经训练好的模型。过程如下:
这种方法的优点是不需要重新训练模型,但可能导致一定程度的精度损失。
(2)量化感知训练
量化感知训练在模型训练阶段就引入了量化操作。这意味着在整个训练过程中,模型会“学习”如何更好地适应量化后的环境。 步骤包括:
这种方法通常能保留更多的模型精度,因为模型已经在训练中学会了应对量化带来的变化。
优点:
挑战:
蒸馏,也称为知识迁移,是一种通过“教师”模型指导“学生”模型学习的方法。“教师”模型通常是更大、更复杂的模型,具有较高的准确性;而“学生”模型则设计得更加紧凑,以便于部署。“教师”的输出(软标签)作为额外信息传递给“学生”,帮助其学习。
过程:
优点:
挑战:
ONNX(Open Neural Network Exchange)是一种用于在各种深度学习框架之间转换神经网络模型的开放格式。它允许用户将训练好的模型从深度学习框架转换为其他框架,或者将模型从一种框架转换为另一种框架。借助它支持不同的人工智能框架(如 PyTorch、MXNet)采用相同格式存储模型数据并交互。
在没有ONNX之前,每个深度学习框架都有其自己的模型格式,这导致了所谓的“框架锁定”问题——即一旦选择了某个框架进行开发,就很难将模型迁移到其他框架中去。ONNX通过定义一种标准化的模型交换格式打破了这种限制,允许模型在PyTorch、TensorFlow、MXNet等流行框架之间自由转换。这意味着开发者可以根据项目需求灵活选择最适合的工具链,而不必担心后期迁移的成本。
对于那些希望快速迭代并优化模型的企业和个人开发者而言,ONNX极大地简化了从研究到生产的路径。例如,研究人员可以在一个框架中设计并训练模型,而工程师则可以轻松地将该模型转换为另一种更适合生产环境的框架来部署。此外,许多推理引擎和硬件加速器也支持ONNX格式,从而进一步加快了模型部署的速度。
在凌智视觉模块中模型转换就比较简单,我们只需要点击运行即可,下面是具体的代码。
%cd /home/aistudio/PaddleX
!pip uninstall -y paddle2onnx
!pip install paddle2onnx -i https://pypi.doubanio.com/simple/ --trusted-host pypi.douban.com
!paddle2onnx --model_dir ./output/best_model/inference \\
--model_filename inference.pdmodel \\
--params_filename inference.pdiparams \\
--save_file ${MODEL_NAME}.onnx \\
--deploy_backend rknn
!cp ${MODEL_NAME}.onnx /home/aistudio/output
%cd /home/aistudio/LockzhinerVisionModule
然后使用 LockzhinerVisionModule 模型转换工具,将 ONNX 模型转换为 RKNN 模型。
# 将 FP32 ONNX 模型转换为 RKNN 模型
import os
def list_image_files(directory, output_file):
with open(output_file, 'w') as f:
for root, dirs, files in os.walk(directory):
for file in files:
if file.lower().endswith(('.png', '.jpg', '.jpeg')):
abs_path = os.path.abspath(os.path.join(root, file))
f.write(abs_path + '\\n')
directory_path = '/home/aistudio/data/Dataset' # 替换为你的目录路径
output_file_path = 'dataset.txt' # 输出文件名
list_image_files(directory_path, output_file_path)
!pip install onnxslim
!python utils/export.py \\
--config_path=./configs/${MODEL_NAME}.yaml \\
--model_load_path=/home/aistudio/output/${MODEL_NAME}.onnx \\
--model_save_path=/home/aistudio/output/${MODEL_NAME}.rknn \\
--target_platform=RV1106
边缘计算是一种将数据处理任务尽可能靠近数据源执行的计算模式,其主要目的是减少延迟、节省带宽,并增强隐私保护。与依赖远程数据中心进行数据处理和存储的传统云计算不同,边缘计算让智能处理更贴近用户或传感器,带来了显著的优势:
然而,边缘计算也带来了独特的挑战,特别是在资源受限的嵌入式系统中部署复杂的AI模型时。为了确保神经网络模型能够在边缘设备上高效运行,必须考虑以下关键因素:
(1)硬件性能限制
边缘设备通常配备有较低功耗的处理器(如CPU或GPU),这意味着它们的计算能力有限。对于深度学习模型而言,这可能是一个瓶颈。因此,选择合适的硬件加速器变得至关重要,比如神经处理单元(NPU)、数字信号处理器(DSP)等,这些专用硬件可以显著提高推理速度,同时保持较低的功耗。
(2)内存容量
内存大小直接关系到模型的复杂度和可加载性。大型神经网络往往需要大量的RAM来存储权重和其他参数。对于内存有限的小型嵌入式系统来说,这可能意味着无法支持过于复杂的模型。因此,在设计阶段就需要权衡模型精度与所需资源之间的关系,必要时简化模型结构以适应目标平台。
(3)功耗管理
许多边缘设备依靠电池供电,这意味着长时间运行高能耗的应用程序会导致电量快速耗尽。为了延长续航时间,开发者应该采用节能算法和技术,例如量化、剪枝等方法来降低模型对计算资源的需求。此外,还可以利用动态电压频率调节(DVFS)技术根据实际工作负载调整处理器的工作状态,进一步节约电力。
(4)存储空间
尽管现代边缘设备拥有一定的内部存储,但深度学习框架及相关库可能会占用大量空间。特别是当涉及到预训练模型时,文件大小可能相当可观。因此,压缩模型或者精简依赖项成为了一个重要的考量点。使用轻量级框架、去除不必要的功能模块以及应用模型压缩技术(如量化感知训练)都是有效的解决方案。
在进行模型的部署之前,我们首先需要确认自己手上的模块的支持哪些算子、支持什么类型的量化(int4/int8/fp16/混合精度)、内存大小等参数,对于手上的板子有一个全面的了解。在进行部署时,我们常常将训练的模型转化成onnx中间文件,再根据硬件设备要求的转化成硬件要求的模型文件。
在本次实验中,我使用的模块是凌智视觉模块(Lockzhiner Vision Module) ,这个模块是福州市凌睿智捷电子有限公司联合百度飞桨倾力打造的一款高集成度人工智能视觉模块,专为边缘端人工智能和机器视觉应用而设计,模块的参数如下图所示。
这个模块有着一个很吸引人的特点与飞桨低代码开发工具 PaddleX 完美适配,配合飞桨星河社区 Al Studio, 可以实现一键训练;配合凌智视觉算法部署库,用户可以实现一键部署,减少我们在模型部署时遇到的疑难杂症。如果遇到问题,可以去厂家开源仓库提交问题。
凌智视觉模块Gitee链接
废话不多说,试一试这个低代码平台是否真的如宣传所说的那样容易使用。在 百度飞桨的 AiStudio 中,搜索【PaddleX】在凌智视觉模块上部署手写数字分类模型
如果说有自己制作数据的话,需要将数据上传,然后在修改全局配置项,修改数据集地址以及对应的类别数。
按照厂家提供的配置直接进行训练转换。
模型的训练时间大概为半个小时,训练完成后,会自动生成一个rknn模型文件,
模型的推理结果如下图所示
更多回帖