onnx转换bin时,多输入校准有问题

:red_circle: 问题仍未解决:工具链版本兼容性问题

从最新日志看,修改后缀后仍然是同样的错误。这说明问题不在文件后缀,而是工具链对多输入 featuremap 类型的校准数据加载逻辑有 bug


:magnifying_glass_tilted_left: 深度排查方案

步骤 1:验证校准数据实际内容

# 检查图像校准数据
ls -lh /data/workspace/gai/calibration_data/image/ | head -5
# 期望:文件大小 = 224*224*3 = 150528 bytes (RGB) 或 224*224 = 50176 bytes (Gray)

# 检查特征校准数据
ls -lh /data/workspace/gai/calibration_data/features/ | head -5
# 期望:文件大小 = 157*4 = 628 bytes (float32)

# 验证文件数量
echo "Image: $(ls /data/workspace/gai/calibration_data/image/*.rgb 2>/dev/null | wc -l)"
echo "Feature: $(ls /data/workspace/gai/calibration_data/features/*.feature 2>/dev/null | wc -l)"

步骤 2:尝试简化配置(单输入测试)

只测试图像输入,确认基础流程正常:

input_parameters:
  input_name: 'image'  # 只保留一个输入
  input_shape: '1x3x224x224'
  input_type_train: 'bgr'
  input_layout_train: 'NCHW'
  norm_type: 'data_mean_and_scale'
  mean_value: '123.675 116.28 103.53'
  scale_value: '0.01712475 0.017507 0.01742919'
  input_type_rt: 'bgr'
  input_layout_rt: 'NHWC'

calibration_parameters:
  cal_data_dir: './calibration_data/image'  # 只保留一个目录
  calibration_type: 'max'

如果单输入能成功,说明是多输入配置问题


:warning: 关键发现:工具链版本问题

你的版本:

  • hbdk: 3.27.1
  • horizon_nn: 0.12.8
  • hb_mapper: 1.5.7

这个版本对多输入 featuremap 类型的支持可能不完善。社区案例 topic/26680 中遇到同样问题的用户最终需要:

  1. 将特征输入 reshape 成 4 维(在 ONNX 模型中)
  2. 校准数据也对应改成 4 维二进制格式

:white_check_mark: 推荐解决方案:修改 ONNX 模型

方案 A:在导出 ONNX 时修改特征输入 shape

# 导出 ONNX 时
dummy_img = torch.randn(1, 3, 224, 224)
dummy_feat = torch.randn(1, 1, 1, 157)  # 改成 4 维!
torch.onnx.export(model, (dummy_img, dummy_feat), 'convnext.onnx', 
                  input_names=['image', 'features'],
                  dynamic_axes={...})

方案 B:在模型 forward 中添加 reshape 节点

如果无法重新导出,使用 ONNX 修改工具:

import onnx
from onnx import shape_inference

model = onnx.load('convnext.onnx')

# 修改输入 shape
model.graph.input[1].type.tensor_type.shape.dim[0].dim_value = 1
model.graph.input[1].type.tensor_type.shape.dim[1].dim_value = 1
model.graph.input[1].type.tensor_type.shape.dim[2].dim_value = 1
model.graph.input[1].type.tensor_type.shape.dim[3].dim_value = 157

# 在特征输入后添加 Reshape 节点(需要找到对应的节点)
# ...

onnx.save(model, 'convnext_4d.onnx')

方案 C:校准数据改成 4 维格式

# 生成 4 维特征校准数据
import numpy as np
import os

feat_dir = './calibration_data/features'
os.makedirs(feat_dir, exist_ok=True)

for i, feat_path in enumerate(raw_feature_paths[:30]):
    feat = np.load(feat_path).flatten().astype(np.float32)
    # Reshape 成 4 维
    feat_4d = feat.reshape(1, 1, 1, 157)
    feat_4d.tofile(f'{feat_dir}/{i:05d}.feature')
    # 文件大小仍是 628 bytes,但维度是 4D

然后 YAML 配置:

input_parameters:
  input_name: 'image;features'
  input_shape: '1x3x224x224;1x1x1x157'  # 4 维
  input_type_train: 'bgr;featuremap'
  input_layout_train: 'NCHW;NCHW'
  norm_type: 'data_mean_and_scale;no_preprocess'
  mean_value: '123.675 116.28 103.53;0'
  scale_value: '0.01712475 0.017507 0.01742919;1'
  input_type_rt: 'bgr;featuremap'
  input_layout_rt: 'NHWC;NHWC'

:clipboard: 快速排查清单

检查项 命令 期望结果
图像文件大小 ls -lh calibration_data/image/*.rgb 150528 bytes
特征文件大小 ls -lh calibration_data/features/*.feature 628 bytes
文件数量 ls image/*.rgb | wc -l 与 features 相同
单输入测试 只用 image 输入运行 hb_mapper 应该成功

:rocket: 建议执行顺序

  1. 先做单输入测试(只保留图像输入)→ 确认基础流程正常
  2. 如果单输入成功→ 问题在多输入配置,需要修改 ONNX 或校准数据为 4 维
  3. 如果单输入也失败→ 提供完整日志,可能是其他问题

请先执行单输入测试,告诉我结果!同时请提供:

ls -lh /data/workspace/gai/calibration_data/image/ | head -5
ls -lh /data/workspace/gai/calibration_data/features/ | head -5