栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

onnx精度验证

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

onnx精度验证

一、yolov5-v6.1 onnx模型转换

1、export.py

参数设置:data、weights、device(cpu)、dynamic(triton需要转成动态的)、include

建议先转fp32,再转fp16:

import onnxmltools
from onnxmltools.utils.float16_converter import convert_float_to_float16
# Update the input name and path for your ONNX model
input_onnx_model = '20211117_yolov5m_car_people.onnx'
# Change this path to the output name and path for your float16 ONNX model
output_onnx_model = '20211117_yolov5m_car_people_fp16.onnx'
# Load your model
onnx_model = onnxmltools.utils.load_model(input_onnx_model)
# Convert tensor float type from your input ONNX model to tensor float16
onnx_model = convert_float_to_float16(onnx_model)
# Save as protobuf
onnxmltools.utils.save_model(onnx_model, output_onnx_model)
import onnx
model_onnx = onnx.load('20211117_yolov5m_car_people_fp16.onnx')
#onnx.checker.check_model(model_onnx)
print(model_onnx.graph.output)
二、精度损失比较

注意:

1、pytorch模型的输入为tensor,而onnx的输入为array

2、pytorch 模型在转 ONNX 模型的过程中,使用的导出器是一个基于轨迹的导出器,这意味着它执行时需要运行一次模型,然后导出实际参与运算的运算符. 这也意味着, 如果你的模型是动态的,例如,改变一些依赖于输入数据的操作,这时的导出结果是不准确的.同样,一 个轨迹可能只对一个具体的输入尺寸有效 (这是为什么我们在轨迹中需要有明确的输入的原因之一.) 我们建议检查 模型的轨迹,确保被追踪的运算符是合理的. 

3、当前版本的yolov5可以直接使用onnx模型检测,将detect参数里的weight改成对应模型即可。

精度对比:

一般onnx模型与pytorch模型的结果只会在小数点的第三位或者第四才会有所出入。

代码可直接加在yolov5 detect.py里:

# pytorch输出            
pred = model(img, augment=augment, visualize=visualize)
# onnx输出
from onnxruntime.datasets import get_example
import onnxruntime
onnx_model = get_example('/home/yijiaxuan/project/big_bag/yolov5_big_bag/weights/0516.onnx')
providers = ['CUDAExecutionProvider', 'CPUExecutionProvider'] if torch.cuda.is_available() else ['CPUExecutionProvider']
sess = onnxruntime.InferenceSession(onnx_model, providers=providers)
pred_onnx = sess.run(None, {sess.get_inputs()[0].name: to_numpy(img)})
            # np.testing.assert_almost_equal(to_numpy(pred), pred_onnx[0], decimal=2)
            # 如果两个项不等于期望的精度,则引发AssertionError。
np.testing.assert_allclose(to_numpy(pred), pred_onnx[0], rtol=1e-3)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/918281.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号