我正在尝试将YOLO11n ONNX模型转换为X5芯片可用的bin文件,但一直遇到配置文件错误。
环境信息:
-
芯片型号:X5(应该使用bayes-e架构)
-
工具版本:
-
hbdk: 3.49.15
-
horizon_nn: 1.1.0
-
hb_mapper: 1.24.3
-
模型信息:
-
模型文件:yolo11n_640x640.onnx
-
输入:images, shape=[1, 3, 640, 640], dtype=FLOAT32, NCHW格式
-
输出:output0, shape=[1, 5, 8400], dtype=FLOAT32
-
生产者:PyTorch v2.7.0
-
ONNX版本:IR version 6, Opset [‘ai.onnx v11’, ‘horizon v1’]
遇到的错误:
-
第一次:Missing keys: 'input_parameters', 'model_parameters'
-
第二次:Wrong key 'output_model' in model_parameters
-
第三次:Wrong keys 'input_layout', 'input_size', 'input_type' in input_parameters
-
第四次:Wrong keys 'calibration_count', 'preprocess' in calibration_parameters
-
第五次:Input_layout_rt missing. input 0 input_type_rt is: rgb. input_layout_rt is required for this type
-
最新错误:None should be instance of 'dict'
-
具体需求:
-
求完整的YAML配置文件示例:针对YOLO11n 640x640模型的正确配置
-
求参数说明:
-
model_parameters中所有支持的参数名和说明
-
input_parameters中所有支持的参数名和说明
-
calibration_parameters中所有支持的参数名和说明
-
compiler_parameters中所有支持的参数名和说明
-
求参数要求:
-
求错误解决方案:如何解决"None should be instance of ‘dict’"错误
额外信息:
请提供针对X5芯片和YOLO11n模型的完整正确配置文件示例,谢谢!
瓜仔
2
你的报错基本都是参数名写错了:output_model、input_layout、input_size、input_type、calibration_count、preprocess 这些都不是 hb_mapper 的合法参数(别参考 fcos 那个老示例魔改,以 X5 OE 官方文档为准)。None should be instance of 'dict' 通常是因为 四个参数组(model_parameters / input_parameters / calibration_parameters / compiler_parameters)必须都存在,某个组只写了组名、下面没有内容(或缩进不对),YAML 解析成 None 就会报这个错。
针对 YOLO11n 640x640 + X5(bayes-e)的可用配置:
model_parameters:
onnx_model: 'yolo11n_640x640.onnx'
march: 'bayes-e'
output_model_file_prefix: 'yolo11n'
working_dir: './model_output'
input_parameters:
input_name: 'images'
input_type_train: 'rgb'
input_layout_train: 'NCHW'
input_shape: '1x3x640x640'
input_type_rt: 'nv12' # 板端接相机 nv12 数据;若离线喂 RGB 图,改成 'rgb' 并加 input_layout_rt: 'NHWC'
norm_type: 'data_scale'
scale_value: '0.0039215686' # 1/255,ultralytics 导出的归一化方式
calibration_parameters:
cal_data_dir: '/workspace/calibration_data/images'
preprocess_on: True # 目录里直接放 jpg/png 时开启,工具自动 resize 到 640x640
calibration_type: 'default'
compiler_parameters:
compile_mode: 'latency'
optimize_level: 'O3'
转换命令(建议先 check 再 makertbin):
hb_mapper check --model-type onnx --march bayes-e
hb_mapper makertbin --config yolo11n.yaml --model-type onnx
几个注意点:
瓜仔
4
主要来自两份官方资料:
-
hb_mapper 的 YAML 参数说明(各参数含义、必选/可选、完整模板都在这一页):
6.2.2.2. 模型编译命令(hb_mapper makertbin) — D-Robotics Open Explorer
-
YOLO 系列的现成配置示例:Model Zoo / 模型转换示例仓库(horizon_model_convert_sample)里有各 YOLO 模型(含 YOLO11)的 yaml 和转换脚本,照着改输入尺寸和校准集路径即可:
1 Model Zoo 概述 | Model Zoo DOC
以后遇到转换报错,优先对着第 1 个链接里的参数表检查字段名和取值(比如 march: 'bayes-e' 对应 X5),基本都能定位。更多资料也可以从 RDK 资料中心入口找:RDK 资料中心
你这个参数说明太多了,那是我看了点进去好多好多,但是我最终目的还是直接训练好,直接给我能用的指令
就好了
瓜仔
6
给一套 YOLO11n 能直接跑的最小配置(以 RDK X5 为例,640×640 输入,摄像头 nv12 喂图):
1. 导出 ONNX(训练机上执行)
from ultralytics import YOLO
YOLO('yolo11n.pt').export(format='onnx', imgsz=640, simplify=True, opset=11)
# 自己训练的就把 yolo11n.pt 换成 runs/detect/train/weights/best.pt
2. 转换配置 yolo11n.yaml
model_parameters:
onnx_model: 'yolo11n.onnx'
march: 'bayes-e' # X5 用 bayes-e,X3 用 bernoulli2
output_model_file_prefix: 'yolo11n'
working_dir: './model_output'
input_parameters:
input_type_train: 'rgb'
input_layout_train: 'NCHW'
input_shape: '1x3x640x640'
norm_type: 'data_scale'
scale_value: 0.0039215686 # 即 1/255
input_type_rt: 'nv12'
calibration_parameters:
cal_data_dir: './cal_data' # 放 50~100 张训练集 jpg 即可
cal_data_type: 'uint8'
preprocess_on: True # 工具自动读图+resize,省事
calibration_type: 'default'
compiler_parameters:
compile_mode: 'latency'
optimize_level: 'O3'
3. 一条命令转换
hb_mapper makertbin --model-type onnx --config yolo11n.yaml
成功后 model_output/ 里就是能上板的 yolo11n.hbm(bin 模型)。
两个注意点:
完整参数说明在官方文档:6.2.2.2. 模型编译命令(hb_mapper makertbin) — D-Robotics Open Explorer
既然你在第 3 楼反馈配置已经可以了,后面可以直接走官方 YOLO 转换示例,不必把整张参数表逐项手填。取仓库的 rdk_x5 分支,进入 samples/vision/ultralytics_yolo/conversion;环境按该页“模型编译环境”准备,导出在训练环境执行,编译在 X5 OpenExplorer 环境执行,都是 x86 主机,不是板端。
以把训练所得 best.pt 放在该目录为例,先导出:
python3 export_monkey_patch.py --pt ./best.pt
再在工具链环境的同一目录编译(确认新导出的文件为 best.onnx,校准图片放入 cal_images):
python3 mapper.py --onnx ./best.onnx --cal-images ./cal_images --output-dir ./output
官方脚本会准备校准数据和 YAML,目标产物是 .bin。你现在贴出的 [1,5,8400] 单输出与这套示例的 Detect 多输出接口不同,不能只换模型文件就直接套用其后处理;请将官方导出、编译和配套运行示例作为一整套使用。自训模型仍需核对类别配置并验证精度;自定义网络或后处理适配属于二次开发,不能承诺一条通用指令覆盖所有情况。
完整链接:
- 官方转换流程:
https://github.com/D-Robotics/rdk_model_zoo/blob/rdk_x5/samples/vision/ultralytics_yolo/conversion/README_cn.md
- 配套运行示例:
https://github.com/D-Robotics/rdk_model_zoo/blob/rdk_x5/samples/vision/ultralytics_yolo/README_cn.md
total 45656
drwxr-xr-x 2 root root 4096 Sep 12 18:04 .
drwxrwxr-x 9 1000 1000 4096 Sep 12 16:46 ..
-rw-r–r-- 1 root root 2273563 Sep 12 17:49 main_graph_subgraph_0.html
-rw-r–r-- 1 root root 35714 Sep 12 17:49 main_graph_subgraph_0.json
-rw-r–r-- 1 root root 2277654 Sep 12 18:00 main_graph_subgraph_1.html
-rw-r–r-- 1 root root 43240 Sep 12 18:00 main_graph_subgraph_1.json
-rw-r–r-- 1 root root 2260538 Sep 12 18:04 main_graph_subgraph_2.html
-rw-r–r-- 1 root root 8654 Sep 12 18:04 main_graph_subgraph_2.json
-rw-r–r-- 1 root root 4792486 Sep 12 18:04 yolo11n_640x640.bin
-rw-r–r-- 1 root root 10765879 Sep 12 17:36 yolo11n_640x640_calibrated_model.onnx
-rw-r–r-- 1 root root 10568166 Sep 12 16:53 yolo11n_640x640_optimized_float_model.onnx
-rw-r–r-- 1 root root 10584230 Sep 12 16:52 yolo11n_640x640_original_float_model.onnx
-rw-r–r-- 1 root root 97441 Sep 12 18:04 yolo11n_640x640_quant_info.json
-rw-r–r-- 1 root root 3004917 Sep 12 17:36 yolo11n_640x640_quantized_model.onnx好像可以了,那接下来我需要做什么,是不是虚拟机和主机已经用不上了,现在就是弄到rdk板子上了。我现在rdk已经烧录好镜像,最新的,然后用网线已经能完成和板子的连接,rdk studio也下好了,接下来呢。完整的流程告诉我。我要usb摄像头能跑模型,我摄像头是1080p,然后免驱动的摄像头
瓜仔
9
模型 .bin 出来了就说明转换这步已经成功,虚拟机/主机后面只有再转新模型时才用得到。接下来全在板端做:
1. 把模型传到板子(主机上执行,IP 换成你板子的):
scp yolo11n_640x640.bin root@<板子IP>:/userdata/
2. 板上先验证模型能跑通(可选,跑 10 秒看 latency/帧率):
ssh root@<板子IP>
hrt_model_exec perf -m /userdata/yolo11n_640x640.bin -t 10
3. USB 摄像头跑实时检测
你的免驱 UVC 摄像头插上就能用,先确认识别到:
ls /dev/video* # 有 video0 之类即识别成功
v4l2-ctl --list-devices # 看具体设备名
镜像里自带 USB 摄像头实时检测示例(YOLOv5X + hbm_runtime),直接指定你的模型跑:
cd /app/pydev_demo/07_usb_camera_sample
python usb_camera_yolov5x.py --model-path /userdata/yolo11n_640x640.bin
一个关键点:这个示例的后处理是按 YOLOv5 的输出(anchor 解码)写的,YOLO11 是 anchor-free、输出结构不同,直接换模型框会画不对。建议先拿默认的 /app/model/basic/yolov5s_672x672_nv12.bin 跑一遍确认链路 OK,再照着 usb_camera_yolov5x.py 里的 decode_outputs 改成 YOLO11 的解码逻辑。
4. 显示问题
示例会弹窗显示检测结果,server 版镜像没桌面,用 MobaXterm 等支持 X11 转发的工具 SSH 连板子就能在本地看到窗口;或者直接接 HDMI 显示器。RDK Studio 也可以用来远程连板开发调试。
1080p 摄像头如果画面卡,把采集分辨率降到 640x640 左右即可,模型输入本来就是 640。
参考文档:
看到已经生成 yolo11n_640x640.bin 了,可以进入板端验证,但仅有文件还不能确认检测结果正确。电脑后面仍用于连接、传文件和调试;训练、重新导出或编译时也还需要原环境,先保留。
建议按下面顺序走:
- 先验证 USB 摄像头链路,不换自训模型。 摄像头插 X5,在板端按官方 USB 实时检测示例运行:
cd /app/pydev_demo/07_usb_camera_sample
python usb_camera_yolov5x.py
这一步使用示例默认模型,看到实时画面和检测框后,在显示窗口按 q 退出。需要图形桌面,或按文档使用支持 X11 转发的连接;仅 SSH 连通不等于能显示窗口。1080p 是采集分辨率,不是模型输入尺寸,示例会做预处理;实际采集格式和帧率以摄像头支持的模式为准。
- 再验证 YOLO11 静态图片。 将
rdk_model_zoo 的 rdk_x5 分支放到板端,按官方 YOLO11 运行说明准备依赖,在仓库根目录执行:
cd samples/vision/ultralytics_yolo/runtime/python
bash run.sh
先用默认官方模型看结果图,排除板端运行环境问题;这不是 USB 实时入口。之后再把自己的 .bin、测试图片和类别文件传到板端,按该页参数验证自训模型。前提仍是第 7 楼说的导出接口与配套后处理一致,不能把当前 .bin 直接替换进 YOLOv5 USB 示例。
- 最后才接自训模型的实时摄像头应用。 静态检测正确后,可参考上述 USB 采集代码和 YOLO11 推理接口自行集成;这部分属于二次开发,目前不能给你一条已验证适用于该自训模型的通用启动命令。官方原版示例若报错,请贴镜像完整版本、执行命令和首次报错日志,我们再针对那一步核查。
完整链接:
- USB 实时检测:
https://developer.d-robotics.cc/rdk_x_doc/Basic_Application/pydev_demo_sample/RDK_X5/usb_camera_sample
- YOLO11 板端运行:
https://github.com/D-Robotics/rdk_model_zoo/blob/rdk_x5/samples/vision/ultralytics_yolo/runtime/python/README_cn.md