赞
踩
Pytorch是一种流行的深度学习框架,用于算法开发,而Android是一种广泛应用的操作系统,多应用于移动设备当中。目前多数的研究都是在于算法上,个人觉得把算法落地是一件很有意思的事情,因此本人准备分享一些模型落地的文章(后续可能分享微信小程序部署,PyQt部署以及exe打包,ncnn部署,tensorRT部署,MNN部署)。本篇文章主要分享Pytorch的Android端部署。
看这篇文章的读者,默认你具有以下的一些编程技能。
1. 熟悉Pytorch框架的使用
2. 熟悉计算机视觉模型的原理
3. 具有成熟的Java开发技术
4. 具有Python开发技术
5. 具有模型剪枝、量化,蒸馏技术(本文不介绍,通过这些技术可以对模型轻量化,便于部署)
5. 具有安卓应用开发技能
1. Android studio应用安装
下载开发工具,一直下一步就好了。
2. SDK和JDK安装
AndroidDevTools - Android开发工具 Android SDK下载 Android Studio下载 Gradle下载 SDK Tools下载
3. Android页面布局
3. 按键功能绑定逻辑代码(给出功能绑定代码的例子)
mButtonAlbum = (Button) findViewById(R.id.button_album); mButtonCamera = (Button) findViewById(R.id.button_camera); mButtonRealtime = (Button) findViewById(R.id.button_realtime); imageView = (ImageView) findViewById(R.id.imageView_logo2);
if (vId == R.id.button_album){ Toast.makeText(this,"打开相册",Toast.LENGTH_SHORT).show(); Intent chooseIntent = new Intent(Intent.ACTION_GET_CONTENT); chooseIntent.setType("image/*"); chooseIntent.addCategory(Intent.CATEGORY_OPENABLE); // startActivity(chooseIntent); startActivityForResult(chooseIntent, CODE_ALBUM); } else if (vId == R.id.button_camera) { Toast.makeText(this,"打开相机",Toast.LENGTH_SHORT).show(); Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 给拍摄的图片指定储存位置 String f = System.currentTimeMillis()+".jpg"; File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM),f); camerafileUri = FileProvider.getUriForFile(MainActivity.this, getPackageName()+".fileprovider",file); cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, camerafileUri); startActivityForResult(cameraIntent, CODE_CAMERA); }
4. 训练深度学习模型(用Pytorch框架训练的,代码是Yolov5的代码)
5. 模型转换(以yolo为例)
终端输入一下代码,将.pt模型转换为其它格式。
python export.py --weighrs runs/train/18_custom/weights/best.pt --include torchscript
执行上方代码得到best.torchscript模型。
使用torch.jit.script库将模型转化为best.torchscript.ptl模型
6.Android studio中导入pytorch依赖
implementation ("org.pytorch:pytorch_android_lite:1.9.0") implementation ("org.pytorch:pytorch_android_torchvision:1.9.0")
7.然后使用Java语言重写模型加载代码以及最大值抑制NMS和分类代码等(展示部分)
if (outputs[i* mOutputColumn +4]>mThreshold){ float x = outputs[i* mOutputColumn]; float y = outputs[i* mOutputColumn +1]; float w = outputs[i* mOutputColumn +2]; float h = outputs[i* mOutputColumn +3]; float left = imgScaleX * (x - w/2); float top = imgScaleY * (y-h/2); float right = imgScaleX * (x + w/2); float bottom = imgScaleY * (y + h/2); float max = outputs[i* mOutputColumn +5]; int cls = 0; for (int j=0; j<mOutputColumn-5;j++){ if (outputs[i* mOutputColumn +5+j] > max){ max = outputs[i * mOutputColumn +5+j]; cls = j; } } Rect rect = new Rect((int)(startX + ivScaleX*left),(int)(startY+top*ivScaleY), (int)(startX+ivScaleX*right), (int) (startY+ivScaleY*bottom)); Result result = new Result(cls, outputs[i * mOutputColumn+4], rect); results.add(result); }
8.接着完善检测等代码,最后将代码打包成APK就可以应用了(手机直接安装就可以用了,这里只展示拍照后识别的结果。实时检测、拍照、相册图像检测都实现了)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。