onnx模型部署到手机(onnx加载模型)

onnx模型部署到手机(onnx加载模型)nbsp nbsp 今日科技快讯 nbsp nbsp 近日 据媒体报道 2024 年上半年字节跳动的整体收入增长超过 35 达到约 730 亿美 国际市场收入增长超过 60 达到约 170 亿美 这里主要是 TikTok 带来的收入 这意味着字节跳动 2024 年上半年的营收不仅在国内遥遥领先 国际市场上更是逼近 Meta 该公司上半年的营收为 755 27 亿美 nbsp nbsp 作者简介 nbsp nbsp 本篇文章转自 CaptainZ 的博客 文章主要分享了





/ 今日科技快讯 /

近日,据媒体报道,2024年上半年字节跳动的整体收入增长超过35%,达到约730亿美元。国际市场收入增长超过60%,达到约170亿美元,这里主要是TikTok带来的收入。这意味着字节跳动2024年上半年的营收不仅在国内遥遥领先,国际市场上更是逼近Meta——该公司上半年的营收为755.27亿美元。

/ 作者简介 /

本篇文章转自CaptainZ的博客,文章主要分享了如何在 Android 上使用YOLOv8 训练,相信会对大家有所帮助!

原文地址:
https://juejin.cn/post/7408822338576482345

/ 前言 /

最近在了解机器学习方面的知识,了解了一些分类相关的算法实现,于是乎也想上手玩玩,毕竟实践出真知。看了看网上有很多 pre-trained 模型,可以实现很多强大的功能,不过还是想基于这些模型做一个二次训练做一个自己的模型,这样才更有成就感,自己也能在实践中学习到一些书本上没有的细节。

/ 灵感 /

现实中很多物体可以做分类,不过我的灵感来自我的2只可爱的狗狗,一只是金毛,一只是只串串。我一直好奇串串是个什么品种,所以我选择自己做一个狗狗分类器,这样我能比较直观的感受到自己训练的成果是不是准确,毕竟如果训练了一个自己不懂的物体,无法直接的判断模型的好坏。

/ 框架选择 /

现实中很多物体可以做分类,不过我的灵感来自我的2只可爱的狗狗,一只是金毛,一只是只串串。我一直好奇串串是个什么品种,所以我选择自己做一个狗狗分类器,这样我能比较直观的感受到自己训练的成果是不是准确,毕竟如果训练了一个自己不懂的物体,无法直接的判断模型的好坏。

数据集准备

分类算法的数据集基本上都类似于下面的格式。

数据集格式介绍

cifar-10-/
|
|-- train/
|   |-- airplane/
|   |   |-- 10008_airplane.png
|   |   |-- 10009_airplane.png
|   |   |-- ...
|   |
|   |-- automobile/
|   |   |-- 1000_automobile.png
|   |   |-- 1001_automobile.png
|   |   |-- ...
|   |
|   |-- bird/
|   |   |-- 10014_bird.png
|   |   |-- 10015_bird.png
|   |   |-- ...
|   |
|   |-- ...
|
|-- test/
|   |-- airplane/
|   |   |-- 10_airplane.png
|   |   |-- 11_airplane.png
|   |   |-- ...
|   |
|   |-- automobile/
|   |   |-- 100_automobile.png
|   |   |-- 101_automobile.png
|   |   |-- ...
|   |
|   |-- bird/
|   |   |-- 1000_bird.png
|   |   |-- 1001_bird.png
|   |   |-- ...
|   |
|   |-- ...
|
|-- val/ (optional)
|   |-- airplane/
|   |   |-- 105_airplane.png
|   |   |-- 106_airplane.png
|   |   |-- ...
|   |
|   |-- automobile/
|   |   |-- 102_automobile.png
|   |   |-- 103_automobile.png
|   |   |-- ...
|   |
|   |-- bird/
|   |   |-- 1045_bird.png
|   |   |-- 1046_bird.png
|   |   |-- ...
|   |
|   |-- ...

数据集必须在根目录下以特定的分割目录结构进行组织,以方便正确的训练、测试和可选的验证过程。这种结构包括用于训练(train)和测试(test)阶段的单独目录,以及用于验证(val)的可选目录。

每个目录都应为数据集中的每个类包含一个子目录。子目录以相应的类命名,并包含该类的所有图像。确保每个图像文件都有唯一的名称,并以 JPEG 或 PNG 等通用格式存储。对于 Ultralytics YOLO 分类任务,数据集必须在根目录下以特定的分割目录结构进行组织,以方便正确的训练、测试和可选的验证过程。这种结构包括用于训练(train)和测试(test)阶段的单独目录,以及用于验证(val)的可选目录。

每个目录都应为数据集中的每个类包含一个子目录。子目录以相应的类命名,并包含该类的所有图像。确保每个图像文件都有唯一的名称,并以 JPEG 或 PNG 等通用格式存储。

一般来说上述的分类数据集是比较通用的,不仅仅适用于 YOLOv8 的分类数据集,也适用于 mobilenet,resnet 等分类框架。

数据集获取

深度学习需要海量的数据集来训练,以保住模型的能力,我们可以自己准备数据集,或者使用网上的开源数据集,一般来说对于开发者来说,有两个地方可以免费获得 dataset(数据集),并且轻易的使用。一个是 huggingface.co/, 另一个是 www.kaggle.com/ ,本文中以 huggingface 为例。打开 hugging face,选择 dataset 可以看到下面的页面。


搜索框里面我们输入 dog 选择我们需要的数据集。

note:请选择 train 数据集和 test 数据集都存在的 dataset,否则将会存在以下风险,因为模型的训练是需要测试数据进行验证回馈,调整损失函数进行下一步训练的。

  1. 无法评估泛化能力:你不能验证模型在未见数据上的表现。
  2. 过拟合风险:可能无法检测到模型是否过拟合。

数据集结构展示


以上面的这个数据集为例,一般数据集结构可以使用 viewer 进行查看,通过上面的 split 可以看到当前数据集的完整性,是否存在 train,test,val split。通过切换我们可以知道这个 dataset 的 test split 并没有完整分类,是无法直接用于分类任务的,我们需要换一个数据集来实现。

数据集使用

一般来说网站上都会提供完整的数据集的使用方法,示例如下:


如果我们点击每个按钮就会有对应的集成代码,本例中以 datasets 库为例,点击之后会出现一个提示框出现类似下面的代码:

from datasets import load_dataset
ds = load_dataset("amaye15/stanford-dogs")

如果在 pycharm 上直接运行,你将会下载上面的数据集。放心数据集只会运行一次。现在你有了完整的数据集了,你需要的就是按照上面的数据集的结构将图片 copy 一份过来。

训练 / Train

现在万事俱备,只需要我们按照官方文档 copy 出来代码:

from ultralytics import YOLO
# Load a model
model = YOLO("yolov8n-cls.pt")  # load a pretrained model (recommended for training)
# Train the model
results = model.train(data="path/to/dataset", epochs=100, imgsz=640)

点击开始,训练就正式开始了。如果不出意外的话,意外就要开始了,你会发现你的进度条不动了,这时候你可能察觉不到异常,因为 YOLOv8 默认的训练是使用 cuda 的,是需要 NVIDIA 显卡来支持的,这时候你需要指定使用 cpu 来训练,当然如果你是高贵的 mac pro 用户,你可以指定设备为 mps 来训练,训练能力排序为 cuda>mps>cpu。

# Ensure the model uses CPU
model.to('cpu')

修复问题我们接着训练,当然为了节省我们不需要讲训练次数 epoch 设置成 100,可以设置成 30 或者50 先看看效果。


如果一切顺利的话,控制台会实时展示训练的成果。

模型验证与导出

模型预测

from ultralytics import YOLO
# Load a model
checkpoint = 'your_model_path.pt'
model = YOLO(checkpoint)  # pretrained YOLOv8n model
# Run batched inference on a list of images
results = model(["im1.jpg", "im2.jpg"])  # return a list of Results objects
# Process results list
for result in results:
    boxes = result.boxes  # Boxes object for bounding box outputs
    masks = result.masks  # Masks object for segmentation masks outputs
    keypoints = result.keypoints  # Keypoints object for pose outputs
    probs = result.probs  # Probs object for classification outputs
    obb = result.obb  # Oriented boxes object for OBB outputs
    result.show()  # display to screen
    result.save(filename="result.jpg")  # save to disk

我们可以使用上面的代码找几张测试图片预测一下当前模型,体验一下自己的劳动成果。checkpoint 这个参数可以在控制台看到,一般路径为:runs/classify/trainX/weights。

模型导出

YOLOv8 的模型导出非常简单,可以说是傻瓜式。

from ultralytics import YOLO
# Load a model
model = YOLO("path/to/best.pt")  # 加载你自己训练数据集
# 导出为你需要的数据集
model.export(format="onnx")

一般来说移动端的部署框架选择很多,例如腾讯的 ncnn,Facebook的 pytorch ,Google 的 tensorflow-lite,百度的 paddle,微软的 onnx-runtime。在这里我选择的是 onnx runtime 框架进行部署。确定了部署的框架之后我们就需要导出模型文件了,这里我的设置如上面所示。

在Android 手机上跑起来

我们可以基于 onnx runtime 原有 demo 稍微做下改造,将里面模型路径换成我们自己的路径,里面的 classes txt 换成我们自己的模型 labels 这样就可以成功部署啦。部署之后我们会兴冲冲打开自己 App 验证一下模型,可是我们可能会发现自己的模型并不能正确识别自己的狗狗。在这里我就不绕弯子了,由于 onnx 输入图片已经做了归一化,如果不了解的可以看一下相关介绍,在这里我们只需要在上面的训练代码添加一个参数即可。

model.train(
    data='dataset',  # Path to your dataset configuration file
    epochs=5,  # Number of epochs
    workers=4,  # Number of workers
    batch_size=16,  # Batch size
    augmented=True,  # Use augmented data
)

model.export(format='onnx',simplify=True)

重新验证

经过重新部署验证之后,用自己的狗狗看看自己训练的结果,终于知道自己的狗宝像哪个品种了了,原来是博美呀!



/ 结语 /

好啦,上面就是我的分享啦,祝周末愉快。附上自己的 repo。
https://github.com/jelychow/Android_Yolo8_Dog_Classfication

推荐阅读:
我的新书,《第一行代码 第3版》已出版!
原创:写给初学者的Jetpack Compose教程,edge-to-edge全面屏体验
Android 15新特性,强制edge-to-edge全面屏体验

欢迎关注我的公众号
学习技术或投稿


长按上图,识别图中二维码即可关注

编程小号
上一篇 2025-03-18 12:46
下一篇 2025-02-26 21:21

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/65440.html