Advertisement

如何用Yolo训练自己的数据集和权重 ——光伏板热斑缺陷数据集

阅读量:

包含光伏板热斑缺陷的大量图像数据集,并用于目标检测的任务,可按照以下步骤执行

数据集描述

该数据集包含以下三种类别:

  • 热斑(hotspot) :表示光伏板上的热斑问题。
    • 热点(hotpoint) :表示光伏板上的热点问题。
    • 遮挡(occlusion) :表示光伏板上的覆盖现象。

数据集的规模较大,具体划分如下:

  • 训练集 :被用来进行训练的图片占大多数。
    • 验证集 :被用来评估模型性能的图片较少。
    • 测试集 :被用来进行全面评估的图片数量有限。

数据集组织

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

复制代码
 pv_hotspot_dataset/

    
 ├── train/
    
 │   ├── images/
    
 │   └── labels/
    
 ├── valid/
    
 │   ├── images/
    
 │   └── labels/
    
 ├── test/
    
 │   ├── images/
    
 │   └── labels/
    
 └── README.txt  # 数据说明

其中:

  • 该存储目录包含了训练数据集中的图像及对应标注信息。 *
    【* 该存储目录也包含了用于验证的数据及其标注信息。 *
    【* 该存储目录同样包含了用于测试的数据及其标注信息。 *

数据预处理

因为数据量庞大而推荐使用脚本自动化处理来完成分类任务。如随机选取部分样本用于验证和测试。

复制代码
 import os

    
 import random
    
 import shutil
    
  
    
 def split_dataset(src_img_dir, src_ann_dir, dest_train_img_dir, dest_train_ann_dir, dest_valid_img_dir, dest_valid_ann_dir, dest_test_img_dir, dest_test_ann_dir, train_ratio=0.7, valid_ratio=0.2, test_ratio=0.1):
    
     """
    
     将数据集分为训练集、验证集和测试集。
    
     """
    
     filenames = os.listdir(src_img_dir)
    
     random.shuffle(filenames)
    
     total = len(filenames)
    
     train_end = int(total * train_ratio)
    
     valid_end = int(total * (train_ratio + valid_ratio))
    
     train_files = filenames[:train_end]
    
     valid_files = filenames[train_end:valid_end]
    
     test_files = filenames[valid_end:]
    
  
    
     for files, dest_img_dir, dest_ann_dir in [
    
     (train_files, dest_train_img_dir, dest_train_ann_dir),
    
     (valid_files, dest_valid_img_dir, dest_valid_ann_dir),
    
     (test_files, dest_test_img_dir, dest_test_ann_dir)
    
     ]:
    
     os.makedirs(dest_img_dir, exist_ok=True)
    
     os.makedirs(dest_ann_dir, exist_ok=True)
    
     for filename in files:
    
         shutil.copy(f'{src_img_dir}/{filename}', dest_img_dir)
    
         shutil.copy(f'{src_ann_dir}/{filename.replace(".jpg", ".txt")}', dest_ann_dir)
    
  
    
 # 示例调用
    
 split_dataset(
    
     src_img_dir='path/to/pv_hotspot_dataset/images/',
    
     src_ann_dir='path/to/pv_hotspot_dataset/labels/',
    
     dest_train_img_dir='path/to/pv_hotspot_dataset/train/images/',
    
     dest_train_ann_dir='path/to/pv_hotspot_dataset/train/labels/',
    
     dest_valid_img_dir='path/to/pv_hotspot_dataset/valid/images/',
    
     dest_valid_ann_dir='path/to/pv_hotspot_dataset/valid/labels/',
    
     dest_test_img_dir='path/to/pv_hotspot_dataset/test/images/',
    
     dest_test_ann_dir='path/to/pv_hotspot_dataset/test/labels/'
    
 )

数据加载器

我们需要定义一个数据加载器来读取图像和标签文件:

复制代码
 import torch

    
 from torch.utils.data import Dataset, DataLoader
    
 import os
    
 import numpy as np
    
 from PIL import Image
    
 import torchvision.transforms as transforms
    
  
    
 class PVHotspotDataset(Dataset):
    
     def __init__(self, images_dir, labels_dir, transform=None):
    
     self.images_dir = images_dir
    
     self.labels_dir = labels_dir
    
     self.transform = transform
    
     self.image_filenames = [os.path.join(images_dir, f) for f in os.listdir(images_dir)]
    
     self.label_filenames = [os.path.join(labels_dir, f.replace('.jpg', '.txt')) for f in os.listdir(images_dir)]
    
  
    
     def __len__(self):
    
     return len(self.image_filenames)
    
  
    
     def __getitem__(self, idx):
    
     if torch.is_tensor(idx):
    
         idx = idx.tolist()
    
  
    
     img_name = self.image_filenames[idx]
    
     label_name = self.label_filenames[idx]
    
     image = Image.open(img_name).convert("RGB")
    
     with open(label_name, 'r') as f:
    
         labels = []
    
         for line in f.readlines():
    
             label, cx, cy, w, h = line.strip().split()
    
             labels.append([int(label), float(cx), float(cy), float(w), float(h)])
    
     labels = np.array(labels)
    
     
    
     if self.transform:
    
         image = self.transform(image)
    
     
    
     return image, labels
    
  
    
 # 示例转换
    
 transform = transforms.Compose([
    
     transforms.Resize((448, 448)),
    
     transforms.ToTensor(),
    
 ])
    
  
    
 # 创建数据集实例
    
 train_dataset = PVHotspotDataset(
    
     images_dir='path/to/pv_hotspot_dataset/train/images/',
    
     labels_dir='path/to/pv_hotspot_dataset/train/labels/',
    
     transform=transform
    
 )
    
  
    
 valid_dataset = PVHotspotDataset(
    
     images_dir='path/to/pv_hotspot_dataset/valid/images/',
    
     labels_dir='path/to/pv_hotspot_dataset/valid/labels/',
    
     transform=transform
    
 )
    
  
    
 test_dataset = PVHotspotDataset(
    
     images_dir='path/to/pv_hotspot_dataset/test/images/',
    
     labels_dir='path/to/pv_hotspot_dataset/test/labels/',
    
     transform=transform
    
 )
    
  
    
 # 创建数据加载器
    
 train_dataloader = DataLoader(train_dataset, batch_size=4, shuffle=True, num_workers=4)
    
 valid_dataloader = DataLoader(valid_dataset, batch_size=4, shuffle=False, num_workers=4)
    
 test_dataloader = DataLoader(test_dataset, batch_size=4, shuffle=False, num_workers=4)

模型定义

我们可以使用YOLOv5作为基础模型来进行目标检测:

复制代码
 # 假设YOLOv5已经安装并且可用

    
 from yolov5.models.common import DetectMultiBackend
    
 from yolov5.utils.torch_utils import select_device
    
  
    
 device = select_device('')
    
 model = DetectMultiBackend('yolov5s.pt', device=device, dnn=False)  # load FP32 model
    
 model.nc = 3  # number of classes
    
 model.names = ['hotspot', 'hotpoint', 'occlusion']  # class names

模型训练

接下来定义训练循环:

复制代码
 from yolov5.train import train

    
  
    
 # 调用训练函数
    
 train(
    
     data='path/to/data.yaml',
    
     imgsz=448,
    
     batch_size=4,
    
     epochs=100,
    
     workers=4,
    
     device=device,
    
     project='runs/train',
    
     name='pv_hotspot_detection',
    
     exist_ok=True
    
 )

模型评估

在训练完成后,我们需要评估模型的性能:

复制代码
 from yolov5.val import val

    
  
    
 # 调用评估函数
    
 val(
    
     data='path/to/data.yaml',
    
     weights='path/to/weights/best.pt',
    
     imgsz=448,
    
     batch_size=4,
    
     workers=4,
    
     device=device,
    
     project='runs/val',
    
     name='pv_hotspot_detection',
    
     exist_ok=True
    
 )

模型预测

下面是一个使用训练好的模型进行预测的Python脚本示例:

复制代码
 from yolov5.detect import detect

    
  
    
 # 调用预测函数
    
 detect(
    
     weights='path/to/weights/best.pt',
    
     source='path/to/your/image.jpg',
    
     imgsz=448,
    
     conf_thres=0.5,
    
     iou_thres=0.45,
    
     device=device,
    
     project='runs/detect',
    
     name='pv_hotspot_detection',
    
     exist_ok=True
    
 )

数据配置文件

创建一个data.yaml文件来指定数据集路径、类别数量等信息:

复制代码
 path: path/to/pv_hotspot_dataset/

    
 train: train/images/
    
 val: valid/images/
    
 test: test/images/  # test set
    
 nc: 3  # number of classes
    
 names: ['hotspot', 'hotpoint', 'occlusion']  # class names

完整的训练和预测流程

克隆YOLOv5仓库

复制代码
        1. git clone https://github.com/ultralytics/yolov5.git

    
        2. cd yolov5
    
        3. pip install -r requirements.txt

数据预处理

复制代码
    split_dataset.py

运行训练脚本

复制代码
    python train.py --img 448 --batch 4 --epochs 100 --data path/to/data.yaml --cfg models/yolov5s.yaml --weights '' --name pv_hotspot_detection --cache

运行预测脚本

复制代码
    python detect.py --weights path/to/weights/best.pt --source path/to/your/image.jpg --img 448 --conf 0.5 --iou 0.45

注意事项

  • 数据集质量 :保证数据集的质量要素及其相关属性。
    • 模型选择 :建议采用更为先进的模型架构(如YOLOv5l或YOLOv5x)以提升性能水平。
    • 超参数调整 :根据具体情况优化超参数设置,如批量大小(--batch)、图像尺寸(--img)等。
    • 监控性能 :通过监控损失函数值与mAP指标来评估模型表现状态。

按照以下所述的步骤,你可能能够利用YOLOv5来建立一个光伏板热斑缺陷检测的数据集,并利用训练好的模型来进行预测

全部评论 (0)

还没有任何评论哟~