0
点赞
收藏
分享

微信扫一扫

pytorch移动端教程 Java调用libtorch

墨香子儿 2022-02-19 阅读 92


将模型转为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)`

实战部署过程可参考

​​


到此为止理论已经大致了解了

接下来将会实战

多个简单的转换模型

打磨移动端部署的过程

而后弄一些复杂的网络进行转换

打磨转换模型这里



举报

相关推荐

0 条评论