模型部署 | 使用ONNXRuntime部署DAMO-YOLO目标检测
01
ONNXRuntime是微软推出的一款推理框架,用户可以非常便利的用其运行一个onnx模型。ONNXRuntime支持多种运行后端包括CPU,GPU,TensorRT,DML等。可以说ONNXRuntime是对ONNX模型最原生的支持。
虽然大家用ONNX时更多的是作为一个中间表示,从pytorch转到onnx后直接喂到TensorRT或MNN等各种后端框架了= =,但这并不能否认ONNXRuntime是一款非常优秀的推理框架(微软出品,必属精品)。而且由于其自身只包含推理功能(1.2版本,最新的ONNXRuntime甚至已经可以训练,可见微软在其上面的野心还是有的),对比主流框架源码看起来没有那么复杂难懂,通过阅读其源码可以非常清晰的理解深度学习框架的一些核心功能原理(op注册,内存管理,运行逻辑等)。接下来的一系列文章尝试对ONNXRuntime的源码进行阅读学习,对理解深度学习框架的工作原理还是很有帮助的。
下面是使用ONNXRuntime的一个简单例子:
import numpy as np
import onnx
import onnxruntime as ort
image = cv2.imread("image.jpg")
image = np.expand_dims(image, axis=0)
onnx_model = onnx.load_model("resnet18.onnx")
sess = ort.InferenceSession(onnx_model.SerializeToString())
sess.set_providers(['CPUExecutionProvider'])
input_name = sess.get_inputs()[0].name
output_name = sess.get_outputs()[0].name
output = sess.run([output_name], {input_name : image_data})
prob = np.squeeze(output[0])
print("predicting label:", np.argmax(prob))
总体来看,整个ONNXRuntime的运行可以分为三个阶段,Session构造,模型加载与初始化和运行。和其他所有主流框架相同,ONNXRuntime最常用的语言是python,而实际负责执行框架运行的则是C++。
——转自知乎-黑羽
现在我们基于“hpcboka”贡献的onnxweight,我们一起来学习实践部署的能力。
使用ONNXRuntime部署DAMO-YOLO目标检测,包含C++和Python两个版本的程序。起初,我想使用opencv做部署的,但是opencv的dnn模块读取onnx文件出错, 无赖只能使用onnxruntime做部署了。
本套程序一共提供了27个onnx模型, onnx文件需要从百度云盘下载。
链接:https://pan.baidu.com/s/10-5ke_fs2omqUMSgKTJV0Q 提取码:w9kp
其中在百度云盘里一共有30个onnx模型文件,但是逐个读取onnx文件做推理时, 发现有3个onnx文件在onnxruntime读取时出错了,在程序里的choices参数里声明了 27个模型文件的名称。