【YOLOv8】 用YOLOv8实现数字式工业仪表智能读数(二)

        上一篇圆形表盘指针式仪表的项目受到很多人的关注,咱们一鼓作气,把数字式工业仪表的智能读数也研究一下。本篇主要讲如何用YOLOV8实现数字式工业仪表的自动读数,并将读数结果进行输出,若需要完整数据集和源代码可以私信。

目录

🍓🍓1.yolov8实现数字型仪表智能读数 

🙋🙋2.数字仪表数字识别目标检测

 🍋2.1准备数据

🍋2.2模型选择

🍋2.3加载预训练模型

🍋2.4数据组织 

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

🍉🍉4.目标检测推理代码

 快速通道

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

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


🍓🍓1.yolov8实现数字型仪表智能读数 


        首先介绍下数字型仪表的数据集如下所示,包含了各种数字型仪表:

       


         最后实现的效果如下:

        从原始数据输入至最后输出仪表读数,共需要3步:

  1. 从原始影像中通过目标检测识别出表盘的位置
  2. 基于第一步的结果将表盘的位置切分出来,再进一步通过目标检测识别表盘中的数字
  3. 基于第二步的结果对表盘中的数字进行智能读数

         此篇主要介绍第二步【从切分好的表盘影像中通过目标检测识别出仪表中的数字

🙋🙋2.数字仪表数字识别目标检测

 🍋2.1准备数据

        训练数据集共包含141张。部分训练数据如下图所示。

        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: 11 # 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 GFLOPss: [0.33, 0.50, 1024] # YOLOv8s summary: 225 layers, 11166560 parameters, 11166544 gradients,  28.8 GFLOPsm: [0.67, 0.75, 768] # YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients,  79.3 GFLOPsl: [1.00, 1.00, 512] # YOLOv8l summary: 365 layers, 43691520 parameters, 43691504 gradients, 165.7 GFLOPsx: [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,此处我的输入影像中只有数字0-9再加一个小数点,共11个类别,所以nc=11

        如果其他的模型参数不变的话,就默认保持原版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: person1: bicycle2: car# ...77: teddy bear78: hair drier79: toothbrush


        此处建议根据自己的数据集设置新建一个shuziyibiao_number.yaml文件,放在./ultralytics/cfg/datasets/目录下,最后数据集设置就可以直接用自己的shuziyibiao_number.yaml文件了。以我的shuziyibiao_number.yaml文件为例:

path: /home/datasets/shuziyibiao_dataset_number  # dataset root dir
train: images/train  # train images (relative to 'path') 4 images
val: images/train  # val images (relative to 'path') 4 images
test:  # test images (optional)names:0: 01: 12: 23: 34: 45: 56: 67: 78: 89: 910: point



🍉🍉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='shuziyibiao_number.yaml', epochs=100, imgsz=640)

        训练完成后的结果如下:

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

        贴上我的训练结果,精度基本都在95%以上。

        至此就可以使用best.pth进行推理预测表盘位置了。

🍉🍉4.目标检测推理代码

        推理代码如下:

from ultralytics import YOLO
from PIL import Image
import osmodel = YOLO('./数字仪表识别weights/weights/best.pt')  # load a custom model
path = '/home/数字仪表/dataset/test/'
img_list = os.listdir(path)
for img_path in img_list:im1 = Image.open(os.path.join(path,img_path))results = model.predict(source=im1, save=True,save_txt=True)

        推理得到的结果包含可视化jpg结果和txt结果,其中txt结果存放在labels文件夹里。

        可视化结果如下:

        txt结果如下:

 快速通道

【YOLOv8】 用YOLOv8实现数字式工业仪表智能读数(一)

【YOLOv8】 用YOLOv8实现数字式工业仪表智能读数(三)-CSDN博客

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

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

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

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

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

相关文章

初识Laravel(Laravel的项目搭建)

初识Laravel(Laravel的项目搭建) 一、项目简单搭建(laravel)1.首先我们确保使用国内的 Composer 加速镜像([加速原理](https://learnku.com/php/wikis/30594)):2.新建一个名为 Laravel 的项目&a…

简过网:“三支一扶”这些政策你知道吗?

你好小编,我最近打算备考三支一扶,能介绍一些关于三支一扶的相关知识吗? 为了让大家更好的了解三支一扶,下面这篇文章,小编以问答的方式给大家介绍,希望能够帮助到你! 1、什么是三支一扶&#…

电脑 DNS 缓存是什么?如何清除?

DNS(Domain Name System,域名系统)是互联网的重要组成部分,负责将人类易记的域名转换为机器可读的 IP 地址,从而实现网络通信。DNS 缓存是 DNS 系统中的一个关键机制,通过临时存储已解析的域名信息&#xf…

消息队列必知必会-RabbitMQ

文章目录 RabbitMQ是什么?有什么特点?RabbitMQ架构RabbitMQ消息消费过程如何保证消息不丢失?可靠性传输?生产者丢失了数据RabbitMQ(broker)丢失了数据消费端丢失数据 顺序消息错乱场景解决方案 高可用普通集…

git提交大文件服务500

错误如图 需保证git服务端能接收大文件 修改项目下.git文件中的config文件,加入 [http] postBuffer 524288000

力扣 160相聚链表

注意 判断是否有交点 用while(A! B) 其中A A nullptr? headb:A->next;B同理 注意,while循环的退出条件是AB指针指向同一个,如果没有相交,仍然可以退出 当AB都为NULLPTR时退出

【信创】信创云规划设计建设方案(2024PPT原件)

信创,即“信息技术应用创新”。我国自主信息产业聚焦信息技术应用创新,旨在通过对IT硬件、软件等各个环节的重构,基于我国自有IT底层架构和标准,形成自有开放生态,从根本上解决本质安全问题,实现信息技术可…

【笔试常见编程题06】最近公共祖先、求最大连续bit数、二进制插入、查找组成一个偶数最接近的两个素数

1. 最近公共祖先 将一棵无穷大满二叉树的结点按根结点一层一层地从左往右编号,根结点编号为1。现给定a,b为两个结点。设计一个算法,返回a、b最近的公共祖先的编号。注意其祖先也可能是结点本身。 测试样例: 2,3 返回&a…

Airtest成功案例分享:KLab连续2年携Airtest私有云产品参加CEDEC大会!

一、KLab株式会社介绍 KLab株式会社是一家位于日本的移动游戏开发公司,成立于2000年。公司以开发和运营基于动漫和漫画IP的手机游戏而闻名,尤其是在音乐节奏游戏领域。KLab的一些知名作品包括《LoveLive!学园偶像祭》、《排球少年:新的征程》…

【中项第三版】系统集成项目管理工程师 | 第 11 章 规划过程组② | 11.3 - 11.5

前言 第 11 章对应的内容选择题和案例分析都会进行考查,这一章节属于10大管理的内容,学习要以教材为准。本章上午题分值预计在15分。 目录 11.3 收集需求 11.3.1 主要输入 11.3.2 主要工具与技术 11.3.3 主要输出 11.4 定义范围 11.4.1 主要输入…

【经典面试题】环形链表

1.环形链表oj 2. oj解法 利用快慢指针: /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/typedef struct ListNode ListNode; bool hasCycle(struct ListNode *head) {ListNode* slow head, *fast…

如何在 C 语言中进行选择排序?

🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会! 📙C 语言百万年薪修炼课程 通俗易懂,深入浅出,匠心打磨,死磕细节,6年迭代,看过的人都说好。 文章目…

【Python】已解决:AttributeError: target_names(机器学习中查看数据信息报错)

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决:AttributeError: target_names(机器学习中查看数据信息报错) 一、分析问题背景 在机器学习的数据处理阶段,我们经常需要查看…

使用pip或conda离线下载安装包,使用pip或conda安装离线安装包

使用pip或conda离线下载安装包,使用pip或conda安装离线安装包 一、使用pip离线下载安装包1. 在有网络的机器上下载包和依赖2. 传输离线安装包 二、在目标机器上离线安装pip包三、使用conda离线下载安装包1. 在有网络的机器上下载conda包2. 传输conda包或环境包3. 在…

每日一练 - 理解IGMP组播组信息

下面是路由器 RTB 的部分输出信息, 关于输出信息描述错误的是A.接口上动态加入的组播组个数是 1 B.加入的组播组地址是 225.1.1.2 C.dsplay igmp group 命令用来查看 IGMP 组播组信息,包括通过成员报告动态加入的组播组和通过命令行静态加入的组播组信息 D.最后发…

汇编语言 第四版 王爽 一二章总结

第一章 基础知识 汇编语言的三类指令 1. 汇编指令 汇编指令是直接被CPU执行的指令,它们在汇编时被转换为对应的机器码。主要包括: 数据传送指令:如MOV,用于在寄存器、内存和I/O端口之间传送数据。 MOV AX, BX ; 将BX中的数据传…

【手把手教你使用cgroup配置,十分钟就会】

手把手教你使用cgroup配置,十分钟就会 什么是cgroupcgroup中的参数概念及原理 以 memory为例看下如何配置配置内存限制写一个内存申请脚本执行脚本测试结束语 什么是cgroup cgroups 是Linux内核提供的一种可以限制单个进程或者多个进程所使用资源的机制&#xff0c…

postgres 的dblink使用,远程连接数据库

一.安装下载 dblink create extension if not exists dblink 查看是否已经安装 select * from pg_extension;二.运行,查询数据 其中,第一个参数是dblink名字,也可以是连接字符串。 第二个参数是要执行的SQL查询语句。AS子句用于指定返回结…

“学习Pandas中时间序列的基本操作“

目录 # 开篇 1. 创建和操作时间序列对象 2. 时间序列数据的读取和存储 3. 时间序列数据的索引和切片 4. 时间序列数据的操作和转换 5. 时间序列数据的可视化 6. 处理时间序列中的缺失值 7. 时间序列数据的聚合和分组 8. 时间序列的时间区间和偏移量操作 示例代码&…

算法训练营day28--134. 加油站 +135. 分发糖果+860.柠檬水找零+406.根据身高重建队列

一、 134. 加油站 题目链接:https://leetcode.cn/problems/gas-station/ 文章讲解:https://programmercarl.com/0134.%E5%8A%A0%E6%B2%B9%E7%AB%99.html 视频讲解:https://www.bilibili.com/video/BV1jA411r7WX 1.1 初见思路 得模拟分析出…