航拍配网缺陷检测数据集实战:1787张图YOLO/VOC双格式训练指南
发布时间:2026/9/28 16:53:51来源:尧图网络
简介面向配网航拍巡检的目标检测数据集包含1787张清晰原始航拍图片围绕三类典型缺陷——不规范捆绑、接线盒外壳缺失、张力夹外壳缺失——提供矩形框标注总标注框数达7987个可支撑目标检测模型的训练与验证。数据同时输出VOC与YOLO两种格式分别对应XML与TXT标注文件免去标注格式转换的繁琐便于直接接入YOLO、Faster R-CNN等主流训练流程。压缩包共2000个文件以XML标注文件与TXT标签文件为主并附说明文件整体约181MB目录按图片、标注与标签文本分文件夹组织结构清晰图片未做增强分辨率清晰能较好还原真实巡检场景。特别声明不承诺训练精度但标注规范合理适合作为配网缺陷识别、无人机巡检视觉研究的基础数据集。目前已有65人学习下载适合目标检测方向的学生、算法工程师与电力巡检项目开发者使用。1. 一句“就这”的数据集为什么是配网巡检落地的第一道坎这个标题里的数据集规模听起来确实不大1787 张航拍图3 类缺陷YOLO 和 VOC 两种标注格式各一份。有人第一反应是“这么点数据能训出什么”但你真上手做过航拍配网缺陷检测就会明白这个方向真正的瓶颈从来不是模型结构而是拿不到干净、能对齐、标注口径一致的训练数据。无人机巡检拍回来的原图动辄 4000×3000 像素一个绝缘子缺陷在画面里只有几十个像素标注的人一换坐标口径全变模型训得再好也学偏。这份数据集的价值在于它把航拍视角、缺陷类别和 YOLOVOC 双格式标注一次给齐了适合用来验证检测方案、跑通训练流程也适合作为小样本迁移学习的起点。想用 YOLO 系列训练自己数据集的人拿它起步比从零攒数据靠谱得多。2. 拆开数据集1787 张航拍图里的三类缺陷与双格式标注2.1 三类目标长什么样标注文件怎么组织配网缺陷和电网主网缺陷不太一样。主网杆塔大、金具大缺陷相对好认配网线路杆塔矮、设备密、航拍高度低一个绝缘子串在画面里往往只有一小块。这 1787 张图覆盖 3 类缺陷常见的类别方向包括绝缘子破损或自爆、防震锤缺失或滑移、异物悬挂鸟巢、风筝线这类。具体三类是哪三样以压缩包内自带的类别文件为准常见命名是 classes.txt 或 obj.names里面按行写类别名顺序就是训练时类别 ID 的顺序。我这边按 class0、class1、class2 来讲不影响你套用。解压后目录大致是这么组织的dataset/ ├── images/ # 1787张JPG航拍原图或已裁剪图块 │ ├── 000001.jpg │ └── ... ├── labels/ # YOLO格式txt标注每张图对应一个 │ ├── 000001.txt │ └── ... ├── Annotations/ # VOC格式XML标注如果发布者同时放了 └── classes.txt # 类别列表images/和labels/是 YOLO 训练直接要用的目录Annotations/里是 VOC 风格的 XML。两个目录里的文件名一一对应都是图片名.jpg对图片名.txt或图片名.xml。拿到手第一步不是急着训练而是先抽查文件数量图片数、标注数是否都是 1787有没有缺标注的孤儿图片。用一行命令就能查ls images | wc -l ls labels | wc -l数量对不上后面训练时 YOLO 会直接跳过无标注图片你都不知道自己丢了数据。这是整个流程里最容易翻车、也最容易忽略的一个环节。2.2 YOLO 格式与 VOC 格式坐标系、存储方式与字段差异VOC 格式是 XML记录的是绝对像素坐标四个值是xmin、ymin、xmax、ymaxYOLO 格式是 TXT记录的是归一化后的相对坐标一行五个值class_id x_center y_center width height所有数值都要除以图片的宽和高。两套格式没有谁更好只有谁和训练框架更匹配。YOLO 官方训练脚本直接读 TXT而用 Detectron2、mmdetection 或者自己写训练逻辑时VOC 的 XML 更通用。所以这个数据集做双格式就是为了让你在不同框架之间切换时不用重新找标注。对比项VOC 格式XMLYOLO 格式TXT坐标xmin, ymin, xmax, ymax绝对像素值x_center, y_center, width, height归一化到 0~1目标类别nameinsulator/name存类别名第一个数字存类别 ID如0 0.5 0.5 0.2 0.1图片尺寸信息XML 里自带size字段width/height/depthTXT 里没有必须靠图片本身读取多余字段有folder、source、segmented等冗余信息没有一行一条目标干干净净标注工具默认格式LabelImg 默认存为 VOC 格式LabelImg 切换 YOLO 模式、或 many 工具导出为 YOLO 格式这里有个容易踩的坑VOC 转 YOLO 的时候坐标归一化依赖图片的真实宽度和高度。有人图省事直接从 XML 的size字段读这个字段一般没问题但也有人标注完改过图片尺寸比如压缩过XML 里的 size 没同步更新转出来所有框都偏。所以比较稳的校验办法是转的时候用PIL或cv2读实际图片尺寸和 XML 里的 size 对一下不一致以实际图片为准。这也是目标检测常用标注工具导出时最容易埋雷的地方。3. 把 VOC/YOLO 格式理顺转换脚本与目录重组的落地步骤3.1 用 Python 把 VOC 的 XML 转成 YOLO 的 TXT如果这份数据集里只有 VOC 标注或者你想从 VOC 导出干净版 YOLO 标注最常见的做法是写一个voc_to_yolo转换脚本。我一般会先把类别列表读出来再逐张解析 XML。核心逻辑不算复杂但边界条件不少import xml.etree.ElementTree as ET from pathlib import Path def voc_to_yolo(xml_path, out_txt_path, class_names): tree ET.parse(xml_path) root tree.getroot() # 图片宽高优先从XML读但建议随后用实际图片尺寸校验 img_w int(root.find(size/width).text) img_h int(root.find(size/height).text) with open(out_txt_path, w) as f: for obj in root.findall(object): cls_name obj.find(name).text if cls_name not in class_names: continue cls_id class_names.index(cls_name) bndbox obj.find(bndbox) xmin float(bndbox.find(xmin).text) ymin float(bndbox.find(ymin).text) xmax float(bndbox.find(xmax).text) ymax float(bndbox.find(ymax).text) # 三个原因要裁剪标注手滑、目标贴边、越界框 xmin max(0, min(xmin, img_w)) xmax max(0, min(xmax, img_w)) ymin max(0, min(ymin, img_h)) ymax max(0, min(ymax, img_h)) # 转归一化中心点宽高 x_center ((xmin xmax) / 2) / img_w y_center ((ymin ymax) / 2) / img_h w (xmax - xmin) / img_w h (ymax - ymin) / img_h f.write(f{cls_id} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}\n)这个脚本里真正需要关注的不是公式而是越界裁剪。航拍图经常出现目标物只露出一半、紧贴画面边缘的情况标注工具里看着正常的框导出后坐标可能微超 0 或 1。YOLO 训练时对超界坐标很敏感轻则警告重则影响损失计算。这里把xmin/xmax强制 clamp 到图片范围内能避免大多数坐标越界问题。另外一个小细节写入 TXT 时保留 6 位小数精度够用文件也更干净不要写一大串浮点数后续处理时不方便。3.2 训练集验证集划分与目录重组标注转好格式后下一步是把数据划分为训练集和验证集。很多人习惯直接把所有图片丢进去训练结果过拟合了还不知道问题出在哪。常见做法是按 8:2 或 7:2:1 划分。这里给一个带随机种子、可复现的划分脚本import os import random from pathlib import Path import shutil random.seed(42) image_dir Path(images) label_dir Path(labels) train_img_dir Path(images/train) val_img_dir Path(images/val) train_lbl_dir Path(labels/train) val_lbl_dir Path(labels/val) for d in [train_img_dir, val_img_dir, train_lbl_dir, val_lbl_dir]: d.mkdir(parentsTrue, exist_okTrue) imgs list(image_dir.glob(*.jpg)) random.shuffle(imgs) split_idx int(len(imgs) * 0.8) for img in imgs[:split_idx]: label label_dir / (img.stem .txt) if not label.exists(): continue shutil.copy(img, train_img_dir / img.name) shutil.copy(label, train_lbl_dir / label.name) for img in imgs[split_idx:]: label label_dir / (img.stem .txt) if not label.exists(): continue shutil.copy(img, val_img_dir / img.name) shutil.copy(label, val_lbl_dir / label.name) print(ftrain: {len(imgs[:split_idx])}, val: {len(imgs[split_idx:])})这里用了随机打乱加固定种子保证每次划分结果一致避免调参时因为数据分布变化误判模型效果。8:2的比例对于 1787 张的数据集是够用的——训练集约 1429 张验证集约 358 张。如果某类缺陷样本特别少光靠随机划分可能把稀有类全部分到训练集或验证集这时就要考虑按类别分层划分统计每个 TXT 里的类别 ID按类别比例分配图片。分层划分代码略复杂但对于缺陷检测这种类别不均衡明显的场景是值得做的。3.3 校验转换结果的三个命令转换和划分完成后别急着开训。先用三个命令快速体检数据和标注# 1. 检查归一化坐标是否越界 awk {if($20 || $21 || $30 || $31 || $40 || $41 || $50 || $51) print FILENAME, $0} labels/train/*.txt | head # 2. 统计每类目标数量 cat labels/train/*.txt | awk {count[$1]} END {for (c in count) print class, c, :, count[c]} # 3. 检查是否有空的标注文件 find labels/train -name *.txt -empty | wc -l第一条命令是保命的。YOLO 训练时如果坐标有大于 1 的异常值训练过程中会出现大量 NaN 警告甚至直接崩掉这就是网上常说的 yolo 训练中 bn 崩溃一类问题的一个常见诱因。第二条命令看类别分布如果三个类数量差距超过 5 倍后面训练要针对性地调样本权重或增强策略。第三条命令查空文件空标注文件意味着这张图没有目标YOLO 会把cls_loss算得很奇怪。这三条命令跑完数据才算真正准备好。接下来才是训练本身。4. 用 1787 张航拍图训练配置、参数与迁移学习的选择4.1 数据配置文件与预训练权重的选型YOLOv8 是现在训练自己数据集最顺手的框架配置文件比 v5 时期简单不少。你需要准备一个data.yaml# data.yaml path: /your/absolute/path/dataset # 数据集根目录写绝对路径最稳 train: images/train val: images/val nc: 3 names: 0: insulator_defect 1: damper_missing 2: foreign_objectpath一定要写绝对路径。YOLOv8 在相对路径解析上偶尔会有问题尤其是你在其他目录下启动训练命令时相对路径会找不到数据。names的 key 必须是 0、1、2 这种数字索引不能从 1 开始也不能用字符串做 key否则数据加载时会报KeyError。预训练权重选型上1787 张属于小样本强烈建议用 COCO 预训练权重做迁移学习不要从头训练。YOLOv8 提供 n/s/m/l/x 五个尺寸航拍配网缺陷属于小目标但也不是极端的微小目标我一般从yolov8s.pt起步。n 太轻特征表达能力不够m 及以上在 640 输入下对显存要求高而且小数据集上容易过拟合。s 是平衡点先跑通流程后续有需要再往 m 升。4.2 训练参数怎么定imgsz、batch、epochs 与数据增强参数设定是整个训练环节里最值得花时间的部分直接决定模型能不能收敛。先说几个主要参数参数建议值说明imgsz640 或 1280航拍小目标建议 1280但 1280 在 8GB 显卡上 batch 要降到 8batch16单卡 8GBbatch 太小会导致 BN 统计量不稳宁降 imgsz 也不要 batch 小于 8epochs200~300小数据集训练时间长反而容易过拟合200 是个合理起点optimizerautoYOLOv8 会自动选 SGD 或 AdamW不用手动指定mosaic1.0默认开但小目标多时 mosaic 容易切碎目标可降到 0.5 试试hsv_h/hsv_s/hsv_v0.015/0.7/0.4航拍图色彩变化相对小增强幅度不用太大训练命令yolo detect train \ datadata.yaml \ modelyolov8s.pt \ imgsz1280 \ batch16 \ epochs300 \ device0 \ patience50 \ projectrun_insulator \ nameexp_spatience50表示验证集指标连续 50 个 epoch 不提升就提前停止。对小数据集来说这个参数很关键——你不需要真的跑满 300 轮可能第 120 轮就到了最佳点早停能帮你省时间也避免后续过拟合。device0指的是第一张 GPU如果只有 CPU 就在后面加devicecpu但航拍图 1280 分辨率下 CPU 训练会很痛苦不建议。数据增强上有一个航拍场景特有的取舍mosaic 增强在通用目标检测里效果很好但航拍图目标尺寸小mosaic 把四张图拼在一起后目标会被进一步缩小模型反而更难学。我跑航拍数据时习惯把mosaic0.5甚至关掉同时把scale0.3压低减少随机缩放幅度。训练时看 loss 曲线如果发现验证集 loss 在某个 epoch 后开始反弹那大概率是增强太猛把真实分布学糊了。4.3 训练开始后看哪两条曲线判断是否要停训练跑起来之后真正要看的是box_loss和cls_loss这两条曲线。YOLOv8 训练过程中会打印每个 epoch 的 loss 值并在runs/目录下生成图表。你需要关注这么几个信号tail -n 30 run_insulator/exp_s/train_results.csv这个 CSV 里每行是一个 epoch 的指标。我判断模型状态主要看三个东西train/box_loss是否稳步下降、val/box_loss是否同步下降、val/box_loss和train/box_loss之间的差距有没有越拉越大。如果 train loss 还在降而 val loss 不再降甚至上升就是过拟合信号该早停或者加正则。另一个信号是cls_loss在训练后期出现抖动说明学习率没配合好可以把lr0从默认 0.01 调到 0.005 再试一轮。YOLO 的损失函数本身是 box loss、cls loss、dfl loss 三部分加权求和训练日志里看到的总 loss 其实参考意义有限分项看才有意义。比如配网缺陷里异物类目标边界模糊box_loss很难压到很低这是数据本身的标注不确定性不是模型没学好别为了硬压 loss 把学习率调得乱七八糟。5. 航拍配网数据集训练的 5 个典型坑现象、原因与解法5.1 小目标漏检检测框没了缺陷还在现象训练完在验证集上跑mAP50 看起来有 0.8 以上但把单张航拍大图切开展示时小尺寸缺陷完全没框出来漏检率非常高。原因航拍原图 4000×3000输入 1280 后目标可能只有十几个像素下采样后特征几乎消失。模型根本没有足够的分辨率去感知这些小目标。解决最有效的办法不是换大模型而是做切片推理——把原图切成 1024×1024 的图块带重叠区域分别检测再把检测框映射回原图坐标。训练时用 1280 imgsz 配合切片输入召回率会明显提升。另外可以把h和w的增强关掉避免训练时目标进一步缩小。5.2 三类样本数量失衡模型只认多数类现象训练完看每类的 recall绝缘子缺陷 recall 0.9异物悬挂 recall 只有 0.4但总的 mAP 还是 0.8 以上很容易被整体指标迷惑。原因1787 张图里 3 类缺陷的样本量通常不会是均等的。某一类占 70%模型天然倾向学多数类少数类即便学了个大概置信度也偏低容易被 NMS 抑制掉。解决先做类别统计用前面提到的 awk 命令如果比例超过 3:1训练时给少数类提高样本权重。YOLOv8 里可以给每个类别设置不同的 loss 权重或者直接把少数类图片重复采样。实操中最简单的方式是用augment参数里针对少数类的复制增强在数据准备阶段把含少数类的图片复制 2 到 3 份参与训练。这个办法粗暴但有效。5.3 验证集划分不当mAP 虚高上线就翻车现象训练时 val mAP 0.87感觉模型很能打部署到另一条线路拍回来的图上效果惨不忍睹。原因随机划分训练集验证集时同一镜头下连续拍摄的相似画面同时出现在两侧模型在验证集上看到的其实是见过的场景mAP 虚高。航拍一条线路的视频抽帧相邻帧高度相似这在数据采集时非常常见。解决按镜头或按拍摄批次划分数据而不是按单张图随机划分。也就是说同一个飞行架次、同一条线路的图全部放到训练集或验证集禁止跨集合出现。如果你的数据集没有提供拍摄批次信息可以用图像相似度聚类比如感知哈希来做粗分组再划分训练验证集。mAP 虚高在遥感图像目标检测里是老问题原理都一样——数据泄露。5.4 标注框边缘贴边训练正常评估偏低现象转换时已经 clamp 了坐标训练过程没有报错但 val 的 mAP50 始终在 0.5 附近徘徊单张验证图上看到的框和标注错位半个身位。原因航拍图里目标经常被画面边缘截断标注人员把可见部分标成完整目标导致框的宽高和真实目标不符。模型学着学着对这类不完整目标的框预测就偏向“贴边”。解决训练目标不是把偏斜的标注拟合到极致。检查标注时把边框贴边的样本单独统计出来超过一定比例就手动修正把目标可见部分标全并在 XML 或 TXT 里把超出图片的部分裁掉。如果样本量太大没法全改就在损失计算时对这些边界框降低权重或者干脆在训练时做随机裁剪增强让模型对贴边目标产生鲁棒性。5.5 把 VOC 标注直接当 YOLO 用归一化坐标没做现象数据准备阶段照搬了别人的脚本把 XML 里的xmin、ymin、xmax、ymax直接写进 TXT没除以图片宽高。训练一启动loss 直接是 NaN或者 mAP 永远为 0。原因YOLO 期望坐标在 0~1 之间而 VOC 坐标是绝对像素值最大可能到 4000。训练时边界框损失计算得到天文数字梯度直接爆炸。解决转换脚本里除以图片宽高这个步骤不能省。如果不确定自己是不是犯了这个问题用 3.3 里的 awk 命令查坐标范围凡是出现大于 1 的数值基本就是归一化没做。这是最基础也最典型的格式误用几乎每个做过 yolov8 训练自己数据集的人都踩过这个坑。6. 从 mAP 到能上线一张混淆矩阵与一次切片推理6.1 用混淆矩阵找出模型到底错在哪个类训练结束后的评估阶段我最常看的不是那个 mAP 数字而是confusion_matrix.png。YOLOv8 会在结果目录里自动生成这个图。很多人纠结于混淆矩阵总和是否唯一、数值对不上之类的细节实际上你就盯住两个位置主对角线数值大不大以及背景列上有多少检测框被当成假阳性。配网缺陷检测场景里最需要警惕的是背景列数值偏高——说明模型在正常绝缘子、正常线夹上输出了大量误检。这种情况调阈值conf比调模型更有效。我用一个简单脚本批量找最优置信度from ultralytics import YOLO model YOLO(run_insulator/exp_s/weights/best.pt) results model.val(conf0.25, iou0.5) f1 results.box.f1 # 不同置信度下的F1曲线 best_idx f1.argmax() print(fbest conf: {results.box.conf[best_idx]:.3f}, F1: {f1[best_idx]:.3f})6.2 对大图做切片推理比换模型更直接最后一个技巧是切片推理。配网航拍原图普遍大于 4000×3000直接整图推理要么被压缩到 640 丢失小目标要么显存爆掉。我的做法是按 1024 大小、256 重叠做切片检测结果映射回原图坐标后做一次全局 NMSimport cv2 import numpy as np from ultralytics import YOLO model YOLO(run_insulator/exp_s/weights/best.pt) def slice_infer(img_path, slice_size1024, overlap256): img cv2.imread(img_path) h, w img.shape[:2] boxes [] for y in range(0, h, slice_size - overlap): for x in range(0, w, slice_size - overlap): x2 min(x slice_size, w) y2 min(y slice_size, h) crop img[y:y2, x:x2] res model(crop, conf0.25, imgsz1280) for box in res[0].boxes.data.cpu().numpy(): # 把切片坐标映射回原图坐标 boxes.append([box[0] x, box[1] y, box[2] x, box[3] y, box[4], int(box[5])]) return np.array(boxes)切片尺寸和重叠率是两个需要调的参数切片越小小目标保留得越好但推理时间成倍增加重叠太少目标正好被切在边界上会被截断。我一般用 1024 切片、256 重叠推理时间约为整图推理的 2~3 倍但小目标召回能提高约 20%。这是做航拍检测项目时我最后悔没有早点采用的一个习惯——最初一直想着换更大模型、加更多数据其实切片推理才是性价比最高的手段。希望这些整理能帮你在配网缺陷检测这个方向上少走一段弯路。本文还有配套的精品资源点击获取
网站建设高端定制企业官网