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

超最简单的安卓端深度学习模型部署教程——pytorch2onnx2pdinfer2android,第1张

目录

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)

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/989961.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存