对B站up同济子豪兄的图像分类系列的学习(大佬的完整代码在GitHub开源)
本文使用oxxn转化pytorch模型为oxxn。并在oxxn-runtime环境部署 。
Open Neural Network Exchange(ONNX,开放神经网络交换)格式,是一个用于表示深度学习模型的标准,可使模型在不同框架之间进行转移。
通常我们在训练模型时可以使用很多不同的框架,比如有的同学喜欢用 Pytorch,有的同学喜欢使用 TensorFLow,也有的喜欢 MXNet,以及深度学习最开始流行的 Caffe等等,这样不同的训练框架就导致了产生不同的模型结果包,在模型进行部署推理时就需要不同的依赖库,而且同一个框架比如tensorflow 不同的版本之间的差异较大, 为了解决这个混乱问题, LF AI 这个组织联合 Facebook, MicroSoft等公司制定了机器学习模型的标准,这个标准叫做ONNX, Open Neural Network Exchage,所有其他框架产生的模型包 (.pth, .pb) 都可以转换成这个标准格式,转换成这个标准格式后,就可以使用统一的 ONNX Runtime等工具进行统一部署。
这里 ONNX 标准采取了谷歌开发 protocal buffers 作为格式标准,这个格式是在 XML, json的基础上发展的,是一个人类易理解的格式。ONNX 官网对ONNX的介绍如下:
ONNX defines a common set of operators - the building blocks of machine learning and deep learning models - and a common file format to enable AI developers to use models with a variety of frameworks, tools, runtimes, and compilers.
ONNX支持的模型来源,基本上囊括了我们日常使用的所有框架。
————————————————
版权声明:本文为CSDN博主「luoganttcc」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/luoganttcc/article/details/122171291
支持ONNX的runtime就是类似于JVM将统一的ONNX格式的模型包运行起来,包括对ONNX 模型进行解读,优化(融合conv-bn等操作),运行。
oxxn一般用于中间部署的阶段。
onnx,onnxruntime两个包,直接pip下载下来。
载入pytorch产生的权重文件到model之后,按照规范转换成oxxn格式。
x = torch.randn(1, 3, 256, 256).to(device)
with torch.no_grad():
torch.onnx.export(
model, # 要转换的模型
x, # 模型的任意一组输入
'resnet18.onnx', # 导出的 ONNX 文件名
opset_version=11, # ONNX 算子集版本
input_names=['input'], # 输入 Tensor 的名称(自己起名字)
output_names=['output'] # 输出 Tensor 的名称(自己起名字)
)
然后目录下就会生成resnet18.oxxn文件。我们可以拿这个文件依靠oxxn-runtime进行推理。
我们可以使用以下语句输出oxxn模型的计算图。
import onnx
# 读取 ONNX 模型
onnx_model = onnx.load('resnet18.onnx')
# 检查模型格式是否正确
onnx.checker.check_model(onnx_model)
print('无报错,onnx模型载入成功')
#以可读形式打印计算图
print(onnx.helper.printable_graph(onnx_model.graph))
以下代码在需要部署的硬件上运行。只需把`onnx`模型文件发到部署硬件上,并安装 ONNX Runtime 环境,用几行代码就可以运行模型了。
# 导入工具包
import onnxruntime
import numpy as np
import torch
# 载入 onnx 模型,获取 ONNX Runtime 推理器
ort_session = onnxruntime.InferenceSession('resnet18.onnx')
# 构造输入,获取输出结果
x = torch.randn(1, 3, 256, 256).numpy()
# onnx runtime 输入
ort_inputs = {'input': x}
# onnx runtime 输出
ort_output = ort_session.run(['output'], ort_inputs)[0]
# 预处理
from torchvision import transforms
# 测试集图像预处理-RCTN:缩放裁剪、转 Tensor、归一化
test_transform = transforms.Compose([transforms.Resize(256),
transforms.CenterCrop(256),
transforms.ToTensor(),
transforms.Normalize(
mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225])
])
# 中间部分略
##
##
# ONNX Runtime 输入
ort_inputs = {'input': input_tensor}
# ONNX Runtime 输出
pred_logits = ort_session.run(['output'], ort_inputs)[0]
pred_logits = torch.tensor(pred_logits)
然后对预测结果进行之前的处理即可。
着实是没看明白。
如果需要部署到andriod端的化需要使用ncnn对oxxn进行模型转换,还需要使用AndriodStudio,确实这个教程是不好编写的。
OXXN多作为一种中间的模型,比如由OXXN模型再转到tensorRT、TVM、ncnn等。