• 在 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,可以使用下面提到的命令安装它。

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

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

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

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

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

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

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

    1. train: ../datasets/images/train/
    2. val: ../datasets/images/test/
    3. # number of classes
    4. nc: 4
    5. # class names
    6. 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。

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

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

    1. Arduino_Nano
    2. ESP8266
    3. Raspberry_Pi_3
    4. Heltec_ESP32_Lora

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

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

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

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

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

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

    ⭐运行训练过程

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

    1. $ yolo task=detect \
    2. mode=train \
    3. model=yolov8n.pt \
    4. data=./chip.yaml \
    5. epochs=30 \30 \
    6. 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现在可以进行预测了!

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

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

    1. class C2f(nn.Module):
    2. # CSP Bottleneck with 2 convolutions
    3. def __init__(self, c1, c2, n=1, shortcut=False, g=1, e=0.5): # ch_in, ch_out, number, shortcut, groups, expansion
    4. super().__init__()
    5. self.c = int(c2 * e) # hidden channels
    6. self.cv1 = Conv(c1, 2 * self.c, 1, 1)
    7. self.cv2 = Conv((2 + n) * self.c, c2, 1) # optional act=FReLU(c2)
    8. self.m = nn.ModuleList(Bottleneck(self.c, self.c, shortcut, g, k=((3, 3), (3, 3)), e=1.0) for _ in range(n))
    9. def forward(self, x):
    10. # y = list(self.cv1(x).split((self.c, self.c), 1))
    11. # y.extend(m(y[-1]) for m in self.m)
    12. # return self.cv2(torch.cat(y, 1))
    13. print("ook")
    14. x = self.cv1(x)
    15. x = [x, x[:, self.c:, ...]]
    16. x.extend(m(x[-1]) for m in self.m)
    17. x.pop(1)
    18. return self.cv2(torch.cat(x, 1))
    1. def forward(self, x):
    2. shape = x[0].shape # BCHW
    3. for i in range(self.nl):
    4. x[i] = torch.cat((self.cv2[i](x[i]), self.cv3[i](x[i])), 1)
    5. if self.training:
    6. return x
    7. elif self.dynamic or self.shape != shape:
    8. self.anchors, self.strides = (x.transpose(0, 1) for x in make_anchors(x, self.stride, 0.5))
    9. self.shape = shape
    10. # box, cls = torch.cat([xi.view(shape[0], self.no, -1) for xi in x], 2).split((self.reg_max * 4, self.nc), 1)
    11. # dbox = dist2bbox(self.dfl(box), self.anchors.unsqueeze(0), xywh=True, dim=1) * self.strides
    12. # y = torch.cat((dbox, cls.sigmoid()), 1)
    13. # return y if self.export else (y, x)
    14. print("ook")
    15. return torch.cat([xi.view(shape[0], self.no, -1) for xi in x], 2).permute(0, 2, 1)

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

    1. $yolo task=detect mode=export model=runs/detect/train4/weights/best.pt
    2. 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按钮,程序执行成功!

  • 相关阅读:
    阿里P8架构师首推Netty实战干货,实战篇+面试篇,将知识点一网打尽
    web:[GXYCTF2019]禁止套娃
    使用python实现http协议的方法
    Java之IO流详解(三)——字符流
    系统架构师备考倒计时20天(每日知识点)
    56、springboot ------ RESTful服务及RESTful接口设计
    MyBatisPlus-映射匹配兼容性
    时间序列:对股价时序建模
    如何做口碑营销?企业实施网络口碑营销的技巧
    矩阵病态问题
  • 原文地址:https://blog.csdn.net/weixin_46287760/article/details/136126058