hb_mapper makertbin 配置文件YAML参数错误,求YOLO11n模型转换的正确配置示例

我正在尝试将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’]

遇到的错误:

  1. 第一次:Missing keys: 'input_parameters', 'model_parameters'

  2. 第二次:Wrong key 'output_model' in model_parameters

  3. 第三次:Wrong keys 'input_layout', 'input_size', 'input_type' in input_parameters

  4. 第四次:Wrong keys 'calibration_count', 'preprocess' in calibration_parameters

  5. 第五次:Input_layout_rt missing. input 0 input_type_rt is: rgb. input_layout_rt is required for this type

  6. 最新错误:None should be instance of 'dict'

  7. 具体需求:

    1. 求完整的YAML配置文件示例:针对YOLO11n 640x640模型的正确配置

    2. 求参数说明

      • model_parameters中所有支持的参数名和说明

      • input_parameters中所有支持的参数名和说明

      • calibration_parameters中所有支持的参数名和说明

      • compiler_parameters中所有支持的参数名和说明

    3. 求参数要求

      • 哪些参数是必需的,哪些是可选的

      • 参数的数据类型(字符串、整数、布尔值等)

      • 参数的默认值

      • 参数之间的依赖关系(如input_type_rt为rgb时必须提供input_layout_rt)

    4. 求错误解决方案:如何解决"None should be instance of ‘dict’"错误

    额外信息:

    • 校准数据目录:/workspace/calibration_data/images(包含100张校准图像)

    • 参考示例:查看了fcos_efficientnetb0_config.yaml,但不确定参数是否完全适用

    请提供针对X5芯片和YOLO11n模型的完整正确配置文件示例,谢谢!

你的报错基本都是参数名写错了:output_modelinput_layoutinput_sizeinput_typecalibration_countpreprocess 这些都不是 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

几个注意点:

  • input_type_rt: 'rgb' 时必须配 input_layout_rt(你的错误 5 就是这个);配 nv12 时则不需要,且输入尺寸不能有奇数。
  • input_type_rt: 'rgb' 转出的模型输入是 int8,板端喂数据要 -128(API 已自动处理)。
  • 所有参数的完整列表、必选/可选、默认值、依赖关系,官方文档这一页全有,对着查即可:
    6.2.2.2. 模型编译命令(hb_mapper makertbin) — D-Robotics Open Explorer

确实可以了,按你给的,你在哪里查的,

主要来自两份官方资料:

  1. hb_mapper 的 YAML 参数说明(各参数含义、必选/可选、完整模板都在这一页):
    6.2.2.2. 模型编译命令(hb_mapper makertbin) — D-Robotics Open Explorer

  2. YOLO 系列的现成配置示例:Model Zoo / 模型转换示例仓库(horizon_model_convert_sample)里有各 YOLO 模型(含 YOLO11)的 yaml 和转换脚本,照着改输入尺寸和校准集路径即可:
    1 Model Zoo 概述 | Model Zoo DOC

以后遇到转换报错,优先对着第 1 个链接里的参数表检查字段名和取值(比如 march: 'bayes-e' 对应 X5),基本都能定位。更多资料也可以从 RDK 资料中心入口找:RDK 资料中心

你这个参数说明太多了,那是我看了点进去好多好多,但是我最终目的还是直接训练好,直接给我能用的指令

就好了

给一套 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 模型)。

两个注意点:

  • 报错多半是 yaml 缩进/引号问题,参数名严格照上面抄;input_type_rt: nv12 时输入宽高不能是奇数。
  • 不想自己写的话,Model Zoo 里 yolo11 有现成 sample 和配置文件可直接抄:https://github.com/D-Robotics/rdk_model_zoo(X5 看 rdk_x5 分支 samples/vision/ 下对应目录)。

完整参数说明在官方文档: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,然后免驱动的摄像头

模型 .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

:warning: 一个关键点:这个示例的后处理是按 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 了,可以进入板端验证,但仅有文件还不能确认检测结果正确。电脑后面仍用于连接、传文件和调试;训练、重新导出或编译时也还需要原环境,先保留。

建议按下面顺序走:

  1. 先验证 USB 摄像头链路,不换自训模型。 摄像头插 X5,在板端按官方 USB 实时检测示例运行:
cd /app/pydev_demo/07_usb_camera_sample
python usb_camera_yolov5x.py

这一步使用示例默认模型,看到实时画面和检测框后,在显示窗口按 q 退出。需要图形桌面,或按文档使用支持 X11 转发的连接;仅 SSH 连通不等于能显示窗口。1080p 是采集分辨率,不是模型输入尺寸,示例会做预处理;实际采集格式和帧率以摄像头支持的模式为准。

  1. 再验证 YOLO11 静态图片。rdk_model_zoordk_x5 分支放到板端,按官方 YOLO11 运行说明准备依赖,在仓库根目录执行:
cd samples/vision/ultralytics_yolo/runtime/python
bash run.sh

先用默认官方模型看结果图,排除板端运行环境问题;这不是 USB 实时入口。之后再把自己的 .bin、测试图片和类别文件传到板端,按该页参数验证自训模型。前提仍是第 7 楼说的导出接口与配套后处理一致,不能把当前 .bin 直接替换进 YOLOv5 USB 示例。

  1. 最后才接自训模型的实时摄像头应用。 静态检测正确后,可参考上述 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