无人机电力巡检图像数据集 | 输电线路避障识别、语义分割、目标检测、深度学习模型训练素材10298期

标签:#无人机电力巡检 #输电线路识别 #电缆电塔检测 #图像分割数据集 #UNet语义分割 #YOLO目标检测 #智慧电网AI运维 #计算机视觉工程实战


国内输电线路覆盖山地、丘陵、旷野等复杂野外环境,传统人工巡检模式不仅作业半径大、徒步巡检效率极低,还存在高空触电、山体滑坡、极端天气作业等重大安全隐患。现阶段无人机已成为电力线路巡检的主流载体,但无人机自主避障、航线悬停、线路精准跟踪高度依赖AI视觉算法:如何从航拍画面中精准区分不同类型电缆、差异化输电塔,过滤无效背景干扰,是实现无人机全自动巡检、智能避障的核心技术难点。而行业内专业标注的输电线路图像数据集稀缺、类别划分粗糙、标注格式不统一,大幅抬高了电力视觉算法的研发门槛。本次分享的无人机输电线路专用标注数据集,面向目标检测+语义分割双任务设计,细分线路与塔架品类、增设无效背景过滤类别,完美适配UNet、YOLO等主流深度学习模型,可直接用于无人机避障算法、线路分割模型、电力设施目标检测系统的训练、调优与工程落地,帮助研发团队快速攻克电力巡检视觉识别难题。
在这里插入图片描述

二、数据集详细介绍

2.1 整体概述

本数据集为无人机航拍视角下的户外输电线路实景图像,聚焦无人机电力巡检避障、线路分割、设施识别三大核心场景,针对电力行业设施特征做精细化类别划分,同时适配目标检测、语义分割两大计算机视觉主流任务。数据标注规范统一,无需二次格式转换,可无缝对接PyTorch、TensorFlow、PaddlePaddle等框架,兼顾学术研究、算法实训与工业项目落地等多种使用场景。

在这里插入图片描述

2.2 类别体系(6大细分类别)

数据集结合输电线路现场运维、无人机避障的实际需求,对电力核心设施进行精细化拆分,同时设置空类过滤冗余背景,类别体系贴合真实巡检工况,解决通用数据集品类模糊、无法满足细分识别的问题:

类别名称 场景释义 应用方向
电缆1 第一类输电电缆 线路跟踪、障碍物预判、语义分割
电缆2 第二类输电电缆 区分不同规格线缆,适配精细化避障逻辑
格构塔 钢结构格构式输电塔 大型电力塔架识别、远距离目标检测
塔_tucohy 特种结构输电塔 异形塔架识别,适配复杂线路巡检场景
木质塔 木质材质输电塔 老旧线路塔架专项识别,差异化运维
空类 无效背景/无目标区域 过滤天空、植被、地面等干扰,降低模型误检率

在这里插入图片描述在这里插入图片描述

2.3 核心数据参数

  1. 数据总量:共计1927张全标注实景图像,数据体量处于电力视觉数据集中等水平,既可以满足中小型深度学习模型完整训练、特征学习需求,又不会因数据量过大拉长训练周期、增加硬件算力消耗,在训练效率与模型泛化能力之间实现平衡。
  2. 图像质量:图像分辨率适配无人机航拍标准,能够清晰呈现电缆走向、塔架轮廓、部件细节等关键特征,可支撑模型完成小目标特征提取、边缘轮廓分割等任务,适配野外逆光、强光、复杂遮挡等真实拍摄环境。
  3. 标注格式:原生适配主流目标检测标注格式,同时兼容语义分割任务标签规则,一套数据可同时开展YOLO目标检测、UNet语义分割两类实验,拓展性极强。
  4. 适用场景:无人机自主避障算法、输电线路语义分割、电力设施多目标检测、巡检航线智能规划、线路状态监测等。

在这里插入图片描述

2.4 产业与技术应用价值

  1. 工程落地层面:赋能智慧电网全自动巡检系统,依托AI识别结果实现无人机自动避障、定点悬停巡检,替代高危人工巡检,压缩运维成本,提升线路故障排查效率。
  2. 算法研发层面:补齐输电线路细分品类的训练数据短板,助力工程师优化模型在野外复杂背景、小目标、遮挡场景下的识别精度与鲁棒性,推动电力视觉算法迭代。
  3. 学习实训层面:适合深度学习从业者、电力智能化开发人员开展目标检测+语义分割多任务联合实战,完整覆盖数据集处理、模型训练、推理部署全流程。
  4. 安全保障层面:精准区分各类电力设施与无效背景,减少无人机巡检过程中的误判、撞线风险,保障巡检设备与输电线路双重安全。
    在这里插入图片描述

三、运行环境与依赖配置

3.1 推荐运行环境

操作系统:Windows 10/11、Ubuntu 18.04/20.04、macOS;
Python版本:3.8 ~ 3.11(全框架兼容);
硬件建议:GPU(NVIDIA,CUDA 11.2及以上),8G显存可满足基础训练,16G及以上显存可开启大批次训练与数据增强;CPU仅支持推理与小规模调试。

在这里插入图片描述

3.2 依赖库一键安装命令

同时适配YOLO目标检测、UNet语义分割两大任务,集成图像处理、模型训练、数据统计全套工具:

# 电力巡检视觉项目全套依赖安装
pip install ultralytics torch torchvision opencv-python numpy pillow matplotlib scikit-image albumentations
  • ultralytics:YOLO系列模型核心库,用于输电设施目标检测;
  • torch/torchvision:PyTorch基础框架,支撑UNet语义分割模型训练;
  • albumentations:专业图像增强库,适配野外航拍图像数据增广;
  • scikit-image:图像轮廓、边缘处理,辅助分割任务后处理。

四、深度学习实战代码(附带电力巡检场景专属注释)

结合数据集特性,提供数据集划分、YOLOv8多目标检测训练、UNet线路语义分割训练、批量图像推理四大核心模块,代码针对无人机航拍、电力小目标、复杂背景做专项优化,每段代码附带行业实战经验注释。

4.1 数据集自动划分脚本(训练集:验证集 = 8:2)

场景经验:1927张航拍图像按8:2划分后,训练集1542张、验证集385张,样本分布均衡。输电线路图像存在大量相似背景、连续拍摄画面,代码开启全局随机打乱,避免同一场景数据集中在单一集合,防止模型出现验证集泛化失效问题。同时兼容检测/分割两类数据目录结构。

import os
import random
import shutil

# ===================== 全局配置(根据本地路径修改)=====================
raw_data_root = "./power_line_raw"   # 原始数据集根目录
split_data_root = "./power_line_split" # 划分后数据集保存目录
train_ratio = 0.8  # 训练集占比
img_suffix = [".jpg", ".png", ".jpeg"] # 支持图像格式
# ===================================================================

def split_power_dataset():
    # 初始化训练、验证文件夹
    train_img_dir = os.path.join(split_data_root, "train", "images")
    train_label_dir = os.path.join(split_data_root, "train", "labels")
    val_img_dir = os.path.join(split_data_root, "val", "images")
    val_label_dir = os.path.join(split_data_root, "val", "labels")

    # 递归创建文件夹
    for dir_path in [train_img_dir, train_label_dir, val_img_dir, val_label_dir]:
        os.makedirs(dir_path, exist_ok=True)

    # 遍历所有图像文件
    all_img_list = []
    for root, dirs, files in os.walk(raw_data_root):
        for file in files:
            if os.path.splitext(file)[-1].lower() in img_suffix:
                all_img_list.append(file)

    # 核心操作:全局随机打乱,规避航拍连续画面带来的数据偏差
    random.shuffle(all_img_list)
    split_index = int(len(all_img_list) * train_ratio)
    train_files = all_img_list[:split_index]
    val_files = all_img_list[split_index:]

    # 拷贝图像+对应标签(YOLO标签格式:同名txt文件)
    def copy_data(file_list, img_target, label_target):
        for file_name in file_list:
            img_src = os.path.join(raw_data_root, file_name)
            label_name = os.path.splitext(file_name)[0] + ".txt"
            label_src = os.path.join(raw_data_root, label_name)

            shutil.copy(img_src, os.path.join(img_target, file_name))
            if os.path.exists(label_src):
                shutil.copy(label_src, os.path.join(label_target, label_name))

    copy_data(train_files, train_img_dir, train_label_dir)
    copy_data(val_files, val_img_dir, val_label_dir)

    print("数据集划分完成!")
    print(f"训练集图像数量:{len(train_files)}")
    print(f"验证集图像数量:{len(val_files)}")

if __name__ == "__main__":
    split_power_dataset()

4.2 YOLOv8 输电线路多目标检测训练代码

场景经验:输电电缆、小型塔架属于典型航拍小目标,设置imgsz=800提升小目标特征提取能力;野外图像光照复杂、遮挡频发,开启Mosaic、旋转增强模拟复杂工况;6分类任务采用迁移学习,基于预训练权重微调,大幅提升收敛速度,适合中小规模数据集训练。

from ultralytics import YOLO
import torch

# ===================== 检测模型训练专属配置 =====================
data_yaml_path = "./power_line.yaml"  # YOLO数据集配置文件路径
model_weight = "yolov8s.pt"            # 基础模型:n(轻量)、s(平衡)、m(高精度)
epochs = 120                           # 训练轮次,电力小目标建议100-150轮
img_size = 800                         # 航拍小目标专属分辨率
batch_size = 8                         # 8G显存设8,16G显存可设16
device = 0 if torch.cuda.is_available() else "cpu"
patience = 20                          # 早停机制,连续20轮不提升则停止,防止过拟合
# =================================================================

def train_power_detection():
    # 加载预训练模型
    model = YOLO(model_weight)

    # 启动训练(电力巡检场景超参优化)
    train_res = model.train(
        data=data_yaml_path,
        epochs=epochs,
        imgsz=img_size,
        batch=batch_size,
        device=device,
        patience=patience,
        mosaic=1.0,        # 开启马赛克增强,适配复杂背景与目标重叠
        degrees=15,        # 随机旋转,适配无人机不同拍摄角度
        scale=0.4,         # 尺度变换,适配远近不同距离的电力设施
        box=7.0,           # 提升检测框回归精度,贴合电缆、塔架轮廓
        name="power_line_detect"
    )
    print("YOLOv8目标检测模型训练完成!")
    print("最优权重保存路径:runs/detect/power_line_detect/weights/best.pt")
    return train_res

if __name__ == "__main__":
    train_power_detection()

配套power_line.yaml配置文件(YOLO标准格式):

train: ./power_line_split/train/images
val: ./power_line_split/val/images
nc: 6  # 类别总数
names: ["电缆1", "电缆2", "格构塔", "塔_tucohy", "木质塔", "空类"]

4.3 UNet 输电线路语义分割训练代码

场景经验:电缆属于细长型线性目标,语义分割对边缘精度要求高;数据集图像背景多为天空、植被,使用UNet基础模型兼顾精度与推理速度,适合无人机边缘端部署;使用albumentations做针对性图像增强,解决野外逆光、阴影问题。

import torch
import torch.nn as nn
from torch.utils.data import Dataset, DataLoader
import albumentations as A
from albumentations.pytorch import ToTensorV2
import cv2
import os

# ===================== 分割任务基础配置 =====================
DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")
IMG_HEIGHT = 640
IMG_WIDTH = 640
BATCH_SIZE = 4
EPOCHS = 80
NUM_CLASSES = 6  # 分割类别与数据集保持一致
train_img_path = "./power_line_split/train/images"
train_mask_path = "./power_line_split/train/masks"
# ===========================================================

# 简易UNet基础模型(轻量化,适配无人机边缘部署)
class DoubleConv(nn.Module):
    def __init__(self, in_channels, out_channels):
        super().__init__()
        self.conv = nn.Sequential(
            nn.Conv2d(in_channels, out_channels, 3, padding=1),
            nn.BatchNorm2d(out_channels),
            nn.ReLU(inplace=True),
            nn.Conv2d(out_channels, out_channels, 3, padding=1),
            nn.BatchNorm2d(out_channels),
            nn.ReLU(inplace=True)
        )
    def forward(self, x):
        return self.conv(x)

class UNet(nn.Module):
    def __init__(self, in_channels=3, out_channels=6):
        super().__init__()
        self.in_conv = DoubleConv(in_channels, 64)
        self.down1 = nn.MaxPool2d(2)
        self.conv1 = DoubleConv(64, 128)
        self.down2 = nn.MaxPool2d(2)
        self.conv2 = DoubleConv(128, 256)
        self.up1 = nn.ConvTranspose2d(256, 128, 2, stride=2)
        self.conv3 = DoubleConv(256, 128)
        self.up2 = nn.ConvTranspose2d(128, 64, 2, stride=2)
        self.conv4 = DoubleConv(128, 64)
        self.out_conv = nn.Conv2d(64, out_channels, 1)

    def forward(self, x):
        x1 = self.in_conv(x)
        x2 = self.conv1(self.down1(x1))
        x3 = self.conv2(self.down2(x2))
        x = self.up1(x3)
        x = torch.cat([x, x2], dim=1)
        x = self.conv3(x)
        x = self.up2(x)
        x = torch.cat([x, x1], dim=1)
        x = self.conv4(x)
        out = self.out_conv(x)
        return out

# 数据集加载类(适配电力分割数据)
class PowerSegDataset(Dataset):
    def __init__(self, img_dir, mask_dir, transform=None):
        self.img_dir = img_dir
        self.mask_dir = mask_dir
        self.transform = transform
        self.images = os.listdir(img_dir)

    def __len__(self):
        return len(self.images)

    def __getitem__(self, index):
        img_path = os.path.join(self.img_dir, self.images[index])
        mask_path = os.path.join(self.mask_dir, self.images[index].replace(".jpg", ".png"))
        image = cv2.imread(img_path)
        mask = cv2.imread(mask_path, cv2.IMREAD_GRAYSCALE)

        if self.transform:
            aug = self.transform(image=image, mask=mask)
            image = aug["image"]
            mask = aug["mask"]
        return image, mask

# 电力航拍图像专属增强策略
train_transform = A.Compose([
    A.Resize(IMG_HEIGHT, IMG_WIDTH),
    A.HorizontalFlip(p=0.5),
    A.RandomBrightnessContrast(p=0.3),  # 适配野外逆光、明暗变化
    A.ShiftScaleRotate(p=0.3),
    ToTensorV2()
])

# 训练主函数
def train_unet_segment():
    # 初始化数据集、加载器、模型
    dataset = PowerSegDataset(train_img_path, train_mask_path, train_transform)
    loader = DataLoader(dataset, batch_size=BATCH_SIZE, shuffle=True)
    model = UNet(in_channels=3, out_channels=NUM_CLASSES).to(DEVICE)
    loss_fn = nn.CrossEntropyLoss()
    optimizer = torch.optim.Adam(model.parameters(), lr=1e-4)

    # 循环训练
    for epoch in range(EPOCHS):
        model.train()
        total_loss = 0
        for imgs, masks in loader:
            imgs = imgs.to(DEVICE).float() / 255.0
            masks = masks.to(DEVICE).long()
            preds = model(imgs)
            loss = loss_fn(preds, masks)

            optimizer.zero_grad()
            loss.backward()
            optimizer.step()
            total_loss += loss.item()

        avg_loss = total_loss / len(loader)
        print(f"第{EPOCHS+1}轮 | 平均损失值:{avg_loss:.4f}")

    # 保存训练完成的分割模型
    torch.save(model.state_dict(), "./unet_power_line_segment.pth")
    print("UNet输电线路语义分割模型训练完成,权重已保存!")

if __name__ == "__main__":
    train_unet_segment()

4.4 批量图像推理脚本(无人机巡检批量筛查)

场景经验:无人机单次巡检会生成数百张航拍图像,该脚本实现全自动批量检测、结果统计。针对电力场景设置较低置信度阈值conf=0.25,避免细小电缆、远端塔架被漏检;自动统计各类设施占比,可直接对接巡检后台生成运维报表。

from ultralytics import YOLO
import os

# ===================== 批量推理配置 =====================
best_model = "./runs/detect/power_line_detect/weights/best.pt"
batch_img_folder = "./batch_inspect_imgs"  # 待检测航拍图像文件夹
class_names = ["电缆1", "电缆2", "格构塔", "塔_tucohy", "木质塔", "空类"]
img_suffix = [".jpg", ".png", ".jpeg"]
conf_threshold = 0.25  # 电力小目标降低置信度,减少漏检
# =======================================================

def batch_power_inspect():
    model = YOLO(best_model)
    class_count = {name: 0 for name in class_names}
    total_num = 0

    # 遍历文件夹所有图像
    for img_name in os.listdir(batch_img_folder):
        if os.path.splitext(img_name)[-1].lower() not in img_suffix:
            continue
        total_num += 1
        img_full_path = os.path.join(batch_img_folder, img_name)
        results = model(img_full_path, conf=conf_threshold)

        # 统计识别结果
        for res in results:
            boxes = res.boxes
            for box in boxes:
                cls_id = int(box.cls.item())
                cls_name = class_names[cls_id]
                class_count[cls_name] += 1

    # 输出巡检统计报告
    print("========== 无人机电力巡检批量识别报告 ==========")
    print(f"本次总计检测图像:{total_num} 张")
    for cls, count in class_count.items():
        ratio = round(count / total_num * 100, 2) if total_num > 0 else 0
        print(f"{cls}:检测到 {count} 个目标,占比 {ratio}%")

if __name__ == "__main__":
    batch_power_inspect()

五、数据集使用技巧与实战经验总结

  1. 模型选型建议
    • 无人机端边缘部署:优先选用yolov8n、轻量化UNet,推理速度快、算力占用低,满足实时避障需求;
    • 云端后台高精度分析:选用yolov8m/yolov8l、标准UNet++,提升小目标与遮挡目标识别精度。
  2. 数据优化技巧
    航拍图像普遍存在逆光、雾天、远景模糊问题,可结合代码中的albumentations库增加降噪、亮度修复预处理;电缆为线性细长目标,训练时可适当调高box损失权重,优化分割/检测边缘效果。
  3. 过拟合规避方案
    本数据集共1927张图像,属于中等规模数据,训练轮次建议控制在80~130轮,配合patience早停机制;不要无限增大batch size,显存不足时优先降低批次,而非关闭数据增强。
  4. 工程拓展方向
    • 多任务融合:将目标检测与语义分割结合,同时实现设施定位+线路轮廓提取,优化无人机避障路径规划;
    • 数据扩充:叠加雨天、雾天、夜间红外图像,构建多气候、多模态电力数据集,提升模型全场景适配能力;
    • 二次开发:模型导出为ONNX/TensorRT格式,部署至无人机机载计算模块,实现端侧实时AI巡检。
  5. 落地适配要点
    模型训练完成后,可对接无人机飞控SDK,将识别到的电缆、塔架坐标转化为避障指令,形成图像识别-航线调整-自主巡检完整闭环。

六、补充说明

  • 数据来源:无人机实地航拍野外输电线路实景图像,无合成数据,场景1:1还原真实电力巡检环境;
  • 框架兼容性:全面支持YOLO系列、UNet、Mask R-CNN等检测/分割模型,适配主流深度学习框架;
  • 适用人群:深度学习算法工程师、电力智能化研发人员、计算机视觉实训学员、电网运维技术团队。

公众号配套标签

#无人机自主避障 #输电线路语义分割 #UNet实战教程 #YOLO电力检测 #智慧电网数据集 #AI电力巡检项目 #计算机视觉工程落地

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐