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

我来帮你排查这个多输入校准的问题。先搜索一下社区是否有类似案例。

问题分析

你的错误 list index out of range 是因为多输入模型在校准数据加载时,工具链对非图像类输入(手工特征)的处理逻辑有问题

从日志看:

2026-04-14 11:41:36,279 INFO First calibration picture md5: 51f674dd7319317f7eff584dd361ae4b  /data/workspace/gai/calibration_data/image/20251202A1-5405.rgbchw
2026-04-14 11:41:36,303 ERROR list index out of range

工具链在尝试加载第一个校准数据后就崩溃了,这通常发生在多输入模型的校准数据配置或预处理脚本有问题时。

解决方案

步骤 1:检查 YAML 配置

确保你的 YAML 文件中 calibration_parameters 配置正确:

calibration_parameters:
  cal_data_dir: './calibration_data/image;./calibration_data/feature'  # 两个输入目录
  cal_data_type: 'uint8;float32'  # 图像用 uint8,手工特征用 float32
  calibration_type: 'default'
  cal_data_num: 100  # 校准数据数量

input_parameters:
  input_name: 'input_img;input_feature'  # 两个输入名称
  input_type_rt: 'rgb;featuremap'  # 图像输入用 rgb/gray,特征输入用 featuremap
  input_type_train: 'rgb;featuremap'
  # 如果输入不是标准图像格式,不要用 gray/bgr/rgb,用 featuremap

步骤 2:校准数据格式要求

对于多输入模型

  1. 图像输入:可以是 .gray.rgb.feature 等格式
  2. 非图像输入(手工特征)必须使用 .feature 后缀,且数据要扁平化为 1D 数组

检查你的校准数据:

# 图像输入校准数据
ls -lh calibration_data/image/
# 应该是:xxxxx.gray 或 xxxxx.feature,大小正确

# 手工特征校准数据  
ls -lh calibration_data/feature/
# 应该是:xxxxx.feature,大小 = 特征维度 * 4 (float32)

步骤 3:修改预处理脚本

如果是非标准输入,需要在 02_preprocess.sh 中正确处理:

# 对于图像输入
python preprocess_image.py --input_dir ./raw_images \
                           --output_dir ./calibration_data/image \
                           --ext .feature \
                           --target_size "1,H,W" \
                           --dtype float32

# 对于手工特征输入
python preprocess_feature.py --input_dir ./raw_features \
                             --output_dir ./calibration_data/feature \
                             --ext .feature \
                             --dtype float32

步骤 4:关键配置项

如果手工特征不是图像数据,必须设置

input_parameters:
  input_type_rt: 'featuremap;featuremap'  # 两个都用 featuremap
  input_type_train: 'featuremap;featuremap'
  # 不要指定 input_layout,工具链会自动 skip

步骤 5:验证校准数据

在运行 hb_mapper 之前,先验证校准数据:

# 验证脚本
import numpy as np
import os

# 检查图像输入
img_files = sorted([f for f in os.listdir('calibration_data/image') if f.endswith('.feature')])
print(f"Image calibration files: {len(img_files)}")
for f in img_files[:3]:
    data = np.fromfile(f'calibration_data/image/{f}', dtype=np.float32)
    print(f"  {f}: shape={data.shape}, size={data.nbytes} bytes")

# 检查特征输入
feat_files = sorted([f for f in os.listdir('calibration_data/feature') if f.endswith('.feature')])
print(f"Feature calibration files: {len(feat_files)}")
for f in feat_files[:3]:
    data = np.fromfile(f'calibration_data/feature/{f}', dtype=np.float32)
    print(f"  {f}: shape={data.shape}, size={data.nbytes} bytes")

参考案例

社区有类似的多输入模型转换案例,可以参考:

快速排查清单

  1. 校准数据文件后缀是否为 .feature(非图像输入)
  2. input_type_rtinput_type_train 是否设置为 featuremap
  3. 校准数据数量是否一致(两个输入的校准文件数量要相同)
  4. 校准数据大小是否匹配模型输入 shape
  5. 是否去除了 input_layout 配置(featuremap 类型不需要)

如果以上都检查过了还是报错,请提供:

  • 完整的 YAML 配置文件
  • 模型输入 shape 信息(hb_checker 输出)
  • 校准数据目录结构和文件大小

这样我可以帮你更精准定位问题。