yolo 模型转换教程
iOS yolo 函数:使用 .mlpackage 或 .mlmodel 格式模型。
.mlpackage:模型目录名称必须是 .mlpackage 结尾
.mlmodel:模型路径设置到 .mlmodel 文件即可
参考资料:https://developer.apple.com/machine-learning/models/
安卓 yolo 函数:需使用 .ncnn 格式模型,具体转换方式详见下方。
准备工作
1、python v3.8 或以上版本环境(通过 Anaconda 或 Miniconda 等虚拟环境管理软件可以切换 python 版本及环境,以避免环境冲突,非必要)
2、以上格式模型均由 .pt 模型转换,因此需先自行训练 .pt 模型。
转换步骤(.pt 转 .ncnn)
步骤 1:安装必要依赖包
如已安装可以跳过
//安装ultralytics、pnnx、ncnn
pip install ultralytics pnnx ncnn -i https://mirrors.aliyun.com/pypi/simple/
//安装PyTorch(任选一种方式)
//方法一:使用 conda虚拟环境安装(推荐):
conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia
//方法二:使用 pip 安装:
pip install torch torchvision torchaudio
步骤 2:切换工作目录到模型目录
打开命令行终端输入:
//切换盘符
f:
//切换工作目录到.pt模型存放目录
cd yourModelDir
yourModelDir:为你的 .pt 模型存放目录,实际操作过程中替换成自己的目录,以下步骤中同义。
yourModelName:为你的模型名称,实际操作过程中替换成自己的模型名称,以下步骤中同义。
如未切换工作目录,后续操作需使用绝对路径
步骤 3:导出 torchscript 文件
yolo export model=yourModelName.pt format=torchscript
导出成功后将在工作目录 yourModelDir 下生成同名 .torchscript 文件,即 yourModelName.torchscript。
步骤 4:静态形状转换
pnnx yourModelName.torchscript
转换成功后将在工作目录yourModelDir下生成:
Python模型定义文件,后续转换标准版模型需要用到:
yourModelName_pnnx.py
yourModelName.ncnn.bin
yourModelName.ncnn.param
步骤 5:修改 yourModelName_pnnx.py文件设置 不同 yolo 版本修改位置不同,以 ncnn 官方教程为准,以 yolov8 为例:
修改前:
v_165 = v_142.reshape(1, 87, 6400)
v_166 = v_153.reshape(1, 87, 1600)
v_167 = v_164.reshape(1, 87, 400)
v_168 = torch.cat((v_165, v_166, v_167), dim=2)
修改后:
v_165 = v_142.reshape(1, 87, -1).transpose(1, 2)
v_166 = v_153.reshape(1, 87, -1).transpose(1, 2)
v_167 = v_164.reshape(1, 87, -1).transpose(1, 2)
v_168 = torch.cat((v_165, v_166, v_167), dim=1)
return v_168
注意:v_165-v_168 的 reshape 第 1、第 2 个参数值不固定,修改前后需保持一致,即如修改前是 1, 87,修改后还是保持 1, 87。
步骤 6:重新导出torchscript
python -c "import yourModelName_pnnx; yourModelName_pnnx.export_torchscript()"
输出成功后将在工作目录 yourModelDir 下生成:
yourModelName_pnnx.py.pt
步骤 7:动态形状转换
pnnx yourModelName_pnnx.py.pt inputshape=[1,3,640,640] inputshape2=[1,3,320,320]
转换成功后将在工作目录 yourModelDir 下生成:
yourModelName_pnnx.py.ncnn.bin
yourModelName_pnnx.py.ncnn.param