yolov8训练高压输电线路巡检数据集权重 检测识别球窝连接 防振锤 绝缘子 悬垂线夹 三角连板 鸟巢 环型连接等

深度学习目标检测算法yolov8训练高压输电线路巡检数据集权重 识别检测防振锤复合绝缘子 悬垂线夹 三角连板 鸟巢等进行检测

训练这套数据集的流程如何呢?
以下文字及代码仅供参考。
高压输电线路巡检数据集
12000张,(txt格式)
GD01-防振锤 GS01-四分裂方框跳线间隔棒 1101-复合绝缘子 1I02-陶瓷绝缘子
1I03-悬式绝缘子 IX01-悬垂线夹(带碗头挂板) IX02-三角连板
IX03-联板(LK) IX04-重锤片 IX05-联结连接金具
IX06-调整板(DB) IR01-防震环 GC01–悬垂线夹(中心回旋式) IS01-球窝连接
IS02-环型连接ISO3-槽型连接. IS04-挂环(U型) ON01-鸟巢 GC07-楔形线夹

以下是基于 高压输电线路巡检数据集 的详细实现流程,从安装依赖、准备数据集、加载预训练模型、配置 YOLOv8、训练与评估、构建 GUI 应用程序到运行的完整代码。

在这里插入图片描述

1. 安装依赖

确保安装了必要的库:

pip install ultralytics opencv-python pyqt5 pandas torch torchvision

在这里插入图片描述

2. 数据准备

在这里插入图片描述

2.1 数据集结构

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

dataset/
├── images/
│   ├── train/
│   │   ├── img1.jpg
│   │   └── ...
│   └── val/
│       ├── img1.jpg
│       └── ...
└── labels/
    ├── train/
    │   ├── img1.txt
    │   └── ...
    └── val/
        ├── img1.txt
        └── ...

每个标签文件是 .txt 格式,每一行表示一个目标,格式为:

<class_id> <x_center> <y_center> <width> <height>
2.2 数据集配置文件

创建一个 data.yaml 文件,用于定义数据集路径和类别名称:

train: ./dataset/images/train
val: ./dataset/images/val

nc: 16  # 类别数量(根据实际数据集调整)
names:
  - GD01-防振锤
  - GS01-四分裂方框跳线间隔棒
  - 1101-复合绝缘子
  - 1I02-陶瓷绝缘子
  - 1I03-悬式绝缘子
  - IX01-悬垂线夹(带碗头挂板)
  - IX02-三角连板
  - IX03-联板(LK)
  - IX04-重锤片
  - IX05-联结连接金具
  - IX06-调整板(DB)
  - IR01-防震环
  - GC01-悬垂线夹(中心回旋式)
  - IS01-球窝连接
  - IS02-环型连接
  - ISO3-槽型连接
  - IS04-挂环(U型)
  - ON01-鸟巢
  - GC07-楔形线夹

3. 配置 YOLOv8

使用 ultralytics 提供的 YOLOv8 模型进行训练和推理。


4. 训练与评估

4.1 训练代码

编写训练代码,使用 YOLOv8 进行训练:

from ultralytics import YOLO

def train_model():
    # 加载预训练模型
    model = YOLO('yolov8n.pt')  # 使用 YOLOv8 Nano 预训练模型

    # 开始训练
    model.train(
        data='data.yaml',       # 数据集配置文件
        epochs=100,             # 训练轮数
        imgsz=640,              # 输入图片尺寸
        batch=16,               # 批次大小
        device='cuda',          # 使用 GPU
        workers=8,              # 数据加载线程数
        project='runs/train',   # 训练结果保存路径
        name='exp'              # 实验名称
    )

if __name__ == "__main__":
    train_model()
4.2 评估代码

编写评估代码,在验证集上评估模型性能:

from ultralytics import YOLO

def evaluate_model():
    model = YOLO("runs/train/exp/weights/best.pt")  # 加载训练好的模型
    metrics = model.val()  # 在验证集上评估模型
    print(metrics)

if __name__ == "__main__":
    evaluate_model()

5. 构建 GUI 应用程序

使用 PyQt5 构建一个简约的系统 UI 界面,支持图片、视频和摄像头检测,并导出检测结果。

完整 GUI 代码
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QLabel, QVBoxLayout, QWidget, QFileDialog, QMessageBox, QComboBox
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtCore import QTimer
from ultralytics import YOLO
import cv2
import pandas as pd
import os

class PowerLineInspector(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("高压输电线路巡检系统")
        self.setGeometry(100, 100, 800, 600)

        # 初始化模型
        self.model = YOLO("runs/train/exp/weights/best.pt")  # 加载训练好的模型
        self.class_names = [
            'GD01-防振锤', 'GS01-四分裂方框跳线间隔棒', '1101-复合绝缘子', '1I02-陶瓷绝缘子',
            '1I03-悬式绝缘子', 'IX01-悬垂线夹(带碗头挂板)', 'IX02-三角连板', 'IX03-联板(LK)',
            'IX04-重锤片', 'IX05-联结连接金具', 'IX06-调整板(DB)', 'IR01-防震环',
            'GC01-悬垂线夹(中心回旋式)', 'IS01-球窝连接', 'IS02-环型连接', 'ISO3-槽型连接',
            'IS04-挂环(U型)', 'ON01-鸟巢', 'GC07-楔形线夹'
        ]
        self.current_class = None  # 当前选择的目标类别

        # UI 元素
        self.label = QLabel(self)
        self.label.setGeometry(50, 50, 700, 400)

        self.btn_image = QPushButton("选择图片", self)
        self.btn_video = QPushButton("选择视频", self)
        self.btn_camera = QPushButton("打开摄像头", self)
        self.btn_export = QPushButton("导出结果", self)
        self.combo_classes = QComboBox(self)

        self.btn_image.setGeometry(50, 500, 150, 40)
        self.btn_video.setGeometry(220, 500, 150, 40)
        self.btn_camera.setGeometry(390, 500, 150, 40)
        self.btn_export.setGeometry(560, 500, 150, 40)
        self.combo_classes.setGeometry(320, 550, 150, 40)

        # 绑定按钮事件
        self.btn_image.clicked.connect(self.detect_single_image)
        self.btn_video.clicked.connect(self.detect_video)
        self.btn_camera.clicked.connect(self.open_camera)
        self.btn_export.clicked.connect(self.export_results)
        self.combo_classes.addItems(["All"] + self.class_names)
        self.combo_classes.currentTextChanged.connect(self.switch_class)

        # 视频捕获相关
        self.cap = None
        self.timer = QTimer()
        self.timer.timeout.connect(self.update_frame)

        # 存储检测结果
        self.results_data = []

    def detect_single_image(self):
        """检测单张图片"""
        file_path, _ = QFileDialog.getOpenFileName(self, "选择图片", "", "Images (*.jpg *.png)")
        if file_path:
            self.process_image(file_path)

    def detect_video(self):
        """检测视频文件"""
        file_path, _ = QFileDialog.getOpenFileName(self, "选择视频", "", "Videos (*.mp4 *.avi)")
        if file_path:
            self.cap = cv2.VideoCapture(file_path)
            self.timer.start(30)

    def open_camera(self):
        """打开摄像头进行实时检测"""
        self.cap = cv2.VideoCapture(0)
        self.timer.start(30)

    def update_frame(self):
        """更新视频帧或摄像头捕获的画面"""
        ret, frame = self.cap.read()
        if ret:
            self.process_image(frame=frame, is_video=True)

    def process_image(self, file_path=None, frame=None, is_video=False):
        """处理图片并显示结果"""
        if not is_video:
            frame = cv2.imread(file_path)

        # 使用 YOLOv8 进行检测
        results = self.model(frame)

        # 统计目标数量
        counts = {cls: 0 for cls in self.class_names}
        for result in results:
            boxes = result.boxes.xyxy.cpu().numpy()
            classes = result.boxes.cls.cpu().numpy()
            confidences = result.boxes.conf.cpu().numpy()

            for box, cls, conf in zip(boxes, classes, confidences):
                class_name = self.model.names[int(cls)]
                counts[class_name] += 1

                # 如果当前类别匹配,则绘制边界框
                if self.current_class == "All" or class_name == self.current_class:
                    x1, y1, x2, y2 = map(int, box)
                    label = f"{class_name} {conf:.2f}"
                    cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
                    cv2.putText(frame, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)

            # 保存检测结果
            if not is_video:
                self.results_data.append({
                    "file": file_path,
                    **counts,
                    "detection_time": pd.Timestamp.now()
                })

        # 显示结果
        if is_video:
            self.display_frame(frame)
        else:
            self.display_image(frame)

    def display_image(self, frame):
        """显示图片"""
        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        height, width, channel = frame.shape
        bytes_per_line = 3 * width
        q_img = QImage(frame.data, width, height, bytes_per_line, QImage.Format_RGB888)
        self.label.setPixmap(QPixmap.fromImage(q_img))

    def display_frame(self, frame):
        """显示视频帧"""
        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        height, width, channel = frame.shape
        bytes_per_line = 3 * width
        q_img = QImage(frame.data, width, height, bytes_per_line, QImage.Format_RGB888)
        self.label.setPixmap(QPixmap.fromImage(q_img))

    def switch_class(self, class_name):
        """切换目标类别"""
        self.current_class = class_name if class_name != "All" else None

    def export_results(self):
        """导出检测结果为 Excel 或 CSV 文件"""
        if not self.results_data:
            QMessageBox.warning(self, "警告", "没有检测结果可导出!")
            return

        file_path, _ = QFileDialog.getSaveFileName(self, "保存结果", "", "Excel Files (*.xlsx);;CSV Files (*.csv)")
        if file_path:
            df = pd.DataFrame(self.results_data)
            if file_path.endswith(".xlsx"):
                df.to_excel(file_path, index=False)
            elif file_path.endswith(".csv"):
                df.to_csv(file_path, index=False)
            QMessageBox.information(self, "成功", "结果已导出!")

if __name__ == "__main__":
    app = QApplication([])
    window = PowerLineInspector()
    window.show()
    app.exec_()

7. 运行说明

  1. 将数据集放入正确路径,并确保 data.yaml 文件配置正确。
  2. 使用训练代码训练模型。
  3. 使用评估代码测试模型性能。
  4. 启动 GUI 应用程序,加载训练好的权重文件进行检测。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值