本帖最后由 小恩GG 于 2024-11-20 15:58 编辑
MCXN94x: AI模型替换方法 一、概述 MCXN94x采用了两个高性能的Arm® Cortex®-M33内核,最高运行频率可达150MHz,并集成了eIQ Neutron NPU,特别适合执行MCU上的机器学习任务。NXP为这一系列的MCU提供了丰富的软件开发工具包(SDK)示例,包括但不限于人脸识别、物体检测、Cifar-10图像分类及关键词识别等应用场景。开发者们可以利用这些示例作为起点,学习如何把自己的模型加到项目里去。这篇文章会一步步教大家,在MCUXpresso IDE里,怎么把SDK中AI应用的默认模型,换成自己训练的新模型。 二、开发环境准备
2.1 硬件准备开发板: FRDM-MCXN947 2.2软件准备
MCUXpresso v11.9、eIQ Toolkit v1.13.1、 SDK_2_16_000_FRDM-MCXN947
Demo: frdmmcxn947_tflm_label_image
三、 AI模型替换过程
3.1 模型准备然后,选择Tensorflow datasets的Dataset选项中的mnist数据集,进行导入。在加载数据集时,可以在Train Split和Test Split选择测试集和训练集的样本大小。Dataset包含了经典数据集为用户学习和测试提供了十分便利的方式。 选择基础mobilenet_v1模型,使用mnist数据集进行训练,mobilenet_v1是一种轻量级卷积神经网络,适合在移动端或嵌入式设备上运行。 选择模型后,进入到模型训练界面,在常用训练参数都在左侧选项栏里,选择合适的参数进行训练模型。其中,常用的参数包括: Weight Initialization: 模型权重初始化策略,包括Imagenet(即网络预训练权重),随机权重,以及本地权重文件(即加载本地所保存的模型权重文件)。 Input Size:指定模型输入尺寸。 Learning Rate:模型训练学习率,控制每次迭代后模型权重更新速度。 Batch Size:每一次迭代所使用的数据大小。
Epochs ToTrain: 总的训练迭代次数。 训练完成后,对模型进行量化,并导出为TensorFlow Lite格式模型,命名为mobilenet.tflte。后续模型转换过程中,会使用eIQ软件的MODE TOOL工具把它转换为.h文件格式。 3.2 模型转换为了在使用模型过程中,使模型文件更加适应SDK应用和不同的编译环境,我们需要把模型. tflite格式转换为.h格式,具体做法如下:
(1) 打开eIQ工具,选择MODEL TOOl工具。
(2) 选择Open Model功能,然后选择训练的mobilenet.tflte模型,Open打开。 (3) 打开模型后,如下图所示,模型输入要求为128*128*3的三通道像素图像数据,并有多个层组成。然后,选择TensorFlow Lite for Neutron(.tflite)进行模型转换。 (4) 在出现的对话框中,选择 mcxn94x 作为目标,然后在自定义选项字段中输入:dump-header-file-output;dump-header-file-input ,输入这两个选项将生成转换后的模型和输入模型的 C 数组。此外,请确保正在使用 MCU_SDK_2.16.0 。单击Convert转换并将转换后的文件并保存。 (5) 完成上步,将得到 mobilenet.h,mobilenet_converted.h 两个.h模型头文件。mobilenet.h模型用于在MCU运行,mobilenet _converted.h 用于NPU运行。本文使用mobilenet_converted.h模型进行AI应用模型替换实验,感兴趣研究者可以比较两个模型在MCXN94x上的性能。 3.3 模型替换 (1) AI应用加载
使用MCUXpresso IDE加载AI应用能够使用SDK和Code Hub两种方式,本文以使用SDK方式导入AI应用进行演示。加载SDK中 AI应用方式如下图,打开MCUXpresso IDE,导入SDK_2_16_000_FRDM-MCXN947 ,选择MCXN947,单击next。 然后,选择eiq_examples例程中的tflm_label_image 应用,此AI应用能够实现多种图像的分类。
另外,eiq_examples例程中mpp_camera_persondetect_view_tflm和mpp_camera_ultraface_view_tflm为人脸识别应用;tflm_cifar10为cifar10分类应用;mpp_camera_mobilenet_view_tflm为摄像头图像识别应用;tflm_kws为关键词识别应用;mpp_camera_view为摄像头图像捕获应用。 下图为导入工程后的目录,其中model目录下存放模型相关文件,model_data.h包含了默认模型数据,model_cifamet_ops_npu.cpp包含了算子操作内容。Image_data.h包含了图片数据数据,并以数组格式存放在image_data[]中。labels.h包含了模型数据标签。 (2)替换模型.h文件
添加mobilenet_converted.h文件到工程model目录下。在打开的工程中,默认模型以数组形式存放在model_date.h中,需要在model.cpp中注释掉#include “model_date.h”,然后添加训练的#include “mobilenet_converted.h”文件。 (3)替换模型描述信息
在默认模型头文件中包含了一些模型信息,这些信息描述了该模型将需要多少内存,并描述了该模型使用的一些标准化值,打开 model_data.h(此示例的默认模型),找到以下图片中的红框代码部分并复制它。
在 mobilenet_converted.h中,注释mode_date[]数组上方的默认 #define。把上一步复制的model_data.h的代码放到mobilenet_converted.h中,修改前后如下图。 (4) 算子替换
算子是执行特定计算任务的小型程序或函数,比如卷积、激活、池化等。不同的模型结构不同,使用的算子也有所不同。mobilenet_converted.h文件顶部生成有使用的算子,需要把这些内容添加到model_mobilenet_ops_npu.cpp文件中。
在model_mobilenet_ops_npu.cpp文件中,注释掉默认模型的算子内容,添加mobilenet_converted.h文件中的模型算子。 (5) 更改标签和静态图片数据
找到labels.h文件,添加与训练模型对应的数据标签。 frdmmcxn947_tflm_label_image工程中,图片以静态数组方式储存在image_data[]中,在测试模型过程中修改这些数据为自己的图片数据。 (6)编译下载
首先,编译工程。
接下来,将编译成功的程序下载至FRDM-MCXN947开发板,并按照下图所示运行程序。本文中,我们用“0”和“1”的手写数字图片数据替换了默认数据,以展示数字识别的效果。 四、总结
本文档着重介绍了如何利用eIQ和MCUXpresso IDE软件,在使用SDK中的eiq_examples AI应用时,将默认模型替换为用户自己训练的模型。同时,文档还详细说明了eIQ中自带数据集的导入流程,旨在帮助大家更好地学习AI和MCU的相关知识。
|