我来帮你排查这个多输入校准的问题。先搜索一下社区是否有类似案例。
问题分析
你的错误 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:校准数据格式要求
对于多输入模型:
- 图像输入:可以是
.gray、.rgb、.feature等格式 - 非图像输入(手工特征):必须使用
.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")
参考案例
社区有类似的多输入模型转换案例,可以参考:
- onnx 模型转换:ERROR:list index out of range - 多输入模型校准数据配置详解
- 使用地平线算法工具链报错,checker 可以完成,marketbin 报错:ERROR"featuremap" - 骨架关键点数据(1x8x17x3)的转换经验
快速排查清单
- 校准数据文件后缀是否为
.feature(非图像输入) -
input_type_rt和input_type_train是否设置为featuremap - 校准数据数量是否一致(两个输入的校准文件数量要相同)
- 校准数据大小是否匹配模型输入 shape
- 是否去除了
input_layout配置(featuremap 类型不需要)
如果以上都检查过了还是报错,请提供:
- 完整的 YAML 配置文件
- 模型输入 shape 信息(
hb_checker输出) - 校准数据目录结构和文件大小
这样我可以帮你更精准定位问题。