热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python模型部署_pytorch模型部署到移动端(使用腾讯TNN)

记录分为pytorch2onnxonnx2tnntnn结果验证移动端(安卓)使用1、pytorch2onnx环境:pytorch1.4.0onnx1.6.0(转换)o

记录分为

pytorch2onnx

onnx2tnn

tnn结果验证

移动端(安卓)使用

1、pytorch2onnx

环境:

pytorch 1.4.0

onnx 1.6.0 (转换)

onnxruntime 1.3.0 (测试)

onnx-simplifier 0.2.9 (模型量化,不执行后续报错了,我测试是这样的)

转换代码:

import onnx

import torch

from test_net import TestModel

import numpy as np

import cv2

if 1:

torch_model = TestModel("model.pt")

torch_model.eval()

batch_size = 1 #批处理大小

input_shape = (3,384,384) #输入数据

# set the model to inference mode

# torch_model.eval()

x = torch.randn(batch_size,*input_shape)# 生成张量

export_onnx_file = "./model.onnx"# 目的ONNX文件名

torch.onnx.export(torch_model,

x,

export_onnx_file,

export_params=True,

opset_version=11,

do_constant_folding=True, # wether to execute constant folding for optimization

input_names = ['input'], # the model's input names

output_names = ['output'], # the model's output names

dynamic_axes={'input' : {0 : 'batch_size'}, # variable lenght axes

'output' : {0 : 'batch_size'}}

)

print ('get onnx ok!')

利用 onnxruntime 测试转换的模型:

import onnxruntime

import imageio

import time

(width, height) = (384,384)

cap = cv2.VideoCapture(0)

while 1:

ret,img = cap.read()

time_start = time.time()

if img is None:

print('no image input!')

break

if img.ndim == 2:

img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)

in_height ,in_width ,_ = img.shape

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) / 255.0

img_resized = cv2.resize(img, (width, height), interpolation=cv2.INTER_AREA)

img_resized = (

torch.from_numpy(np.transpose(img_resized, (2, 0, 1))).contiguous().float()

)

value = img_resized.unsqueeze(0)

def to_numpy(tensor):

return tensor.detach().cpu().numpy() if tensor.requires_grad else tensor.cpu().numpy()

ort_session = onnxruntime.InferenceSession("model.onnx")

ort_inputs = {ort_session.get_inputs()[0].name: (to_numpy(value)).astype(np.float32)}

#Actual: (N11onnxruntime17PrimitiveDataTypeIdEE) , expected: (N11onnxruntime17PrimitiveDataTypeIfEE)

#传入数据类型不对

ort_outs = ort_session.run(None, ort_inputs)

result = ort_outs[0][0, 0, :, :]

result = np.array(result)

print (result.shape)

reslut_resized = cv2.resize(

result, (in_width, in_height), interpolation=cv2.INTER_AREA

)

print('cost : %.3f (s)'%(time.time() - time_start))

cv2.namedWindow('re',2)

cv2.imshow('re',reslut_resized)

if cv2.waitKey(1) ==27:

break

cap.release()

cv2.destroyAllWindows()

模型简化操作:

python -m onnxsim model10.onnx model_sim.onnx --input-shape 1,3,384,384

2、onnx2tnn

下载tnn源码,https://github.com/Tencent/TNN ;进入

~/TNN-master/tools/onnx2tnn/onnx-converter 文件夹,运行 ./build 进行编译。

2.运行命令进行转换

python onnx2tnn.py model/model_sim.onnx -version=algo_version -optimize=1

0.----onnx version:1.6.0

结果为:

algo_optimize 1

onnx_net_opt_path /home/jiang/TNN-master/tools/onnx2tnn/onnx-converter/model/model_sim.opt.onnx

1.----onnx_optimizer: /home/jiang/TNN-master/tools/onnx2tnn/onnx-converter/model/model_sim.onnx

/home/jiang/TNN-master/tools/onnx2tnn/onnx-converter

----load onnx model: /home/jiang/TNN-master/tools/onnx2tnn/onnx-converter/model/model_sim.onnx

----onnxsim.simplify error: You'd better check the result with Netron

----onnxsim.simplify error:

----export optimized onnx model: /home/jiang/TNN-master/tools/onnx2tnn/onnx-converter/model/model_sim.opt.onnx

----export optimized onnx model done

2.----onnx2tnn: /home/jiang/TNN-master/tools/onnx2tnn/onnx-converter/model/model_sim.opt.onnx

get_node_attr_ai [Line 116] name :546

get_node_attr_ai [Line 116] name :585

get_node_attr_ai [Line 116] name :624

get_node_attr_ai [Line 116] name :663

get_node_attr_ai [Line 116] name :693

TNNLayerParam [Line 61] resize: coordinate_transformation_mode(pytorch_half_pixel) is not supported, result may be different.

3.----onnx2tnn status: 0

出现了错误----onnxsim.simplify error: You’d better check the result with Netron

----onnxsim.simplify error: 。

参数 algo_optimize=0即不进行优化就不保存转换成功。

778e302ef1b54417000fee7791ce7207.png

3、tnn结果验证

先要安装Android环境;

本文地址:https://blog.csdn.net/qq_32768679/article/details/107106390

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!



推荐阅读
  • 本文介绍了Python函数的定义与调用的方法,以及函数的作用,包括增强代码的可读性和重用性。文章详细解释了函数的定义与调用的语法和规则,以及函数的参数和返回值的用法。同时,还介绍了函数返回值的多种情况和多个值的返回方式。通过学习本文,读者可以更好地理解和使用Python函数,提高代码的可读性和重用性。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
author-avatar
如梦幻般的童心_900
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有