输电线绝缘子数据集 及破损检测数据集
电力设施及缺陷检测数据集,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
步骤概述
- 数据集准备
- 创建数据集配置文件 (
data.yaml
) - 分割数据集
- 训练目标检测模型 (YOLOv8)
- 评估目标检测模型
- 可视化目标检测结果
- 清理临时文件
- 推理和显示目标检测结果
详细步骤
1. 数据集准备
确保你的数据集已经按照上述格式准备好,并且包含 images
, labels_yolo
和 labels_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
总结
以上文档包含了从数据集准备、目标检测模型训练与评估、可视化结果到推理和显示结果的所有步骤。希望这些详细的信息和代码能够帮助你顺利实施和优化你的电力设施及缺陷检测系统
这段代码涵盖了从数据集准备、目标检测模型训练与评估、可视化结果到推理和显示结果的所有步骤。你可以根据需要调整参数和路径。