将模型转为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)`
实战部署过程可参考
到此为止理论已经大致了解了
接下来将会实战
多个简单的转换模型
打磨移动端部署的过程
而后弄一些复杂的网络进行转换
打磨转换模型这里