Pytorch|超最简单的安卓端深度学习模型部署教程——pytorch2onnx2pdinfer2android

目录
0. 背景
1. 随便写一个pytroch模型并转为onnx模型
1.1 随便写一个pytorch图像分类模型
1.2 转为onnx模型,并检查输入(没有进行训练)
2. onnx2pdinference
3. pdinference2android
4. 打开paddle的安卓部署工程文件
5. 连接手机或模拟器
6. 修改安卓工程文件,并运行
7. 参考链接
0. 背景 百度官方给我们提供了很好的安卓端部署demo,但现阶段很多模型都是pytorch实现的,想要自己复现可能需要花些时间,因此我们可以从pytorch转到onnx再到paddle实现安卓端的部署。
简单起见,我们采用最简单的图像分类模型做演示。
1. 随便写一个pytroch模型转为onnx模型 1.1 随便写一个pytorch图像分类模型

import numpy as np import torch import torch.nn as nn import onnxruntimeclass simple_model(nn.Module): def __init__(self, in_dim, n_class): super(simple_model, self).__init__() self.conv = nn.Sequential( nn.Conv2d(in_dim, 16, 3, stride=1, padding=0), nn.ReLU(True), nn.MaxPool2d(2, 2), nn.Conv2d(16, 32, 3, stride=1, padding=0), nn.ReLU(True), nn.MaxPool2d(2, 2), nn.Conv2d(32, 64, 3, stride=1, padding=0), nn.MaxPool2d(2, 2) )self.fc = nn.Sequential( nn.Linear(43264, n_class), # nn.Dropout() )def forward(self, x): out = self.conv(x) out = out.view(out.size(0), -1) out = self.fc(out) return out

1.2 转为onnx模型,并检查输入(没有进行训练) 这一步生成onnx模型,并对比其预测结果与pytoch模型的预测结果
if __name__ == '__main__': x = torch.randn(1, 3, 224, 224, requires_grad=True) model = simple_model(3, 2) out = model(x) # Export the model torch.onnx.export(model, x, "model.onnx", export_params=True, opset_version=10, do_constant_folding=True, input_names=['input'], output_names=['output'])ort_session = onnxruntime.InferenceSession("model.onnx")def to_numpy(tensor): return tensor.detach().cpu().numpy() if tensor.requires_grad else tensor.cpu().numpy()# compute ONNX Runtime output prediction ort_inputs = {ort_session.get_inputs()[0].name: to_numpy(x)} ort_outs = ort_session.run(None, ort_inputs) print(ort_outs) print(out) # compare ONNX Runtime and PyTorch results np.testing.assert_allclose(to_numpy(out), ort_outs[0], rtol=1e-03, atol=1e-05)print("Exported model has been tested with ONNXRuntime, and the result looks good!")

2. onnx2pdinference 很简单,只需要一句命令
x2paddle --framework=onnx --model=vit.onnx --save_dir=pd_model

我们只需要pd_model\inference_model目录下的model.pdmodel、model.pdiparams.info、model.pdiparams模型文件
3. pdinference2android 同样非常简单
先看一下目录结构
Pytorch|超最简单的安卓端深度学习模型部署教程——pytorch2onnx2pdinfer2android
文章图片

再看一下实现代码
import paddlelite.lite as lite import sys sys.path.append("..") opt = lite.Opt() opt.set_model_file("pd_model\\inference_model\\model.pdmodel") opt.set_param_file("pd_model\\inference_model\\model.pdiparams") opt.set_optimize_out("android_model/model") opt.set_valid_places("arm") opt.set_model_type("naive_buffer") opt.set_optimize_out("model") opt.run()

这样我们就得到了可以在安卓端部署的模型->model.nb
4. 打开paddle的安卓部署工程文件 首先下载paddle提供的安卓工程demo
Paddle-Lite-Demo/PaddleLite-android-demo at master · PaddlePaddle/Paddle-Lite-Demo (github.com)
使用android studio打开
Paddle-Lite-Demo-master\PaddleLite-android-demo\image_classification_demo
如下图:
Pytorch|超最简单的安卓端深度学习模型部署教程——pytorch2onnx2pdinfer2android
文章图片

文件很多,但是我们只需要在images、labels、models文件夹内添加对应文件,并在values/strings.xml中进行对应修改即可。
Pytorch|超最简单的安卓端深度学习模型部署教程——pytorch2onnx2pdinfer2android
文章图片

simple_model.jpg为apk打开时显示的图片
simple_model.txt为分类标签,左侧为label,右侧为label对应的类别,如下:
Pytorch|超最简单的安卓端深度学习模型部署教程——pytorch2onnx2pdinfer2android
文章图片

建立simple_model文件夹,并将我们训练好的model.nb模型放入,模型名最好用model.nb,否则需要修改其他文件
5. 连接手机或模拟器 有安卓手机的可以进入手机的开发者模式,连接手机,苹果用户可以使用android studio自带的模拟器,或者下载其他的模拟器,均可
这里使用夜神模拟器,模拟器连接手机时需要注意:
1. 需要将adb.exe加入环境变量
2. 在夜神模拟器的adb.exe文件下,打开powershell:
输入 .\nox_adb.exe connect127.0.0.1:62001或者 .\adb.exe connect 127.0.0.1:62001连接模拟器
连接后会看到模拟器的型号,这里是三星的某款机型,如下:
Pytorch|超最简单的安卓端深度学习模型部署教程——pytorch2onnx2pdinfer2android
文章图片

6. 修改安卓工程文件,并运行 很简单,打开app/res/values/strings.xml文件,按照图片修改即可
Pytorch|超最简单的安卓端深度学习模型部署教程——pytorch2onnx2pdinfer2android
文章图片

运行结果如下:
Pytorch|超最简单的安卓端深度学习模型部署教程——pytorch2onnx2pdinfer2android
文章图片
成功 !!!
7. 参考链接 1. 将模型从 PyTorch 导出到 ONNX 并使用 ONNX Runtime 运行 - stardsd - 博客园 (cnblogs.com)
【Pytorch|超最简单的安卓端深度学习模型部署教程——pytorch2onnx2pdinfer2android】2. Paddle-Lite-Demo/PaddleLite-android-demo at master · PaddlePaddle/Paddle-Lite-Demo (github.com)

    推荐阅读