深度学习基于YOLOV11无人机航拍输电线路巡检系统 缺陷绝缘子 缺陷阻尼器 铁塔等检测识别 无人机航拍输电线巡检检测数据集
航拍输电线巡检检测数据集,10003张,yolo,voc,coco三种标注方式
图像尺寸: 640 * 640
总类别数量: 7 类
===== 图像数量统计 =====
训练集图像总数:7023
验证集图像总数:1993
测试集图像总数:987
数据集全部图像总量:10003
===== 类别完整统计 =====
类别,训练图片数,训练标签数,验证图片数,验证标签数,测试图片数,测试标签数
DSXL - 输电线路,6909,31854,1955,7215,984,3759
QXDS - 缺陷输电线路,1014,1020,227,230,84,84
QXJC - 缺陷绝缘子,3172,3190,689,691,335,343
QXZD - 缺陷阻尼器,531,531,98,101,72,72
TD - 铁塔,6065,6091,1367,1369,615,615
ZJJC - 正常绝缘子,5898,22154,1250,4419,620,2657
ZJZD - 正常阻尼器,5716,19233,1144,3650,597,1684
模型与源代码
采用 YOLOv11n 网络训练
训练轮次:80 个 epoch
提供训练好的yolo11n模型,全部训练 + 测试源代码
训练精度 mAP 效果如图所示
PyQt5 界面功能
界面使用 PyQt5 开发,提供全部源码(.ui、.qrc、.py 及图标文件)
支持图片检测、视频检测、摄像头实时检测
界面实时显示:目标位置、目标总数、置信度等信息
支持检测结果保存导出
操作简单直观,无需命令行
4、运行配置
运行环境:Python=3.8、opencv-python、PyQt5、torch
支持 Windows、Linux 系统
航拍输电线巡检检测数据集![]()
| 项目 | 详情 |
|---|---|
| 数据集名称 | 航拍输电线巡检检测数据集 |
| 图像总量 | 10003张 |
| 标注格式 | YOLO、VOC、COCO三种标注格式 |
| 图像尺寸 | 640×640 |
| 类别总数 | 7类 |
| 数据集划分 | 训练集:7023张 验证集:1993张 测试集:987张 |
| 类别明细 | 1.输电线路:训练图片6909张,训练标签31854;验证图片1955张,验证标签7215;测试图片984张,测试标签3759 2.缺陷输电线路:训练图片1014张,训练标签1020;验证图片227张,验证标签230;测试图片84张,测试标签84 3.缺陷绝缘子:训练图片3172张,训练标签3190;验证图片689张,验证标签691;测试图片335张,测试标签343 4.缺陷阻尼器:训练图片531张,训练标签531;验证图片98张,验证标签101;测试图片72张,测试标签72 5.铁塔:训练图片6065张,训练标签6091;验证图片1367张,验证标签1369;测试图片615张,测试标签615 6.正常绝缘子:训练图片5898张,训练标签22154;验证图片1250张,验证标签4419;测试图片620张,测试标签2657 7.正常阻尼器:训练图片5716张,训练标签19233;验证图片1144张,验证标签3650;测试图片597张,测试标签1684 |
| 模型信息 | YOLOv11n网络训练,80个epoch;提供训练完成权重,全套训练+测试源代码 |
| PyQt5可视化界面 | 全套源码包含.ui、.qrc、.py、图标资源文件;支持图片、视频、摄像头实时检测;实时展示目标位置、目标数量、置信度;可保存导出检测结果;图形化操作,无需命令行 |
| 运行环境 | Python3.8,opencv-python、PyQt5、torch;兼容Windows、Linux系统 |
| 应用场景 | 无人机航拍输电线路巡检,电力铁塔、输电线、绝缘子、阻尼器的缺陷智能识别,电网运维、电力AI目标检测算法研究 |
| 数据集价值 | 覆盖输电线路多种核心构件的正常与缺陷样本,适配航拍复杂野外背景,可用于电力巡检AI模型研发;配套完整GUI检测系统,可快速部署为桌面检测工具,减少人工高空巡检风险,提升电网故障排查效率,适用于科研论文、工程项目、教学实训。 |
构建系统完整代码
1、环境安装命令
pip install ultralytics torch opencv-python pyqt5 numpy2、数据集yaml配置文件powerline.yaml
path: ./powerline_dataset train: images/train val: images/val test: images/test names: 0: 输电线路 1: 缺陷输电线路 2: 缺陷绝缘子 3: 缺陷阻尼器 4: 铁塔 5: 正常绝缘子 6: 正常阻尼器3、模型训练代码train.py
from ultralytics import YOLO if __name__ == '__main__': model = YOLO("yolo11n.pt") train_result = model.train( data="powerline.yaml", epochs=80, imgsz=640, batch=16, device=0, save=True, save_txt=True, save_conf=True ) print("训练完成,权重文件保存在 runs/detect/train/weights/best.pt")4、PyQt5主界面代码main_window.py
import sys import cv2 import time from PyQt5.QtWidgets import (QApplication, QMainWindow, QFileDialog, QLabel, QPushButton, QTableWidget, QTableWidgetItem, QHeaderView) from PyQt5.QtGui import QImage, QPixmap from PyQt5.QtCore import Qt from ultralytics import YOLO class PowerLineDetectUI(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("航拍输电线巡检检测系统") self.resize(1350, 880) self.model = YOLO("best.pt") self.result_img = None # 图片显示区域 self.label_img = QLabel(self) self.label_img.setGeometry(30, 30, 750, 620) self.label_img.setStyleSheet("border:1px solid #555;") # 按钮 self.btn_img = QPushButton("导入图片", self) self.btn_img.setGeometry(820, 40, 180, 45) self.btn_img.clicked.connect(self.load_image) self.btn_video = QPushButton("导入视频", self) self.btn_video.setGeometry(820, 100, 180, 45) self.btn_video.clicked.connect(self.load_video) self.btn_camera = QPushButton("开启摄像头", self) self.btn_camera.setGeometry(820, 160, 180, 45) self.btn_camera.clicked.connect(self.open_camera) self.btn_save = QPushButton("保存检测结果", self) self.btn_save.setGeometry(820, 220, 180, 45) self.btn_save.clicked.connect(self.save_result) self.btn_exit = QPushButton("退出", self) self.btn_exit.setGeometry(820, 280, 180, 45) self.btn_exit.clicked.connect(self.close) # 结果信息展示 self.label_info = QLabel("用时:0 s | 目标总数:0", self) self.label_info.setGeometry(820, 340, 320, 30) # 结果表格 self.table = QTableWidget(self) self.table.setGeometry(30, 670, 1280, 180) self.table.setColumnCount(5) self.table.setHorizontalHeaderLabels(["序号", "文件路径", "类别", "置信度", "目标坐标"]) self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) def detect_image(self, img_bgr): t_start = time.time() pred = self.model(img_bgr)[0] t_end = time.time() cost_time = round(t_end - t_start, 3) boxes = pred.boxes # 绘制检测框 img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB) for box in boxes: x1, y1, x2, y2 = map(int, box.xyxy[0]) cls_id = int(box.cls[0]) conf = float(box.conf[0]) cls_name = self.model.names[cls_id] cv2.rectangle(img_rgb, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.putText(img_rgb, f"{cls_name} {conf:.2f}", (x1, y1 - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2) self.result_img = img_rgb self.label_info.setText(f"用时:{cost_time} s | 目标总数:{len(boxes)}") # 渲染图片 h, w, c = img_rgb.shape qimg = QImage(img_rgb.data, w, h, c * w, QImage.Format_RGB888) self.label_img.setPixmap(QPixmap.fromImage(qimg).scaled(self.label_img.size(), Qt.KeepAspectRatio)) # 填充表格 self.table.setRowCount(len(boxes)) for index, box in enumerate(boxes): x1, y1, x2, y2 = map(int, box.xyxy[0]) cls_id = int(box.cls[0]) conf = float(box.conf[0]) cls_name = self.model.names[cls_id] pos = f"[{x1},{y1},{x2},{y2}]" self.table.setItem(index, 0, QTableWidgetItem(str(index + 1))) self.table.setItem(index, 1, QTableWidgetItem("")) self.table.setItem(index, 2, QTableWidgetItem(cls_name)) self.table.setItem(index, 3, QTableWidgetItem(f"{conf:.3f}")) self.table.setItem(index, 4, QTableWidgetItem(pos)) def load_image(self): file_path, _ = QFileDialog.getOpenFileName(self, "选择图片", "", "图片(*.jpg *.png *.jpeg *.bmp)") if not file_path: return img = cv2.imread(file_path) self.detect_image(img) def load_video(self): file_path, _ = QFileDialog.getOpenFileName(self, "选择视频", "", "视频(*.mp4 *.avi *.mov)") cap = cv2.VideoCapture(file_path) while cap.isOpened(): ret, frame = cap.read() if not ret: break self.detect_image(frame) QApplication.processEvents() cap.release() def open_camera(self): cap = cv2.VideoCapture(0) while cap.isOpened(): ret, frame = cap.read() if not ret: break self.detect_image(frame) QApplication.processEvents() cap.release() def save_result(self): if self.result_img is None: return save_path, _ = QFileDialog.getSaveFileName(self, "保存结果图片", "result.jpg", "图片(*.jpg *.png)") if save_path: cv2.imwrite(save_path, cv2.cvtColor(self.result_img, cv2.COLOR_RGB2BGR)) if __name__ == '__main__': app = QApplication(sys.argv) window = PowerLineDetectUI() window.show() sys.exit(app.exec())5、单图推理脚本predict.py
from ultralytics import YOLO model = YOLO("best.pt") res = model.predict(source="test.jpg", save=True, conf=0.5) for result in res: for box in result.boxes: cls_name = result.names[int(box.cls)] conf = box.conf.item() xyxy = box.xyxy.tolist() print(f"类别:{cls_name},置信度:{conf:.3f},坐标:{xyxy}")配套包含ui界面文件,可自行用Qt Designer绘制界面生成.ui、.qrc资源文件。