2393422_zh-CN

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

2393422_zh-CN

2393422_zh-CN

无法为 i.MX95 Neutron NPU 编译 YOLOv8/YOLO11 TFLite 模型

您好,NXP支持团队,

我们正在使用Neutron SDK v3.1.3FRDM i.MX95平台上评估目标检测功能。并且无法生成与 NPU 兼容的模型。Neutron 变流器成功加载了模型,但报告称0 个算子映射到 Neutron NPU

环境

  • 目标板:FRDM i.MX95

  • Neutron SDK:3.1.3

  • Ultralytics:已使用 YOLO11 和 YOLOv8 进行测试

  • eIQ 工具包:用于 ONNX 到 TFLite 的转换

  • 型号:定制单类钉子检测器

训练司令部

$ yolo detect train \ model=yolov11n.pt \ data=/visual_inspect_yolo/dataset/dataset.yaml \ imgsz=640 \ epochs=100 \ batch=16 \ project=models \ name=peg_detector_v8

导出命令


$ yolo export \ model=models/peg_detector_v84/weights/best.pt \ format=tflite \ int8=True \ data=/visual_inspect_yolo/dataset/dataset.yaml

我们还测试了另一种工作流程:

  • 导出 PyTorch → ONNX

  • 使用 NXP eIQ 工具包将 ONNX 转换为 INT8 TFLite

使用 Neutron SDK 编译时,两种工作流程都产生了相同的结果。

 

中子汇编

〜/下载/eiq-neutron-sdk-linux-3.1.3/bin/neutron-变流器--target imx95 --input best_int8.tflite --output my_model_int8_npu.tflite

 

变流器输出

变流器报告:

  • 导入后运算符:341

  • 优化后的运算符数:367

  • 已转换运算符:0

  • 操作员转换率:0 / 367

  • 中子图数量:0

警告

  • 警告:图中所有运算符均未映射到 Neutron。
  • 警告:转换后的模型与输入模型相同,因为没有将任何算符映射到 Neutron。
  • 警告:图表中包含不支持的 FLOAT 运算符!这会导致转化率低。

更多信息

我们观察到以下情况也存在同样的现象:

  • YOLO11

  • YOLOv8

  • 直接 Ultralytics TFLite 导出

  • ONNX → eIQ 工具包 → INT8 TFLite

所有生成的 TFLite 模型都导致 Neutron 编译器映射 0 个算符

问题

  1. Neutron 编译器是否正式支持 i.MX95 的 YOLOv8 或 YOLO11 目标检测模型?

  2. 对于目标平台为 i.MX95 NPU 的 YOLO 模型,是否有推荐的导出流程?

  3. 当前 Neutron SDK (v3.1.3) 是否存在任何已知限制?关于YOLO检测头?

  4. NXP 是否提供可在 i.MX95 NPU 上成功编译的 YOLOv8/YOLO11 参考模型?

  5. 启用运算符映射是否需要额外的编译器选项或预处理步骤?

我们非常希望获得任何与 i.MX95 Neutron NPU 兼容的指导、推荐工作流程或参考模型。

谢谢!

Re: Unable to compile YOLOv8/YOLO11 TFLite models for i.MX95 Neutron NPU

谢谢回复

咨询一下是否标准程序用于IM X95板上进行模型训练导出部署

由于我们目前拥有ARA2 我们正在寻求充分利用功能定制我们模型我们NXP技术进行演示如果方面提供帮助我们不胜感激

感谢
帮助

Re: Unable to compile YOLOv8/YOLO11 TFLite models for i.MX95 Neutron NPU

在 imx95 主板上尝试了 eIQ 模型库中的 yolo8m 模型,使用了 LF 2026 Q2 版本镜像。内核版本为 6.18.20,使用 Neutron SDK 3.1.2,运行正常。

xing_lei_0-1783672312304 (1).png

您可以先尝试以下方法:

wget https://huggingface.co/EdgeFirst/yolov8-det/resolve/main/imx95/yolov8n-det-int8-smart.imx95.tflite

root@imx95evk:/usr/bin/tensorflow-lite-2.19.0/examples# ./benchmark_model--graph=yolov8n-det-int8-smart.imx95.tflite --external_delegate_path=/usr/lib/libneutron_delegate.so

更多信息请参阅 README 文件eiq-model-zoo/tasks/vision/object-detection/yolov8 at main · NXP/eiq-model-zoo

此外,您还可以附加转换/编译的模型和详细日志。


Re: Unable to compile YOLOv8/YOLO11 TFLite models for i.MX95 Neutron NPU

根据变流器日志,首先要解决的问题是生成的 TFLite 模型仍然包含 FLOAT 运算符:


警告:图表中包含不受支持的浮点运算符!


对于 i.MX95 Neutron,中子变流器的输入必须是 TFLite 模型,其算符和量化格式与 Neutron 编译器兼容。具体来说,i.MX95 中子流需要量化的 TFLite 和对称的 int8 权重。如果模型在 Ultralytics 导出或 ONNX 到 TFLite 转换后仍然包含 FLOAT 运算符/张量,则变流器可能无法创建任何 Neutron 兼容的子图,这与报告的结果一致:


已转换运算符:0

中子图数量:0


YOLOv8 已在 i.MX95 上进行过一些流程的评估,但对于任意 Ultralytics 导出,不应假定完全端到端的 YOLOv8/YOLO11 卸载。根据导出的 TFLite 图,模型可能只有一部分会转换为 NeutronGraph,而不支持的操作符将保留在 CPU 上。因此,建议的下一步是检查/分析生成的 TFLite 模型并确认:

  1. 该图已完全量化。
  2. 没有浮动操作商。
  3. 权重是对称的int8,
  4. 输入/输出张量类型兼容,或者如果适用,可以使用 Neutron 变流器 uint8 到 int8 选项进行转换。
  5. 除非 SDK 确认支持确切的操作符,否则 YOLO 后处理(例如解码/NMS)将保留在 NPU 图之外。

另外,请确保板上的 Neutron 变流器版本和 Neutron 运行时/固件/委托来自同一个兼容的 SDK/电路板支持包 版本。


建议采用 NXP/eIQ 转换路径:

PyTorch -> ONNX(静态输入形状) -> NXP/eIQ 量化(使用代表性校准数据) -> 量化后的 TFLite -> 中子变流器 --target imx95


如果模型具有 uint8 输入/输出张量,请同时进行以下测试:

--将输入的 uint8 转换为 int8

--convert-outputs-uint8-to-int8


如果移除浮点运算符后,转换结果仍然显示 0 个已映射运算符,请分享:

- 完整的 中子变流器 日志,如有详细/分析输出,请提供。

- TFLite 操作员列表,

- 张量数据类型和量化参数,

- FRDM i.MX95 板上确切的 电路板支持包/运行时 Neutron 代理/固件版本,

- YOLO 检测头是否包含 NMS 或 TFLite 图中的其他后处理。

Re: Unable to compile YOLOv8/YOLO11 TFLite models for i.MX95 Neutron NPU

在我的测试中,我没有自己训练或导出模型。我使用了 eIQ 模型库中预先生成的 YOLOv8 模型,并验证了它在 i.MX95 平台上运行。

我实际使用的唯一命令是:

./benchmark_model \

--graph=yolov8n-det-int8-smart.imx95.tflite \

--external_delegate_path=/usr/lib/libneutron_delegate.so

``

以该模型为例:

wget https://huggingface.co/EdgeFirst/yolov8-det/resolve/main/imx95/yolov8n-det-int8-smart.imx95.tflite


对于定制模型,NXP 推荐的流程如下:

PyTorch

ONNX(静态输入形状)

eIQ 工具包 ONNX2Quant

eIQ Toolkit ONNX2TFLite

量化 TFLite

中子变流器 --target imx95


由于您的模型报告:

纯文本

已转换运算符:0

中子图数量:0

警告:图表中包含不支持的 FLOAT 运算符!


我怀疑您生成的 TFLite 图在结构上与 eIQ 模型库参考模型不同。我首先建议做的是比较这两个型号的以下方面:

  • 输入/输出张量类型(INT8 与 UINT8)
  • 浮式经营者的存在
  • 图内的解码/NMS层
  • Netron/TFLite 分析器报告的运营商列表
Re: Unable to compile YOLOv8/YOLO11 TFLite models for i.MX95 Neutron NPU

你好
我运行的是 ubuntu 24.04,但是 eiq_toolkit 仅适用于 20.04.03 版本。

如何使用 eiqToolkit 和使用 eIQ Toolkit 进行量化

Re: Unable to compile YOLOv8/YOLO11 TFLite models for i.MX95 Neutron NPU

请问您是如何将 yolov8m_full_integer_quant.tflite 转换为能够在 imx95 NPU 上运行的?
以下步骤和环境设置数据(主机)将对我们非常有帮助。


Re: Unable to compile YOLOv8/YOLO11 TFLite models for i.MX95 Neutron NPU

推荐的端到端工作流程

  1. 模型训练(PC)

使用您偏好的框架进行训练:

  • Ultralytics YOLOv8
  • PyTorch
  • Tensorflow
  • ONNX原生工作流

对于目标检测,NXP 已经在 eIQ 模型库中提供了 YOLO 参考配方,包括 YOLOv8 目标检测模型。[github.com] ,[github.com]

示例:

shell

yolo 检测训练 \

model=yolov8n.pt \

data=dataset.yaml

imgsz=640 \

epochs=100

`

  1. 导出到 ONNX

NXP 通常建议在量化和部署之前使用 ONNX 作为交换格式。


yolo 导出 \

model=best.pt \

format=onnx


Neutron 启用演示文稿明确描述了基于以下流程的说明:

纯文本

PyTorch

ONNX

量子化

TFLite

中子变流器

而不是直接从训练工件中寻找部署目标。

  1. 使用 eIQ 工具包进行量化

Neutron 工作流程文档建议使用 eIQ Toolkit 量化工具:

python -m onnx2quant \

model.onnx \

-o model_quant.onnx \

-c 输入::

``

其次是:

python -m onnx2tflite \

model_quant.onnx \

-o model_int8.tflite

显示更多行

该流程在 i.MX95 Neutron 实现材料中有明确记录。

  1. 为 i.MX95 Neutron NPU 编译

中子变流器

--target imx95 \

--输入 model_int8.tflite \

--输出 model_neutron.tflite

Neutron 变流器创建 Neutron 特有的图分区,这些分区可以卸载到 NPU 上。

  1. 验证转化率

NPU 部署成功后,应报告类似以下内容:

转换的操作员数量 > 0

中子图数量 > 0

如果你看到:

已转换运算符:0

中子图数量:0

那么该模型就没有被NPU加速。

你目前的问题就属于这一类。

  1. 部署在 FRDM-i.MX95 上

使用 TensorFlow Lite 和 Neutron 委托运行:

./benchmark_model \

--graph=model_neutron.tflite \

--external_delegate_path=/usr/lib/libneutron_delegate.so

``

./label_image \

--external_delegate_path=/usr/lib/libneutron_delegate.so

i.MX 机器学习用户指南将Neutron Delegate定义为 i.MX95 TensorFlow Lite 模型的加速机制。

Re: Unable to compile YOLOv8/YOLO11 TFLite models for i.MX95 Neutron NPU

由于 eIQ Toolkit 已在 Ubuntu 20.04 上验证过,因此最安全的方法是:

Docker

在 Ubuntu 24.04 主机上运行 Ubuntu 20.04 容器:

docker run -it --name eiq \

ubuntu:20.04 /bin/bash


然后,在容器内安装所需的依赖项和 eIQ Toolkit。

Re: Unable to compile YOLOv8/YOLO11 TFLite models for i.MX95 Neutron NPU

使用 eIQ Toolkit (onnx2quant) 转换自定义 YOLOv8 ONNX 模型时,无法保留置信度输出。

概述

NXP团队您好,

我正在尝试使用 eIQ Toolkit 在 FRDM i.MX95 上部署自定义 YOLOv8 单类目标检测模型。

整个转换流程运行成功,但在 onnx2quant 之后,置信度输出全部变为零,而边界框输出仍然有效。

环境

- Ubuntu 24.04
- Python 3.10
- eIQ ONNX2TFLite 0.9.0
- ONNX 运行时 1.21.1
- TensorFlow 2.21
- 中子变流器 3.1.3
- 目标:FRDM i.MX95(tflite_runtime 2.19 + Neutron delegate)

转换管道

1. 火车
yolo detect train model=yolov8n.pt data=dataset.yaml imgsz=640 epochs=50

2. 导出 ONNX
yolo export model=best.pt format=onnx opset=13

3. 验证 ONNX
输入:(1,3,640,640)
输出:(1,5,8400)

ONNX 运行时推理:
置信度通道最大值 = 0.773

4. 生成校准数据集
形状:(1,3,640,640)
数据类型:float32
范围:0.0 - 1.0

5. 量化
onnx2quant best.onnx -c "images;calibration/images" -o best_quant.onnx

同时测试了:
onnx2quant 最佳.onnx -u

两者产生的结果相同。

6. 验证量化的 ONNX
输出:(1,5,8400)

边界框通道仍然有效。

信心:
最小值 = 0
最大值 = 0
平均值 = 0

解码检测结果 = 0

7. 转换为 TFLite 格式
onnx2tflite best_quant.onnx -o best.tflite

8. 为 Neutron 编译
neutron-converter --target imx95 --input best.tflite --output best_neutron.tflite

编译成功。
操作员转化率:278 / 325 (85.5%)

已展开调查

已核实:
• PyTorch 模型有效
• ONNX 导出工作
• ONNX 运行时推理功能正常
• 校准数据集正确
• 真实校准和随机校准产生相同的结果
• TFLite 重现量化的 ONNX 输出
• Neutron 可以重现 TFLite 的输出

该问题首次出现于以下情况:

ONNX

onnx2quant

量化 ONNX(置信度变为零)

补充观察

恩智浦参考模型:
输入:(1,640,640,3) INT8
输出:(1,84,8400) INT8

我转换后的模型:
输入:(1,3,640,640) FLOAT32
输出:(1,5,8400) FLOAT32

对于自定义 YOLOv8 模型,是否有推荐的导出或量化工作流程,能够保留置信度输出?

对于输出为 (1,5,8400) 的模型,这可能是 onnx2quant 的一个限制或错误吗?


Re: Unable to compile YOLOv8/YOLO11 TFLite models for i.MX95 Neutron NPU

与AE团队讨论。

Re: Unable to compile YOLOv8/YOLO11 TFLite models for i.MX95 Neutron NPU

Ara240 的端到端性能是否已经过评估?数据手册中提到了两个矢量核心,可以执行诸如 sigmoid 和 NMS 之类的后处理操作。编译器能否将 NMS 操作映射到向量核心?

Re: Unable to compile YOLOv8/YOLO11 TFLite models for i.MX95 Neutron NPU

抱歉耽搁了。我正在尝试重现转换工作流程。

现在有一个问题,为什么转换后的模型的数据类型是 FLOAT32?你试过转换成 INT8 类型吗?Neutron NPU 需要 INT8 类型作为输入数据。我在其他模型转换中也遇到过类似的错误,根本原因是数据类型错误。

Re: Unable to compile YOLOv8/YOLO11 TFLite models for i.MX95 Neutron NPU

由于对 YOLOv8 的输出张量应用了完全 INT8 量化( inference_output_type=tf.int8 )这一根本限制,置信度输出丢失了。

YOLOv8 将边界框坐标和置信度分数打包成形状为(1, 5, 8400)的单个输出张量。bbox 值具有较大的动态范围(~640 像素),而置信度得分在 ~0 到 1 的范围内。当整个输出张量共享一个量化尺度时,该尺度主要由较大的边界框值(~640)构成,只剩下一个整数级别的一小部分来表示整个置信范围(~1)。因此,经过 INT8 量化后,所有置信值实际上都被四舍五入为零。

推荐解决方案
而不是通过 onnx2quant,直接从您训练好的数据中导出 INT8 TFLite。 .pt 使用 Ultralytics 建模,然后将其输入到 neutron-变流器

# 直接导出 INT8 TFLite 数据(校准使用您的训练数据集)
 yolo export model=best.pt \
 format=liter \
 imgsz=640 \
量化=8
 data=dataset.yaml
分数=0.1

 #Neutron 编译(未更改)
 neutron-变流器 --target imx95 --input best_int8.tflite --output best_neutron.tflite 

请确保输入和输出数据类型为 np.int8:

interp = tf.lite.Interpreter(model_path=TFLITE_INT8)
 interp.allocate_tensors()inp_d = interp.get_input_details()[0]out_ds = interp.get_output_details()inp_scale, inp_zp = inp_d[ "量化" ]
 out_d = out_ds[0]
 out_scale, out_zp = out_d[ "量化" ]

 print(f " 输入数据类型={inp_d['dtype']} 形状={inp_d['shape'].tolist()}"
 f " quant=(scale={inp_scale:.6f}, zp={inp_zp})" )
 print(f " 输出 dtype={out_d['dtype']} shape={out_d['shape'].tolist()}"
 f " quant=(scale={out_scale:.6f}, zp={out_zp})" )# 根据形状确定输入格式
in_shape = inp_d[ "shape" ].tolist()# [1,3,640,640] 或 [1,640,640,3]
如果in_shape[1] == 3:
 # NCHW
 src=img_nchw
别的:
 # NHWC
 src=img_nhwcif inp_d[ "dtype" ] == np.int8:
 src_int8 = np.clip(np.round(src/ inp_scale + inp_zp), -128, 127).astype(np.int8)
interp.set_tensor(inp_d[ “索引” ],src_int8)
别的:
 interp.set_tensor(inp_d[ “索引” ],src.astype(np.float32))interp.invoke()raw_out = interp.get_tensor(out_d[ "index" ])# 如果 out_d[ "dtype" ] == np.int8,则可能是 int8 或 float32:
 dq_out = (raw_out.astype(np.float32) - out_zp) * out_scale
别的:
 dq_out = raw_out.astype(np.float32)dq_out= dq_out[0] # (5, 8400) 归一化 # 将边界框重新缩放回像素坐标以便显示
BBOX_SCALE = 640.0tfl_bbox = dq_out[:4] * BBOX_SCALE # (4, 8400)
 tfl_conf = dq_out[4] # (8400,) 
Re: Unable to compile YOLOv8/YOLO11 TFLite models for i.MX95 Neutron NPU

您好,我尝试了您分享的命令……

但是中子变流器无法转换模型……

请查收附件日志,供您参考,引用。

Re: Unable to compile YOLOv8/YOLO11 TFLite models for i.MX95 Neutron NPU

请提供日志。

Tags (1)
No ratings
Version history
Last update:
19 hours ago
Updated by: