在 Android 上部署自定义 YOLOv8 教程

在本教程中,我将向您展示如何在 Android 设备上使用自定义数据集部署 YOLOv8。想要了解如何在 Android 设备上使用您自己的数据集部署 YOLOv8?本文将展示如何操作。

Android 上的 自定义 YOLOv8 🔥 ⚡️ 结果显示标题

对从 GoPro 流式传输到移动设备的运动镜头使用 YOLOv8 对象检测可以提供有关场景中对象的宝贵信息,包括位置和类型。这在捕捉远足路线的镜头时特别有用,有助于识别潜在的障碍物或危险以及感兴趣的物体。

YOLOv8🔥 参加雪地自行车比赛🚴❄️🌨🧊

在需要快速准确的物体检测的情况下,手机上的 YOLOv8 应用程序必不可少。 YOLOv8是一种基于深度学习的物体检测模型,可以快速准确地检测图像或视频中的物体,并且可以在移动设备上随时随地使用。

MotoGP 中的 YOLOv8🔥 🏍️🏰标题

为了在 Android 设备上部署带有自定义数据集的 YOLOv8,我们需要训练模型,将其转换为 TensorFlow Lite 或 ONNX 等格式,并将其包含在应用程序的资源文件夹中。然后,使用Android Studio创建项目、添加依赖、加载和解析模型、加载图像数据。执行模型推理,解析输出,并在图像上绘制边界框以显示检测到的对象。最后,在 Android 设备上安装并运行该应用程序。然而,优化移动设备的模型并解决压缩和加速等性能问题对于实际应用非常重要。

🔥第 0 步——理解 ncnn 的终极指南

ncnn是一款专为手机优化的开源高性能神经网络前向计算框架。从设计之初,ncnn就深入考虑了移动端的部署和使用,无第三方依赖,跨平台,且移动端的CPU速度比所有已知的开源框架都要快。基于此ncnn,开发者可以轻松地将深度学习算法移植到手机上高效执行,开发人工智能APP,让AI触手可及。

步骤 1 — 使用自定义数据集训练 YOLOv8
  • 克隆 Git 存储库并安装 YOLOv8
  • 使用预训练权重进行推理
  • 数据准备和格式转换
  • 运行训练过程
  • 将权重转换为 ONNX 格式
  • 将权重转换为 NCNN 格式

步骤2 — 在 Android Studio 上构建并运行

  • 下载 ncnn-android-yolov8
  • 下载ncnn
  • 下载 opencv-mobile
  • 使用 Android Studio 打开 ncnn-android-yolov8
  • 将 NCNN 格式权重放入文件夹中
  • 修改yolo.cpp

🔥第 1 步 —使用自定义数据集训练 YOLOv8

⭐克隆 Git 存储库并安装 YOLOv8

YOLOv8 发布了一个名为 的软件包ultralytics,可以使用下面提到的命令安装它。

$ mkdir yolov8
$ cd yolov8
$ git clone https://github.com/ultralytics/ultralytics
$ pip install -qe ultralytics
$ cd ultralytics
⭐使用预先训练的权重进行推理

要使用 YOLOv8 的预训练权重对所选视频或图像执行对象检测,可以在终端中执行下面提供的命令。

# image
$ yolo task=detect mode=predict model=yolov8m.pt source="XXX.png"# video
$ yolo task=detect mode=predict model=yolov8m.pt source="XXX.mp4"

如果执行成功,结果将保存在文件夹中YOLOv8/ultralytics/runs/detect/exp/

⭐数据​​准备和格式转换

访问 Kaggle 并下载微控制器检测数据集。

要创建一个名为 的文本文件chip.yaml并将其放置在文件夹中YOLOv8/ultralytics/,请使用以下命令并将所需的内容添加到该文件中。

train: ../datasets/images/train/
val:   ../datasets/images/test/
# number of classes
nc: 4
# class names
names: ['Arduino Nano', 'ESP8266', 'Raspberry Pi 3', 'Heltec ESP32 Lora']

训练期间的数据结构如下表所示。

将文件夹下的.xml移动Microcontroller Detection/images/train/到文件夹中Microcontroller Detection/images/train_xml/

将文件夹下的.xml移动Microcontroller Detection/images/test/到文件夹中Microcontroller Detection/images/test_xml/

将文件夹上传Microcontroller Detection/images/train/到文件夹中YOLOv8/datasets/images/

将文件夹上传Microcontroller Detection/images/test/到文件夹中YOLOv8/datasets/images/

要使用该数据集训练 YOLOv8 目标检测模型,需要将格式从 .xml 转换为 .txt。

$ cd ..
$ git clone  https://github.com/Isabek/XmlToTxt
$ cd XmlToTxt
$ pip install -r requirements.txt

YOLOv8/XmlToTxt/classes.txt根据您的自定义数据集进行修改。

Arduino_Nano 
ESP8266 
Raspberry_Pi_3 
Heltec_ESP32_Lora

将文件夹上传Microcontroller Detection/images/train_xml/到文件夹中YOLOv8/XmlToTxt/

将文件夹上传Microcontroller Detection/images/test_xml/到文件夹中YOLOv8/XmlToTxt/

要将文件从 .xml 格式转换为 .txt 格式,请在终端中运行以下命令。

# 记得将classes.txt中的文本更改为您自己的类别
# 将要转换的xml文件放入xml文件夹中
$ python xmltotxt.py -xml train_xml -out train 
$ python xmltotxt.py -xml test_xml -out test

将文件夹移动YOLOv8/XmlToTxt/train/YOLOv8/datasets/labels/.

将文件夹移动YOLOv8/XmlToTxt/test/YOLOv8/datasets/labels/.

⭐运行训练过程

现在一切都已设置完毕,是时候运行训练过程了。

$ yolo task=detect \mode=train \model=yolov8n.pt \data=./chip.yaml \epochs=30 \30 \imgsz=416

训练过程的持续时间可能会因硬件配置而异,可能需要几分钟甚至更长的时间。当训练过程运行时,输出日志将显示类似于以下内容的消息。

0/9        0G    0.1184    0.0347   0.03127        47       640:   4%|▎         | 3/85 [01:08<30:00, 21.95s/it]

完成训练过程后,生成的模型ultralytics/runs/train/exp/weights/best.pt现在可以进行预测了!

$ yolo task=detect \mode=predict \model=/runs/train/exp/weights/best.pt \conf=0.25 \source='XXX.jpg'
⭐将权重转换为 ONNX 格式

修改ultralytics/ultralytics/nn/modules.py如下内容。

class C2f(nn.Module):# CSP Bottleneck with 2 convolutionsdef __init__(self, c1, c2, n=1, shortcut=False, g=1, e=0.5):  # ch_in, ch_out, number, shortcut, groups, expansionsuper().__init__()self.c = int(c2 * e)  # hidden channelsself.cv1 = Conv(c1, 2 * self.c, 1, 1)self.cv2 = Conv((2 + n) * self.c, c2, 1)  # optional act=FReLU(c2)self.m = nn.ModuleList(Bottleneck(self.c, self.c, shortcut, g, k=((3, 3), (3, 3)), e=1.0) for _ in range(n))def forward(self, x):# y = list(self.cv1(x).split((self.c, self.c), 1))# y.extend(m(y[-1]) for m in self.m)# return self.cv2(torch.cat(y, 1))print("ook")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))
def forward(self, x):shape = x[0].shape  # BCHWfor i in range(self.nl):x[i] = torch.cat((self.cv2[i](x[i]), self.cv3[i](x[i])), 1)if self.training:return xelif 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 = shape# box, cls = torch.cat([xi.view(shape[0], self.no, -1) for xi in x], 2).split((self.reg_max * 4, self.nc), 1)# dbox = dist2bbox(self.dfl(box), self.anchors.unsqueeze(0), xywh=True, dim=1) * self.strides# y = torch.cat((dbox, cls.sigmoid()), 1)# return y if self.export else (y, x)print("ook")return torch.cat([xi.view(shape[0], self.no, -1) for xi in x], 2).permute(0, 2, 1)

以下命令用于将best.pt格式中的权重转换为 ONNX 格式,并将结果文件保存为best.onnx.

$yolo task=detect mode=export model=runs/detect/train4/weights/best.pt 
format=onnx simplify=True opset=13 imgsz=416

🔥第 2 步 — 在 Android Studio 上构建并运行

下载 ncnn-android-yolo v8

下载ncnn-android-yolov8到您的桌面

⭐下载ncnn

下载ncnn-YYYYMMDD-android-vulkan.zip

提取ncnn-YYYYMMDD-android-vulkan.zipapp/src/main/jni/

ncnn_DIR路径更改为您的路径app/src/main/jni/CMakeLists.txt

⭐下载opencv-mobile

下载opencv-mobile-XYZ-android.zip

提取opencv-mobile-XYZ-android.zipapp/src/main/jni/

更改OpenCV_DIR路径在app/src/main/jni/CMakeLists.txt

⭐使用Android Studio打开ncnn-android-yolov8

💡 如果构建过程中出现问题,应该是SDK Tools中NDK和CMake的兼容性问题。修改方法如下

👉ctrl +alt +s打开设置,安装21.3.6528147版本NDK

👉 安装3.10.2.4988404版本CMake

👉 添加CMake路径local.properties

Sync project with Gradle Files👉 按右上角的按钮。

⭐将 NCNN 格式权重放入文件夹中

放置best.binbest.param放入文件夹中app\src\main\assets\

⭐修改yolo.cpp

根据您的自定义数据集修改app\src\main\jni\yolo.cpp's 。num_class

根据您的自定义数据集修改app\src\main\jni\yolo.cpp's 。class_names

根据你的app\src\main\jni\yolo.cpp情况修改。layer_namebest.param

修改app\src\main\jni\yolo.cppweights name

按RUN按钮,程序执行成功!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/686044.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Sora时代,我们的AI应该何去何从?——关于Sora大模型的思考

Sora时代&#xff0c;我们的AI应该何去何从?——关于Sora大模型的思考 一、Sora大模型&#xff1a;横空出世&#xff0c;让AI生成所有领域瑟瑟发抖二、Sora的出现代表了相关行业的灭亡&#xff1f;三、我们将何去何从&#xff1f; 一、Sora大模型&#xff1a;横空出世&#xf…

1.8 NLP自然语言处理

NLP自然语言处理 更多内容&#xff0c;请关注&#xff1a; github&#xff1a;https://github.com/gotonote/Autopilot-Notes.git 一、简介 seq2seq(Sequence to Sequence)是一种输入不定长序列&#xff0c;产生不定长序列的模型&#xff0c;典型的处理任务是机器翻译&#…

前端常见的设计模式

说到设计模式&#xff0c;大家想到的就是六大原则&#xff0c;23种模式。这么多模式&#xff0c;并非都要记住&#xff0c;但作为前端开发&#xff0c;对于前端出现率高的设计模式还是有必要了解并掌握的&#xff0c;浅浅掌握9种模式后&#xff0c;整理了这份文章。 六大原则&…

Linux第一个小程序-进度条

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、回车和换行 二、行缓冲区概念 三、倒计时 四、进度条代码 版本一&#xff1a; ​编辑 版本二&#xff1a; 总结 前言 世上有两种耀眼的光芒&#xff0c;一…

第七篇【传奇开心果系列】Python微项目技术点案例示例:数据可视化界面图形化经典案例

传奇开心果微博系列 系列微博目录Python微项目技术点案例示例系列 微博目录一、微项目开发背景和项目目标&#xff1a;二、雏形示例代码三、扩展思路介绍四、数据输入示例代码五、数据分析示例代码六、排名统计示例代码七、数据导入导出示例代码八、主题定制示例代码九、数据过…

蓝桥杯第十四届电子类单片机组程序设计

目录 前言 蓝桥杯大赛历届真题&#xff08;点击查看&#xff09; 一、第十四届比赛题目 1.比赛原题 2.题目解读 1&#xff09;任务要求 2&#xff09;注意事项 二、任务实现 1.NE555读取时机的问题 1&#xff09;缩短计数时间 2&#xff09;实时读取 2.温度传感器读…

<网络安全>《35 网络攻防专业课<第一课 - 网络攻防准备>》

1 主要内容 认识黑客 认识端口 常见术语与命令 网络攻击流程 VMWare虚拟环境靶机搭建 2 认识黑客 2.1 白帽、灰帽和黑帽黑客 白帽黑客是指有能力破坏电脑安全但不具恶意目的黑客。 灰帽黑客是指对于伦理和法律态度不明的黑客。 黑帽黑客经常用于区别于一般&#xff08;正面…

问题:在额定电压500V以下的电路中,使用的各种用电设备,一般称为(_ _ _)用电设备 #媒体#媒体#媒体

问题&#xff1a;在额定电压500V以下的电路中,使用的各种用电设备,一般称为&#xff08;_ _ _)用电设备 参考答案如图所示

【dofile版本】实证研究Stata代码命令汇总

一、引言 在现代社会科学研究领域&#xff0c;Stata已成为欧美地区最受欢迎的计量分析软件之一。然而&#xff0c;许多研究人员在使用上仍显生疏 为了帮助研究人员更好地利用Stata&#xff0c;整理了一套Stata实证命令汇总&#xff0c;覆盖了从数据的初步处理到高级统计分析的…

Mysql第一关之常规用法

简介 介绍Mysql常规概念&#xff0c;用法。包括DDL、DCL、DML、DQL&#xff0c;关键字、分组、连表、函数、排序、分页等。 一、 SQL DCMQ&#xff0c;分别代表DDL、DCL、DML、DQL。 模糊简记为DCMQ&#xff0c;看起来像一个消息队列。 D&#xff1a;Definition 定义语句 M…

【Vue前端】vue使用笔记0基础到高手第2篇:Vue知识点介绍(附代码,已分享)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论vue相关知识。Vue.js是前端三大新框架&#xff1a;Angular.js、React.js、Vue.js之一&#xff0c;Vue.js目前的使用和关注程度在三大框架中稍微胜出&#xff0c;并且它的热度还在递增。Vue.js是一个轻巧、高性能、可组件…

[ai笔记7] google浏览器ai学习提效定制优化+常用插件推荐

欢迎来到文思源想的ai空间&#xff0c;这是技术老兵重学ai以及成长思考的第7篇分享&#xff01; 工欲善其事必先利其器&#xff0c;为了ai学习的效能提升&#xff0c;放假期间对google浏览器做了一次系统整改&#xff0c;添加了一些配置和插件&#xff0c;这里既有一些显示、主…

在Visual Studio中搭建Dynamo Python开发环境,效率飞一般的增长

最近在学习Dynamo中Python Script的用法&#xff0c;发现这个东西用起来太不友好了&#xff0c;不支持自动缩进&#xff0c;不支持自动填充和提示。用过Visual Studio做二开的都知道&#xff0c;在引用了Revit api以后&#xff0c;就可以自动填充和提示了。 本来英语就不好&am…

Netty中的内置通信模式、Bootstrap和ChannelInitializer

内置通信传输模式 NIO:io.netty.channel.socket.nio 使用java.nio.channels包作为基础–基于选择器的方式Epoll:io.netty.channel.epoll由JNI驱动的epoll()和非阻塞IO.这个传输支持只有在Linux上可用的多种特性&#xff0c;如果SO_REUSEPORT&#xff0c;比NIO传输更快&#xf…

代码随想录 Leetcode435. 无重叠区间

题目&#xff1a; 代码(首刷看解析 2024年2月17日&#xff09;&#xff1a; class Solution { private:const static bool cmp(vector<int>& a,vector<int>& b) {return a[0] < b[0];} public:int eraseOverlapIntervals(vector<vector<int>&…

MessageQueue --- RabbitMQ

MessageQueue --- RabbitMQ RabbitMQ IntroRabbitMQ 核心概念RabbitMQ 分发类型Dead letter (死信)保证消息的可靠传递 RabbitMQ Intro 2007年发布&#xff0c;是一个在AMQP&#xff08;高级消息队列协议&#xff09;基础上完成的&#xff0c;可复用的企业消息系统&#xff0c;…

java 宠物医院系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 java 宠物医院系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…

c语言遍历文件夹中的文件

文件目录如下&#xff0c;文件夹里还有一些txt文件未展示出来。 使用递归实现&#xff0c;深度优先遍历文件夹中的文件。 代码如下&#xff0c;用了一点C的语法。 #include <io.h> #include <iostream> using namespace std;#define MAX_PATH_LENGTH 100int Tr…

人工智能学习与实训笔记(四):神经网络之自然语言处理

目录 六、自然语言处理 6.1 词向量 (Word Embedding) 6.1.1 词向量的生成过程 6.1.2 word2vec介绍 6.1.3 word2vec&#xff1a;skip-gram算法的实现 6.2 句向量 - 情感分析 6.2.1 LSTM (Long Short-Term Memory)介绍 6.2.2 基于飞桨实现的情感分析模型 6.3 BERT 六、自…

unreal engine5.1中设置convex decomposition凸包分解

UE5系列文章目录 文章目录 UE5系列文章目录前言一、convex decomposition是什么&#xff1f;二、convex decomposition属性设置 前言 今天使用ue5根据网上教程制作可操控直升机&#xff0c;找属性convex decomposition凸包分解&#xff0c;默认的碰撞如下图 如果想使用精细化…