如何测试mindir模型的精度

举报
stable feeling 发表于 2024/04/07 15:50:49 2024/04/07
【摘要】 benchmark计算mindir模型精度

1、前言

本文主要介绍如何测试mindir模型的精度

2、原理说明

在相同的输入条件下,对比onnx和mindir模型的输出结果,计算出误差

3、模型转换

这里以yolox模型为例,说明对比过程

开源的yolox onnx模型:https://github.com/Megvii-BaseDetection/YOLOX/tree/main/demo/ONNXRuntime

因为onnx模型的输入是固定shape的,所以在配置好mindspore-lite的环境变量后,可以直接使用如下命令转换

converter_lite --modelFile=./yolox_x.onnx --outputFile=./yolox_x --inputShape="images:1,3,640,640" --fmk=ONNX --saveType=MINDIR --optimize=ascend_oriented

转换成功后就得到了mindir模型

4、保存onnx模型的输入和输出

这一步需要先使用onnx进行一次推理,样例代码如下

import onnxruntime
import numpy as np
import traceback


def save_output(outputs_name, outputs, output_path):
    """
    outputs_name:输出名称列表
    outputs:输出数据列表
    output_path:输出文件路径
    """
    print('outputs_name ', outputs_name)
    out_shapes = [out.shape for out in outputs]
    outputs = [out.flatten() for out in outputs]
    try:
        with open(output_path, 'w') as f:
            for idx, name in enumerate(outputs_name):
                shape_str = [str(dim) for dim in out_shapes[idx]]
                shape_str = ' '.join(shape_str)
                print(f'output {idx} is {outputs[idx].shape}')
                f.write(f'{name} {len(out_shapes[idx])} {shape_str}\n')
                for i in range(len(outputs[idx])):
                    f.write(str(outputs[idx][i]) + ' ')
                f.write('\n')
    except Exception:
        traceback.print_exc()


def run_onnx_infer():
    model_path = "./yolox_x.onnx"
    onnx_session = onnxruntime.InferenceSession(model_path)
    images = np.random.random(size=(1,3,640,640)).astype(np.float32)
    # 将输入numpy数据保存为bin文件
    images.tofile("./images.bin")
    data_inputs = {onnx_session.get_inputs()[0].name:images}
    outputs_data = onnx_session.run(None, data_inputs)
    # 将输出保存到txt文件中
    save_output(["output"], outputs_data, "./outputs.txt")


if __name__ == "__main__":
    run_onnx_infer()

运行代码之后,会在当前目录下生成images.bin和outputs.txt文件

5、测试mindir模型精度

使用上一步生成的输入和输出文件,执行如下命令

benchmark --modelFile=./yolox_x.mindir --device=Ascend --inputShapes="1,3,640,640" --inDataFile=./images.bin --benchmarkDataFile=outputs.txt

执行结束后,会有如下误差结果返回

这里的结果是绝对值误差,数值越小代表误差越小,精度越高

说明:如果模型有多个输入,则会生成多个bin文件,benchmark命令中的--inDataFile后按照输入顺序放置保存的bin文件,以英文逗号隔开即可

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。