问题仍未解决:工具链版本兼容性问题
从最新日志看,修改后缀后仍然是同样的错误。这说明问题不在文件后缀,而是工具链对多输入 featuremap 类型的校准数据加载逻辑有 bug。
深度排查方案
步骤 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'
如果单输入能成功,说明是多输入配置问题。
关键发现:工具链版本问题
你的版本:
- hbdk: 3.27.1
- horizon_nn: 0.12.8
- hb_mapper: 1.5.7
这个版本对多输入 featuremap 类型的支持可能不完善。社区案例 topic/26680 中遇到同样问题的用户最终需要:
- 将特征输入 reshape 成 4 维(在 ONNX 模型中)
- 校准数据也对应改成 4 维二进制格式
推荐解决方案:修改 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'
快速排查清单
| 检查项 | 命令 | 期望结果 |
|---|---|---|
| 图像文件大小 | 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 | 应该成功 |
建议执行顺序
- 先做单输入测试(只保留图像输入)→ 确认基础流程正常
- 如果单输入成功→ 问题在多输入配置,需要修改 ONNX 或校准数据为 4 维
- 如果单输入也失败→ 提供完整日志,可能是其他问题
请先执行单输入测试,告诉我结果!同时请提供:
ls -lh /data/workspace/gai/calibration_data/image/ | head -5
ls -lh /data/workspace/gai/calibration_data/features/ | head -5