0 效果演示:
1具体部署方案
- ONNX:该模型格式可以在不同的平台所需的模型格式之间进行转化
- CoreML:该格式的模型可以部署到Apple上,那至少需要有苹果两件套(iphone和Mac),前者作为部署端,后者用于开发苹果应用程序
- TFLite:Google的轻量级推理库,这种TensorFLow Lite格式的模型文件可以部署到基于Android的移动端上,这也是最理想的一种方式
模型转换方法
方法一 yolov5官方的转换方法:
为PyTorch > ONNX > CoreML > TFLite,最后从原始训练得到的pt模型文件转化为mlmodel、onnx和torchscript.pt
方法二
直接转换,参考链接,同样是使用yolov5的export.py导出,不过更加清晰直观
此方法为
zldrobit在yolov5官方的issue提出,现在已内置到yolov5,参见方法一;
建议直接使用yolov5官方进行模型转换
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
#安装所需要的库
pip install -r requirements.txt # install
pip install tensorflow==2.4.0
#运行yolov5/models路径下的tf.py
python export.py --weights yolov5s.pt --include tflite --img 320
部署
Android Studio安装
安装教程(最新版,如果你是第一次安装,跟着这篇教程走),重装请务必卸载干净
卸载参考我的另外一篇文章
使用Android Studio打开前面用的zldrobit仓库中的Android文件夹
3 打开后Android Studio,自动下载需要的依赖,选择虚拟机机型(或直接使用手机开发者选项,打开USB调试)
标签文件.txt需根据自己的数据集标签进行制作,这里使用默认的coco数据集对应的txt文件
将这两个模型文件放到assets文件下
接下来用USB连接PC和Android手机,一般需要打开手机的开发者模式才能被Android Studio检测到。若成功检测到,则点击运行,app会下载到手机上,最终成功安装
Android Studio详细开发教程(java):yolov5 tflite量化原理及android部署详解
核心内容概括:
1 yolov5 tflite
(1)demo演示
(2)tflite量化原理
(3)tflite量化导出, 模型文件细节
3.2 Android部署(以摄像头检测为例)
(1)android部署整体流程
(2)相关依赖
(3)模型加载,输入与输出定义
(4)NNAPI代理,gpu代理,多线程加速
(5)tflite task和support的区别
(6)布局文件示例
(7)cameraX 摄像头数据细节
(8)摄像头逐帧分析器
(9)异步计算,避免UI刷新卡顿
3.3 替换自己的yolov5模型
(1)assert文件替换
- 导出自己的yolov5.tflite模型,建议用yolov5s,同时量化为fp16或者动态范围
- 定义自己的label.txt文件,每行为一个类名
- 将label.txt和yolov5.tflite放到assert目录下
(2)输入与输出修改
修改以下这4个地方(detetor/Yolov5TFLiteDetector.java):
1 修改input size和output size:
private final Size INPNUT_SIZE = new Size(320, 320); private final int[] OUTPUT_SIZE = new int[]{1, 6300, 85};
2 修改模型名/标签文件名:
private final String MODEL_YOLOV5S = "yolov5s-fp16-320-metadata.tflite"; private final String LABEL_FILE = "coco_label.txt";
3 如果模型是int8格式,则需要修改input/output的量化参数:
MetadataExtractor.QuantizationParams input5SINT8QuantParams = new MetadataExtractor.QuantizationParams(0.003921568859368563f, 0); MetadataExtractor.QuantizationParams output5SINT8QuantParams = new MetadataExtractor.QuantizationParams(0.006305381190031767f, 5);
4 如果模型是int8格式,还需要修改setModelFile()方法里面:
case "yolov5s": IS_INT8 = true;
总结:
如果模型是fp16或者动态量化的,只需要执行1,2步骤
如果模型是int8的,需要执行1,2,3,4步骤
参考链接:
1.在Android上运行YOLOv5目标检测
2.记录历经三天将自己的yolov5模型部署到Android安卓手机
3.YOLOv5学习记录(二): 模型转化及Android端部署
4.yolov5笔记(3)——移动端部署自己的模型(随5.0更新),个人认为是最值得参考的系列文章