你好!问题已经非常清晰了。核心问题有两个:
quanti type: NONE:这是因为hb_mapper默认不会对已经是 int32 的输出进行二次量化标记。你在 ONNX 导出时虽然保持了 float32,但hb_mapper在某些版本或配置下,对于特定形状的输出(特别是 bbox 这种回归分支)如果没有明确的量化提示,可能会直接透传为 int32 但不标记量化参数。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 初始化失败。可能的原因:
- 输出布局不匹配:parser 期望
NHWC,但模型输出是NONE。 - 输出类型不匹配:parser 期望 bbox 是
S32且有量化信息,但模型输出是S32却无量化信息。 - 配置文件错误:
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)。
快速验证步骤
- 重新导出 ONNX:确保使用修正后的脚本(带
.contiguous())。 - 重新量化:使用修正后的 YAML(开启
debug: True)。 - 检查模型信息:
重点看 bbox 分支的hrt_model_exec model_info --model_file=./model_output/yolov8_cow.binlayout是否为NHWC,quanti type是否有值。 - 运行 TROS:如果模型信息正常,再运行 TROS 测试。
如果问题依旧,请把 hb_mapper 的完整日志(/data/hb_mapper_makertbin.log)和 hrt_model_exec model_info 的完整输出发出来,我们继续深入分析!