在当今技术飞速发展的环境中,边缘机器学习(边缘ML)正在成为一股变革力量,重塑我们实时处理和分析数据的方式。这种创新技术直接在边缘设备上部署ML模型,带来了新一波响应式智能应用。
传统的ML模型依赖集中式云服务器进行大量数据处理,而边缘ML将计算负担转移到本地边缘设备上,从而实现即时决策,而无需一直依赖远程服务器。这种转变解决了传统方法在延迟、隐私和带宽方面固有的挑战。
边缘ML的一大关键优势是能够提供实时分析。通过直接在边缘设备上执行推理,应用可以对动态条件做出快速反应,使其成为时间关键型场景的理想选择。无论是自动驾驶汽车做出快速决策、智能监控摄像头执行区域监控,还是医疗保健设备提供及时诊断,边缘ML所减少的延迟都代表着重大进步。
本文将指导您使用NXP Semiconductors FRDM-MCXN947开发板开展边缘ML实际应用,并介绍用于生成ML模型的NXP eIQ® Portal。该开发板搭载的NXP MCX N947微控制器采用eIQ Neutron神经处理单元(NPU),设计用于缩短推理时间,同时还能延长边缘ML产品的电池续航时间。从智慧城市和工业物联网(IIoT)到医疗保健和消费电子产品,边缘ML的潜在应用多种多样,影响深远。
《Jump into Machine Learning with NXP》(实操项目解锁NXP产品在边缘机器学习中的潜力)一文对硬件和软件设置进行了更详细的介绍。
项目材料与资源
项目物料清单(BOM)
- NXP FRDM-MCXN947
项目代码/软件
其他资源
- MCUXpresso IDE终端窗口、Tera Term或其他终端模拟器软件
- Python编程语言
- OpenCV
其他硬件
- Windows PC
- USB Type-C转USB Type-A电缆或Type-C电缆(取决于PC提供的USB端口类型)
帐户
- NXP帐户(可免费创建)
项目技术概况
FRDM-MCXN947开发板(图1)采用MCX N947微控制器,该MCU有两个高性能Arm® Cortex®-M33内核,每个内核的运行速度高达150MHz。该MCU配备2MB闪存、可选的全ECC RAM、DSP协处理器和集成式eIQ Neutron NPU。NPU可显著提高ML吞吐量,与单核CPU相比,性能最多可提升30倍,因而可大幅缩短设备的工作时间,降低总体功耗。
图1:采用MCX N947 MCU的NXP FRDM-MCXN947开发板。(图源:贸泽电子)
多核架构通过在模拟和数字外设之间智能分配工作负载,提高了系统性能和效率。此开发板配备了MCUXpresso Developer Experience支持,经过优化且使用方便,可以加快嵌入式系统的开发速度。
MCX N94x系列专为工业应用而设计,具有更丰富的模拟和电机控制外设。
软件概述
本节将介绍运行本项目示例所需的软件。有关安装说明,请参阅《Jump into Machine Learning with NXP》一文。
MCUXpresso IDE
MCUXpresso集成开发环境(IDE)为开发人员提供基于Eclipse的用户友好开发环境,专为搭载Arm Cortex-M内核的NXP MCU量身定制,包括通用跨界MCU和支持无线功能的MCU。此IDE提供各种高级编辑、编译和调试功能,包括MCU特定调试视图、代码跟踪和剖析、多核调试以及集成的配置工具(图2)。
图2:NXP MCUXpresso IDE。(图源:贸泽电子)
SDK Builder
MCUXpresso SDK Builder(图3)通过提供开源驱动程序、中间件和参考示例应用来加快软件开发速度。通过SDK Builder,您可以定制并下载与所选处理器或评估板相匹配的软件开发套件(SDK),从而简化开发流程。我们将在后面创建并安装SDK。
图3:NXP MCUXpresso SDK Builder网站。(图源:贸泽电子)
eIQ Portal
eIQ Toolkit(图4)通过直观的图形用户界面(即eIQ Portal)和工作流工具,以及eIQ ML软件开发环境中的命令行主机工具选项,助力ML的开发。NXP的eIQ Toolkit是与Au-Zone Technologies独家合作开发的,它为开发人员提供图形级分析功能和运行时洞察力,可优化EdgeVerse™处理器上的神经网络架构。它还提供转换模型以便利用eIQ Neutron NPU所需的工具。
图4:NXP eIQ Portal。(图源:贸泽电子)
eIQ工具包为导入数据集提供了简便方法,并配有全面的用户指南,帮助您了解各种选项。
项目开发
本节将介绍如何开始构建项目。首先,打开eIQ Portal。
eIQ模型导入与训练
打开eIQ Portal后,单击Create Project(创建项目)并选择Import Dataset(导入数据集)。这时会出现几个选项(如用于检测任务的VOC数据集、用于分类任务的结构化文件夹、TensorFlow数据集),供您加载TensorFlow网站上提供的各种数据集(图5)。
图5:eIQ Portal数据集导入界面。(图源:贸泽电子)
导入数据集后,您可以捕获并添加其他映像,或使用增强工具修改现有映像。确认无误后,单击Portal窗口底部的Select Model(选择模型)框。
Model Selection(模型选择)部分(图6)包含三个选项——Classification(分类)、Segmentation(分割)和Detection(检测),每个选项都附有说明,以便用户根据训练时间和数据集大小等因素权衡利弊。在本文中,我们将使用训练速度更快,更适合测试数据集的Classification模型。如果有更高要求的话,可以随后再使用更复杂、需要更长训练时间和更大数据集的模型,如Detection。
图6:eIQ Portal的Model Selection窗口。(图源:贸泽电子)
接下来,选择模型性能选项(图7),包括Performance(性能)、Balanced(平衡)和Accuracy(精度),每个选项的权重都根据性能类型和设计要求确定。在本例中,我们选择Balanced。
图7:eIQ Portal的模型性能选择界面。(图源:贸泽电子)
然后,确定使用何种设备来推理模型(图8)。MCX N微控制器包含eIQ Neutron NPU,非常适合ML应用。
图8:eIQ Portal的设备选择界面。(图源:贸泽电子)
一切就绪后,就可以开始训练模型了。虽然有多个选项可以对训练过程进行修改(图9),但本项目中我们使用默认设置。训练完成后(可能需要几分钟),您可以选择调整设置并重新训练,或者继续训练,或者进入到对训练进行验证的步骤。
图9:eIQ Portal模型训练界面。(图源:贸泽电子)
验证过程(图10)提供了多个可调参数。因为我们选择了NPU作为推理目标,所以必须进行量化。评估本步骤和之前步骤中的不同选项,以确定哪些参数最符合您的具体要求。
图10:eIQ Portal模型验证界面。(图源:贸泽电子)
部署模型
模型训练和验证完成后,我们需要将其导出并转换为与NPU兼容的格式。本节将介绍转换步骤。
导出模型
完成验证后,eIQ Portal会提供部署或导出模型的选项;本项目中,我们需要导出模型。在左侧菜单中,确保打开Export Quantized Model(导出量化模型)设置,然后单击Export Model(导出模型)(图11)。选择要导出到的位置,然后等待导出完成。
图11:导出训练后的模型。(图源:贸泽电子)
转换模型
成功导出模型后,将鼠标悬停在顶部菜单中的Workspaces(工作区)上,然后选择Home(主页)。在eIQ Portal主页上,单击Model Tool(模型工具)。在下一个窗口中,单击Open Model(打开模型)。浏览到导出模型保存的位置,选择该文件,然后单击Open(打开),进入模型工具显示界面(图12)。
图12:导出模型显示在模型工具显示界面中。(图源:贸泽电子)
单击窗口左上角的三条横线图标打开菜单,然后单击Convert(转换)。在新窗口中,选择TensorFlow Lite for Neutron (.tflite),打开Conversion Options(转换选项)窗口(图13)。将Neutron target(Neutron目标)设为mcxn94x,然后单击Convert(转换)。选择要将转换后的模型保存到的位置。
图13:eIQ模型工具的转换选项。(图源:贸泽电子)
将模型集成到MCXN94x NPU中
此时,软件模型已完成训练、验证、导出和转换,我们将使用MCUXpresso IDE将其集成到代码中,以便在MCX N94x上运行。如果尚未安装IDE,请参阅《Jump into Machine Learning with NXP》一文,了解安装说明。此外,还可以参阅该文章中的“Building and Installing the SDK”(创建并安装SDK)说明,以确保正确安装FRDM-MCXN947开发套件。
安装好MCUXpresso IDE和FRDM-MCXN947工具包后,下一步是导入示例项目。在MCUXpresso的Quickstart面板中,单击Import SDK example(s)...(导入SDK示例)启动SDK Import Wizard(SDK导入向导)。
1.在选择板和设备的页面中,选择frdmmcxn947板,然后单击Next(下一步)。
2.在Import projects(导入项目)窗口(图14)中,浏览到eiq_examples,然后选择tflm_cifar10。
3.单击Next。
图14:MCUXpresso的SDK Import Wizard。(图源:贸泽电子)
新建的示例程序将出现在IDE左上角的Project Explorer(项目资源管理器)中。
1.在Project Explorer中,浏览至Source文件夹并展开显示子文件夹,然后右键单击Model
2.单击New(新建),然后选择File from Template(从模板创建文件)。
3.在New File(新建文件)窗口(图15)中,在File name:(文件名)字段输入新文件的名称,然后选择Configure(配置)。
图15:从模板创建新文件。(图源:贸泽电子)
4.在Preferences (Filtered)(首选项 (筛选))窗口(图16)中,选择Assembly Source File(程序集源文件),然后单击Apply and Close(应用并关闭)。
图16:模板首选项。(图源:贸泽电子)
创建文件后,在Project Explorer中添加以下代码行(图17)。请将custom_model_converted_V1.tflite替换为您使用的文件名。
.section .rodata
.align 16
.global custom_model_data
.global custom_model_data_end
custom_model_data:
.incbin "/source/model/custom_model_converted_V1.tflite"
custom_model_data_end:
然后,浏览至转换后的tflite文件所在位置并复制模型。在MCUXpresso IDE中,将模型文件粘贴到Model文件夹中。
图17:新建的程序集源文件,包含修改后的代码。(图源:贸泽电子)
接下来,更新model.cpp,使图18中突出显示的部分与custom_model_data[]匹配。同时,更新修改model_cifarnet_ops_npu.cpp,确保自定义模型使用的所有运算符都更新/添加到s_microOpResolver中(图19)。
图18:编辑model.cpp文件。(图源:贸泽电子)
图19:编辑model_cifarnet_ops_npu.cpp文件。(图源:贸泽电子)
测试模型
接下来,我们要准备测试数据,然后对模型进行测试。下面的Python脚本可以轻松转换图像,并将其导出到C数组中,以便在示例代码中使用。在本示例中,我们将使用Python脚本,把船的图像替换为鸟的图像。
img = cv2.imread('bird.jpg')
img = cv2.resize(img, (128,128))
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
with open('bird.h', 'w') as fout:
print('#define STATIC_IMAGE_NAME "bird"', file=fout)
print('static const uint8_t bird [] = {', file=fout)
img.tofile(fout, ',', '0x%02x')
print('};n', file=fout)
将转换后的“.h”文件复制到项目中的image文件夹,该文件夹与model文件夹位于同一位置。然后,修改image_load.c文件以指向新的图像数组(图20)。
图20:修改后的image_load.c文件。(图源:贸泽电子)
打开终端界面(如Putty),按如下所示配置串行设置:
- 波特率:115200
- 数据位:8
- 奇偶校验位:无
- 停止位:1
- 流控制:无
接下来,在MCUXpresso IDE中选择Debug(调试),以构建并运行更新后的项目代码。如果构建过程和代码运行成功,终端窗口将出现图21所示的输出。
图21:终端窗口输出。(图源:贸泽电子)
该序列可用于评估不同的图像,以验证模型的准确性。
结语
边缘ML的变革性潜能在于其提供实时见解的能力。如本项目所示,在边缘设备上进行直接推理,可使应用对不断变化的条件迅速做出反应,这在时间紧迫的情况下尤为有利。
作者简介
Joseph Downing于2011年加入贸泽电子,担任技术支持专员,后转为技术内容专员。此外,Joseph还曾就职于Intel、Radisys和Planar等电子行业公司,拥有20多年的工作经验。作为一名狂热的创客,Joseph帮助管理并向应用与技术专栏(Mouser.com网站上)以及贸易展会提供技术项目和材料。