在 i.MX95 NPU 上运行 yolov11n、yolov8n、yolov5nu 模型后未获得任何输出。 [i.MX95 NPU] YOLOv5n/v8n/v11n 中子转换模型运行但未返回任何探测结果(零输出) 问题描述 我正在使用 Neutron 变流器在 i.MX95 NPU 上评估 YOLO 目标检测模型。 虽然 INT8 量化的 TFLite 模型在 Cortex-A55 CPU 上运行成功并能检测到物体,但编译后的 neutron.tflite 版本在卸载到 NPU 时,尽管执行推理时没有崩溃,却产生了零检测结果(空/无输出)。 环境及硬件设置 硬件: i.MX95 19x19 LPDDR5 EVK(A1 版本) 操作系统/内核: Linux 6.12.34-lts-next-gbe78e49cb433 #1 SMP PREEMPT (aarch64) NXP 工具链: MCU-SDK v25.09.00 + Linux 6.12.34_2.1.0 测试型号: YOLOv5nu、YOLOv8n、YOLOv11n(Ultralytics) 工作流程步骤和使用的命令 1. 量化(Ultralytics 导出) 模型导出为 INT8 全整数量化格式,分辨率为 320x320: yolo export model=yolov8n.pt format=tflite int8=True imgsz=320# (Repeated identically for yolov11n.pt and yolov5nu.pt)
状态:在CPU上运行完美。yolovXn_full_integer_quant.tflite 在 A55 内核上能够正确检测对象。 2. 中子汇编 TFLite 模型是使用 MCU_SDK_25.09.00+Linux_6.12.34_2.1.0 中的 Neutron 转换器为 i.MX95 NPU 编译的: ./neutron-converter --input yolov8n_full_integer_quant.tflite --target imx95 --output yolov8n_full_integer_quant_neutron.tflite 状态:无法在 NPU 上检测到对象。编译后的模型可以加载并运行推理,不会抛出语法或执行错误,但对于完全相同的测试图像,输出张量返回零检测结果。 观察到的症状和疑似根本原因 操作回退:变流器是否会针对特定的 YOLO 层(如自定义锚点、SiLU/Swin 激活或非最大值抑制)回退到 CPU? 量化缩放/不对称性:通过 Ultralytics 导出的 YOLO 模型通常使用不对称量化或具有 Neutron NPU 驱动程序可能误解的特定输出张量缩放。 输出张量格式:推理运行正常,这表明输入管道没有问题,但输出边界框/分数要么为空白,要么完全是垃圾值。 向恩智浦专家提问 中子变流器是否存在针对 Ultralytics YOLO 架构的已知限制或必需的优化标志? 在将 TFLite 模型传递给 Neutron 转换器之前,是否应该去除 NMS(非极大值抑制)层? i.MX95 Neutron SDK 是否需要对称量化(per_channel=True 或 False)才能正确解析输出层? 任何关于 i.MX95 NPU 的指导、参考脚本或 YOLO 部署说明都将不胜感激。 Re: yolov11n,yolov8n,yolov5nu model not getting any output after running on i.MX95 NPU 嗨,亚历杭德罗, 感谢您的回复。 我认为我的硬件平台可能存在一些误解。我的问题与 i.MX91 无关。 我正在使用以下平台: 主板:i.MX95 19x19 LPDDR5 EVK(IMX95LPD5EVK-19CM,A1 版本) 开发板快速入门指南: https://www.nxp.com/docs/en/quick-reference-guide/IMX95LPD5EVK-19CM.pdf Neutron SDK:MCU_SDK_25.09.00+Linux_6.12.34_2.1.0 内核:Linux 6.12.34-lts-next-gbe78e49cb433 #1 SMP PREEMPT (aarch64) 您分享的指南似乎是针对 i.MX91 的,而我的问题是关于在 i.MX95 Neutron NPU 上部署 YOLO。 原始的 INT8 TFLite 模型(YOLOv5nu、YOLOv8n 和 YOLOv11n)在 Cortex-A55 CPU 上运行正常,并产生有效的检测结果。然而,在使用 MCU_SDK_25.09.00+Linux_6.12.34_2.1.0 中包含的 Neutron 变流器编译相同的模型后,推理在 NPU 上成功执行,没有任何运行时错误,但输出张量不包含任何有效检测结果。 为了便于调查,我已经将以下文件附加到我的原帖中: * 原始 INT8 量化 TFLite 模型。 * YOLOv8n 和 YOLOv11n 的中子转换 TFLite 模型。 * 一个可用于重现该问题的 Python 推理脚本。 由于这些是原始的预训练 Ultralytics 模型转换为 TFLite,因此您可以直接使用提供的脚本中的标准 COCO 类名。它应该能让你在 i.MX95 平台上重现该行为,而无需任何额外的修改。 如果您能使用附件中的文件重现该问题,并告知我这是否是当前 Neutron SDK for i.MX95 的已知限制或问题,我将不胜感激。 谢谢。 Re: yolov11n,yolov8n,yolov5nu model not getting any output after running on i.MX95 NPU 你好@vijayranaACL , 感谢您联系恩智浦技术支持。 请参考本指南。 由于您使用的是 i.MX91 A1 芯片版本,因此某些特性或功能可能无法正常工作,因为 A1 是一个早期芯片版本,主要用于评估和开发目的。 因此,我们建议您在测试和验证活动中使用 i.MX91 B0 芯片版本。该指南是使用 B0 硅版本开发和验证的,因此记录的行为和结果均基于该版本。 如果可以,请确认您使用的是哪个版本的芯片,以及您是否可以获取 B0 设备进行比较。 此致, 亚历杭德罗·加西亚 Re: yolov11n,yolov8n,yolov5nu model not getting any output after running on i.MX95 NPU 你好@vijayranaACL , 我已在采用 B0 芯片的 i.MX95 EVK 上测试了您的代码,在我们这边运行正常,没有任何问题。 使用 person_detect.py 应用程序,模型加载成功,Neutron 委托初始化正确,应用程序按预期执行推理。在测试过程中,我观察到稳定的目标检测和持续约 13-14 FPS 的性能。日志还证实 Neutron 代理处于活动状态,并且模型在 NPU 加速下正在正常执行。 根据这些结果,我建议升级到 B0 硅片版本。A0 和 A1 硅版本主要是为了评估和 beta 测试目的而发布的,它们没有与 B0 相同级别的软件支持和验证。早期版本之后引入了一些功能和修复,这或许可以解释您看到的情况。 以下是我的测试日志的相关部分:
root@imx95evk:~# python3 person_detect.py
Opening camera /dev/video52 ...
Trying camera backend: V4L2 /dev/video52
Camera opened via V4L2 /dev/video52
Loading model and NPU delegate ...
Loaded Neutron delegate: /usr/lib/libneutron_delegate.so
/usr/lib/python3.13/site-packages/tflite_runtime/interpreter.py:457: UserWarning: Warning: tf.lite.Interpreter is deprecated and is scheduled for deletion in
TF 2.20. Please use the LiteRT interpreter from the ai_edge_litert package.
See the [migration guide](https://ai.google.dev/edge/litert/migration)
for details.
warnings.warn(_INTERPRETER_DELETION_WARNING)
INFO: NeutronDelegate delegate: 1 nodes delegated out of 33 nodes with 1 partitions.
INFO: Neutron delegate version: v1.0.0-d98743a7, zerocp enabled.
INFO: Created TensorFlow Lite XNNPACK delegate for CPU.
Model input: shape=[ 1 640 640 3] dtype= quant=(0.003921568859368563, -128)
Model output[0]: shape=[ 1 84 8400] dtype= quant=(0.003906319383531809, -128)
Using model input size: 640x640
Re-opening camera after model load ...
Trying camera backend: V4L2 /dev/video52
Camera opened via V4L2 /dev/video52
Person detection running. Press Ctrl+C to stop.
First frame: 640x480
Output tensor shape: (1, 84, 8400)
frame=22 person conf=0.61 box=[143,8,496,476] fps=10.7
--- fps=11.5 detections=0 ---
frame=39 person conf=0.58 box=[138,16,496,473] fps=12.1
frame=50 person conf=0.50 box=[138,12,496,472] fps=12.5
frame=60 person conf=0.58 box=[138,13,496,476] fps=12.8
--- fps=12.8 detections=1 ---
frame=84 person conf=0.61 box=[143,10,496,475] fps=13.3
frame=85 person conf=0.54 box=[138,10,496,475] fps=13.3
frame=86 person conf=0.61 box=[138,13,496,476] fps=13.3
frame=88 person conf=0.54 box=[138,12,496,472] fps=13.3
--- fps=13.3 detections=0 ---
--- fps=13.6 detections=0 ---
frame=136 person conf=0.65 box=[138,13,496,476] fps=13.7
frame=139 person conf=0.58 box=[138,12,496,472] fps=13.7
frame=140 person conf=0.61 box=[136,10,498,475] fps=13.8
frame=141 person conf=0.61 box=[138,13,496,476] fps=13.8
frame=145 person conf=0.50 box=[138,13,496,476] fps=13.8
frame=146 person conf=0.65 box=[138,13,496,476] fps=13.8
frame=148 person conf=0.54 box=[138,16,496,473] fps=13.8
frame=150 person conf=0.50 box=[131,12,498,472] fps=13.8
--- fps=13.8 detections=1 ---
frame=155 person conf=0.50 box=[152,32,497,472] fps=13.8
frame=156 person conf=0.71 box=[180,37,495,422] fps=13.8
frame=157 person conf=0.54 box=[182,38,497,411] fps=13.8
frame=158 person conf=0.65 box=[156,37,493,472] fps=13.8
frame=159 person conf=0.68 box=[158,42,496,472] fps=13.8
frame=160 person conf=0.61 box=[155,46,495,468] fps=13.8
frame=162 person conf=0.54 box=[156,46,493,463] fps=13.8
frame=163 person conf=0.71 box=[171,43,493,466] fps=13.8
frame=164 person conf=0.54 box=[186,41,363,353] fps=13.8
frame=165 person conf=0.61 box=[187,42,492,452] fps=13.8
frame=166 person conf=0.58 box=[190,41,495,393] fps=13.8
frame=167 person conf=0.61 box=[190,42,495,432] fps=13.8
frame=168 person conf=0.61 box=[195,38,495,426] fps=13.8
frame=169 person conf=0.50 box=[190,36,495,423] fps=13.8
frame=170 person conf=0.58 box=[198,37,496,397] fps=13.8
--- fps=13.9 detections=0 ---
frame=202 person conf=0.50 box=[145,28,495,456] fps=13.9
--- fps=14.0 detections=0 ---
^CStopped.
root@imx95evk:~#
由于相同的应用程序和模型在 B0 芯片上运行正常,我的建议是在继续进行进一步调试之前,使用 B0 设备重复测试,因为问题可能与芯片版本有关,而不是与应用程序本身有关。
此致, 查维拉 Re: yolov11n,yolov8n,yolov5nu model not getting any output after running on i.MX95 NPU 嗨,亚历杭德罗, 感谢您澄清是 i.MX 95(而非 i.MX 91)的问题,并推荐使用 --优化级别 OOpt。 我们尝试在现有配置上执行您建议的命令,但是 --优化级别 不可用 在与我们的板级 BSP 配套的中子变流器中。 我们目前的环境 元器件版本 电路板 IMX95LPD5EVK-19 BSP LF6.12.34_2.1.0 (Linux 6.12.34-lts-next ) 中子号代表已登船 v1.0.0-be8bf399 主机变流器 eIQ 工具包 1.17 → 中子变流器 2.1.3+0Xaf140cf5 变流器 电路板支持包 标签 MCU_SDK_25.09.00+Linux_6.12.34_2.1.0 在这个变流器上, 中子转换器 --help 做 不是 列表 --优化级别。 我们实际运行的命令 中子变流器 \ --输入yolov8n_full_integer_quant.tflite \ --输出yolov8n_neutron.tflite \ --target imx95 为了进行调试,我们还使用: 中子变流器 \ --输入yolov8n_full_integer_quant.tflite \ --输出yolov8n_neutron.tflite \ --target imx95 \ --详细 我们的变流器(2.1.3)中可用的标志 关键选项 - 帮助: - 输入, - 输出, - 目标 --合并中子图 --将输入的 uint8 转换为 int8, --convert-outputs-uint8-to-int8 --dump-statistics, --dump-graphs, --详细 --include-between-input-tensors, --排除输入张量之间的差异 --显示目标, --show-kernel-kinds --优化级别 不存在 在这个版本上。 目前为止的测试结果 模型 NPU 行为 YOLOv8n 中子(我们的转换) 调用没问题,但是 0 次检测 YOLOv8n 无头骨干网 NPU 输出 常数(~1.13) 无头CPU主干网+CPU头部 检测结果正常 ——管道逻辑正确 问题 是 --optimization-level OOpt 仅支持较新的中子变流器 2.1.3 ? 推荐的转换命令是什么? LF6.12.34 / imx95 什么时候 OOpt 不可用? Re: yolov11n,yolov8n,yolov5nu model not getting any output after running on i.MX95 NPU 嗨@vijayranaACL , 抱歉,这是我的笔误。
我指的是 i.MX95,因为 i.MX91 不包含 NPU。 我建议尝试使用以下命令转换模型:
.\neutron-converter.exe `
--input " .tflite" `
--target imx95 `
--output " .tflite" `
--optimization-level OOpt
根据 Neutron SDK 文档,需要注意的是,对于 Neutron-S 靶(例如 i.MX95),变流器不是确定性的。转换过程依赖于多线程约束编程求解器,这意味着对同一模型执行变流器的不同操作可能会产生略有不同的结果,尤其是在 TCM 内存分配和生成的微代码方面。 由于可能存在多个最优解,因此在每次转换过程中,不同的求解器线程可能会收敛到不同的有效解。尽管这些解决方案内部可能有所不同,但变流器认为它们都是正确且经过优化的。在大多数情况下,这些差异不应显著影响功能或性能。 如果您观察到行为、性能或准确性方面的变化,我建议您多次转换模型并比较结果。虽然有一些方法可以强制执行确定性行为,但通常会大大增加转换时间,因此除非绝对必要,否则一般不建议使用。 请告知我您的测试结果。 此致, 亚历杭德罗·加西亚
View full article