RDKX5的TROS部署自己的yolov8输出结构全是F32,该怎么调整?

你好!你的问题很明确:cal_data_count 不是 calibration_parameters 的有效配置项,这是配置参数名称错误导致的。

问题结论

cal_data_count 参数不存在,应该移除。校准数据数量由你放入 cal_data_dir 目录的实际文件数量决定,不需要在 YAML 中指定。


正确的 YAML 配置

根据你的 hb_mapper 版本 (1.24.3),修正后的配置如下:

model_parameters:
  onnx_model: './best.onnx'
  march: "bayes-e"
  layer_out_dump: False
  working_dir: 'model_output'
  output_model_file_prefix: 'yolov8_cow'

input_parameters:
  input_name: "images"
  input_type_rt: 'nv12'
  input_type_train: 'rgb'
  input_layout_train: 'NCHW'
  norm_type: 'data_scale'
  scale_value: 0.003921568627451

calibration_parameters:
  cal_data_dir: './cal_bin'
  cal_data_type: 'float32'
  calibration_type: 'default'
  # 删除 cal_data_count: 100  ← 这个参数不存在!

compiler_parameters:
  compile_mode: 'latency'
  debug: False
  optimize_level: 'O3'

# 删除 optimization_parameters 段落(你的版本不支持 quantize_output_nodes)

关键修改点

错误配置 正确做法
cal_data_count: 100 删除,不需要此参数
optimization_parameters: quantize_output_nodes: True 删除,1.24.3 版本不支持
input_layout_rt: 'NHWC' 删除,板端布局由 BPU 自动处理

校准数据准备

校准数据数量由目录中的实际文件数决定:

# 检查校准数据数量
ls ./cal_bin/*.bin | wc -l

# 如果少于 100 张,建议补充
# 校准数据应该是已经预处理成 bin 格式的图片

要求

  • 至少 50-100 张 代表性图片
  • 格式为 .bin(已预处理为模型输入格式)
  • 覆盖各种场景(光照、角度、目标大小等)

执行步骤

步骤 1:修正 YAML 文件

cat > yolov8.yaml <<'EOF'
model_parameters:
  onnx_model: './best.onnx'
  march: "bayes-e"
  layer_out_dump: False
  working_dir: 'model_output'
  output_model_file_prefix: 'yolov8_cow'

input_parameters:
  input_name: "images"
  input_type_rt: 'nv12'
  input_type_train: 'rgb'
  input_layout_train: 'NCHW'
  norm_type: 'data_scale'
  scale_value: 0.003921568627451

calibration_parameters:
  cal_data_dir: './cal_bin'
  cal_data_type: 'float32'
  calibration_type: 'default'

compiler_parameters:
  compile_mode: 'latency'
  debug: False
  optimize_level: 'O3'
EOF

步骤 2:重新编译

hb_mapper makertbin --model-type onnx --config yolov8.yaml

步骤 3:验证输出

编译成功后,检查模型输出:

hrt_model_exec model_info --model_file=./model_output/yolov8_cow.bin

期望输出(bbox 应该有 quanti type):

output[0]:
  valid shape: (1,80,80,5,)
  tensor type: HB_DNN_TENSOR_TYPE_F32
  tensor layout: HB_DNN_LAYOUT_NHWC
  quanti type: SCALE  # 或 SHIFT

output[1]:
  valid shape: (1,80,80,64,)
  tensor type: HB_DNN_TENSOR_TYPE_S32  # bbox 应该是 int32
  tensor layout: HB_DNN_LAYOUT_NHWC
  quanti type: SCALE  # 关键:这里有量化信息

关于 OE 版本

你提到的版本信息:

  • hb_mapper version: 1.24.3 :white_check_mark:(这是工具链版本,不是 OE 版本)
  • OE 版本: 应该是 1.2.8(对应 hb_mapper 1.24.x)

版本兼容性

  • 你的版本是最新的,不需要升级
  • 配置格式错误是因为参数名称不对,不是版本问题

如果 quanti type 仍然是 NONE

如果编译后 quanti type 还是显示 NONE,可能原因:

  1. 校准数据不足:确保 cal_bin 目录有足够图片
  2. ONNX 模型问题:确认导出脚本已修正(保持 float32,先 cls 后 bbox)
  3. 需要手动配置输出量化(高级):
    • 参考社区教程使用 QAT 方案
    • 或在 ONNX 中添加 FakeQuantize 节点

参考资源

先按上述配置重新编译,然后把 hrt_model_exec model_info 的输出发出来,我们继续分析!