Pytorch-Mobile-Android(2)
Android-Pytorch:QUICKSTART WITH A HELLOWORLD EXAMPLE(官网例1)
1.模型构成:
是一个resnet18模型(model.ptl),用来识别静态图片,图片和模型都存放在了assets目录下。
2.Gradle Dependencies:
上一篇文章说过,build.gradle是一个配置构建文件,其中dependencies可以理解为插件加载区:implementation是远程依赖声明,意味着如本地没有所提示的插件,那就将声明的插件从别地下载到本地。
3.开始阅读代码
首先,我们要保存模型存入asset文件夹,就需要以下代码。
需要说明的是:traced_script_module_optimized._save_for_lite_interpreter("app/src/main/assets/model.ptl")这里的地址只能写同目录下的地址,否则会报错file can not be openned。
import torch
import torchvision
from torch.utils.mobile_optimizer import optimize_for_mobilemodel = torchvision.models.mobilenet_v2(pretrained=True)
model.eval()
example = torch.rand(1, 3, 224, 224)
traced_script_module = torch.jit.trace(model, example)
traced_script_module_optimized = optimize_for_mobile(traced_script_module)
traced_script_module_optimized._save_for_lite_interpreter("app/src/main/assets/model.ptl")
这里对torch.jit.trace做一个说明:
【Pytorch部署】TorchScript - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/135911580
JIT = just in time compilation即时编译是一种程序优化,目的是:
TorchScript
动态图模型通过牺牲一些高级特性来换取易用性,那到底 JIT 有哪些特性,在什么情况下不得不用到 JIT 呢?下面主要通过介绍 TorchScript(PyTorch 的 JIT 实现)来分析 JIT 到底带来了哪些好处。
- 模型部署
PyTorch 的 1.0 版本发布的最核心的两个新特性就是 JIT 和 C++ API,这两个特性一起发布不是没有道理的,JIT 是 Python 和 C++ 的桥梁,我们可以使用 Python 训练模型,然后通过 JIT 将模型转为语言无关的模块,从而让 C++ 可以非常方便得调用,从此「使用 Python 训练模型,使用 C++ 将模型部署到生产环境」对 PyTorch 来说成为了一件很容易的事。而因为使用了 C++,我们现在几乎可以把 PyTorch 模型部署到任意平台和设备上:树莓派、iOS、Android 等等…
2. 性能提升
既然是为部署生产所提供的特性,那免不了在性能上面做了极大的优化,如果推断的场景对性能要求高,则可以考虑将模型(torch.nn.Module)转换为 TorchScript Module,再进行推断。
3. 模型可视化
TensorFlow 或 Keras 对模型可视化工具(TensorBoard等)非常友好,因为本身就是静态图的编程模型,在模型定义好后整个模型的结构和正向逻辑就已经清楚了;但 PyTorch 本身是不支持的,所以 PyTorch 模型在可视化上一直表现得不好,但 JIT 改善了这一情况。现在可以使用 JIT 的 trace 功能来得到 PyTorch 模型针对某一输入的正向逻辑,通过正向逻辑可以得到模型大致的结构,但如果在 `forward` 方法中有很多条件控制语句,这依然不是一个好的方法,所以 PyTorch JIT 还提供了 Scripting 的方式,这两种方式在下文中将详细介绍。
记住,Android的所有逻辑都是从MainActivity开始的,我们不需要弄懂所有代码,AS只是一个工具,我们也不需要学会每行代码的语法结构,大概看懂代码,学会修改参数就可以了。
将jpg图片转为位图:
Bitmap bitmap = BitmapFactory.decodeStream(getAssets().open("image.jpg"));
加载模型:
Module module = Module.load(assetFilePath(this, "model.ptl"));
准备输入:还记得我们在build.gradle下加载的库函数(插件)org.pytorch:pytorch_android_torchvision吗?org.pytorch.torchvision.TensorImageUtils是它的子库。
ensorImageUtils.bitmapToFloat32Tensor可以把安卓的位图,转化为torchvision可以接受的tensor形式。
tips:不知道大家是否还记得归一化,例如
将数据限定在[0,1]内。
所有的预训练模型都要求图像的归一化是统一的,举个例子:
对于RGB三通道的图片(3 * H * W),H,W分别是位图的高和宽,对所有图片归一化,
mean = [0.485, 0.456, 0.406]
andstd(标准差) = [0.229, 0.224, 0.225] 需一致。
Tensor inputTensor = TensorImageUtils.bitmapToFloat32Tensor(bitmap,TensorImageUtils.TORCHVISION_NORM_MEAN_RGB, TensorImageUtils.TORCHVISION_NORM_STD_RGB);
调用forward方法,并得到结果
org.pytorch.Module.forward
method runs loaded module’sforward
method and gets result asorg.pytorch.Tensor
outputTensor with shape1x1000
. 返回的是一个java数组
Tensor outputTensor = module.forward(IValue.from(inputTensor)).toTensor();
float[] scores = outputTensor.getDataAsFloatArray();
找对应结果
根据数组内的最大数值去ImageNet里去找对应的预测出的类别。
也就是从ImageNetClasses.IMAGENET_CLASSES[index]去找对应的类别
float maxScore = -Float.MAX_VALUE;
int maxScoreIdx = -1;
for (int i = 0; i < scores.length; i++) {if (scores[i] > maxScore) {maxScore = scores[i];maxScoreIdx = i;}
}
String className = ImageNetClasses.IMAGENET_CLASSES[maxScoreIdx];
4.所用安卓类总结
5.所用pytorch类总结
6.CNN模型部署pytorch mobile总结:
import torch
import torchvision
from torch.utils.mobile_optimizer import optimize_for_mobilemodel = torchvision.models.mobilenet_v2(pretrained=True)
model.eval()
example = torch.rand(1, 3, 224, 224)
traced_script_module = torch.jit.trace(model, example)
traced_script_module_optimized = optimize_for_mobile(traced_script_module)
traced_script_module_optimized._save_for_lite_interpreter("app/src/main/assets/model.ptl")
将上述代码中的torchvision.models.模型一换,再存入assets里面即可
Pytorch-Mobile-Android(2)相关推荐
- PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call
您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...
- PyTorch框架:(4)如何去构建数据
接PyTorch框架:(3) 1.最基本的方法 (1)使用模块 模块1:TensorDataset.模块2:DataLoader 自己去构造数据集,然后一个batch一个batch的取数据,自己去写构 ...
- [Android]使用Kotlin开发Android(二)
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4829007.html [TOC] 使用Kotlin+OkHtt ...
- 目标检测-基于Pytorch实现Yolov3(1)- 搭建模型
原文地址:https://www.cnblogs.com/jacklu/p/9853599.html 本人前段时间在T厂做了目标检测的项目,对一些目标检测框架也有了一定理解.其中Yolov3速度非常快 ...
- pytorch学习笔记(二):gradien
pytorch学习笔记(二):gradient 2017年01月21日 11:15:45 阅读数:17030
- Android(Xamarin)之旅(三)
Android(Xamarin)之旅(三) 原文:Android(Xamarin)之旅(三) 前面两篇说到了Xamarin的安装和一些简单的控件,今天来说说一些对话框和提示信息,以及简单的布局元素. ...
- pytorch:一维线性回归(二)
首先,这是对上一篇文章(pytorch:一维线性回归(一))的改进. 其次,为什么想要改进上一篇文章嘞? 答案:我使用这个写好的模型后,想着既然参数已经训练出来了,那么预测的时候,就只需要直接根据参数 ...
- 编写高效的PyTorch代码技巧(下)
点击上方"算法猿的成长",关注公众号,选择加"星标"或"置顶" 总第 133 篇文章,本文大约 3000 字,阅读大约需要 15 分钟 原文 ...
- PyTorch学习笔记(七):PyTorch可视化
PyTorch可视化 往期学习资料推荐: 1.Pytorch实战笔记_GoAI的博客-CSDN博客 2.Pytorch入门教程_GoAI的博客-CSDN博客 本系列目录: PyTorch学习笔记(一) ...
- PyTorch学习笔记(六):PyTorch进阶训练技巧
PyTorch实战:PyTorch进阶训练技巧 往期学习资料推荐: 1.Pytorch实战笔记_GoAI的博客-CSDN博客 2.Pytorch入门教程_GoAI的博客-CSDN博客 本系列目录: P ...
最新文章
- 四种软件架构演进史,会一种就很牛逼了!
- SAP RETAIL 使用事务代码MM41创建商品主数据时不能激活检验类型?
- 大牛激辩:AI 该像婴儿一样生来就懂事,还是该从零学习?
- hibernate动态表名映射
- SQLServer服务的运行与登录
- 二、 elasticsearch安装和概念
- linux基础-0.0绝对路径与相对路径
- LiveVideoStack线上交流分享 ( 六 ) —— VP9 Scalable Video Coding
- 在Outlook 2010中使用对话视图
- bzoj 1996: [Hnoi2010]chorus 合唱队
- C++拾遗(四)——顺序容器
- Ververica Platform-阿里巴巴全新Flink企业版揭秘
- C++/C--字符串分割函数 --strtok()
- thrift的lua实现
- [编织消息框架][优化系统]突破连接上限(上)
- php跳转post,php如何使用post跳转页面
- Linux基础入门(详细版)
- 计算机无法打开浏览器,Internet选项打不开怎么办?IE浏览器internet选项无法打开解决方法...
- 华为荣耀畅享7的计算机在哪,华为畅享7有什么新功能_华为畅享7有哪些新功能-太平洋IT百科...
- python打开是什么颜色-Python中常见颜色记录
热门文章
- 计算机教室用什么踢脚,踢脚
- plupload断点续传 php,Plupload 文件断点续传,文件分块上传
- 前端相关知识(html)
- 跨越可观测性鸿沟|高手们都在用的“火焰图”是什么
- python+selenium 安装 xlrd 报错解决xlrd.biffh.XLRDError: Excel xlsx file; not supported
- 作为Java开发人员不会饿死的5个理由
- Servlet Jsp | 3:在idea下开发MVC项目
- 一个程序员半年工作小结
- 带孩子们做环球旅行的读后感_孩子做了错事要批评指正,不可宠溺,家长们教育孩子你做对了吗...
- 中国人工智能研究领域开拓者刘叙华教授逝世,享年84岁