深度学习模型DNN部署到安卓(移动)设备上——pytorch->onnx->ncnn->Android

最近,由于实验要求,我需要把在服务器上训练好的pytorch模型预训练.pth文件部署到安卓端测试推理时间,但是一直不知道应该怎么转变模型和部署,查了很多资料,遇到了很多问题,在同学的帮助下,尝试成功。

我简单记录一下整个部署流程,希望可以帮助想要尝试的同志们,同时,如果之后还需要部署相同项目的时候,我还可以参考这篇笔记。

一共有四个部分, pytorch->onnx->ncnn->Android

1.pytorch->onnx
(1)安装onnx和onnxruntime
onnx: pip install onnx
onnxruntime:
CPU版本: pip install onnxruntime
GPU版本: pip install onnxruntime-gpu
我使用的是gpu版本,在服务器上安装的

(2)pytorch->onnx
1)我使用pytorch生成了预训练的pth文件,把这个文件转换成onnx文件,只需要一个函数:

#导出onnx文件
torch_out = torch.onnx._export(model, x, output_onnx, export_params=True, verbose=False, input_names=input_names, output_names=output_names)

参数:
model :torch模型 pth文件
x:模型的输入 tensor
output_onnx:模型输出位置和文件 如:”resnet.onnx”
export_params:bool,default=True true表示导出trained model。默认即可

注意:在这个函数之前一定先使用model.eval()

2)onnxruntime加载onnx模型测试

import onnx
model = onnx.load("model.onnx") # 加载onnx
onnx.checker.check_model(model) # 检查生成模型是否错误

2.onnx->ncnn
ncnn安装之前需要先安装opencv和protocol
1)protocol各版本地址:https://github.com/protocolbuffers/protobuf/releases
我安装的3.17.0

unzip protobuf-all-3.17.0.zip
cd protobuf-all-3.17.0
./configure --prefix=/usr/local
make -j4
make check -j4
sudo make install
sudo ldconfig

2)opencv官网:https://opencv.org/releases/page/2/
我安装的4.5.0

##依赖项
sudo apt-get install build-essential
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install  libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
##源码编译
unzip opencv-4.5.0.zip
cd opencv-4.5.0
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..

make -j8
sudo make install
sudo ldconfig

3)克隆ncnn项目

git  clone   https://github.com/Tencent/ncnn.git

然后,编译一下

cd ncnn
mkdir -p build
cd build
cmake ..

make -j4

在build/tools/onnx/ 目录下就有转换工具onnx2ncnn文件了

4)简化onnx模型
安装工具:

pip3 install onnx-simplifier

python3 -m onnxsim mobilenetv3.onnx mobilenetv3-sim.onnx

然后去到目录build/tools/onnx/下运行(每次运行新的程序都需要重新执行上面的代码编译onnx)

onnx2ncnn mobilenetv3-sim.onnx mobilenetv3.param mobilenetv3.bin

mobilenetv3.param 和mobilenetv3.bin是我们所需的ncnn文件

5)xxx.id.h文件生成
到目录build/tools/目录下运行

生成包含网络结构名字的文件,后续文件中会用到这里面的网络结构名字。
比较基本的就是会修改输入输出的名字,如下面。

ex.input(mobilenetv3_param_id::BLOB_input_1, in);
ncnn::Mat out;
ex.extract(mobilenetv3_param_id::BLOB_653, out);

(3)ncnn->Android
这一步真的是我弄了两天,因为要跑别人的项目,所以在环境配置上有很多的问题,搞得很心烦。
我这一步是在windows上运行的,安装了android studio。
建议大家先跑别人的程序试一下:squeezenet

这个链接里面也有教程,应该怎么使用,很好用。

我在调整android studio时有很多问题,主要是代理的配置有问题:
(1)导入项目在Building gradle project info 时一直卡住
根据自己文件夹中对应的版本下载

(4)根目录下没有 gradle.properties 文件
可以用Android studio新建一个项目,把它的gradle.properties 文件拷贝过来,
然后加上

   android.useAndroidX=true
   android.enableJetifier=true

然后sync project 或者重启工程

Original: https://blog.csdn.net/xiaodidididi521/article/details/123464113
Author: 今天也是努力奋斗的阿迪鸭
Title: 深度学习模型DNN部署到安卓(移动)设备上——pytorch->onnx->ncnn->Android

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/709302/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球