如何在Java中集成YOLOv5的last.pt模型开发安卓APK实现目标检测
YOLOv5自定义last.pt模型Java+安卓端目标检测实现方案
前置准备
- 原生PyTorch格式的
last.pt无法直接在Java/安卓端运行,需要先做模型格式转换,安卓端推荐优先转NCNN格式,推理性能优于ONNX、TFLite等其他格式 - 工具准备:Python环境(用于模型格式转换)、Android Studio(安卓APK开发IDE)、NCNN模型转换工具
第一步:模型格式转换
- 导出ONNX中间格式
在你训练YOLOv5的项目根目录下,执行官方自带的导出脚本:python export.py --weights last.pt --include onnx --img 640 --batch 1
执行完成后会得到last.onnx文件,其中--img参数和你训练时的输入尺寸保持一致即可。 - ONNX转NCNN格式
使用NCNN官方提供的onnx2ncnn工具执行转换:onnx2ncnn last.onnx last.param last.bin
转换完成后得到NCNN推理需要的两个文件:.param是模型结构文件,.bin是模型权重文件,你可以再用ncnnoptimize工具对模型进行裁剪优化,减小模型体积适配移动端。
第二步:安卓端Java代码实现示例
依赖引入
直接在安卓项目的模块级build.gradle文件中添加NCNN的预编译依赖即可,无需手动编译源码。
核心代码实现
先把转换得到的last.param和last.bin文件放到安卓项目的assets资源目录下,之后编写推理逻辑:
import com.tencent.ncnn.YoloV5Ncnn; import android.graphics.Bitmap; import java.util.List; public class YoloDetector { private YoloV5Ncnn yoloV5Ncnn; // 初始化模型 public boolean initModel(android.content.AssetManager assetManager) { yoloV5Ncnn = new YoloV5Ncnn(); // 第三个参数设置是否开启GPU加速,可根据需求调整 return yoloV5Ncnn.Init(assetManager, "last.param", "last.bin", false); } // 执行目标检测 public List<YoloV5Ncnn.Obj> detect(Bitmap inputBitmap, float confThreshold) { if (yoloV5Ncnn == null) return null; return yoloV5Ncnn.Detect(inputBitmap, confThreshold); } // 释放模型资源 public void release() { if (yoloV5Ncnn != null) { yoloV5Ncnn.Destroy(); } } }
检测结果处理
你可以直接遍历返回的结果集合获取检测信息:
obj.label:检测类别ID,和你训练时的标签顺序一一对应obj.prob:检测置信度,范围0-1obj.rect:检测框坐标,包含left/top/right/bottom四个值,对应检测框的左上角和右下角坐标
你可以在画布上自行绘制检测框和类别标签,完成可视化输出。
自有训练模型适配注意事项
- 模型转换和训练使用的YOLOv5版本必须一致,避免版本差异导致的结构不兼容问题
- 如果你的训练配置修改了类别数、锚框尺寸、输入尺寸,需要同步修改推理端的对应配置,否则会出现检测结果完全错误的问题
- 实时检测场景可以开启GPU加速,中高端安卓机的推理速度可以提升2-3倍,满足实时性要求
- 安卓端运行需要提前申请相机、存储读取权限,否则无法加载图片或者调用摄像头做实时检测
内容的提问来源于stack exchange,提问作者TAIFOUR TAOUTAOU
相关产品推荐
相关产品推荐

