红外图像绝缘子识别数据集,数据集一共919张图片,标注为voc格式,可以转yolo格式
数据集名称
红外图像绝缘子识别数据集 (Infrared Insulator Recognition Dataset, IIRD)
数据集描述
IIRD是一个专为电气工程领域设计的小规模红外图像数据集,特别适用于绝缘子的检测和识别任务。该数据集包含919张高质量的红外图像,每张图像中都标注了绝缘子的位置信息。所有标签以PASCAL VOC格式(XML)提供,并且可以转换为YOLO格式(TXT),方便直接用于基于YOLO的目标检测模型训练。数据集涵盖了多种环境和条件下的绝缘子图像,确保了模型在实际应用中的鲁棒性。
数据规模
- 总样本数量:919张图像
- 类别数量:1个类别(绝缘子)
- 标签格式:PASCAL VOC格式 (XML),可转换为YOLO格式 (TXT)
- 数据集大小:根据图像分辨率和压缩情况而定
图像特性
- 多样化场景:数据集中包括变电站、输电线路等多种环境下的图像。
- 多变环境:图像拍摄于不同的时间点(白天、夜间),保证了算法对光照变化的适应能力。
- 高质量图像:所有图像均为高分辨率,确保细节清晰,有助于提高模型的识别精度。
- 真实场景:图像均为实际拍摄,未经过任何数据增强处理,确保了数据的真实性和多样性。
- 稀有数据:红外图像在电力领域相对较少,该数据集提供了宝贵的训练资源。
类别列表
- 绝缘子 (Insulator)
应用场景
- 电力巡检:辅助无人机或机器人进行电力设备巡检,自动检测绝缘子的状态。
- 故障诊断:通过分析红外图像,快速发现绝缘子的热缺陷或其他异常情况。
- 维护规划:支持电力公司的维护计划,优化检修周期和资源配置。
- 安全监控:提高电力设施的安全监控水平,预防潜在的故障和事故。
数据集结构
一个典型的文件夹结构可能如下所示:
1infrared_insulator_recognition_dataset/
2├── images/
3│ ├── img_00001.jpg
4│ ├── img_00002.jpg
5│ └── ...
6├── annotations/
7│ ├── img_00001.xml
8│ ├── img_00002.xml
9│ └── ...
10├── class_names.txt # 类别名称文件
11├── train.txt # 训练集图像路径列表
12├── val.txt # 验证集图像路径列表
13└── test.txt # 测试集图像路径列表
标签格式说明
- PASCAL VOC格式 :
- 每个图像都有一个对应的XML文件,包含每个对象的类别名及其对应的边界框坐标(xmin, ymin, xmax, ymax)。
示例
假设一张图片img_00001.jpg
的分辨率为640x480像素,其对应的PASCAL VOC格式标签文件img_00001.xml
内容如下:
1<annotation>
2 <folder>images</folder>
3 <filename>img_00001.jpg</filename>
4 <size>
5 <width>640</width>
6 <height>480</height>
7 <depth>3</depth>
8 </size>
9 <object>
10 <name>insulator</name>
11 <bndbox>
12 <xmin>100</xmin>
13 <ymin>150</ymin>
14 <xmax>200</xmax>
15 <ymax>250</ymax>
16 </bndbox>
17 </object>
18 <!-- 更多对象... -->
19</annotation>
转换为YOLO格式
您可以使用以下Python脚本来将PASCAL VOC格式的标签转换为YOLO格式。
脚本: VOC to YOLO转换
1import os
2import xml.etree.ElementTree as ET
3
4def convert_voc_to_yolo(voc_dir, yolo_dir, class_names):
5 if not os.path.exists(yolo_dir):
6 os.makedirs(yolo_dir)
7
8 for filename in os.listdir(voc_dir):
9 if not filename.endswith('.xml'):
10 continue
11
12 tree = ET.parse(os.path.join(voc_dir, filename))
13 root = tree.getroot()
14
15 image_width = int(root.find('size/width').text)
16 image_height = int(root.find('size/height').text)
17
18 yolo_filename = filename.replace('.xml', '.txt')
19 with open(os.path.join(yolo_dir, yolo_filename), 'w') as f:
20 for obj in root.findall('object'):
21 name = obj.find('name').text
22 if name not in class_names:
23 continue
24
25 class_id = class_names.index(name)
26
27 bbox = obj.find('bndbox')
28 xmin = int(bbox.find('xmin').text)
29 ymin = int(bbox.find('ymin').text)
30 xmax = int(bbox.find('xmax').text)
31 ymax = int(bbox.find('ymax').text)
32
33 x_center = (xmin + xmax) / 2.0 / image_width
34 y_center = (ymin + ymax) / 2.0 / image_height
35 width = (xmax - xmin) / image_width
36 height = (ymax - ymin) / image_height
37
38 f.write(f"{class_id} {x_center} {y_center} {width} {height}\n")
39
40# 使用示例
41voc_dir = 'path/to/infrared_insulator_recognition_dataset/annotations'
42yolo_dir = 'path/to/infrared_insulator_recognition_dataset/labels'
43class_names = ['insulator']
44
45convert_voc_to_yolo(voc_dir, yolo_dir, class_names)
数据准备
为了使用此数据集来训练基于YOLO格式的目标检测模型,您需要执行以下步骤:
- 确认数据集划分:确保训练集、验证集和测试集已经正确划分。
- 加载数据:根据所选的框架(如YOLOv5/v7或YOLOv8)加载数据。
- 设置配置文件:根据所选的框架设置相应的配置文件,指定类别数和其他相关参数。
- 开始训练过程:启动训练过程并监控模型的性能。
工具和脚本
您可以利用Python库如torchvision
和PyTorch
来加载和处理数据。以下是一些常用脚本的示例代码,包括数据加载、模型训练和评估。
脚本1: 数据加载
1import os
2from torchvision import transforms
3from torch.utils.data import Dataset, DataLoader
4import cv2
5
6class InfraredInsulatorDataset(Dataset):
7 def __init__(self, image_dir, label_dir, transform=None):
8 self.image_dir = image_dir
9 self.label_dir = label_dir
10 self.transform = transform
11 self.images = [f for f in os.listdir(image_dir) if f.endswith('.jpg') or f.endswith('.png')]
12
13 def __len__(self):
14 return len(self.images)
15
16 def __getitem__(self, idx):
17 img_path = os.path.join(self.image_dir, self.images[idx])
18 label_path = os.path.join(self.label_dir, self.images[idx].replace('.jpg', '.txt').replace('.png', '.txt'))
19
20 image = cv2.imread(img_path)
21 image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
22
23 with open(label_path, 'r') as f:
24 labels = f.readlines()
25
26 bboxes = []
27 for label in labels:
28 class_id, x_center, y_center, width, height = map(float, label.strip().split())
29 bboxes.append([class_id, x_center, y_center, width, height])
30
31 if self.transform:
32 transformed = self.transform(image=image, bboxes=bboxes)
33 image = transformed['image']
34 bboxes = transformed['bboxes']
35
36 return image, bboxes
37
38def load_data(data_dir, batch_size=32):
39 transform = transforms.Compose([
40 transforms.ToTensor(),
41 transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
42 ])
43
44 train_dataset = InfraredInsulatorDataset(os.path.join(data_dir, 'images'), os.path.join(data_dir, 'labels'), transform=transform)
45 val_dataset = InfraredInsulatorDataset(os.path.join(data_dir, 'images'), os.path.join(data_dir, 'labels'), transform=transform)
46 test_dataset = InfraredInsulatorDataset(os.path.join(data_dir, 'images'), os.path.join(data_dir, 'labels'), transform=transform)
47
48 train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True, num_workers=4)
49 val_loader = DataLoader(val_dataset, batch_size=batch_size, shuffle=False, num_workers=4)
50 test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False, num_workers=4)
51
52 return train_loader, val_loader, test_loader
53
54# 使用示例
55data_dir = 'path/to/infrared_insulator_recognition_dataset'
56train_loader, val_loader, test_loader = load_data(data_dir)
脚本2: 模型训练
1import torch
2import torch.nn as nn
3import torch.optim as optim
4from ultralytics import YOLO
5
6def train_model(model, train_loader, val_loader, num_epochs=10, learning_rate=0.001):
7 device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
8 model.to(device)
9
10 optimizer = optim.Adam(model.parameters(), lr=learning_rate)
11
12 for epoch in range(num_epochs):
13 model.train()
14 running_loss = 0.0
15 for images, targets in train_loader:
16 images = images.to(device)
17 targets = [{k: v.to(device) for k, v in t.items()} for t in targets]
18
19 optimizer.zero_grad()
20 loss_dict = model(images, targets)
21 losses = sum(loss for loss in loss_dict.values())
22 losses.backward()
23 optimizer.step()
24
25 running_loss += losses.item()
26
27 print(f'Epoch {epoch+1}/{num_epochs}, Loss: {running_loss/len(train_loader)}')
28
29 # 验证
30 model.eval()
31 with torch.no_grad():
32 for images, targets in val_loader:
33 images = images.to(device)
34 targets = [{k: v.to(device) for k, v in t.items()} for t in targets]
35 outputs = model(images)
36 # 进一步处理验证结果,计算mAP等指标
37 # ...
38
39# 使用示例
40model = YOLO('yolov8m.yaml') # 加载YOLOv8m模型
41train_loader, val_loader, _ = load_data('path/to/infrared_insulator_recognition_dataset')
42train_model(model, train_loader, val_loader)
脚本3: 模型评估
1import torch
2from torch.utils.data import DataLoader
3
4def evaluate_model(model, test_loader):
5 device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
6 model.to(device)
7 model.eval()
8
9 correct = 0
10 total = 0
11 with torch.no_grad():
12 for images, targets in test_loader:
13 images = images.to(device)
14 targets = [{k: v.to(device) for k, v in t.items()} for t in targets]
15 outputs = model(images)
16 # 进一步处理测试结果,计算mAP等指标
17 # ...
18
19# 使用示例
20test_loader = load_data('path/to/infrared_insulator_recognition_dataset')[2]
21evaluate_model(model, test_loader)
项目介绍
项目名称
基于YOLOv8的红外图像绝缘子检测系统
项目描述
该项目旨在开发一个基于YOLOv8的红外图像绝缘子检测系统,能够准确地识别和定位电力设施中的绝缘子。通过使用上述IIRD数据集,我们将训练一个高效的卷积神经网络(CNN)模型,实现对绝缘子的旋转框检测任务。项目的主要目标是提高绝缘子检测的准确性和鲁棒性,同时提供易于部署和使用的接口,方便集成到现有的电力巡检和故障诊断系统中。
项目目标
- 高准确性:在测试集上达到较高的平均精度均值 (mAP)。
- 鲁棒性:在不同光照条件和环境背景下保持良好的检测效果。
- 易用性:提供易于部署和使用的接口,方便集成到现有的系统中。
- 可扩展性:支持未来添加新的检测类别。
项目结构
1infrared_insulator_detection_project/
2├── data/
3│ ├── infrared_insulator_recognition_dataset/
4│ │ ├── images/
5│ │ ├── annotations/ # 原始VOC格式标签
6│ │ ├── labels/ # 转换后的YOLO格式标签
7│ │ ├── class_names.txt
8│ │ ├── train.txt
9│ │ ├── val.txt
10│ │ └── test.txt
11├── models/
12│ ├── yolov8m.py # YOLOv8m模型定义
13├── trainers/
14│ ├── trainer.py # 训练器
15├── utils/
16│ ├── utils.py # 工具函数
17├── scripts/
18│ ├── load_data.py
19│ ├── train_model.py
20│ ├── evaluate_model.py
21├── notebooks/
22│ ├── data_exploration.ipynb # 数据探索笔记本
23│ ├── model_training.ipynb # 模型训练笔记本
24│ ├── model_evaluation.ipynb # 模型评估笔记本
25├── requirements.txt # 依赖库
26└── README.md # 项目说明文件
项目流程
-
数据准备:
- 确认数据集已划分为训练集、验证集和测试集。
- 使用
load_data.py
脚本加载数据。 - 将VOC格式的标签转换为YOLO格式。
-
数据探索:
- 使用
data_exploration.ipynb
笔记本探索数据集,了解数据分布和质量。
- 使用
-
模型训练:
- 使用
train_model.py
脚本训练模型。 - 根据需要调整超参数和模型配置。
- 使用
-
模型评估:
- 使用
evaluate_model.py
脚本评估模型性能。 - 生成可视化结果,比较不同模型的表现。
- 使用
-
推理和应用:
- 将模型集成到实际应用中,实现绝缘子检测功能。
-
结果可视化:
- 使用可视化工具展示模型的检测结果。
改进方向
如果您已经使用上述方法对该数据集进行了训练,并且认为还有改进空间,以下是一些可能的改进方向:
-
数据增强:
- 引入数据增强策略,例如旋转、翻转、缩放、颜色抖动等,以提高模型的泛化能力。
- 使用混合增强技术,如MixUp、CutMix等,以增加数据多样性。
-
模型优化:
- 调整模型超参数,例如学习率、批量大小、优化器等,以找到最佳配置。
- 尝试使用不同的网络架构,例如YOLOv8的不同版本(s, m, l, x),以提高检测精度。
- 引入注意力机制,如SENet、CBAM等,以增强模型对关键区域的关注。
-
损失函数:
- 尝试使用不同的损失函数,例如Focal Loss、Label Smoothing等,以改善检测效果。
- 结合多种损失函数,例如交叉熵损失和正则化损失的组合,以平衡不同类型的任务。
-
后处理:
- 使用非极大值抑制(NMS)等后处理技术,以减少误检和漏检。
- 优化边界框回归,提高定位精度。
-
迁移学习:
- 使用预训练模型进行微调,利用大规模数据集(如COCO)上的预训练权重,加快收敛速度并提高性能。
-
集成学习:
- 使用多个模型进行集成学习,通过投票或加权平均的方式提高最终的检测效果。