深度学习模型移植pytorch->onnx->ncnn->android

深度学习模型移植pytorch->onnx->ncnn->android

最近做项目需要在手机上跑深度学习的模型,踩了不少坑,做个记录。这里以mobilenetv3为例子。

pytorch->onnx

1.环境配置
pytorch 1.0 之后自带onnx输出,所以是个很好的选择,顺便装个caffe2验证不同后端加载的模型输出结果是否一致。如果用conda配置,就几行命令。

conda install pytorch-nightly-cpu -c pytorch
conda install -c conda-forge onnx

2.mobilenetv3 修改自 rwightman 的代码,模型参数也是这位大神训练的。修改后的代码见此。
拿一张图像先跑一下
猫

import time
import numpy as np
import torch
from PIL import Image
import mobilenetv3
import onnx
import caffe2.python.onnx.backend as backend


src_image = 'cat.jpg'
input_size = 224
mean_vals = torch.tensor([0.485, 0.456, 0.406], dtype=torch.float32).view(3,1,1)
std_vals = torch.tensor([0.229, 0.224, 0.225], dtype=torch.float32).view(3,1,1)

imagenet_ids = []
with open("synset_words.txt", "r") as f:
    for line in f.readlines():
        imagenet_ids.append(line.strip())

###############################prepare model####################################
infer_device = torch.device('cpu')
res_model = mobilenetv3.MobileNetV3()
state_dict = torch.load('./mobilenetv3x1.0.pth', map_location=lambda storage, loc: storage)
res_model.load_state_dict(state_dict)
res_model.to(infer_device)
res_model.eval()

################################prepare test image#####################################
pil_im = Image.open(src_image).convert('RGB')
pil_im_resize = pil_im.resize((input_size, input_size), Image.BILINEAR)

origin_im_tensor = torch.ByteTensor(torch.ByteStorage.from_buffer(pil_im_resize.tobytes()))
origin_im_tensor = origin_im_tensor.view(input_size, input_size, 3)
origin_im_tensor = origin_im_tensor.transpose(0, 1).transpose(0, 2).contiguous()
origin_im_tensor = (origin_im_tensor.float()/255 - mean_vals)/std_vals
origin_im_tensor = origin_im_tensor.unsqueeze(0)


###########################test################################
t1=time.time()
with torch.no_grad():
    pred = res_model(origin_im_tensor.to(infer_device))
    predidx = torch.argmax(pred, dim=1)
t2 = time.time()
print(t2 - t1)
print("predict result: ", imagenet_ids[predidx])

不出意外,预测应该是猫

0.03892230987548828
predict result:  n02123597 Siamese cat, Siamese

3.pytorch导出onnx并检查,代码接上段

##################export###############
output_onnx = 'mobilenetv3.onnx'
x = origin_im_tensor
print("==> Exporting model to ONNX format at '{}'".format(output_onnx))
input_names = ["input0"]
output_names = ["output0"]
torch_out = torch.onnx._export(res_model, x, output_onnx, export_params=True, verbose=
### 如何在 Windows 系统上部署深度学习框架和模型 #### 部署前的准备 为了在 Windows 上成功部署深度学习框架及其对应的模型,需要先确认目标硬件设备的支持情况以及所选框架的要求。例如,如果计划使用 GPU 加速,则需安装 NVIDIA 的 CUDA 和 cuDNN 工具包[^1]。 #### 安装深度学习框架 常见的深度学习框架如 TensorFlow、PyTorch 或 Keras 可通过 Python 虚拟环境管理工具(如 `conda` 或 `venv`)轻松安装。以下是具体操作方法: - **TensorFlow**: 使用 pip 命令可以直接安装最新版本的 TensorFlow。对于 GPU 支持,推荐安装特定的 GPU 版本。 ```bash pip install tensorflow ``` - **PyTorch**: PyTorch 提供了一个方便的命令生成器页面 (https://pytorch.org/get-started/locally/) 来帮助选择适合的操作系统配置。 ```bash pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 ``` - **Keras**: 如果单独使用 Keras,可以通过以下方式安装: ```bash pip install keras ``` 这些框架通常依赖于 NumPy 和 SciPy 等科学计算库,在安装过程中会自动解决大部分依赖关系[^2]。 #### 模型格式转换 当完成框架的选择后,下一步是考虑模型的兼容性和优化问题。ONNX 是一种通用的开放标准,用于表示机器学习模型。它可以作为不同框架之间的桥梁,允许开发者将来自 Tensorflow、PyTorch 或其他平台上的模型导出并导入至 ONNX 格式。 ##### 将 PyTorch 模型转换为 ONNX 假设有一个预训练好的 PyTorch 模型,可以按照如下步骤将其保存为 ONNX 文件: ```python import torch from model import MyModel # 自定义模型类 model = MyModel() dummy_input = torch.randn(1, 3, 224, 224) # 输入张量形状取决于实际需求 torch.onnx.export(model, dummy_input, "mymodel.onnx", verbose=True) ``` 同样地,也可以从 ONNX 导入回 PyTorch 中继续微调或测试用途。 #### Android 应用中的模型部署实例 针对移动端应用开发场景,比如安卓手机应用程序内的 AI 功能集成,可以选择轻量化推理引擎 NCNN 进行跨平台移植工作。此过程涉及 JNI 编程接口绑定 C++ 实现部分逻辑到 Java 层面交互[^3]。 最终完整的解决方案应该综合考虑到性能效率、资源消耗等因素权衡取舍最佳实践方案。 ---
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值