目录
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 onnxruntime
class 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同样非常简单
先看一下目录结构
再看一下实现代码
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
如下图:
文件很多,但是我们只需要在images、labels、models文件夹内添加对应文件,并在values/strings.xml中进行对应修改即可。
simple_model.jpg为apk打开时显示的图片
simple_model.txt为分类标签,左侧为label,右侧为label对应的类别,如下:
建立simple_model文件夹,并将我们训练好的model.nb模型放入,模型名最好用model.nb,否则需要修改其他文件
5. 连接手机或模拟器有安卓手机的可以进入手机的开发者模式,连接手机,苹果用户可以使用android studio自带的模拟器,或者下载其他的模拟器,均可
这里使用夜神模拟器,模拟器连接手机时需要注意:
1. 需要将adb.exe加入环境变量
2. 在夜神模拟器的adb.exe文件下,打开powershell:
输入 .\nox_adb.exe connect 127.0.0.1:62001或者 .\adb.exe connect 127.0.0.1:62001连接模拟器
连接后会看到模拟器的型号,这里是三星的某款机型,如下:
6. 修改安卓工程文件,并运行很简单,打开app/res/values/strings.xml文件,按照图片修改即可
运行结果如下:
成功 !!!
7. 参考链接1. 将模型从 PyTorch 导出到 ONNX 并使用 ONNX Runtime 运行 - stardsd - 博客园 (cnblogs.com)
2. Paddle-Lite-Demo/PaddleLite-android-demo at master · PaddlePaddle/Paddle-Lite-Demo (github.com)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)