随着移动设备计算能力的提升,越来越多的深度学习模型被部署到移动端,以实现实时、低延迟的应用场景。YOLO
系列的在目标检测任务中表现出色,具有精度高、速度快的优势。本文将详细介绍如何基于NCNN
框架 ,在Android
平台 上高效部署YOLOv8
目标检测模型,并结合OpenCV
和Vulkan
加速实现高性能推理。
效果展示:
1. 准备工作
步骤一:
下载YOLOv8
源码进行训练模型,环境配置以及训练方法在此不做赘述,可以参考主页-Ultralytics YOLOv8文档进行。
项目下载地址:YOLOv8-github
官方快速入门:YOLOv8-文档
步骤二:
安装 Android Studio (https://developer.android.google.cn/),非本文重点,不做赘述。
步骤三
:准备项目:①下载 ncnn-android-yolov8,官方地址:https://github.com/FeiGeChuanShu/ncnn-android-yolov8
② 下载 opencv-mobile: https://github.com/nihui/opencv-mobile/releases 和 ncnn-android-vulkan: https://github.com/Tencent/ncnn/releases
将上面下载好的两个压缩包解压后放入该位置:ncnn-android-yolov8\app\src\main\jni\
下
2. 模型转化
2.1 修改源码
经过训练模型之后,默认得到的文件格式为.pt后缀文件,通过模型导出Ultralytics YOLO文档可以得知训练后可以导出多种不同模型文件。但是,值得注意的是
:在转换前需要对项目源码作出一些修改,待修改的内容在ncnn-android-yolov8-main/doc/ 中有显示,如使用检测任务则修改 c2f.jpg和Detect.jpg两张图片上的内容。即把ultralytics项目中的下列函数修改:
-
ultralytics/ultralytics/nn/modules/head.py
:注释Detect类下forward方法内所有内容并添加代码shape = x[0].shape # BCHW for i in range(self.nl):x[i] = torch.cat((self.cv2[i](x[i]), self.cv3[i](x[i])), 1) if self.training: # Training pathreturn x elif self.dynamic or self.shape != shape:self.anchors, self.strides = (x.transpose(0, 1) for x in make_anchors(x, self.stride, 0.5))self.shape = shapepred = torch.cat([xi.view(shape[0], self.no, -1) for xi in x], 2).permute(0, 2, 1) return pred
-
ultralytics/ultralytics/nn/modules/block.py
:注释C2f类下forward方法内所有内容并添加代码x = self.cv1(x) x = [x, x[:, self.c:, ...]] x.extend(m(x[-1]) for m in self.m) x.pop(1) return self.cv2(torch.cat(x, 1))
注:恢复原代码即可重新训练!!
2.2 pt转onnx
新建文件pt_to_onnx.py
,填入自己的模型路径运行:
# 将模型导出为ONNX 格式
from ultralytics import YOLOmodel = YOLO(r"模型路径")
success = model.export(format="onnx", imgsz=320, half=True, opset=12)
点击网址 https://netron.app,导入onnx
模型:可以看到输入名称和输出名称:
输入名称images
,输出名称output0
2.3 onnx转ncnn
-
安装Visual Studio
-
下载并解压ncnn-YYYYMMDD-windows-vsXXXX.zip(vs后的数字应当要与本地Visual Studio版本保持一致。):https://github.com/Tencent/ncnn/releases
-
打开文件夹 \ncnn-20250503-windows-vs2022\x64\bin,可以看到应用程序onnx2ncnn.exe:
-
进入该文件夹(cmd):
-
输入(将yolov8n换成自己的模型路径名)并运行
onnx2ncnn E:\OCR_Project\yolov8n.onnx yolov8n.param yolov8n.bin
可以看到 \ncnn-20250503-windows-vs2022\x64\bin 文件夹下多出来两个文件,
2.4 修改项目代码
将转换后的模型文件粘贴至\ncnn-android-yolov8-main\ncnn-android-yolov8\app\src\main\assets
用Android studio打开\ncnn-android-yolov8-main\ncnn-android-yolov8
-
修改
\ncnn-android-yolov8\app\src\main\jni\yolo.cpp
:函数修改static const char* class_names[] 为模型的预测类别int Yolo::draw(cv::Mat& rgb, const std::vector<Object>& objects) {static const char* class_names[] = {"person", "bicycle", "car", "motorcycle", "airplane", "bus", "train", "truck", "boat", "traffic light","fire hydrant", "stop sign", "parking meter", "bench", "bird", "cat", "dog", "horse", "sheep", "cow","elephant", "bear", "zebra", "giraffe", "backpack", "umbrella", "handbag", "tie", "suitcase", "frisbee","skis", "snowboard", "sports ball", "kite", "baseball bat", "baseball glove", "skateboard", "surfboard","tennis racket", "bottle", "wine glass", "cup", "fork", "knife", "spoon", "bowl", "banana", "apple","sandwich", "orange", "broccoli", "carrot", "hot dog", "pizza", "donut", "cake", "chair", "couch","potted plant", "bed", "dining table", "toilet", "tv", "laptop", "mouse", "remote", "keyboard", "cell phone","microwave", "oven", "toaster", "sink", "refrigerator", "book", "clock", "vase", "scissors", "teddy bear","hair drier", "toothbrush"};
-
修改 ex.input(“images”, in_pad); 和 ex.extract(“output”, out); 为模型输入输出名
-
修改const int num_class为模型分类数量
-
修改文件夹内模型匹配格式:
-
修改
\ncnn-android-yolov8\app\src\main\jni\yolov8ncnn.cpp
:修改const char* modeltypes[] 为模型名。 -
修改 const int target_sizes[]、const float mean_vals[][3]、const float norm_vals[][3] 代码行数匹配文件夹内模型数量
-
修改
\ncnn-android-yolov8\app\src\main\res\values\strings.xml
注:此修改仅调整下拉菜单中的选项显示名称,实际选项匹配由索引值完成,与名称无关。
2.5 编译运行
3. 画面清晰度
修改\ncnn-android-yolov8\app\src\main\jni\ndkcamera.cpp
:AImageReader_new方法
4. 默认摄像头
修改\ncnn-android-yolov8\app\src\main\java\com\tencent\yolov8ncnn\MainActivity.java
: private int facing(0:前置,1:后置)
修改 cnn-android-yolov8/app/src/main/res/layout/main.xml
文件即可调整APP
界面布局,通过拖拽操作即可完成。
5. 总结展望
本文详细介绍了如何基于NCNN框架 在Android平台 上部署YOLOv8目标检测模型 的完整流程。从环境配置、模型转换、项目搭建到最终的调试运行,每一步都提供了清晰的操作指引和代码示例,帮助开发者快速实现YOLOv8在移动端的落地应用。
亮点总结:
- 使用NCNN框架实现高效的模型推理,兼容性强且性能优越;
- 通过OpenCV-Mobile提升图像预处理效率;
- 支持自定义训练模型的无缝替换,灵活应用于不同场景;
- 实现了YOLOv8在移动端的实时视频检测功能,满足工业级需求。
展望:
未来可进一步优化模型量化策略(如FP16/INT8),提升推理速度;同时结合Vulkan异构计算能力,进一步挖掘移动端GPU的潜力,实现更高帧率的目标检测体验。