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

你好!问题已经非常清晰了。核心问题有两个:

  1. quanti type: NONE:这是因为 hb_mapper 默认不会对已经是 int32 的输出进行二次量化标记。你在 ONNX 导出时虽然保持了 float32,但 hb_mapper 在某些版本或配置下,对于特定形状的输出(特别是 bbox 这种回归分支)如果没有明确的量化提示,可能会直接透传为 int32 但不标记量化参数。
  2. Invalid parser: 0:这是最关键的报错。说明 TROS 的 yolov8 解析器在初始化时失败了。结合你的模型输出(bbox 分支 layout: NONE 而不是 NHWC),解析器无法正确识别张量布局,导致初始化失败。

根本原因:你的 bbox 分支输出布局显示为 NONE,而 TROS 的 YOLOv8 parser 期望所有输出都是 NHWC。这通常是因为 hb_mapper 在量化过程中,对于 int32 输出没有正确继承或设置布局信息。


解决方案

方案一:强制 hb_mapper 对输出进行量化(推荐尝试)

虽然 optimization_parameters 在你的版本中不支持,但我们可以尝试在 compiler_parameters 中添加调试选项,或者检查是否有其他配置方式。

修改 YAML:

model_parameters:
  onnx_model: './best.onnx'
  march: "bayes-e"
  layer_out_dump: True  # 开启层输出 dump,用于调试
  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: True  # 开启调试模式
  optimize_level: 'O3'

重新编译后,检查 model_output 目录下的日志文件,看是否有关于输出量化的警告或错误。

方案二:检查 ONNX 导出脚本的 contiguous()

确保在 permute 之后调用了 .contiguous(),这有时会影响布局信息的传递:

def bpu_detect_forward(self, x):
    result = []
    for i in range(self.nl):
        bbox = self.cv2[i](x[i])
        cls = self.cv3[i](x[i])
        
        # 确保 permute 后是 contiguous 的
        bbox = bbox.permute(0, 2, 3, 1).contiguous()
        cls = cls.permute(0, 2, 3, 1).contiguous()
        
        result.append(cls)
        result.append(bbox)
    return result

重新导出 ONNX,然后重新量化。

方案三:使用官方推荐的 YOLOv8 导出脚本

如果上述方法都无效,建议直接使用社区验证过的导出脚本。参考 RDKX5 部署 yolov8 模型到 dnn_node_example 节点报错 帖子中的 export_monkey_patch.py。


关于 Invalid parser: 0

这个错误通常意味着 parser 初始化失败。可能的原因:

  1. 输出布局不匹配:parser 期望 NHWC,但模型输出是 NONE。
  2. 输出类型不匹配:parser 期望 bbox 是 S32 且有量化信息,但模型输出是 S32 却无量化信息。
  3. 配置文件错误:yolov8workconfig.json 中的 output_order 或其他参数配置错误。

检查 yolov8workconfig.json:

{
  "model_file": "/home/sunrise/yolov8/cow5.bin",
  "task_num": 4,
  "dnn_parser": "yolov8",
  "model_output_count": 6,
  "reg_max": 16,
  "class_num": 5,
  "cls_names_list": "my_config/cow.list",
  "strides": [8, 16, 32],
  "score_threshold": 0.25,
  "nms_threshold": 0.7,
  "nms_top_k": 300,
  "output_order": [0, 1, 2, 3, 4, 5]
}

确保 output_order 与模型输出顺序一致(先 cls 后 bbox)。


快速验证步骤

  1. 重新导出 ONNX:确保使用修正后的脚本(带 .contiguous())。
  2. 重新量化:使用修正后的 YAML(开启 debug: True)。
  3. 检查模型信息:
    hrt_model_exec model_info --model_file=./model_output/yolov8_cow.bin
    
    重点看 bbox 分支的 layout 是否为 NHWC,quanti type 是否有值。
  4. 运行 TROS:如果模型信息正常,再运行 TROS 测试。

如果问题依旧,请把 hb_mapper 的完整日志(/data/hb_mapper_makertbin.log)和 hrt_model_exec model_info 的完整输出发出来,我们继续深入分析!