在 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 convolutions
    def __init__(self, c1, c2, n=1, shortcut=False, g=1, e=0.5):  # ch_in, ch_out, number, shortcut, groups, expansion
        super().__init__()
        self.c = int(c2 * e)  # hidden channels
        self.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  # 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:
            return 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 = 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按钮,程序执行成功!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【刷刷刷,爽!】leetcode198. 打家劫舍

题目如上&#xff01; 这是一道非常非常标准的初级动规题。属于走楼梯的进阶版。所以我们尝试把他变成走楼梯。 怎么变&#xff1f;或者说是怎么看成走楼梯。 答案是&#xff01;&#xff01;&#xff01;&#xff01; 看最后一个数。 往往会最有灵感。 比如示例1中[1,2,3,4]&a…

免费申请一个美国EDU学生邮箱

EDU邮箱的作用 例如大名鼎鼎的GitHub学生包。包含各种服务器的优惠卷&#xff0c;可以让你免费使用1-2年的服务器。免费的域名。免费的网站证书。太多了。 微软&#xff1a;免费的5T的OneDrive账户。 Google&#xff1a;G Sutie Drive无限容量 微软、苹果、AWS、都有针对学…

Sora和Pika,RunwayMl,Stable Video对比!网友:Sora真王者,其他都是弟

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

SpringCloud-Nacos集群搭建

本文详细介绍了如何在SpringCloud环境中搭建Nacos集群&#xff0c;为读者提供了一份清晰而详尽的指南。通过逐步演示每个关键步骤&#xff0c;包括安装、配置以及Nginx的负载均衡设置&#xff0c;读者能够轻松理解并操作整个搭建过程。 一、Nacos集群示意图 Nacos&#xff0…

17.3.1.6 自定义处理

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 模拟某款图像处理软件的处理&#xff0c;它只留下红色、绿色或者蓝色这样的单一颜色。 首先按照颜色划分了6个色系&#xff0c;分别…

2.16学习总结

1.邮递员送信&#xff08;dijkstra 不只是从起到到目标点&#xff0c;还要走回去&#xff09; 2.炸铁路(并查集) 3.统计方形&#xff08;数据加强版&#xff09;&#xff08;排列组合&#xff09; 4.滑雪&#xff08;记忆化&#xff09; 5.小车问题&#xff08;数学问题&#x…

二叉树前序中序后序遍历(非递归)

大家好&#xff0c;又和大家见面啦&#xff01;今天我们一起去看一下二叉树的前序中序后序的遍历&#xff0c;相信这个对大家来说是信手拈来&#xff0c;但是&#xff0c;今天我们并不是使用常见的递归方式来解题&#xff0c;我们采用迭代方式解答。我们先看第一道前序遍历 1…

基于Robei EDA实现FIFO(非IP核)及FIFO求和

一、FIFO简介 FIFO&#xff08; First in First out&#xff09; 使用在需要产生数据接口的部分&#xff0c;用来存储、缓冲在两个异步 时钟之间的数据传输。在异步电路中&#xff0c;由于时钟之间周期和相位完全独立&#xff0c;因此数据丢失概 率不为零。使用 FIFO 可以在两个…

【ChatIE】论文解读:Zero-Shot Information Extraction via Chatting with ChatGPT

文章目录 介绍ChatIEEntity-Relation Triple Extration (RE)Named Entity Recognition (NER)Event Extraction (EE) 实验结果结论 论文&#xff1a;Zero-Shot Information Extraction via Chatting with ChatGPT 作者&#xff1a;Xiang Wei, Xingyu Cui, Ning Cheng, Xiaobin W…

【电源】POE系统供电原理(二)

转载本博客文章&#xff0c;请注明出处 ​ 上一篇文章中&#xff0c;有提到POE系统工作原理及动态检测机制&#xff0c;下面我们继续介绍受电端PD技术及原理。POE供电系统包含PSE、PD及互联接口部分组成&#xff0c;如下图所示。 图1 POE供电系统 PSE控制器的主要作用&#xff…

无人机基本知识,无人机遥控器功能详解与调试方法

无人机作为一种新兴的飞行器&#xff0c;近年来在各个领域得到了广泛的应用。而无人机遥控器则是控制无人机飞行的重要工具。 无人机遥控器是一种无线设备&#xff0c;通过它来远程控制无人机的飞行。遥控器通常包括一个或多个摇杆&#xff0c;用于控制无人机的各种动作&#x…

FL Studio 21中文破解激活版2024免费下载安装图文教程

FL Studio 21.2.1.3859中文破解激活版是我见过更新迭代最快的宿主软件&#xff0c;没有之一。FL Studio12、FL Studio20、FL Studio21等等。有时甚至我刚刚下载好了最新版本&#xff0c;熟悉了新版本一些好用的操作&#xff0c;Fl Studio就又推出了更新的版本&#xff0c;而且F…

【STM32 CubeMX】串口编程DMA+IDLE中断

文章目录 前言一、为什么要引入IDLE中断二、IDLE中断使用方式2.1 接收的三种情况2.2 函数的使用查询方式中断方式DMA方式分析一个问题 总结 前言 在嵌入式系统中&#xff0c;串口通信是一项关键的任务&#xff0c;而使用DMA&#xff08;直接内存访问&#xff09;结合IDLE中断进…

基于springboot特产销售平台源码和论文

“互联网”的战略实施后&#xff0c;很多行业的信息化水平都有了很大的提升。但是目前很多藏区特产销售信息仍是通过人工管理的方式进行&#xff0c;需要在各个岗位投入大量的人力进行很多重复性工作&#xff0c;使得对人力物力造成诸多浪费&#xff0c;工作效率不高等情况&…

【初始RabbitMQ】工作队列的实现

工作队列 工作队列&#xff08;又称为任务队列&#xff09;的主要思想是避免立即执行资源密集型任务&#xff0c;而不得不等待它完成。 相反我们安排任务在之后执行。我们把任务封装为消息并将其发送到队列。在后台运行的工作进 程将弹出任务并最终执行作业。当有多个工作线程…

电脑屏幕录制工具 Top10 榜单,免费无水印方法集

随着媒体行业的突飞猛进&#xff0c;不同服务之间对有效屏幕录制的竞争日益激烈。这导致市场上出现了质量参差不齐的屏幕录像机。特别是有些录屏器会自动给你录制的视频加上水印&#xff0c;给需要在公共场合使用的人留下不专业的印象。除此之外&#xff0c;它们甚至不能保护您…

【Google Bard】免费生成图像——功能和使用方法详解

Google Bard 关于Bard 图片生成功能打开Bard通过Bard来生成图片Bard Vs Bing Vs Dall-EBard的生成结果Bing的生成结果Dall-E 的生成结果 总结 关于Bard 图片生成功能 Google在2月1日&#xff08;当地时间&#xff09;宣布&#xff0c;其对话型AI“Bard”新增了图像生成功能。 …

Mysql——update更新数据的方式

注&#xff1a;文章参考&#xff1a; MySQL 更新数据 不同条件(批量)更新不同值_update批量更新同一列不同值-CSDN博客文章浏览阅读2w次&#xff0c;点赞20次&#xff0c;收藏70次。一般在更新时会遇到以下场景&#xff1a;1.全部更新&#xff1b;2.根据条件更新字段中的某部分…

MATLAB离线文档安装

MATLAB离线文档安装 来源于最全matlab安装离线文档教程只是对内容进行了精简&#xff0c;同时更方便查找 一、下载离线文档 我上传的2023b离线文档 提供本体属于违规行为&#xff0c;本体下载链接已删除 为方便已安装好软件的朋友想安装离线帮助文档&#xff0c;由于官网下载…

模型 IPO(输入、处理、输出)学习模型

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_总纲目录。重在提升认知。信息转化与传递。 1 模型 IPO(输入、处理、输出)学习模型的应用 1.1 项目管理知识体系 PMBOK 中的IPO应用 在项目管理领域&#xff0c;PMBOK&#xff08;Project Management Body of Know…