如何使用Yolov8训练使用输电线数据集绝缘子数据集检测木塔变压器总线破损绝缘子帽数据集电力设施及缺陷检测数据集 ,8932张,yolo和voc两种标注 19类,实现可视化及评估故障变压器数据集

输电线绝缘子数据集 及破损检测数据集
电力设施及缺陷检测数据集,8932张,提供yolo和voc两种标注方式
19类在这里插入图片描述
电力设施及缺陷检测数据集,8932张,提供yolo和voc两种标注方式
19类,标注数量:在这里插入图片描述

Insulator: 绝缘子 - 3408
Broken Insulator Cap: 破损的绝缘子帽 - 2011
Insulator Cap: 绝缘子帽 - 22722
Cable: 电缆 - 24605
Tower (Wooden): 木塔 - 875
Transformer: 变压器 - 317
Front Insulator Cap: 前绝缘子帽 - 4386
Tower (Lattice): 格构塔 - 1011
Tower (Tucohy): Tucohy塔 - 483
Transmission Line: 输电线路 - 517
Damaged Line: 损坏的线路 - 247
Bus: 总线 - 125
Faulty Transformer: 故障变压器 - 6
Spacer between Dampers: 阻尼器之间的间隔 - 51
Broken Insulator: 破损的绝缘子 - 68
Bent Insulator: 弯曲的绝缘子 - 20
Object on TL: 输电线路上的物体 - 120
Capacitor Bank: 电容器组 - 106
Damaged Splice: 损坏的接头 - 83
Image num: 图像数量 - 8932在这里插入图片描述
在这里插入图片描述
如何使用YOLOv8进行电力设施及缺陷检测的数据集训练。我们将使用YOLO格式的数据集来进行目标检测,并确保所有类别都被正确处理。

使用 YOLOv8 进行电力设施及缺陷检测

数据集信息
  • 类别: 19类
  • 图片数量: 共8932张
  • 标注格式:
    • YOLO 格式 (txt)
    • VOC 格式 (xml)
  • 分辨率: 假设为统一的分辨率(例如 640x640)
类别分布
  • Insulator: 绝缘子 - 3408
  • Broken Insulator Cap: 破损的绝缘子帽 - 2011
  • Insulator Cap: 绝缘子帽 - 2272
  • Cable: 电缆 - 24605
  • Tower (Wooden): 木塔 - 875
  • Transformer: 变压器 - 317
  • Front Insulator Cap: 前绝缘子帽 - 4386
  • Tower (Lattice): 格构塔 - 1011
  • Tower (Tucohy): Tucohy塔 - 483
  • Transmission Line: 输电线路 - 517
  • Damaged Line: 损坏的线路 - 247
  • Bus: 总线 - 125
  • Faulty Transformer: 故障变压器 - 6
  • Spacer between Dampers: 阻尼器之间的间隔 - 51
  • Broken Insulator: 破损的绝缘子 - 68
  • Bent Insulator: 弯曲的绝缘子 - 20
  • Object on TL: 输电线路上的物体 - 120
  • Capacitor Bank: 电容器组 - 106
  • Damaged Splice: 损坏的接头 - 83
步骤概述
  1. 数据集准备
  2. 创建数据集配置文件 (data.yaml)
  3. 分割数据集
  4. 训练目标检测模型 (YOLOv8)
  5. 评估目标检测模型
  6. 可视化目标检测结果
  7. 清理临时文件
  8. 推理和显示目标检测结果
详细步骤
1. 数据集准备

确保你的数据集已经按照上述格式准备好,并且包含 images, labels_yololabels_voc 目录。

power_facility_detection/
├── datasets/
│   └── power_facility_dataset/
│       ├── images/
│       │   ├── image1.jpg
│       │   ├── image2.jpg
│       │   └── ...
│       ├── labels_yolo/
│       │   ├── image1.txt
│       │   ├── image2.txt
│       │   └── ...
│       └── labels_voc/
│           ├── image1.xml
│           ├── image2.xml
│           └── ...
└── main.py
2. 创建数据集配置文件 (data.yaml)

创建一个 data.yaml 文件来配置数据集路径和类别信息。

train: ./datasets/power_facility_dataset/train/images
val: ./datasets/power_facility_dataset/val/images

nc: 19  # Number of classes
names: ['Insulator', 'Broken Insulator Cap', 'Insulator Cap', 'Cable', 'Tower (Wooden)', 'Transformer', 'Front Insulator Cap', 'Tower (Lattice)', 'Tower (Tucohy)', 'Transmission Line', 'Damaged Line', 'Bus', 'Faulty Transformer', 'Spacer between Dampers', 'Broken Insulator', 'Bent Insulator', 'Object on TL', 'Capacitor Bank', 'Damaged Splice']
3. 分割数据集

将数据集分割成训练集和验证集。

import os
import random
from pathlib import Path
import shutil

def split_dataset(data_dir, train_ratio=0.8):
    images = list(Path(data_dir).glob('*.jpg'))
    random.shuffle(images)
    
    num_train = int(len(images) * train_ratio)
    train_images = images[:num_train]
    val_images = images[num_train:]
    
    train_dir = Path(data_dir).parent / 'train'
    val_dir = Path(data_dir).parent / 'val'
    
    train_img_dir = train_dir / 'images'
    train_label_dir = train_dir / 'labels_yolo'
    val_img_dir = val_dir / 'images'
    val_label_dir = val_dir / 'labels_yolo'
    
    train_img_dir.mkdir(parents=True, exist_ok=True)
    train_label_dir.mkdir(parents=True, exist_ok=True)
    val_img_dir.mkdir(parents=True, exist_ok=True)
    val_label_dir.mkdir(parents=True, exist_ok=True)
    
    for img in train_images:
        label_path = img.with_suffix('.txt')
        shutil.copy(img, train_img_dir / img.name)
        shutil.copy(label_path, train_label_dir / label_path.name)
    
    for img in val_images:
        label_path = img.with_suffix('.txt')
        shutil.copy(img, val_img_dir / img.name)
        shutil.copy(label_path, val_label_dir / label_path.name)

# 使用示例
split_dataset('./datasets/power_facility_dataset/images')
4. 训练目标检测模型 (YOLOv8)

使用YOLOv8进行目标检测训练。

import torch
from ultralytics import YOLO

# 设置随机种子以保证可重复性
torch.manual_seed(42)

# 定义数据集路径
dataset_config = 'data.yaml'

# 加载预训练的YOLOv8n模型
model = YOLO('yolov8n.pt')

# 训练模型
results = model.train(
    data=dataset_config,
    epochs=100,
    imgsz=640,
    batch=16,
    name='power_facility_detection',
    project='runs/detect'
)

# 评估模型
metrics = model.val()

# 保存最佳模型权重
best_model_weights = 'runs/detect/power_facility_detection/weights/best.pt'
print(f"Best model weights saved to {best_model_weights}")
5. 可视化目标检测结果

可视化目标检测结果。

from ultralytics import YOLO

# 加载训练好的模型
model = YOLO(best_model_weights)

# 可视化训练结果
model.plot_results(save=True, save_dir='runs/detect/power_facility_detection')
6. 清理临时文件

清理不必要的临时文件。

import shutil

def clean_temp_files(project_dir):
    temp_dirs = [
        f'{project_dir}/wandb',
        f'{project_dir}/cache'
    ]
    
    for dir_path in temp_dirs:
        if os.path.exists(dir_path):
            shutil.rmtree(dir_path)
            print(f"Removed directory: {dir_path}")

# 使用示例
clean_temp_files('runs/detect/power_facility_detection')
7. 推理和显示目标检测结果

推理和显示目标检测结果。

from ultralytics import YOLO
import cv2
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt

# 7.1 检测单张图片
def detect_image(model, image_path, conf_threshold=0.5):
    results = model.predict(image_path, conf=conf_threshold)[0]
    annotated_frame = annotate_image(image_path, results, model)
    return annotated_frame

def annotate_image(image_path, results, model):
    frame = cv2.imread(image_path)
    for result in results.boxes.cpu().numpy():
        r = result.xyxy[0].astype(int)
        cls = int(result.cls[0])
        conf = result.conf[0]
        
        label = f"{model.names[cls]} {conf:.2f}"
        color = (0, 255, 0)
        cv2.rectangle(frame, (r[0], r[1]), (r[2], r[3]), color, 2)
        cv2.putText(frame, label, (r[0], r[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, color, 2)
    return frame

# 主函数
def main_detection():
    # 加载模型
    model = YOLO(best_model_weights)
    
    # 测试图片路径
    test_image_path = './datasets/power_facility_dataset/images/test_image.jpg'
    annotated_image = detect_image(model, test_image_path, conf_threshold=0.5)
    cv2.imwrite('annotated_test_image.jpg', annotated_image)
    plt.imshow(cv2.cvtColor(annotated_image, cv2.COLOR_BGR2RGB))
    plt.axis('off')
    plt.show()
    
    # 统计检测到的物体数量
    results = model.predict(test_image_path, conf=0.5)[0]
    class_counts = {}
    for result in results.boxes.cpu().numpy():
        cls = int(result.cls[0])
        class_name = model.names[cls]
        if class_name in class_counts:
            class_counts[class_name] += 1
        else:
            class_counts[class_name] = 1
    
    print("Detection Summary:")
    for class_name, count in class_counts.items():
        print(f"{class_name}: {count}")

if __name__ == "__main__":
    main_detection()
运行脚本

在终端中运行以下命令来执行整个流程:

python main.py

总结

以上文档包含了从数据集准备、目标检测模型训练与评估、可视化结果到推理和显示结果的所有步骤。希望这些详细的信息和代码能够帮助你顺利实施和优化你的电力设施及缺陷检测系统

这段代码涵盖了从数据集准备、目标检测模型训练与评估、可视化结果到推理和显示结果的所有步骤。你可以根据需要调整参数和路径。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值