Advertisement

使用YOLOv8来训练一个钢材表面缺陷检测数据集,并使用OpenCV和Tkinter构建一个GUI应用程序来进行检测 ——钢材缺陷检测识别+数据集+代码

阅读量:

可以通过YOLOv8组织训练数据集来完成钢材表面缺陷检测任务,并且可以通过OpenCV与Tkinter结合开发一个GUI应用程序来进行图像、视频以及实时摄像头上的缺陷检测。

数据集描述

该数据集包含以下信息:

  • 数据规模 :共包含4312张图像样本
    • 分类项数 :共有6类分类项
      • 裂纹现象:该分类项下包含较多的研究文献
      • 杂质:分析了图像中常见的金属杂质分布情况
      • 斑块状物:识别出图像中的斑块状金属颗粒特征
      • 亚微米级表面损伤:重点研究了亚微米尺度的表面损伤特征
      • 铁路道岔处的鳞状结构:分析了不同道岔处金属组织中的鳞状结构特征
      • 划痕状态:评估了不同划痕状态下的金属性能变化规律

数据集组织

假设你的数据集目录结构如下:

复制代码
复制代码
 steel_defect_dataset/

    
 ├── train/
    
 │   ├── images/
    
 │   └── labels/
    
 ├── valid/
    
 │   ├── images/
    
 │   └── labels/
    
 └── data.yaml  # 数据配置文件
    
    
    
    
    AI写代码

其中:

  • train/ 存储着训练数据集的所有图像及其对应的标注信息文件。
  • valid/ 存储着验证数据集的所有图像及其对应的标注信息文件。
  • data.yaml 包含了完整的数据配置参数。

数据配置文件

创建或确认data.yaml文件是否正确配置了数据集路径和类别信息:

复制代码
 train: ./train/images/  # 训练集图像路径

    
 val: ./valid/images/  # 验证集图像路径
    
 test: ./test/images/  # 测试集图像路径(如果有)
    
  
    
 # Classes
    
 nc: 6  # 类别数量
    
 names: ['crazing', 'inclusion', 'patches', 'pitted_surface', 'rolled-in_scale', 'scratches']  # 类别名称列表
    
    
    
    
    AI写代码

安装相关库

确保安装了以下库:

复制代码
 pip install opencv-python-headless  # 如果不需要显示窗口,可以使用headless版本

    
 pip install opencv-python            # 如果需要显示窗口
    
 pip install ultralytics
    
 pip install tk
    
    
    
    
    AI写代码

构建GUI应用程序

开发一个基于图形用户界面(GUI)的应用程序。该应用能够实现对图像识别、视频分析以及实时摄像头数据处理的功能模块设计。

主要功能模块
  1. 导入预训练好的YOLOv8模型。
  2. 完成一张图片的图像识别任务。
  3. 解析视频流,并对每帧执行分析。
  4. 通过实时获取摄像头画面完成监控。
示例代码

以下是一个基于Python的简单GUI程序范例。该程序采用Tkinter库构建界面框架,并结合YOLOv8模型进行目标检测的同时利用OpenCV库展示检测结果

复制代码
 import tkinter as tk

    
 from tkinter import filedialog
    
 import cv2
    
 import numpy as np
    
 from ultralytics import YOLO
    
  
    
 # 加载模型
    
 model = YOLO("path/to/best.pt")  # 替换为实际的模型路径
    
  
    
 def detect_image(image_path):
    
     results = model.predict(source=image_path, conf=0.5)
    
     result = results[0]
    
     boxes = result.boxes.xyxy.cpu().numpy().astype(int)
    
     labels = result.names
    
     for box in boxes:
    
     cv2.rectangle(image, (box[0], box[1]), (box[2], box[3]), (0, 255, 0), 2)
    
     cv2.putText(image, labels[int(result.boxes.cls[box])], (box[0], box[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
    
     cv2.imshow("Detected Image", image)
    
     cv2.waitKey(0)
    
     cv2.destroyAllWindows()
    
  
    
 def detect_video(video_path):
    
     cap = cv2.VideoCapture(video_path)
    
     while True:
    
     ret, frame = cap.read()
    
     if not ret:
    
         break
    
     results = model.predict(source=frame, conf=0.5)
    
     result = results[0]
    
     boxes = result.boxes.xyxy.cpu().numpy().astype(int)
    
     labels = result.names
    
     for box in boxes:
    
         cv2.rectangle(frame, (box[0], box[1]), (box[2], box[3]), (0, 255, 0), 2)
    
         cv2.putText(frame, labels[int(result.boxes.cls[box])], (box[0], box[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
    
     cv2.imshow("Detected Video", frame)
    
     if cv2.waitKey(1) & 0xFF == ord('q'):
    
         break
    
     cap.release()
    
     cv2.destroyAllWindows()
    
  
    
 def detect_camera():
    
     cap = cv2.VideoCapture(0)
    
     while True:
    
     ret, frame = cap.read()
    
     if not ret:
    
         break
    
     results = model.predict(source=frame, conf=0.5)
    
     result = results[0]
    
     boxes = result.boxes.xyxy.cpu().numpy().astype(int)
    
     labels = result.names
    
     for box in boxes:
    
         cv2.rectangle(frame, (box[0], box[1]), (box[2], box[3]), (0, 255, 0), 2)
    
         cv2.putText(frame, labels[int(result.boxes.cls[box])], (box[0], box[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
    
     cv2.imshow("Camera Detection", frame)
    
     if cv2.waitKey(1) & 0xFF == ord('q'):
    
         break
    
     cap.release()
    
     cv2.destroyAllWindows()
    
  
    
 def select_image():
    
     file_path = filedialog.askopenfilename()
    
     if file_path:
    
     image = cv2.imread(file_path)
    
     detect_image(image)
    
  
    
 def select_video():
    
     file_path = filedialog.askopenfilename()
    
     if file_path:
    
     detect_video(file_path)
    
  
    
 # 创建主窗口
    
 root = tk.Tk()
    
 root.title("钢材表面缺陷检测")
    
  
    
 # 创建按钮
    
 btn_image = tk.Button(root, text="选择图片", command=select_image)
    
 btn_video = tk.Button(root, text="选择视频", command=select_video)
    
 btn_camera = tk.Button(root, text="启动摄像头", command=detect_camera)
    
  
    
 # 布局
    
 btn_image.pack(pady=10)
    
 btn_video.pack(pady=10)
    
 btn_camera.pack(pady=10)
    
  
    
 root.mainloop()
    
    
    
    
    AI写代码

运行效果

运行上述代码后,你会得到一个包含三个按钮的GUI窗口:

  • 加载图片 :点击进入界面后会显示一个选项页面,请用户选择一张图片并执行检测操作。
  • 加载视频文件 :用户点击进入选项页面后会看到多个视频文件列表,请您选择其中一个并开始检测流程。
  • 打开摄像头设备 :用户操作流程中,在设备管理界面进行设置之后即可打开摄像头设备进行实时监控。

按照以下步骤操作:首先使用YOLOv8训练钢材表面缺陷检测的数据集;然后同时利用OpenCV和Tkinter搭建一个缺陷检测系统。

全部评论 (0)

还没有任何评论哟~