嵌入式技术论坛
直播中

老渔翁

12年用户 529经验值
擅长:模拟技术 测量仪表 嵌入式技术 处理器/DSP 控制/MCU RF/无线
私信 关注
[经验]

AI模型部署边缘设备的奇妙之旅:如何实现手写数字识别

1 简介

近年来,人工智能(AI)技术的突破性进展为嵌入式系统带来了新的生机。AI技术的融入使得嵌入式系统能够更加智能地处理复杂任务, 如图像识别、语音识别、自然语言处理等。这种融合不仅提高了嵌入式系统的智能化水平,还极大地拓展了其应用范围, 使得嵌入式系统在智能家居、智能交通、智能医疗等领域有了更深层次的运用。AI技术的嵌入,已经成为未来嵌入式系统发展 的一个重要趋势。踏入边缘端部署的第一步,我们可以从一个经典的机器学习案例——手写数字识别开始。手写数字识别是AI技术与嵌入式系统融合的一个直观且易于理解的例子。它不仅展示了如何在资源受限的设备上运行复杂的AI算法,而且体现了将智能处理推向数据产生源的重要性,从而减少对云端计算的依赖。

2 基础知识

2.1 神经网络模型概览

神经网络模型的设计灵感来源于人类大脑的结构。人脑由大量相互连接的神经元组成,这些神经元通过电信号传递信息,帮助我们处理和理解周围的世界。模仿这一过程,人工神经网络(ANN)利用软件构建的人工神经元或节点来解决复杂问题。这些节点被组织成层,并通过计算系统执行数学运算以求解问题。

一个典型的神经网络模型包括三个主要部分:

  • 输入层:负责接收来自外部世界的原始数据,如图像、声音或文本等。输入节点对这些数据进行初步处理后,将它们传递给下一层。

  • 隐藏层:位于输入层与输出层之间,可以有一层或多层。每一层都会对接收到的数据进行分析和转换,逐步提取特征直至形成抽象表示。隐藏层的数量和宽度决定了网络的深度和复杂性。

  • 输出层:最终产生网络的预测结果。根据任务的不同,输出层可能包含单个节点(例如二分类问题中的0或1)或者多个节点(如多类别分类问题)。
    img_1.png

    为了更直观地理解神经网络的工作原理,我们可以使用在线工具A Neural Network Playground
    img.png

    当神经网络中包含多个隐藏层时,它就被称为深度神经网络(DNN),也即深度学习网络。这类网络通常拥有数百万甚至更多的参数,使得它们能够捕捉到数据内部非常复杂的非线性关系。在深度神经网络中,每个节点之间的连接都有一个权重值,用来衡量两个节点间的关联强度;正权重表示激励作用,而负权重则意味着抑制作用。较高的权重意味着该节点对其相邻节点的影响更大。

    理论上讲,足够深且宽的神经网络几乎可以拟合任意类型的输入输出映射。然而,这种能力是以需要大量的训练数据为代价的——相比起简单的浅层网络,深度神经网络往往需要数百万级别的样本才能达到良好的泛化性能。

2.3 常见的神经网络类型

根据具体应用场景和技术特点,人们开发了多种不同类型的神经网络架构:

  • 前馈神经网络(FNN):最基础的一种形式,其中数据仅沿单一方向流动,从输入层经过一系列隐藏层到达输出层,不存在反馈路径。
  • 卷积神经网络(CNN):特别擅长于图像识别任务,因其特殊的滤波器设计能够有效地捕捉图像的空间结构信息。
  • 循环神经网络(RNN):适用于处理序列数据,比如自然语言处理中的句子或是时间序列分析中的股票价格走势。RNN具备记忆功能,允许当前时刻的状态依赖于之前时刻的状态。
  • 长短期记忆网络(LSTM) 和门控循环单元(GRU):作为RNN的改进版本,旨在克服传统RNN中存在的梯度消失问题,从而更好地建模长时间跨度上的依赖关系。
  • 生成对抗网络(GAN):由两个子网络构成,一个是生成器用于创造新的数据样本,另一个是判别器用来判断这些样本的真实性。两者相互竞争,共同进化,最终实现高质量的数据合成。

2.4 模型优化技术

在将深度学习模型部署到资源受限的环境中时,模型优化技术扮演着至关重要的角色。这些技术旨在减少模型的大小、降低计算复杂度,并提高推理速度,同时尽量保持或最小化对模型准确性的负面影响。以下是三种常见的模型优化技术:剪枝、量化和蒸馏。

2.4.1 剪枝(Pruning)

剪枝是一种通过移除神经网络中不重要或冗余的连接(权重)或节点来压缩模型的技术。通常,剪枝是基于权重的绝对值大小来进行的,即认为较小的权重对于模型的重要性较低,可以被安全地删除。

过程:

  • 预训练阶段:首先训练一个大型的初始模型。
  • 剪枝阶段:根据设定的标准(如阈值)去除部分权重或整个神经元。
  • 微调阶段:对剪枝后的模型进行再训练,以恢复可能因剪枝而损失的精度。

优点:

  • 显著减少了模型参数的数量,从而降低了存储需求和计算成本。
  • 对于某些应用,可以通过剪枝实现更高的效率,尤其是在硬件加速器上。

挑战:

  • 剪枝可能会导致模型性能下降,因此需要仔细选择剪枝策略并进行适当的再训练。
  • 高度非线性的问题中,简单地剪枝可能会造成较大的准确率损失。

2.4.2 量化(Quantization)

模型量化是深度学习模型优化的一种关键技术,旨在通过减少模型参数和激活值的数值精度来降低模型的存储需求和计算复杂度。具体来说,量化通常涉及将浮点数(如32位或16位)表示的权重和激活转换为低精度的数据类型(如8位整数或更低),从而实现模型压缩和加速推理。

过程

(1)训练后量化

这是最简单的方法,直接应用于已经训练好的模型。过程如下:

  • 统计分析:收集模型中所有层的激活和权重分布信息。
  • 确定范围:根据统计结果确定量化范围(例如最小值和最大值),以便将浮点数映射到整数区间。
  • 应用量化:将浮点权重和激活值按照预定规则转换为低精度整数。
  • 校准(可选):为了最小化量化误差,可以通过少量数据集进行校准,调整量化参数。

这种方法的优点是不需要重新训练模型,但可能导致一定程度的精度损失。

(2)量化感知训练

量化感知训练在模型训练阶段就引入了量化操作。这意味着在整个训练过程中,模型会“学习”如何更好地适应量化后的环境。 步骤包括:

  • 模拟量化:在前向传播时,模拟量化过程,即用低精度数值代替高精度数值来进行计算。
  • 反向传播与更新:在反向传播期间,仍然使用原始浮点梯度进行参数更新,确保模型能够正常收敛。
  • 逐步量化:可以选择性地先对某些层进行量化,观察其影响后再决定是否对其他层也实施量化。
  • 最终量化:完成训练后,将模型完全转换为量化版本。

这种方法通常能保留更多的模型精度,因为模型已经在训练中学会了应对量化带来的变化。

优点:

  • 显著降低模型的存储需求和计算复杂度。
  • 在特定硬件(如GPU、NPU)上运行时,可以大幅提升推理速度。

挑战:

  • 可能会导致一定的精度损失,尽管这种损失通常是可控的。
  • 不同类型的模型和任务对量化敏感度不同,需谨慎评估。

2.4.3 蒸馏(Knowledge Distillation)

蒸馏,也称为知识迁移,是一种通过“教师”模型指导“学生”模型学习的方法。“教师”模型通常是更大、更复杂的模型,具有较高的准确性;而“学生”模型则设计得更加紧凑,以便于部署。“教师”的输出(软标签)作为额外信息传递给“学生”,帮助其学习。

过程:

  • 教师模型训练:先训练出一个高性能但可能过于庞大的教师模型。
  • 学生模型训练:使用教师模型的输出作为监督信号,训练一个较小的学生模型,使其模仿教师的行为。
  • 混合损失函数:结合硬标签(原始目标值)与软标签(教师预测),构成最终的损失函数用于训练学生模型。

优点:

  • 可以在几乎不影响预测质量的情况下大幅减小模型规模。
  • 学生模型继承了教师的知识,能够在资源受限的设备上高效运行。

挑战:

  • 设计有效的教学策略以及选择合适的损失函数是关键。
  • 教师模型的质量直接影响到学生的学习效果,因此需要高质量的教师模型。

2.5 ONNX

ONNX(Open Neural Network Exchange)是一种用于在各种深度学习框架之间转换神经网络模型的开放格式。它允许用户将训练好的模型从深度学习框架转换为其他框架,或者将模型从一种框架转换为另一种框架。借助它支持不同的人工智能框架(如 PyTorch、MXNet)采用相同格式存储模型数据并交互。
onnx.png

在没有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

2.6 边缘端部署需考虑因素

边缘计算是一种将数据处理任务尽可能靠近数据源执行的计算模式,其主要目的是减少延迟、节省带宽,并增强隐私保护。与依赖远程数据中心进行数据处理和存储的传统云计算不同,边缘计算让智能处理更贴近用户或传感器,带来了显著的优势:

  • 低延迟:由于减少了数据往返云端的时间,边缘计算可以实现近乎即时的数据处理和响应。
  • 带宽优化:通过在本地处理数据,边缘计算减少了需要上传到云端的数据量,从而降低了通信成本和网络负载。
  • 隐私与安全:敏感数据可以在本地处理,而不必传输到外部服务器,这有助于更好地保护用户隐私和数据安全。

然而,边缘计算也带来了独特的挑战,特别是在资源受限的嵌入式系统中部署复杂的AI模型时。为了确保神经网络模型能够在边缘设备上高效运行,必须考虑以下关键因素:

(1)硬件性能限制

边缘设备通常配备有较低功耗的处理器(如CPU或GPU),这意味着它们的计算能力有限。对于深度学习模型而言,这可能是一个瓶颈。因此,选择合适的硬件加速器变得至关重要,比如神经处理单元(NPU)、数字信号处理器(DSP)等,这些专用硬件可以显著提高推理速度,同时保持较低的功耗。

(2)内存容量

内存大小直接关系到模型的复杂度和可加载性。大型神经网络往往需要大量的RAM来存储权重和其他参数。对于内存有限的小型嵌入式系统来说,这可能意味着无法支持过于复杂的模型。因此,在设计阶段就需要权衡模型精度与所需资源之间的关系,必要时简化模型结构以适应目标平台。

(3)功耗管理

许多边缘设备依靠电池供电,这意味着长时间运行高能耗的应用程序会导致电量快速耗尽。为了延长续航时间,开发者应该采用节能算法和技术,例如量化、剪枝等方法来降低模型对计算资源的需求。此外,还可以利用动态电压频率调节(DVFS)技术根据实际工作负载调整处理器的工作状态,进一步节约电力。

(4)存储空间

尽管现代边缘设备拥有一定的内部存储,但深度学习框架及相关库可能会占用大量空间。特别是当涉及到预训练模型时,文件大小可能相当可观。因此,压缩模型或者精简依赖项成为了一个重要的考量点。使用轻量级框架、去除不必要的功能模块以及应用模型压缩技术(如量化感知训练)都是有效的解决方案。

3 部署

3.1 准备工作

在进行模型的部署之前,我们首先需要确认自己手上的模块的支持哪些算子、支持什么类型的量化(int4/int8/fp16/混合精度)、内存大小等参数,对于手上的板子有一个全面的了解。在进行部署时,我们常常将训练的模型转化成onnx中间文件,再根据硬件设备要求的转化成硬件要求的模型文件。

在本次实验中,我使用的模块是凌智视觉模块(Lockzhiner Vision Module) ,这个模块是福州市凌睿智捷电子有限公司联合百度飞桨倾力打造的一款高集成度人工智能视觉模块,专为边缘端人工智能和机器视觉应用而设计,模块的参数如下图所示。
parameter .png
这个模块有着一个很吸引人的特点与飞桨低代码开发工具 PaddleX 完美适配,配合飞桨星河社区 Al Studio, 可以实现一键训练;配合凌智视觉算法部署库,用户可以实现一键部署,减少我们在模型部署时遇到的疑难杂症。如果遇到问题,可以去厂家开源仓库提交问题。
凌智视觉模块Gitee链接

3.2 模型转换

废话不多说,试一试这个低代码平台是否真的如宣传所说的那样容易使用。在 百度飞桨的 AiStudio 中,搜索【PaddleX】在凌智视觉模块上部署手写数字分类模型

如果说有自己制作数据的话,需要将数据上传,然后在修改全局配置项,修改数据集地址以及对应的类别数。
aistudio2.png

按照厂家提供的配置直接进行训练转换。
aistudio.png

模型的训练时间大概为半个小时,训练完成后,会自动生成一个rknn模型文件,

3.3 部署结果

模型的推理结果如下图所示
predict.png

更多回帖

发帖
×
20
完善资料,
赚取积分