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

        最近研究了一个项目,利用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实现仪表盘实例分割

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

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

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

### 指针仪表读数异常检测方法及解决方案 #### 基于深度学习指针式仪表图像智能读数方法 对于指针仪表读数异常检测,可以采用基于深度学习的方法来进行。具体来说,使用YOLOv5模型对表盘图像上的半指针、表盘中心和刻度字符进行检测[^1]。这种方法能够减少预处理步骤带来的累积误差,并且提高了指针提取的速度和准确性。 当检测到这些目标对象后,可以根据检测结果连接表盘中心和指针的针尖构成指针线,同时根据检测的刻度中心点通过欧式距离寻找指针的近邻刻度线。此过程中还可以加入异常判断逻辑: - **角度偏差校验**:计算实际测量得到的角度与理论应有角度之间的差异。如果超出设定范围,则认为存在异常。 - **位置合理性验证**:检查指针末端是否位于合理的区域范围内(即靠近某个特定刻度)。如果不符合理论预期的位置分布规律,则标记为潜在错误数据。 此外,在某些应用场景下可以直接跳过复杂的刻度字符识别环节而依赖预先配置好的参数信息来简化流程并提升效率。然而为了适应更多种类未见过类型的仪表设备,仍然建议保留定的自适应能力用于处理未知模式下的输入样本。 #### 利用OpenCV的传统计算机视觉技术实现初步筛选 另种思路是从传统计算机视觉出发,借助OpenCV库完成基本形态学操作如圆形轮廓捕捉以及线条特征抽取等工作[^2]。虽然这类方案相对简单易懂易于部署实施,但是其鲁棒性和泛化性能往往不如前者强大。因此可以在前期利用Hough变换等手段做轮粗略过滤之后再结合机器学习算法进步精细化分析可疑案例。 例如,先通过霍夫曼圆检测定位表盘边界,随后应用Canny算子获取边缘响应强度较高的像素集合形成候选集;接着尝试拟合最佳匹配路径代表真实的指针轨迹走向。在此基础上引入额外约束条件评估所得结论的有效性——比如考察是否存在明显偏离正常趋势的情况发生。 综上所述,无论是选择先进的神经网络架构还是经典的图形处理技巧都可以有效地辅助发现并纠正可能出现的问题所在之处。重要的是根据不同业务需求权衡利弊选取最合适的工具组合起来构建套完整的质量监控体系。 ```python import cv2 import numpy as np def detect_abnormal_readings(image_path): img = cv2.imread(image_path, 0) # 使用Canny算子提取边缘 edges = cv2.Canny(img, threshold1=50, threshold2=150) # 应用霍夫曼直线检测找到疑似指针 lines = cv2.HoughLinesP(edges, rho=1, theta=np.pi/180, threshold=70, minLineLength=30, maxLineGap=10) abnormal_flags = [] if lines is not None: for line in lines: x1, y1, x2, y2 = line[0] # 计算每条线段对应的角度值 angle = np.arctan((y2-y1)/(x2-x1)) * (180 / np.pi) # 这里假设有个标准角度区间[-threshold_angle, +threshold_angle] if abs(angle) > THRESHOLD_ANGLE: abnormal_flags.append(True) else: abnormal_flags.append(False) return any(abnormal_flags) THRESHOLD_ANGLE = 5 # 设置允许的最大偏转角 print(detect_abnormal_readings('path_to_your_image')) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zy_destiny

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值