按键精灵安卓/ios脚本开发辅助工具:yolo转换教程
按键精灵安卓版:yolo函数需使用.ncnn格式模型
按键精灵iOS新版:yolo函数需使用.mlpackage或.mlmodel格式模型,未来会支持.ncnn,相同模型下苹果原生ml执行效率与性能消耗优于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
简化版模型文件,如只需简化版模型到这一步可以退出,yolo.setModel函数的modelType参数设置1,但会损失一定精度:
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下生成:
标准版模型文件,yolo.setModel函数的modelType参数设置2,可以重命名为自己需要的名称,后缀名不能修改:
yourModelName_pnnx.py.ncnn.bin
yourModelName_pnnx.py.ncnn.param
