前言
最近买到手了一个旭日派x3,正好公司最近正在研究能不能把模型往一些轻量化的前端去部署,本人又刚刚好喜欢折腾,就开始研究这个东西了
顺便在这里感谢一下dalao提供的教程,让我能初步使用旭日派x3进行推理[BPU部署教程] 万字长文!通透解读模型部署端到端大流程——以终为始,以行为知,当然我做的还有一点问题,后续都会挨个修复
模型的转化
(1):pt转onnx,得到可用onnx模型
这个的话比较简单,只需要用pytorch读取yolov8n-pose模型后进行导出即可,虽然大佬、建议每次导出,都做个校队,以确保使用过程中不会出问题,但我懒,没有做校队
代码:
import os
import sys
sys.path.append(os.getcwd())
import cv2
import numpy as np
import torch
import onnx
# 1. 加载Pytorch模型
dataroot = "./data/"
modelpath = os.path.join(dataroot, "yolov8n-pose.pt")
net = torch.load(modelpath)['model']
net.eval() # ※这个要有
net.float()
# 2. 转换ONNX
onnxpath = os.path.join(dataroot, "yolov8n_pose.onnx") # 定义onnx文件保存目录
im = torch.randn(1, 3, 640, 640).cpu() # 定义输入变量,维度重要,内容不重要
# 下面是转onnx的基本配置,为了能够用在BPU上,按照下面这个方式配置参数即可
# 对于多输入输出的模型,参考连接:https://www.cnblogs.com/WenJXUST/p/16334151.html
# 下面这个Warning可以忽略不管
# Warning: Constant folding - Only steps=1 can be constant folded for opset >= 10 onnx::Slice op. Constant folding not applied.
torch.onnx.export(net,
im,
onnxpath,
verbose=False,
training=torch.onnx.TrainingMode.EVAL,
do_constant_folding=True,
input_names=['images'],
output_names=['output'],
dynamic_axes=None,
opset_version=11)
# 3. 检查ONNX,如果ONNX有问题,这里会输出一些日志
print('Start check onnx')
model_onnx = onnx.load(onnxpath)
onnx.checker.check_model(model_onnx)
(2:)onnx模型转bin模型
正确做法,其实是先校队一下你的onnx模型有没有损失,转化过程中有没有错误,但我说了我比较懒,就越过这一步了
转化过程:
1、将上面得到的onnx模型移到你的ubuntu目录下
2、通过官方的模型转化工具来进行转化,当然,需要做一点点小小的修改
通过vscode打开官方转化工具包全局搜索672,将其改成640(这个按需求来做,如果是yolov8x我记得好像是1280了)
补充:我感觉的话,其实只需要改/yolov5s_v2.0/04_detection/03_yolov5s/mapper/preprocess.py和/yolov5s_v2.0/04_detection/03_yolov5s/mapper/postprocess.py
这俩处的672就可以了,其他地方不需要动
然后,继续按照官方文档
首先修改01_check_X3.sh和yolov5s_config_X3.yaml,吧里面的模型路径换成你的模型路径
修改后就可以按照官方的01_check_X3.sh,02_preprocess.sh,03_build_X3.sh的顺序去获取编译后得到的bin模型了
结尾
由于我也是刚刚开始使用旭日派x3,这篇文章可能写的不太好,中间如果大家有问题我也是欢迎提问,并优化文章的