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_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/project/yolov5/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)

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值