白日梦观察 - onnx
type: channel
link: https://blog.angustar.com/tag/onnx/
items: 在嵌入式开发板上部署深度神经网络（一）：将 PyTorch 模型转换为 NCNN 模型

在嵌入式开发板上部署深度神经网络（一）：将 PyTorch 模型转换为 NCNN 模型
type: item
date: 2023-06-24T19:50:00+08:00
description: 在实际场景中，深度学习模型通常通过 PyTorch、TensorFlow 等框架来完成，直接通过这些模型来进行推理效率并不高，特别是对延时要求严格的线上场景。由此，经过工业界和学术界数年的探索，模型部署有了一条流行的流水线： 这一条流水线解决了模型部署中的两大难点：使用对接深度学习框架和推理引擎的中间表示，开发者不必担心如何在新环境中运行各个复杂的框架；通过中间表示的网络结构优化和推理引擎对运算的底层优化，模型的运算效率大幅提升。 在本文中，我们尝试以 ONNX 模型作为中介将 PyTorch 模型转换为 NCNN 模型。 一、将 PyTorch 模型转换为 ONNX 模型 1.1 配置环境 配置 PyTorch 环境的过程可以参考官方网站。 安装 ONNX Runtime 和 ONNX Smiplifier： pip install onnxruntime pip install onnx-simplifier 1.2 转换模型 在准备好相关环境后，使用以下 Python 代码即可将 PyTorch 模型转换为 ONNX 模型： import torch.onnx import torch import timm dummy_input = torch.randn(1, 3, 299, 299) model = timm.create_model('inception_v3', num_classes=1000, pretrained=True) model.eval() torch.onnx.export(model, # model being run dummy_input, # model input (or a tuple for multiple inputs) "./out/inception_v3.onnx", # where to save the model (can be a file or file-like object) export_params=True, # store the trained parameter weights inside the model file do_constant_folding=True, # whether to execute constant folding for optimization input_names = ['input'], # the model's input names output_names = ['output'], # the model's output names ) 为了避免出现运行失败的情况，在将 ONNX 模型转换为 NCNN 模型前，我们需要简化ONNX 模型： onnxsim ./out/inception_v3.onnx ./out/inception_v3-sim.onnx 1.3 验证模型 在转换后，需要对比 PyTorch 模型和转换后得到的 ONNX 模型的推理结果是否一致，以验证转换是否成功，可以使用以下代码： import torch import onnxruntime import numpy as np import cv2 import timm #test image img_path = "59204d6bb0c234eb.png" img = cv2.imread(img_path) img = cv2.resize(img, (299, 299)) img = np.transpose(img, (2, 0, 1)).astype(np.float32) img = torch.from_numpy(img) img = img.unsqueeze(0) # pytorch test model = timm.create_model('inception_v3', num_classes=1000, pretrained=True) model.eval() # pytorch test output = model(img) val, cls = torch.max(output.data, 1) print("[PyTorch]--->predicted class:", cls.item()) print("[PyTorch]--->predicted value:", val.item()) # onnx test sess = onnxruntime.InferenceSession("./out/inception_v3-sim.onnx") x = "input" y = ["output"] output = sess.run(y, {x : img.numpy…