[YOLOv8] 用YOLOv8实现指针式圆形仪表智能读数(一)

news2024/11/17 21:54:32

        最近研究了一个项目,利用python代码实现指针式圆形仪表的自动读数,并将读数结果进行输出,若需要完整数据集和源代码可以私信。

目录

🍓🍓1.yolov8实现圆盘形仪表智能读数 

🙋🙋2.仪表目标检测

🍋2.1准备数据

🍋2.2模型选择

🍋2.3加载预训练模型

🍋2.4数据组织 

🍉🍉3.目标检测训练代码

整理不易,欢迎一键三连!!!

送你们一条美丽的--分割线--


🍓🍓1.yolov8实现圆盘形仪表智能读数 

        实现的效果如下:

        对整个项目来说,可分为三个大步骤:

  1. 仪表目标检测
  2. 仪表表盘指针分割
  3. 计算读数

        此篇先将仪表目标检测,将原图中的表盘识别出来。

🙋🙋2.仪表目标检测

        首先第一步,对原始影像中的仪表进行目标识别,具体使用的模型我们采用YOLOv8,当然可以换其他模型,这里就以YOLOv8为示例进行仪表目标检测任务进行讲解。

🍋2.1准备数据

        使用的数据集如下所示:

label部分采用YOLO格式的txt文件,格式如下所示:

🍋2.2模型选择

        以YOLOv8n为例,模型选择代码如下:

model = YOLO('yolov8n.yaml')  # build a new model from YAML
model = YOLO('yolov8n.pt')  # load a pretrained model (recommended for training)
model = YOLO('yolov8n.yaml').load('yolov8n.pt')  # build from YAML and transfer weights

        其中yolov8n.yaml为./ultralytics/cfg/models/v8/yolov8n.yaml,可根据自己的数据进行模型调整,打开yolov8n.yaml显示内容如下:

# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv8 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect

# Parameters
nc: 7 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov8n.yaml' will call yolov8.yaml with scale 'n'
  # [depth, width, max_channels]
  n: [0.33, 0.25, 1024] # YOLOv8n summary: 225 layers,  3157200 parameters,  3157184 gradients,   8.9 GFLOPs
  s: [0.33, 0.50, 1024] # YOLOv8s summary: 225 layers, 11166560 parameters, 11166544 gradients,  28.8 GFLOPs
  m: [0.67, 0.75, 768] # YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients,  79.3 GFLOPs
  l: [1.00, 1.00, 512] # YOLOv8l summary: 365 layers, 43691520 parameters, 43691504 gradients, 165.7 GFLOPs
  x: [1.00, 1.25, 512] # YOLOv8x summary: 365 layers, 68229648 parameters, 68229632 gradients, 258.5 GFLOPs

# YOLOv8.0n backbone
backbone:
  # [from, repeats, module, args]
  - [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
  - [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
  - [-1, 3, C2f, [128, True]]
  - [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
  - [-1, 6, C2f, [256, True]]
  - [-1, 1, Conv, [512, 3, 2]] # 5-P4/16
  - [-1, 6, C2f, [512, True]]
  - [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32
  - [-1, 3, C2f, [1024, True]]
  - [-1, 1, SPPF, [1024, 5]] # 9

# YOLOv8.0n head
head:
  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 6], 1, Concat, [1]] # cat backbone P4
  - [-1, 3, C2f, [512]] # 12

  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 4], 1, Concat, [1]] # cat backbone P3
  - [-1, 3, C2f, [256]] # 15 (P3/8-small)

  - [-1, 1, Conv, [256, 3, 2]]
  - [[-1, 12], 1, Concat, [1]] # cat head P4
  - [-1, 3, C2f, [512]] # 18 (P4/16-medium)

  - [-1, 1, Conv, [512, 3, 2]]
  - [[-1, 9], 1, Concat, [1]] # cat head P5
  - [-1, 3, C2f, [1024]] # 21 (P5/32-large)

  - [[15, 18, 21], 1, Detect, [nc]] # Detect(P3, P4, P5)

        主要需要修改的地方为nc,也就是num_class,此处如果是自己的表盘识别数据,那就要换成类别为1。

        如果其他的模型参数不变的话,就默认保持原版yolov8,需要改造模型结构的大佬请绕行。

🍋2.3加载预训练模型

        加载预训练模型yolov8n.pt,可以在第一次运行时自动下载,如果受到下载速度限制,也可以自行下载好(下载链接),放在对应目录下即可。

 

🍋2.4数据组织 

        yolov8还是以yolo格式的数据为例,./ultralytics/cfg/datasets/data.yaml的内容示例如下:

# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: ../datasets/coco8  # dataset root dir
train: images/train  # train images (relative to 'path') 4 images
val: images/val  # val images (relative to 'path') 4 images
test:  # test images (optional)

# Classes (80 COCO classes)
names:
  0: person
  1: bicycle
  2: car
  # ...
  77: teddy bear
  78: hair drier
  79: toothbrush

        要注意此处的names是从0开始的,如果是0-79,那上面模型选择的nc=80。这里要特别小心。

        训练时的数据加载方式为:

# Train the model
results = model.train(data='data.yaml', epochs=50, imgsz=640)

🍉🍉3.目标检测训练代码

        准备好数据和模型之后,就可以开始训练了,train.py的内容显示为:

from ultralytics import YOLO

# Load a model
model = YOLO('yolov8n.yaml')  # build a new model from YAML
model = YOLO('yolov8n.pt')  # load a pretrained model (recommended for training)
model = YOLO('yolov8n.yaml').load('yolov8n.pt')  # build from YAML and transfer weights

# Train the model
results = model.train(data='data.yaml', epochs=50, imgsz=640)

训练完成后的结果如下所示: 

        其中weights文件夹内hi包含2个模型,一个best.pth,一个last.pth。

        模型预测效果如下:

        为了方便下一步的像素级表盘分割任务,可以将框内的表盘提取并裁剪出来,方便后续使用。

下一篇:YOLOv8实现仪表盘实例分割

整理不易,欢迎一键三连!!!

送你们一条美丽的--分割线--

🌷🌷🍀🍀🌾🌾🍓🍓🍂🍂🙋🙋🐸🐸🙋🙋💖💖🍌🍌🔔🔔🍉🍉🍭🍭🍋🍋🍇🍇🏆🏆📸📸⛵⛵⭐⭐🍎🍎👍👍🌷🌷

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

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

相关文章

机器人系统可以支持对接人工系统吗?

​ 随着科技的飞速发展,机器人系统在各行各业都扮演着越来越重要的角色。它们可以高效地处理大量数据,执行繁琐的任务,甚至在某些领域超越了人类的能力。然而,机器人系统也有其局限性,特别是在处理复杂的人际交往…

linux 服务器无 sudo 权限非 root 用户安装特定版本 cuda

1. 下载 cuda toolkit 下载想要版本的 cuda toolkit CUDA Toolkit 11.8 Downloads | NVIDIA Developer [xxxlocalhost ~]$ hostnamectlStatic hostname: localhost.localdomainIcon name: computer-serverChassis: serverMachine ID: b4258bf9bef54798b03e8e3a13756124Boot …

如何做到销售订单不做可用量检查,而交货单做

如何保证一个用户做某物料可用量检查时,不会锁定物料 可用量和需求冻结标志 Indicates whether, during the availability check, the material is blocked for other users. The block remains until the transaction responsible has been saved. It is set at m…

Web3与跨境支付:探讨区块链如何改变国际交易

随着区块链技术的发展和普及,人们开始意识到其在跨境支付领域的巨大潜力。在传统的跨境支付系统中,存在着诸多问题,如高昂的手续费、长时间的处理周期以及缺乏透明度等。而区块链作为一种去中心化、安全、透明且可追溯的技术,被认…

一步成像:Hyper-SD在图像合成中的创新与应用

一、摘要: 论文:https://arxiv.org/pdf/2404.13686 代码:https://huggingface.co/ByteDance/Hyper-SD 在生成人工智能领域,扩散模型(Diffusion Models, DMs)因其出色的图像生成质量而备受关注,但…

Oracle里令人头疼的生僻字处理案例

事情起因 有小伙伴找到我问一下生僻字的问题,数据库是oracle 11g,字符集是zhs16gbk 下图里显示的??应该是“𧿹”这个字,算是个生僻字。 问应用厂家就说数据库字符集建错了,要改库的字符集。…

LeetCode89:柠檬水找零

题目描述 在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。 每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零&a…

docker容器技术篇:rancher管理平台部署kubernetes集群

rancher管理平台部署kubernetes集群 Rancher 是一个 Kubernetes 管理工具,让你能在任何地方和任何提供商上部署和运行集群。 Rancher 可以创建来自 Kubernetes 托管服务提供商的集群,创建节点并安装 Kubernetes,或者导入在任何地方运行的现…

引领AI数据标注新纪元:景联文科技为智能未来筑基

在人工智能蓬勃发展的今天,数据如同燃料,驱动着每一次技术飞跃。在这场智能革命的浪潮中,景联文科技凭借其深厚的专业实力与前瞻性的战略眼光,正站在行业前沿,为全球的人工智能企业提供坚实的数据支撑。 全国布局&…

C++向函数传递对象

C语言中,对象作为函数的参数和返回值的传递方式有 3 种:值传递、指针传递和引用传递。 1. 对象作为函数参数 把实参对象的值复制给形参对象,这种传递是单向的,只从实参到形参。因此,函数对形参值做的改变不会影响到实…

Qt 6.7功能介绍

Qt 6.7为我们所有喜欢在构建现代应用程序和用户体验时获得乐趣的人提供了许多大大小小的改进。一些新增内容作为技术预览发布,接下来我们就一起来看看吧: 将C20与Qt一起使用 对于许多编译器工具链来说,C20仍然是可选的和实验性的,…

tartiflette,一个有趣的 Python 库!

更多Python学习内容:ipengtao.com 大家好,今天为大家分享一个有趣的 Python 库 - tartiflette。 Github地址:https://github.com/tartiflette/tartiflette Tartiflette是一个为Python编写的GraphQL服务器实现,它建立在现代异步编程…

机器学习中线性回归算法的推导过程

线性回归是机器学习中监督学习中最基础也是最常用的一种算法。 背景:当我们拿到一堆数据。这堆数据里有参数,有标签。我们将这些数据在坐标系中标出。我们会考虑这些数据是否具有线性关系。简单来说 我们是否可以使用一条线或者一个平面去拟合这些数据的…

Android Compose 二:布局的对齐方式

布局的对齐方式 使用Modifier 内容或者子组件居中 Text(text "Hello $name!",modifier Modifier.fillMaxSize() //设置宽高撑满.wrapContentHeight(align Alignment.CenterVertically) //设置竖直居中.wrapContentWidth(align Alignment.CenterHorizontally…

相亲系统功能介绍

相亲系统是一种旨在帮助单身人士寻找合适伴侣的平台,其主要功能通常包括以下几个方面: 实名认证:为了确保双方的权益保障,用户必须进行实名认证后才能使用该系统。这有助于增加系统的安全性和可信度。偏好选择:用户可…

数据结构(十一)----图的应用

目录 一.最小生成树 1.Prim算法(普里姆) 2.Kruskal算法(克鲁斯卡尔): 二.最短路径(BFS算法) 1.单源最短路径 (1)BFS算法(无权图) (2)Dijkstra算法&…

带你入门React

目录 前言一,基本配置1.1 环境搭建1.2 页面初始化渲染二,基础学习2.1 结构与样式开发2.2 数据展示2.3 行内样式2.4 条件渲染2.5 列表渲染2.6 点击事件 三,页面更新3.1 组件数据3.2 组件数据共享 总结 前言 笔者之前的工作经验都局限于Vue&am…

CCF-Csp算法能力认证,202209-1如此编码(C++)含解析

前言 推荐书目,在这里推荐那一本《算法笔记》(胡明),需要PDF的话,链接如下 「链接:https://pan.xunlei.com/s/VNvz4BUFYqnx8kJ4BI4v1ywPA1?pwd6vdq# 提取码:6vdq”复制这段内容后打开手机迅雷…

YOLOv8独家原创改进: 通用倒瓶颈(UIB)搜索块结合C2f二次创新 | 轻量化之王MobileNetV4

💡💡💡创新点:轻量化之王MobileNetV4 开源 | Top-1 精度 87%,手机推理速度 3.8ms,原地起飞! 最主要创新:引入了通用倒瓶颈(UIB)搜索块,这是一个统一且灵活的结构,它融合了倒瓶颈(IB)、ConvNext、前馈网络(FFN)以及一种新颖的额外深度可分(ExtraDW)变体技…

【大学物理】双语笔记

7.5 angular momentu(角动量)_哔哩哔哩_bilibili 6.4Energy in Rotation Motion 有质量有速度的物体有动能,是不是很有道理 international system(from French systeme international,acronym,SI)of ineria kg*m^2 转…