通过边缘AI重塑工业5.0时代的物流
在人们对更快、更准确且高度灵活的运营需求日益增长的推动下,现代制造和物流正在迅速发展。传统的自动化技术虽然功能强大,但在系统遇到变量或不可预见的错误(如条形码缺失或运输标签损坏)时,往往缺乏适应性。这正是工业5.0原则的用武之地。
图源:radekcho/stock.adobe.com;图片由AI生成
不同于强调全面自动化和互联互通的工业4.0,工业5.0侧重于人类操作员与智能机器之间的协作。其目标是将自动化的精度和速度与人类的判断力和灵活性相结合,打造出更智能、更安全、更具韧性的工作流程。这种协作模式的核心在于边缘端机器学习(ML)的部署,也就是直接在数据源头(即边缘)集成人工智能(AI),而非依赖基于云的处理。边缘AI能够实现低延迟和离线决策,并将敏感数据保留在本地,从而解决隐私和安全问题。
本文介绍了一个基于NXP Semiconductors FRDM-IMX93开发板构建的智能系统原型,用于验证包裹尺寸。该系统结合了物体检测AI、实时操作员交互和本地处理功能,以应对现实中的物流挑战。
项目材料和资源
在开始任何软件开发之前,请确保您已备齐所有必需组件,并正确组装了原型硬件。本项目不仅需要核心开发板,还需特定的外设来处理视频输入、图形输出和操作员交互。
项目物料清单(BOM)
NXP Semiconductors FRDM-IMX93开发套件
所需软件与下载
· NXP FRDM-IMX93 Yocto软件开发套件(SDK):用于构建交叉编译工具链。请参阅https://www.nxp.com/docs/en/user-guide/UG10164.pdf。需注册免费的NXP账号。
· NXP eIQ®机器学习软件:用于针对Arm® Ethos™-U65 NPU优化LiteRT(原TensorFlow Lite)模型。需要注册免费的NXP账号。
· NXP GUI Guider
· 项目源代码
· 终端模拟器(如PuTTY、Tera Term)
· 项目GitHub存储库
其他硬件
· 运行原生Linux(推荐Ubuntu 20.04/22.04)或已启用适用于Linux的Windows子系统(WSL2)的Windows 10/11计算机
· 包含Linux BSP镜像的预编程MicroSD卡
· HDMI显示器
· HDMI电缆
· USB UVC兼容摄像头
· USB-C PD电源(5VDC,至少1A)
· USB 2.0键盘
· USB 2.0鼠标
· USB集线器
资源
· FRDM-IMX93开发板用户手册
· NXP-iMX/libcamera GitHub
· NXP i.MX93 EVK Timesys入门指南
项目技术概述
本项目演示了一个概念验证型包裹验证站,它将AI驱动的自动化与人类决策相结合。该系统使用USB摄像头和运行在NXP FRDM-IMX93开发板上的预训练LiteRT(原TensorFlow Lite)物体检测模型,将包裹分为三种尺寸类别(图1)。
图1:为FRDM-i.MX93准备TensorFlow模型的步骤。(图源:NXP)
LiteRT是TensorFlow平台的轻量级、移动友好版本,专为在智能手机、微控制器和嵌入式系统等边缘设备上高效运行ML模型而设计。使用LiteRT部署图像识别功能时,繁重的训练过程需要在前期完成(通常在台式机或云服务器上)。然后,训练好的模型会转换为紧凑的LiteRT文件,用于在设备上运行。
在运行时,LiteRT模型接收输入数据(通常是摄像头拍摄或从存储器加载的图像),并对其进行预处理,使其符合模型要求的格式。这通常包括将图像调整为固定尺寸、对像素值进行归一化处理(例如将其缩放到0到1之间),以及添加批处理维度。经过预处理的图像数据被输入到LiteRT解释器中,该解释器使用优化的内核,直接在设备的中央处理器(CPU)、图形处理器(GPU)或专用加速器[如片上神经处理单元(NPU)或特定于厂商的硬件加速器]上运行神经网络的推理操作。
模型通过各层对输入数据进行处理;例如,卷积层提取边缘和纹理等特征,池化层对数据进行下采样,全连接层则生成最终的分类分数。输出通常是一组概率列表,表示图像属于每个可能类别的可能性。随后,应用程序会解读这些概率以生成结果,例如显示标签(如小、中或大)或触发动作(如点亮LED、发出蜂鸣声)。
由于LiteRT模型小巧且高效,即使在低功耗硬件上也能实现实时图像识别,因此非常适合物联网(IoT)设备和智能摄像头。这种设备端处理方式还能增强隐私保护,并减少对持续互联网连接的需求,因为所有计算都在本地进行,无需将图像上传到服务器。
硬件概述
NXP FRDM-IMX93是一款集成了NXP i.MX 93处理器的低成本、紧凑型开发板。该处理器专为节能型边缘计算而设计,具备面向ML和安全边缘应用的硬件加速功能。该开发板配置如下:
· CPU:双核Arm® Cortex®-A55处理器(最高1.7GHz)
· 微控制器内核:Arm Cortex-M33(最高250MHz),用于实时任务
· RAM:2GB LPDDR4X(板载)
· 存储:32GB eMMC5.1、MicroSD插槽
· NPU:Arm EthosU65
· 集成安全性:NXP EdgeLock®安全区域,用于加密、信任根和安全启动
· 连接性:10/100/1000以太网PHY;通过M.2插槽实现的Wi-Fi®和蓝牙连接
· USB:USB 2.0 OTG和USB 2.0主机端口
· 扩展:双排40引脚排针
· 调试功能:JTAG、USB调试端口和板载OpenSDA调试器
软件概述
本节介绍用于更新、测试和运行本项目的各种开发应用程序。运行本项目需要各种软件的支持。本文不会完整重复NXP文档的内容,但会重点介绍在计算机上搭建开发环境时需要考虑的一些关键要点。
总体而言,本项目的软件开发流程如下:
1. 将预训练的LiteRT模型转换为与NXP硬件兼容的格式。
2. 创建图形用户界面(GUI)并导出代码。
3. 将LiteRT模型和GUI代码集成到统一的代码库中。
4. 添加功能,例如根据所需的运行逻辑控制LED的开关。
项目开发
本节将逐步指导您在NXP开发板上实现一个集嵌入式AI与图形界面于一体的项目。从将开发板连接到互联网、使用eIQ Toolkit配置ML理,到利用GUI Guider设计自定义用户界面,再到通过Linux交叉编译工具链集成C/C++应用程序,每个步骤都建立在前一步的基础上,以确保系统作为一个统一的整体运行。请仔细按照步骤操作,让您的设备连接到互联网、运行LiteRT模型、在屏幕上显示结果,并通过自定义嵌入式逻辑处理实际输入。
按正确的顺序连接外设,可确保系统准备就绪,能够通过Linux环境启动并接收操作员输入:
1. 将USB 2.0键盘和USB 2.0鼠标连接至USB集线器。
2. 将USB集线器的输出电缆连接至FRDM-IMX93开发板上的USB-A主机端口。此举可将输入设备整合到单一主机通道上。
3. 将USB UVC兼容摄像头连接至USB集线器上的可用端口。使用标准UVC设备至关重要,因为运行在i.MX 93 A55内核上的Linux BSP镜像通常包含必要的Video4Linux2(V4L2)内核驱动程序,可实现即时运行。
4. 使用HDMI电缆将FRDM-IMX93开发板连接至标准HDMI显示器。该开发板通过板载LVDS转HDMI桥接器将显示信号传输至HDMI端口P5。
5. 将USB Type-C PD电源(最低5VDC、1A)连接至FRDM-IMX93开发板上的USB Type-C PWR输入端口。请注意,此电源输入端口与USB调试端口是分开的。
要配置设备的操作系统(尤其是针对网络访问和底层调试),必须建立可靠的串行控制台连接。
FRDM-IMX93包含一个专用USB调试端口(P16),其提供两个COM端口:一个用于Cortex-A55系统调试(Linux控制台),另一个用于Cortex-M33系统调试。本项目需要使用Cortex-A55调试端口。
1. 使用USB-C电缆连接主机PC和FRDM-IMX93的USB调试端口(P16)。
2. 在主机PC上,打开终端模拟程序(如PuTTY或Tera Term),配置Cortex-A55 COM端口的串行连接设置:
· 115200波特率
· 8个数据位
· 无奇偶校验位
· 1个停止位(8N1)
3. 上电之前,请确保开发板的SW1 DIP开关已设置为所需的启动配置。若要使用预编程的MicroSD卡,请将SW1设置为0011(OFF、OFF、ON、ON)。
4. 向专用USB Type-C PWR输入端口供电。开发板将启动引导过程,从MicroSD卡加载Linux镜像。
5. 等待引导序列完成,此时将出现Linux命令提示符(如root@**imx93frdm**:~#)。该提示符表明您已获得目标操作系统的完全访问权限,以便进行后续配置步骤。
深度解析:A55 Linux与M33工作流对比
关于本项目选择的开发环境,需要特别说明一下。MCUXpresso传统上用于开发NXP Cortex-M内核(如i.MX 93的M33内核)的嵌入式应用程序,通常涉及裸机或实时操作系统。
然而,本项目的具体应用需求,包括通过V4L2处理实时视频捕获、利用Linux帧缓冲区通过轻量级多功能图形库(LVGL)渲染复杂图形元素,以及运行带有NPU委派功能的全面LiteRT推理引擎,这些都必须依赖完整的操作系统环境。这些功能本身就比较复杂,最适合由运行在高性能Cortex-A55应用内核上的Linux发行版来处理。此外,本项目依赖CMake和Make等工具来构建最终可执行文件,也证实了本项目是标准的Linux交叉编译工作流程。
因此,本项目从编译到部署的整个开发工作流程,必须完全聚焦于Cortex-A55的Linux环境。确立这一重点可防止开发人员使用不合适的工具链,以免其缺少系统主要功能所需的必要Linux依赖项(如V4L2、LiteRT委派和LVGL库)。
主机环境设置与交叉编译工具链
开发此边缘AI应用程序需要在主机上配置完善的软件栈,才能正确生成适用于目标硬件的可执行二进制文件。由于主机系统通常运行x86架构,而FRDM-IMX93采用AArch64(Armv8)架构,因此必须构建专门的交叉编译环境。
使用WSL2设置Windows主机环境
在Windows PC上执行Linux原生交叉编译,需要使用适用于Linux的Windows子系统(WSL2)。WSL2提供集成在Windows中运行的完整Linux内核和文件系统(如Ubuntu),从而能够访问所需的构建工具和NXP Yocto SDK。
1. 在Windows中,以管理员身份打开PowerShell或命令提示符,然后运行wsl --install。
2. 按照提示安装WSL2和Ubuntu发行版(或其他兼容的Linux发行版)。推荐用于WSL2的Linux发行版为Ubuntu 20.04或22.04。
3. 打开新安装的Ubuntu应用程序,或在Windows搜索栏中输入wsl以启动Linux终端。
注意:后续所有涉及构建、安装或运行脚本的步骤,都必须在该Linux终端中进行。
4. 在WSL2中,安装必要的Linux实用程序。以下核心软件包(表1)对于源代码控制、项目构建和网络部署是必不可少的:
表1:核心软件包与安装命令
获取并安装Yocto SDK
交叉编译环境的核心是NXP Yocto SDK,其中包含了针对i.MX 93处理器及其特定Linux板级支持包(BSP)配置的正确交叉编译器、系统头文件和运行时库。如前所述,整个过程必须在WSL2 Linux终端内执行。
编译过程必须将依赖于LiteRT运行时、V4L2头文件和LVGL等组件的应用程序代码与专为AArch64架构设计的库进行链接,而非使用主机PC的原生库。此过程由Yocto SDK协调,该SDK提供了一个专用的交叉编译器和一个sysroot(包含所有目标特定依赖项的虚拟根文件系统)。
Yocto SDK与特定的NXP Linux BSP版本相关联。为获得最佳效果,请使用基于最新NXP 版本的SDK,例如对应于Linux 6.1或6.6 BSP的版本(如imx-linux-langdale或imx-linux-scarthgap)。
1. 从NXP网站下载适用于i.MX 93的Yocto SDK安装程序脚本。(该文件通常命名为fsl-imx-xwayland-glibc-x86_64-imx-image-full-armv8a-imx93evk-toolchain-6.x.sh或类似名称。)
2. 将安装程序文件放置在WSL2环境中。
3. 在WSL2终端中导航至下载位置,并以超级用户权限运行该shell脚本:$ sudo sh./fsl-imx-xwayland-glibc-x86_64-imx-image-full-armv8a-imx93evk-toolchain-6.x.sh
4. 安装完成后,必须加载SDK提供的环境设置脚本。该命令会设置指向交叉编译器和AArch64 sysroot的必要环境变量(如CC、CXX、PATH)。在每个用于编译的新WSL2终端会话中,都必须执行此命令:$ source /opt/fsl-imx-xwayland/6.x/environment-setup-aarch64-poky-linux
如果不加载此环境脚本,将导致CMake工具使用主机PC的原生编译器,从而在尝试链接目标特定库时导致编译失败。
连接到互联网
编译后的应用程序最终部署通过Wi-Fi使用SCP进行。这要求FRDM-IMX93目标开发板连接到网络,并拥有已知且有效的IP地址。该开发板运行的是Yocto Linux镜像,网络管理通常由connmanctl处理。
以下过程通过串行控制台执行,用于配置开发板的无线网络连接:
1. 在连接管理器可以使用之前,需要先加载必要的无线内核模块并初始化网络接口。
#>modprobe moal mod_para=nxp/wifi_mod_para.conf
#>ifconfig mlan0 up
#>connmanctl
connmanctl>agent on
connmanctl>enable wifi
connmanctl>scan wifi
connmanctl>services
connmanctl>connect <[your_network-managed_psk]>
2. 输入密码。此时应显示以下信息:
Connected <[your_network-managed_psk]>
3. 输入以下命令以验证连接:
connmanctl> state # 应显示Wi-Fi为“online”(在线)状态
connmanctl> services # 应显示网络为“online”(在线)或“ready”(就绪)状态
connmanctl>quit
#>ping 223.5.5.5 # 应能看到来自服务器的响应
获取IP地址后,将启用SSH和SCP访问,从而允许主机PC(通过WSL2终端)远程管理文件传输和执行操作,无需物理访问串行控制台。
NXP eIQ机器学习软件
实时执行包裹验证的能力建立在尽可能提高物体检测模型效率的基础上。该优化需要专用的NXP eIQ机器学习软件开发环境,该环境有助于部署专门由Ethos-U65 NPU加速的模型。
NXP eIQ工具包是开发链中的关键组件,提供用于模型转换、优化和验证的工具。此处提供的信息假设使用的是eIQ工具包1.8.0版本或兼容的更高版本。该工具包支持LiteRT运行时(NXP BSP中通常捆绑2.18.0左右的版本)和命令行工具。eIQ Portal是该工具包的GUI组件,简化了嵌入式开发人员的ML工作流程。本项目中,其主要功能是将通用的预训练LiteRT(.tflite)模型针对i.MX 93的独特硬件进行定制,从而确保Arm Ethos-U65 MicroNPU得到优化利用(图2)。
图2:NXP eIQ环境为开发人员提供了多种工具,用于将LiteRT模型部署到NXP开发板上。(图源:Green Shoe Garage)
标准工作流程包括加载模型、转换其数值精度、将网络层委派给NPU,最后导出目标应用程序所需的专用文件。
针对Ethos-U65 NPU的优化
要实现高性能,必须遵守Ethos-U65硬件的优化约束条件,尤其是其对整数运算的偏好。此过程应通过eIQ Portal GUI(如果主机环境中可用)或从WSL2终端内启动的eIQ命令行工具来执行。
导入预训练的LiteRT模型
1. 在WSL2 Bash提示符下执行eiq_launcher,或在Windows上启动应用程序GUI,以启动eIQ Portal或eIQ命令行工具。
2. 单击New Project(新建项目),然后输入一个描述性名称。
3. 单击Import Model(导入模型),选择LiteRT(或TensorFlow Lite),然后浏览并选择您的预训练.tflite文件。
4. 使用Model Inspector(模型检查器)工具(如适用)验证运算符和层与NPU的兼容性。
将Float32量化为Int8
将Float32量化为Int8对于在NPU上实现高性能至关重要,因为NPU是专为8位整数(Int8)运算设计的。
1. 在eIQ Portal中,导航至Optimize(优化)选项卡,然后选择Quantization(量化)。
2. 选择Post-Training Quantization (PTQ)[训练后量化 (PTQ)],然后将输出模型精度配置为Int8。
3. 单击Quantize(量化)。
4. 单击Validate(验证),使用数据集运行模型。然后查看所得的准确率分数,以确保Int8转换未对物流任务的性能造成过大影响。
选择Ethos-U委派
必须通过划分神经网络图来为模型做好硬件加速的准备。
1. 在eIQ Toolkit主屏幕中,单击Model Tool(模型工具)。
2. 单击Open Model(打开模型),然后选择量化后的.tflite模型。
3. 打开菜单,选择Convert(转换)。
4. 在转换对话框中,选择Tensorflow Lite Vela/i.MX93 (.tflite) (eiq-converter-armvela)。
5. 单击Convert(转换)。此操作将生成NPU所需的构建产物。
这些步骤会指示运行时将受支持的操作卸载到NPU上。此举还确保兼容的网络层被卸载到Ethos-U65 MicroNPU上,而不支持的层则保留在Cortex-A55 CPU上。
导出优化后的构建产物
最终输出文件生成后,即可用于部署。
1. 单击Export(导出)。
2. 确保导出过程生成以下文件:
· 最终的量化.tflite模型(如package_detector_quant.tflite)。
· 必要的运行时配置和委派库文件(如libethosu_delegate.so)。
这些优化后的构建产物至关重要,必须传输到FRDM-IMX93开发板以进行部署。
NXP GUI Guider
项目的GUI必须清晰地显示摄像头画面、AI的分类结果以及验证状态。NXP GUI Guider(图3)是一款专用的拖放式工具,用于设计基于LVGL的界面。本指南介绍的工作流兼容GUI Guider 1.6.x至1.9.x版本。这些版本使用LVGL v8.x.x或v9.x.x生成代码。
图3:GUI Guider是一款图形化拖放工具,可轻松创建用户界面。(图源:Green Shoe Garage)
初始化GUI Guider并选择模板
NXP GUI Guider用于设置i.MX 93 HDMI输出的显示配置。
1. 在主机PC上打开NXP GUI Guider。
2. 单击New Project(新建项目)。
3. 从模板列表中,选择MCIMX93FRDM开发板模板。该模板可确保项目为开发板的HDMI输出配置正确的显示分辨率和色深。
4. 在Project Name(项目名称)字段中输入名称(如BoxDetectionDemo),并在主机PC的Project Directory(项目目录)字段中指定生成的源文件输出到的文件夹。
设计人机闭环验证的用户界面
GUI设计必须优先考虑清晰度和即时反馈(图4)。
图4:此显示屏幕在GUI Guider中创建,反映了呈现在摄像头的包裹发生的变化。(图源:Green Shoe Garage)
1. 确保Screen Manager(屏幕管理器)中主屏幕(Screen1)处于活动状态。
2. 从Widgets(小部件)面板中,将Label(标签)小部件拖动到屏幕上。在Properties(属性)面板中,将其ID重命名为描述性名称,如Label_Display。该标签将显示AI检测到的类别[如“Small”(小)、“Medium”(中)或“Large”(大)]。底层的C/C++应用程序将使用此小部件渲染V4L2摄像头的实时帧。
3. 将第二个标签小部件拖放到屏幕上,并将其重命名为Label_Status。该标签将通过编程方式更新以显示验证消息[Match(匹配)/Mismatch(不匹配)],并根据结果更改颜色,从而向操作员提供即时状态信息。
导出LVGL源代码
完成视觉布局后,即可导出设计。
1. 单击GUI Guider菜单中的Export(导出)按钮。
2. 验证GUI Guider是否生成了定义接口结构的可移植C源代码文件,包括ui.c、ui.h和events_init.c。
3. 手动将导出的文件复制或移动到WSL2的/source中。
这些导出并复制的文件已准备好与AI推理和摄像头代码集成。
架构依赖关系:LVGL与帧缓冲驱动程序
GUI在HDMI显示器上是否成功渲染,依赖于与FRDM-IMX93上运行的Linux操作系统的深度集成。以下初始化代码片段揭示了此架构:
C
lv_init();
fbdev_init();
lv_disp_drv_register();
ui_init();
对fbdev_init()和lv_disp_drv_register()的调用表明了LVGL端口依赖于标准的Linux帧缓冲设备(FBDEV)驱动程序。帧缓冲是内核中用于管理与HDMI输出相对应的显示缓冲区的机制。在GUI Guider中选择正确的开发板模板,可确保导出的LVGL代码尺寸设置正确,以便与该底层驱动程序对接,使编译后的应用程序能够将像素直接绘制到屏幕缓冲区中。这种底层依赖关系确保了图形输出高效并能在i.MX 93硬件上正确显示。
集成核心应用程序(C/C++)并实现逻辑
本节详细介绍了复杂的工程挑战:将三个相互独立的模块(摄像头输入、AI推理和GUI输出)集成到统一的实时应用程序中,并定义控制验证过程的逻辑。
项目结构与CMake配置
核心应用程序需要结构化的文件系统以及构建定义文件(CMakeLists.txt),该文件需通过先前安装的Yocto SDK交叉工具链正确引用所有外部依赖项。必须在WSL2 Linux文件系统中创建以下项目结构。该结构的源代码可在项目的GitHub存储库中获取。
组织项目文件
该项目必须在主机PC上进行逻辑化组织(图5):
· /source:包含自定义的C/C++文件(main.c、logistics_verifier.c)以及导出的GUI Guider文件(ui.c、events_init.c)
· /models:包含从eIQ Toolkit导出的经过优化和量化的LiteRT模型(package_detector_quant.LiteRT)
· /assets:包含应用程序使用的任何图像或资源
· /build:用于编译输出的临时目录
图5:完整项目的最小文件结构。(图源:Green Shoe Garage)
使用CMake定义构建系统
CMakeLists.txt文件充当项目蓝图,指导编译器如何为AArch64目标架构构建应用程序。该文件必须显式链接Yocto SDK中包含的必要库:
· 语言和标准:该文件定义了项目,并确保执行必要标准(如C++17)。
· 工具链集成:必须将构建配置为使用交叉工具链环境,通常通过在CMake配置步骤中传递特定的工具链文件(toolchain.cmake)来实现。该文件确保构建系统使用AArch64编译器和链接器。
· 库链接:显式表明链接以下核心库:
o LVGL库
o LiteRT运行时库
o 用于摄像头交互的 V4L2(Video4Linux2)库
o Ethos-U委派库(NPU加速必需)
实现实时数据管道
任何基于视觉的嵌入式AI应用的核心挑战,在于需要高吞吐量处理才能将数据从摄像头传感器传输到神经网络的输入层。自定义的C/C++应用程序通过绕过高层开销并直接管理底层Video4Linux2(V4L2)内核API来解决这一问题。
摄像头输入(V4L2)
连接到FRDM-IMX93的USB UVC摄像头会注册为V4L2设备,在Linux目标系统中通常位于/dev/video0。自定义应用程序代码通过以下方式处理底层V4L2 API调用:
· 打开设备文件。
· 查询并设置所需的视频格式(如YUYV或MJPG)和帧分辨率。
· 启动内存映射或用户指针缓冲,以高效管理捕获的帧,尽可能减少内核空间与用户空间之间的复制操作。
· 实现一个连续循环,该循环从队列中取出缓冲区(捕获新帧)、处理图像,然后将缓冲区重新加入队列以备下一帧使用。
图像预处理
从V4L2设备捕获的原始数据(如YUYV帧)无法直接输入到神经网络中,必须先进行重新处理,包括:
· 转换颜色空间(如YUYV转换为RGB或灰度)。
· 将图像缩放至预训练LiteRT模型要求的固定输入尺寸(如224×224或300×300)。
· 将像素值缩放至与模型量化范围匹配(Int8模型通常为0到255)。随后,将经过正确预处理的数值数据复制到LiteRT解释器的输入张量中。
LiteRT推理执行与NPU委派
推理管道接收预处理后的图像数据,并使用优化的LiteRT模型对物体进行分类。
初始化模型并分配张量
应用程序代码必须使用传输到目标开发板的优化模型文件来初始化LiteRT解释器:
C
LiteRTModel * model = LiteRTModelCreateFromFile("models/model.LiteRT");
// 注意:委派注册通常由导出的运行时配置处理
LiteRTInterpreter * interpreter = LiteRTInterpreterCreate(model, NULL);
LiteRTInterpreterAllocateTensors(interpreter);
该序列将加载神经网络结构、创建推理执行上下文,并为输入、中间和输出张量分配内存。至关重要的是,在Linux目标平台上的解释器创建阶段中,系统必须识别并加载Ethos-U委派库(libethosu_delegate.so),以确保将兼容的操作导向NPU而非CPU。
执行推理循环
在主应用程序循环中,图像经过预处理并加载到输入张量后,将执行推理:
C
// 将预处理后的数据放入输入张量
LiteRTInterpreterInvoke(interpreter);
// 从输出张量读取分类结果
LiteRTInterpreterInvoke()函数会触发计算。由于采用了委派机制,该调用会将受支持的层透明地分派至高速Ethos-U65 NPU,并以近乎实时的速度返回分类结果[即Small(小)、Medium(中)或Large(大)的类别标签]。
实现工业5.0验证逻辑
本项目的核心逻辑不仅是物体检测,更是验证。也就是说,系统会判断检测到的物体是否符合动态预期的参数。
动态输入与比较
该可执行程序设计用于在运行时通过命令行参数接收预期的包裹尺寸(如“Large”),如./smart_verifier Large。该预期尺寸代表必需的条件,可能源自清单或外部仓库管理系统。
应用程序内的核心逻辑会将AI检测到的标签(result_label)与通过命令行提供的预期标签(match_label)进行比较。
集成GUI和LED反馈
该逻辑决定了系统的响应,并通过GUI和板载物理LED指示灯向操作员传达。代码通常在events_init.c或main.c中使用LVGL更新函数实现。
匹配场景
如果result_label与match_label匹配:
这表示验证成功,警报LED将熄灭。
不匹配场景(异常)
如果检测到的尺寸与预期尺寸不同[如预期为Medium(中),却检测到Small(小)]:
LED灯将亮起,立即向操作员反馈需要人工干预或目视检查。LED控制函数(led_on/off)对开关物理指示灯所需的底层Linux GPIO基于文件的I/O操作进行了抽象。
多线程实现实时用户体验
由于V4L2摄像头采集和后续AI推理具有计算密集型特征,因此必须采用多线程方法来保持GUI的流畅性和响应度。所提供的应用程序代码会自动采用两个主要线程来确保流畅的用户体验:
· AI/摄像头线程:该线程负责V4L2帧抓取、图像预处理、LiteRT推理以及执行核心验证逻辑。
· LVGL线程:该线程专门用于运行LVGL事件循环,并将显示缓冲区刷新到Linux帧缓冲(fbdev)。
通过将高负载AI处理与低延迟显示任务解耦,该系统可提供出色的用户体验,这在协作式工业环境中至关重要。
构建、部署与验证
最后阶段包括使用Yocto交叉工具链编译集成的C/C++源代码,将二进制文件和优化后的模型安全地部署到FRDM-IMX93,并执行应用程序(图6)。
图6:完整构建后的包裹验证项目。(图源:Green Shoe Garage)
执行交叉编译
交叉编译过程必须在主机PC的WSL2 Linux终端中进行,且需预先加载Yocto环境变量。
1. 切换到项目根目录,并创建一个临时目录,用于生成构建文件:
$ mkdir build && cd build
2. 加载(source)Yocto SDK(environment-setup-aarch64-poky-linux)后,将CMake指向交叉编译工具链文件(toolchain.cmake):
$ cmake -DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake ..
3. 使用make工具执行编译:
$ make -j$(nproc)
编译成功后,将在WSL2文件系统的build/目录中生成一个名为smart_verifier的可执行文件。
通过SCP进行安全文件传输
必须通过SCP将编译好的可执行文件和优化后的LiteRT模型安全传输到目标开发板上的可写位置。此命令需在WSL2 Linux终端中执行,并使用目标开发的IP地址。
1. 通过串口/SSH,在FRDM-IMX93开发板上设置目标目录:
root@imx93evk:~# mkdir -p /home/root/smart_verifier/models/
2. 将二进制文件从WSL2复制到FRDM-IMX93开发板上的目标目录中:
$ scp build/smart_verifier root@<开发板IP地址>:/home/root/smart_verifier/
3. 将优化且量化后的LiteRT模型从WSL2复制到FRDM-IMX93开发板上的指定模型目录中:
$ scp models/*LiteRT root@<开发板IP地址>:/home/root/smart_verifier/models/
传输过程必须使用在eIQ Toolkit中生成的特定优化Int8模型。如果将原始的Float32模型直接传输而未将其量化为Int8,将会导致运行时性能大幅下降,因为它会绕过Ethos-U65 NPU加速。
运行Smart Verifier并与之交互
最终的运行验证通过串行控制台或活动的SSH会话,直接在FRDM-IMX93开发板上执行二进制文件来完成。
1. 导航至此目录:
root@imx93evk:~# cd /home/root/smart_verifier
2. 确保赋予可执行权限:
root@imx93evk:~/smart_verifier# chmod +x smart_verifier
3. 运行应用程序,并以动态输入参数的形式指定预期的包裹尺寸:
场景A:预期尺寸为大包裹
root@imx93evk:~/smart_verifier#./smart_verifier Large 1
测试1(成功):将归类为“大”的包裹放置在摄像头前。
预期结果:GUI更新并显示“Large package detected.”(检测到大包裹)。状态指示灯变为绿色,板载LED熄灭。
测试2(失败/异常):将归类为“小”的包裹放置在摄像头前。
预期结果:GUI更新并显示“Small package NOT detected!”(未检测到小包裹)。状态指示灯变为红色,板载LED亮起,提醒操作员发生异常,需要人工干预。
场景B:预期尺寸为中包裹
root@imx93evk:~/smart_verifier#./smart_verifier Medium 1
测试3(成功):将归类为“中”的包裹放置在摄像头前。
预期结果:GUI显示匹配,且LED熄灭。
包裹尺寸的定义(例如6英寸及以下为小包裹,6英寸至12英寸为中包裹,大于12英寸为大包裹)已嵌入原始LiteRT模型的训练数据中。
排除常见部署错误导致的故障
二进制文件无法执行或发生段错误
出现“Cannot Execute Binary File”(无法执行二进制文件)消息,表明交叉编译过程失败,原因是未正确配置Yocto环境,导致系统使用了主机PC的原生编译器,而非AArch64交叉编译器。
性能不佳
高推理延迟(低FPS)表明未能使用Ethos-U65 NPU。请检查模型是否已在eIQ中正确量化为Int8,以及委派库是否已在运行时被LiteRT解释器正确链接和加载。
结语
随着工业5.0的持续演进与扩展,人类与机器将日益紧密地协作,充分发挥双方的优势以实现更高的效率。
该包裹验证器项目展示了边缘AI与人类决策相结合的优势可以确保可靠性并减少纯自动化过程中可能出现的错误。该架构可扩展至其他物体分类任务,可与仓库管理系统集成,或适配不同的外形规格。借助FRDM-IMX93的NPU进行设备端处理,该系统无需依赖云基础设施即可工作,从而降低延迟并增强隐私保护。NXP的eIQ和GUI Guider工具简化了模型部署和界面创建过程,使各种规模的团队都能更轻松地实现边缘AI方案。





