一. yolo导出onnx关于opset版本设置。
1. 先安装onnx和onnxsim。
2. yolo有官方的导出代码,自己写一个更简单一些。
import warnings
warnings.filterwarnings('ignore')
from ultralytics import YOLO
if __name__ == '__main__':
model = YOLO('runs/xxx/weights/best.pt')
model.export(format='onnx', opset=17, simplify=True)
3. 代码中,opset用什么版本,由onnx和torch版本最高能支持opset的版本而定。
3.1查看onnx能支持的opset最高的版本。执行下面的onnx的代码。(我的最高支持opset 1.21)
from onnx import version, IR_VERSION
from onnx.defs import onnx_opset_version
print(f"onnx.__version__ = {version.version!r}, opset={onnx_opset_version()}, IR_VERSION={IR_VERSION}")
3.2查看torch能支持的opset最高的版本,以torch1.13版本为例,
浏览器输入网址:torch.onnx — PyTorch 1.13 documentation
(查看到opset最高只支持1.17)
如果要查询torch其他版本最高能支持opset多少,只需要把下面的网址中的1.13改为你要查询的版本即可。
所以上述代码转onnx模型代码中,opset设置为17。
二. yolo导出onnx关于simplify参数设置。
点击查看what is this package used for? · Issue #38 · daquexian/onnx-simplifier · GitHub
(onnx-simplifier能折叠并删除onnx中的冗余计算,加快模型推理)
例如,未加simplify,导出的onnx模型是4.1M,加上simplify,导出的onnx模型是3.9M,会更小一点,这样能减少计算量,加快推理。
三. yolo导出onnx进行推理和pt推理对比。
import warnings
warnings.filterwarnings('ignore')
from ultralytics import YOLO
if __name__ == '__main__':
# 用onnx模型进行推理
model = YOLO('runs/xxx/weights/best.onnx') # 用pt推理,需要best.onnx改为best.pt
model.predict(source='images',
imgsz=640,
project='runs/detect',
name='exp',
save=True,
conf=0.2,
)
注意:用onnx进行推理和用pt进行推理,推理得到的类别几乎相同,但置信度会有一点差异,跟onnx用640*640和pt用384*640进行推理有部分关系。
注: torch能直接调用onnx模型进行推理,这样就能用同一个代码,加载pt和onnx进行模型推理,进行精度对比。