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 到底带来了哪些好处。

  1. 模型部署

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] and std(标准差) = [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’s forward method and gets result as org.pytorch.Tensor outputTensor with shape 1x1000. 返回的是一个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)相关推荐

  1. PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call

    您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...

  2. PyTorch框架:(4)如何去构建数据

    接PyTorch框架:(3) 1.最基本的方法 (1)使用模块 模块1:TensorDataset.模块2:DataLoader 自己去构造数据集,然后一个batch一个batch的取数据,自己去写构 ...

  3. [Android]使用Kotlin开发Android(二)

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4829007.html [TOC] 使用Kotlin+OkHtt ...

  4. 目标检测-基于Pytorch实现Yolov3(1)- 搭建模型

    原文地址:https://www.cnblogs.com/jacklu/p/9853599.html 本人前段时间在T厂做了目标检测的项目,对一些目标检测框架也有了一定理解.其中Yolov3速度非常快 ...

  5. pytorch学习笔记(二):gradien

    pytorch学习笔记(二):gradient 2017年01月21日 11:15:45 阅读数:17030

  6. Android(Xamarin)之旅(三)

    Android(Xamarin)之旅(三) 原文:Android(Xamarin)之旅(三) 前面两篇说到了Xamarin的安装和一些简单的控件,今天来说说一些对话框和提示信息,以及简单的布局元素. ...

  7. pytorch:一维线性回归(二)

    首先,这是对上一篇文章(pytorch:一维线性回归(一))的改进. 其次,为什么想要改进上一篇文章嘞? 答案:我使用这个写好的模型后,想着既然参数已经训练出来了,那么预测的时候,就只需要直接根据参数 ...

  8. 编写高效的PyTorch代码技巧(下)

    点击上方"算法猿的成长",关注公众号,选择加"星标"或"置顶" 总第 133 篇文章,本文大约 3000 字,阅读大约需要 15 分钟 原文 ...

  9. PyTorch学习笔记(七):PyTorch可视化

    PyTorch可视化 往期学习资料推荐: 1.Pytorch实战笔记_GoAI的博客-CSDN博客 2.Pytorch入门教程_GoAI的博客-CSDN博客 本系列目录: PyTorch学习笔记(一) ...

  10. PyTorch学习笔记(六):PyTorch进阶训练技巧

    PyTorch实战:PyTorch进阶训练技巧 往期学习资料推荐: 1.Pytorch实战笔记_GoAI的博客-CSDN博客 2.Pytorch入门教程_GoAI的博客-CSDN博客 本系列目录: P ...

最新文章

  1. 四种软件架构演进史,会一种就很牛逼了!
  2. SAP RETAIL 使用事务代码MM41创建商品主数据时不能激活检验类型?
  3. 大牛激辩:AI 该像婴儿一样生来就懂事,还是该从零学习?
  4. hibernate动态表名映射
  5. SQLServer服务的运行与登录
  6. 二、 elasticsearch安装和概念
  7. linux基础-0.0绝对路径与相对路径
  8. LiveVideoStack线上交流分享 ( 六 ) —— VP9 Scalable Video Coding
  9. 在Outlook 2010中使用对话视图
  10. bzoj 1996: [Hnoi2010]chorus 合唱队
  11. C++拾遗(四)——顺序容器
  12. Ververica Platform-阿里巴巴全新Flink企业版揭秘
  13. C++/C--字符串分割函数 --strtok()
  14. thrift的lua实现
  15. [编织消息框架][优化系统]突破连接上限(上)
  16. php跳转post,php如何使用post跳转页面
  17. Linux基础入门(详细版)
  18. 计算机无法打开浏览器,Internet选项打不开怎么办?IE浏览器internet选项无法打开解决方法...
  19. 华为荣耀畅享7的计算机在哪,华为畅享7有什么新功能_华为畅享7有哪些新功能-太平洋IT百科...
  20. python打开是什么颜色-Python中常见颜色记录

热门文章

  1. 计算机教室用什么踢脚,踢脚
  2. plupload断点续传 php,Plupload 文件断点续传,文件分块上传
  3. 前端相关知识(html)
  4. 跨越可观测性鸿沟|高手们都在用的“火焰图”是什么
  5. python+selenium 安装 xlrd 报错解决xlrd.biffh.XLRDError: Excel xlsx file; not supported
  6. 作为Java开发人员不会饿死的5个理由
  7. Servlet Jsp | 3:在idea下开发MVC项目
  8. 一个程序员半年工作小结
  9. 带孩子们做环球旅行的读后感_孩子做了错事要批评指正,不可宠溺,家长们教育孩子你做对了吗...
  10. 中国人工智能研究领域开拓者刘叙华教授逝世,享年84岁