MindStudio精度对比报错“The data in the Dump Path of Ground Truth is invalid.”
收藏回复举报
MindStudio精度对比报错“The data in the Dump Path of Ground Truth is invalid.”
t('forum.solved') 已解决
发表于2026-03-06 15:40:46
0 查看

MindStudio版本为MindStudio_2.2.9_linux.tar.gz

其中精度对比一节,原代码如下

import onnx
import onnxruntime
import numpy as np
import time 
from skl2onnx.helpers.onnx_helper import enumerate_model_node_outputs
from skl2onnx.helpers.onnx_helper import select_model_inputs_outputs
from skl2onnx.helpers.onnx_helper import save_onnx_model
 #修改模型,增加输出节点
model_onnx = onnx.load("./resnet50.onnx")
output = []
for out in enumerate_model_node_outputs(model_onnx):
    output.append(out)
    num_onnx = select_model_inputs_outputs(model_onnx,outputs=output)
    save_onnx_model(num_onnx, "resnet50_dump.onnx")
 #推理得到输出,本示例中采用随机数作为输入
input_data = np.random.random((1,3,224,224)).astype(np.float32)
input_data.tofile("test_data.bin")
sess = onnxruntime.InferenceSession("resnet50_dump.onnx")
input_name = sess.get_inputs()[0].name
output_name = [node.name for node in sess.get_outputs()]
res = sess.run(output_name, {input_name: input_data})
 #获得输出名称,确保每个算子节点有对应名称
node_name = [node.name for node in model_onnx.graph.node]
 #保存数据,针对多个输出的节点要适配output_index的循环
for idx,data in enumerate(res):
    file_name = node_name[idx] + "." + str(0) + "." + str(round(time.time() * 1000000)) + ".npy"
    output_dump_path = "./onnx_dump/"+file_name
    np.save(output_dump_path, data.astype(np.float16))

我没有找到这个示例中说的 resnet50.onnx 从哪里下载,我使用yolov8的模型 yolov8l_compressed_ir_D0.67_W1.0_C384.onnx,发现报错,因为 len(res)是218,而 len(node_name) 是210,所以我找豆包重新写了代码,内容如下:

import onnx
import onnxruntime
import numpy as np
import time
import os
from skl2onnx.helpers.onnx_helper import enumerate_model_node_outputs
from skl2onnx.helpers.onnx_helper import select_model_inputs_outputs
from skl2onnx.helpers.onnx_helper import save_onnx_model
import cv2

# 确保输出目录存在(避免保存文件时报错)
os.makedirs("./onnx_dump", exist_ok=True)

# 修改模型,增加输出节点
model_onnx = onnx.load("yolov8l_compressed_ir_D0.67_W1.0_C384/yolov8l_compressed_ir_D0.67_W1.0_C384.onnx")
output = []
for out in enumerate_model_node_outputs(model_onnx):
    output.append(out)
num_onnx = select_model_inputs_outputs(model_onnx, outputs=output)
save_onnx_model(num_onnx, "resnet50_dump.onnx")

# 推理得到输出,本示例中采用随机数作为输入
# input_data = np.random.random((1,3,512,640)).astype(np.float32)
# input_data.tofile("test_data.bin")
img_path = "test.jpg"  # 图片路径,可根据实际情况修改
img = cv2.imread(img_path)  # cv2默认读取为BGR格式
if img is None:
    raise FileNotFoundError(f"无法读取图片:{img_path},请检查路径是否正确")

# 2. BGR转RGB
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# 3. 调整尺寸到模型输入尺寸(512x640)
# 注意:YOLO通常是(h,w),这里对应模型输入(1,3,512,640)的(height=512, width=640)
img_resized = cv2.resize(img_rgb, (640, 512))  # cv2.resize参数是 (width, height)

# 4. 维度转换:HWC (512,640,3) → CHW (3,512,640)
img_chw = np.transpose(img_resized, (2, 0, 1))

# 5. 增加batch维度:CHW (3,512,640) → NCHW (1,3,512,640)
img_nchw = np.expand_dims(img_chw, axis=0)

# 6. 转为float32 + 归一化(除以255)
input_data = img_nchw.astype(np.float32) / 255.0
# -----------------------------------------------------------------

# 保存二进制输入(可选,保留你原本的逻辑)
input_data.tofile("test_data.bin")



sess = onnxruntime.InferenceSession("resnet50_dump.onnx")
input_name = sess.get_inputs()[0].name
# 关键1:output_name 长度和 res 完全一致(218)
output_name = [node.name for node in sess.get_outputs()]
res = sess.run(output_name, {input_name: input_data})
print(output_name)

# 打印关键信息验证
print(f"推理输出数量: {len(res)}")
print(f"输出名称数量: {len(output_name)}")  # 应和res数量一致
print(f"算子节点数量: {len(model_onnx.graph.node)}")  # 210,仅作参考

# 保存数据:改用output_name(和res一一对应),避免索引越界
timestamp = str(round(time.time() * 1000000))  # 提取时间戳,避免重复计算
for idx, data in enumerate(res):
    # 关键2:用output_name[idx]替代node_name[idx],并替换/为_
    base_name = output_name[idx].replace("/", "_").replace("model.", "model_")
    # 拼接文件名:名称.0.时间戳.npy(保留你原本的格式)
    file_name = f"{base_name}.{timestamp}.npy"
    output_dump_path = f"./onnx_dump/{file_name}"
    print(f"保存文件: {output_dump_path}")
    # 保存为float16格式
    np.save(output_dump_path, data.astype(np.float16))

可以正常运行,保存数据如下:

cke_30374.png 然后执行Ascend——>Model Accuracy Analyzer,执行,选择Ground Truth 的 Dump path,发现报错如下:

cke_48589.png

The data in the Dump Path of Ground Truth is invalid.

不知道是哪一步出错了,该如何改正?

本帖最后由 匿名用户2026/03/06 15:43:06 编辑

我要发帖子