将模型转为libtorch模型之后
剩下的就是移动端是事情了
也就是使用java调用模型因为
libtorch 支持移动端且支持java调用
其实你使用java再电脑做做测试最好
但是不得不说libtorch 虽然支持java但是java教程却没有人看过没人用过
就从官方给的demo上学习一下
官方直接就给了个项目案例如下
首先克隆项目到电脑上
如果克隆慢请注册gitee
再git中fork这个项目
再使用gitee导入项目最后克隆即可
git clone https://github.com/pytorch/android-demo-app.git cd HelloWorldApp
这一步其实可以忽略,使用androidstudio 应该是自动配置的
./gradlew installDebug
重点就是改gradle dependencies

repositories {jcenter()
}dependencies {implementation 'org.pytorch:pytorch_android:1.4.0'implementation 'org.pytorch:pytorch_android_torchvision:1.4.0'
}

使用上面配置好的torch api 和 android的api读取图片
org.pytorch:pytorch_android_torchvision android.media.Image and android.graphics.Bitmap
在这个中org.pytorch.helloworld.MainActivity
使用这句话就能读取图片
Bitmap bitmap = BitmapFactory.decodeStream(getAssets().open("image.jpg"));
使用这句话Module module = Module.load(assetFilePath(this, "model.pt"));
就能加载模型并预处理归一化
Tensor inputTensor = TensorImageUtils.bitmapToFloat32Tensor(bitmap, TensorImageUtils.TORCHVISION_NORM_MEAN_RGB, TensorImageUtils.TORCHVISION_NORM_STD_RGB);
预测并得到结果 输出的是1000的数组 就是1000分类的概率
Tensor outputTensor = module.forward(IValue.from(inputTensor)).toTensor(); float[] scores = outputTensor.getDataAsFloatArray();
使用java得出那个概率最高(就是java中求数组最大值和最大值得索引)最后从类别名称列表中通过求出
最大值的索引得到这个图被识别为哪个类别
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];
java 调用pytorch模型其实就是上面这样(重点在于前面的转化和后面的显示对于一个算法工程师来说后面是硬伤
因为这个是Android工程师做的事情,我们这都会了就是人工智能工程师全站,记得要求会移动端部署的工作一定要高工资因为
你做的是两个人的工作)
接下来就是调用摄像头并获取图的代码了
再这个文件org.pytorch.demo.vision.AbstractCameraXActivity的代码中使用下面代码即可
调用摄像头
`
void setupCameraX() {
final PreviewConfig previewConfig = new PreviewConfig.Builder().build();
final Preview preview = new Preview(previewConfig);
preview.setOnPreviewOutputUpdateListener(output -> mTextureView.setSurfaceTexture(output.getSurfaceTexture()));

final ImageAnalysisConfig imageAnalysisConfig =new ImageAnalysisConfig.Builder().setTargetResolution(new Size(224, 224)).setCallbackHandler(mBackgroundHandler).setImageReaderMode(ImageAnalysis.ImageReaderMode.ACQUIRE_LATEST_IMAGE).build();
final ImageAnalysis imageAnalysis = new ImageAnalysis(imageAnalysisConfig);
imageAnalysis.setAnalyzer((image, rotationDegrees) -> {analyzeImage(image, rotationDegrees);});CameraX.bindToLifecycle(this, preview, imageAnalysis);

}

void analyzeImage(android.media.Image, int rotationDegrees)`

实战部署过程可参考
https://blog.csdn.net/y_dd6011/article/details/104751029
到此为止理论已经大致了解了
接下来将会实战
多个简单的转换模型
打磨移动端部署的过程

而后弄一些复杂的网络进行转换
打磨转换模型这里

pytorch移动端教程 Java调用libtorch相关推荐

  1. Jgit基础教程(Java调用git)

    前言 最近公司需要做一个java调用git的工具,这里简单的介绍了一下基本操作方法以及一些衍生的信息获取,或有不对的地方请大家批评指正.转载请注明出处. 一.Jgit依赖导入 <dependen ...

  2. java调用云小蜜示例教程(调用sdk版本)

    最近又用java写了云小蜜的调用教程,这里总结一下,首先maven依赖为: <!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-j ...

  3. java 调用笔记本摄像头拍照_教程:如何使用Java和C++在应用程序中实现面部识别

    全文共8470字,预计学习时长25分钟 来源:xaecong HOG:梯度方向直方图(histogram of orientedgradients)是一种图片描述符格式,它能够汇总图像(例如人脸)的主 ...

  4. Java调用Pytorch实现以图搜图(附源码)

    Java调用Pytorch实现以图搜图 设计技术栈: 1.ElasticSearch环境: 2.Python运行环境(如果事先没有pytorch模型时,可以用python脚本创建模型): 1.运行效果 ...

  5. Swig超详细入门教程(Java调用C/C++, CMake)——更新于2021.12

    目录 相关教程 环境配置 0基础上手例子(C/C++) 使用CMake的例子(C语言) 使用CMake的例子(C++) 本文主要是手把手教萌新们如何用官方用例构建(有许多本人亲身踩坑血泪史) 相关教程 ...

  6. android开发教程(3)— jni编程之采用SWIG从Java调用C/C++

    2019独角兽企业重金招聘Python工程师标准>>>                                            Android 从Java调用C/C++ ...

  7. 使用java调用C语言程序教程

    1.idea创建一个java类 严格来说,核心步骤并不是创建一个java类,而是创建一个方法,那个方法要被native修饰,这才是关键. 接着在TestNativeCode类当中声明我们的本地方法: ...

  8. [pytorch] 官网教程+注释

    pytorch官网教程+注释 Classifier import torch import torchvision import torchvision.transforms as transform ...

  9. java xfire webservice 异步_[Java教程]Java中使用webservice,简化开发(xfire的webservice)...

    [Java教程]Java中使用webservice,简化开发(xfire的webservice) 0 2016-01-07 15:00:11 首先,使用到的jar先导入项目中, xbean-sprin ...

最新文章

  1. 互联网大脑如何产生“梦境“并形成元宇宙
  2. python time智能等待_python中等待怎么表示
  3. SQLPLUS命令的使用大全
  4. C#操作sql通用类 SQLHelper
  5. Python实现HTTP服务器(四)单进程线程非阻塞实现多任务
  6. Oracle性能优化技巧
  7. 阅读SQL语言艺术实践一
  8. Android使用AsyncTask设置请求超时的注意事项
  9. sqlserver 分割多个文件_鸿萌易备:SQL Server 数据库的全方位备份解决方案
  10. 什么是黑盒测试,白盒测试,灰盒测试?
  11. php mac开启socket,mac上nginx以socket的方式连接php-fpm出现502错误?
  12. Mach-O文件, 架构包framework的合并和拆分
  13. Mysql必知必会概要总结
  14. 请打印出1988年到2019年的所有闰年年份
  15. FPN (特征金字塔) 的原理和代码
  16. PAN++ 端到端场景文本识别【识别部分精讲】
  17. Promise的使用方法
  18. 有道云笔记迁移到为知笔记
  19. 算法图解(一):算法简介
  20. 数学建模准备 插值(拉格朗日多项式插值,牛顿多项式插值,分段线性插值,分段三次样条插值,分段三次Hermite插值)

热门文章

  1. python中calendar怎么用_Python时间模块datetime、time、calendar的使用方法
  2. 吴恩达深度学习代码_吴恩达深度学习笔记(58)-深度学习框架Tensorflow
  3. Android 读取xml转json,将XML转换为Android中的JSON对象
  4. python高级开发面试题_python面试的100题(16)
  5. tomcat怎么平滑更新项目_SpringBoot内置tomcat启动原理
  6. 【 数字信号处理 】定点数的表示之定点数的字长问题
  7. eShopOnContainers 知多少[2]:Run起来
  8. SpringMVC 框架系列之初识与入门实例
  9. Sql 先进先出计算积分
  10. hexdump——Linux系统的二进制文件查看工具