onnx精度验证

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

 

1、export.py

onnx精度验证_第1张图片

参数设置: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)

你可能感兴趣的:(深度学习,人工智能)