admin 管理员组

文章数量: 1184232

### YOLOv8 在安卓手机上的部署

YOLO(You Only Look Once)是一种非常流行的实时对象检测算法,以其快速且准确的特性而闻名。随着模型版本的不断迭代,YOLOv8带来了更优秀的性能表现。本项目旨在将轻量级版本YOLOv8s通过QT和NCNN框架部署到小米手机上运行,实现高效的移动设备端物体识别功能。

在这里插入图片描述

1. 模型转换与优化

模型修改

在将YOLOv8s模型转换为适用于移动端格式之前,需要对原始模型进行一些调整以确保其兼容性。具体来说,主要涉及到以下两个方面的修改:

  • C2F Block中的Split改为Slice:这一步骤主要是为了更好地适应某些特定硬件平台的要求,虽然对于大多数情况而言并不是必须的操作。

  • 移除Detect Head:原始的YOLOv8s模型包含了一个复杂的检测头部结构,直接转换可能会导致生成的ONNX文件在后续处理中遇到问题。因此,在转换过程中会先去掉这部分逻辑,并计划后续在NCNN内通过自定义层来重新实现类似的功能。

在这里插入图片描述

转ONNX格式

使用export.py脚本或参考提供的指南将修改后的PyTorch模型导出为ONNX格式。此步骤非常重要,因为它是连接深度学习训练环境与移动端推理引擎之间的桥梁。

转换至NCNN

接下来,利用onnx2ncnn工具将得到的ONNX文件进一步转换成适合于NCNN使用的.param和.bin文件。命令如下:



onnx2ncnn yolov8s.onnx yolov8s.param yolov8s.bin

FP16模式优化

为了提高模型在移动设备上的执行效率同时减少内存占用,可以采用半精度浮点数(FP16)表示法。使用ncnnoptimize命令行工具来进行这项操作:



ncnnoptimize.exe yolov8s.param yolov8s.bin yolov8s_opt.param yolov8s_opt.bin 65536

这里设置的最大批处理大小为65536,根据实际情况可适当调整该值。

代码



#include "widget.h" #include "yolo.h" #include <QApplication> #include <QFile> Yolo *yolov8 = new Yolo(); int main(int argc, char *argv[]) { QApplication a(argc, argv); // 加载QSS QFile qss_(":/assets/ManjaroMix.qss"); if( qss_.open(QFile::ReadOnly)){ qDebug("open success"); QString style = QLatin1String(qss_.readAll()); a.setStyleSheet(style); qss_.close(); } else{ qDebug("Open failed"); } int target_size = 640; float norm_vals[3] = { 1 / 255.f, 1 / 255.f, 1 / 255.f }; float mean_vals[3] = { 103.53f, 116.28f, 123.675f }; yolov8->load(target_size, mean_vals,norm_vals); Widget w; w.show(); return a.exec(); }

2. 基于QT的NCNN安卓程序编译

环境准备

首先确保你的开发环境中已经安装了最新版的Qt Creator、Android SDK以及NDK。此外还需要从官网下载并配置好NCNN库,以便能够顺利地在Android平台上构建相关代码。

项目结构

在这里插入图片描述

一个典型的基于QT+NCNN的Android项目通常包括以下几个关键部分:

  • main.cpp - 程序入口点。

  • androidmanifest.xml - 定义应用权限及组件信息。

  • *.pro - Qt项目的配置文件,用于指定源文件路径、链接库等。

  • *.qml 或者 *.ui - UI设计界面描述文件。

  • NCNN相关的头文件及预编译库。

添加依赖项

在Qt项目的.pro文件中加入必要的NCNN库引用,比如:



INCLUDEPATH += /path/to/ncnn/include LIBS += -L/path/to/ncnn/build/lib -lncnn

编写核心逻辑

实现YOLOv8s模型加载、前向计算等功能的核心代码应该放在单独的一个类里,例如YoloV8Detector。这个类需要提供构造函数初始化模型参数、输入图像预处理方法以及实际的推理过程等成员函数。

图像处理与展示

利用Qt Multimedia模块读取摄像头流或者本地图片作为输入数据源,然后调用上述定义好的YoloV8Detector实例完成目标检测任务。最后,将带有标注框的结果显示在UI界面上供用户查看。

打包发布

当所有功能都开发完毕并通过测试后,就可以通过Qt Creator内置的支持创建APK安装包了。只需点击“Build”菜单下的“Build APK”选项即可自动完成整个流程。记得在此之前检查是否有遗漏任何必需的权限声明或其他配置项。

在这里插入图片描述

结语

本文详细介绍了如何将最新的YOLOv8s模型移植到Android手机上运行的方法。通过合理地选择合适的工具链和技术栈,即使是在资源受限的移动设备上也能享受到高性能的计算机视觉服务。希望这份指南能帮助开发者们快速入门这一领域,并激发更多创新性的应用场景探索。

本文标签: 代码 教程 QT ncnn