简介:本数据集面向电力巡检、输电线路智能监控方向的算法工程师与深度学习研究者,用于训练和验证输电线异物目标检测模型。数据覆盖气球、风筝、鸟巢、垃圾四类典型异物,共1300张jpg图片,每张均配有对应的VOC格式xml与YOLO格式txt标注,标注工具为labelImg,采用矩形框方式,总框数1319个,其中鸟巢871框、风筝181框、气球160框、垃圾107框,类别分布差异明显,贴近真实巡检场景。压缩包为7z格式,内含2000个文件,以1300个xml与700个txt标注文件为主,整体约831.71MB,目录结构清晰,便于直接接入YOLO或VOC训练流程。需注意约15%的图片经过数据增强处理,可提升模型泛化能力。目前已有971人学习下载,适合快速搭建异物检测基线、开展对比实验或扩充自有数据集。
1. 输电线异物检测数据集:1300 张 VOC+YOLO 双格式,4 类目标直接开训
输电线异物检测这个场景,真正卡住大多数团队的从来不是模型结构,而是数据。鸟巢、风筝、塑料薄膜、气球这四类东西挂在导线上,背景是天空、杆塔、树林、建筑,尺度跨度大、样本还偏少,自己从零标一批,光标注成本就够喝一壶。这份数据集给的是 1300 张已经标好的图,同时提供 Pascal VOC 的 XML 和 YOLO 的 TXT 两套标注,4 个类别,拿来就能直接进训练流程。它适合两类人:一类是想快速验证 YOLO 系列在电力巡检场景下效果的算法工程师,另一类是做输电线路智能巡检落地、需要一份能跑通 baseline 的工程团队。VOC 和 YOLO 双格式意味着你不用再写转换脚本,省掉最容易出错的一步。
2. VOC 与 YOLO 双格式拆解:标注结构、类别映射与选型理由
2.1 两套标注到底差在哪
Pascal VOC 格式的核心是每张图对应一个 XML 文件,里面用<object>节点描述每个目标,包含<name>(类别名)、<bndbox>(xmin、ymin、xmax、ymax 四个绝对像素坐标)。YOLO 格式则是每张图对应一个 TXT 文件,每行一个目标,格式是class_id x_center y_center width height,后四个值都是相对整图宽高的归一化值,范围 0 到 1。
这两种格式的差异不只是坐标表达,还牵扯到训练框架的读取逻辑。VOC 的绝对坐标在图像增强(比如随机缩放、裁剪)时需要重新计算,而 YOLO 的归一化坐标在 resize 后天然保持比例,这也是 Ultralytics 系框架默认吃 YOLO 格式的原因。数据集同时给两套,等于把「用 mmdetection 走 VOC」和「用 YOLOv5/v8 走 YOLO」两条路都铺好了。
| 对比项 | VOC (XML) | YOLO (TXT) |
|---|---|---|
| 坐标类型 | 绝对像素 (xmin,ymin,xmax,ymax) | 归一化中心点+宽高 |
| 类别表示 | 字符串类别名 | 整数 class_id |
| 一图多目标 | 多个<object>节点 | 多行文本 |
| 常用框架 | mmdetection、Detectron2 | Ultralytics YOLO 系列 |
| 增强友好度 | 需同步变换坐标 | resize 后自动适配 |
2.2 4 类别映射与类别不平衡
4 个类别在电力巡检里是高频异物:鸟巢、风筝、塑料薄膜(含地膜、大棚膜)、气球。这四类在真实场景里的出现频率并不均匀,鸟巢和风筝相对多,气球和薄膜偏少。拿到数据集第一件事不是直接开训,而是先统计每个类别的框数量,确认有没有某一类少到影响收敛。
常见做法是写个统计脚本,遍历 labels 目录下的 TXT,按 class_id 累加。如果发现某类样本数不到总数的 5%,就要考虑在训练时用类别权重或者对少数类做过采样。这一步不做,训出来的模型大概率对薄膜和气球几乎无响应,mAP 被多数类拉高,实际巡检时漏检。
import os from collections import Counter label_dir = "labels/train" # YOLO 格式标签目录 counter = Counter() for fname in os.listdir(label_dir): if not fname.endswith(".txt"): continue with open(os.path.join(label_dir, fname)) as f: for line in f: line = line.strip() if not line: continue cls_id = int(line.split()[0]) # 每行第一个字段是类别 id counter[cls_id] += 1 # 输出每个类别的框数量,用于判断类别不平衡 for cls_id in sorted(counter): print(f"class {cls_id}: {counter[cls_id]} boxes")这段脚本的逻辑很直接:逐文件读 TXT,取每行首字段作为类别 id 累加。参数上唯一要注意的是label_dir要指向 YOLO 格式的标签目录,不是 VOC 的 XML 目录。跑完你会得到类似class 0: 620 boxes这样的分布,如果某一类只有几十个框,后面训练配置里就得针对性处理。
2.3 目录组织与 data.yaml 配置
YOLO 训练要求固定的目录结构:images/train、images/val、labels/train、labels/val,图片和标签同名不同后缀。数据集解压后如果 VOC 和 YOLO 是分开的两个文件夹,需要先把 YOLO 那套按 train/val 分好。常见做法是按 8:2 或 7:3 切分,切分时用固定随机种子,保证可复现。
# data.yaml —— Ultralytics YOLO 训练配置 path: /data/transmission_line # 数据集根目录 train: images/train # 训练集图片相对路径 val: images/val # 验证集图片相对路径 nc: 4 # 类别数,本数据集为 4 names: # 类别名,顺序必须与 class_id 对应 0: nest 1: kite 2: plastic_film 3: balloonnc和names的顺序必须和标注文件里的 class_id 严格一致,这是最容易翻车的地方。如果 VOC 的 XML 里类别名顺序和 YOLO 的 class_id 映射对不上,训出来的模型会把鸟巢认成气球。建议先用一小批图做可视化验证,把框画回原图上看类别对不对,再开始正式训练。
3. 从解压到跑通 baseline:YOLOv8 训练全流程与参数设置
3.1 环境准备与数据校验
训练前先把环境搭好。Ultralytics 的 YOLOv8 对 PyTorch 版本有要求,常见组合是 Python 3.9+、PyTorch 1.13 或 2.x、CUDA 11.7/11.8。装完框架后不要急着 train,先做一次数据校验,确认图片能正常读取、标签没有越界坐标。
# 安装 ultralytics pip install ultralytics # 快速校验数据集:用 YOLO 自带校验,会检查标签格式和图片可读性 yolo checksyolo checks会输出环境信息和数据集的基本检查结果。如果标签里有坐标超过 1.0 或者负数,训练时不会报错但会静默丢弃,导致实际参与训练的目标变少。所以校验这一步不能省,尤其是别人标的数据集,标注质量参差不齐是常态。
3.2 训练命令与关键参数
baseline 用 YOLOv8n 或 YOLOv8s 起步,1300 张图不算大,n 版本能在单卡上很快跑完一轮,先确认流程通不通,再换大模型。
# 以 YOLOv8s 为例,输入 640,batch 16,训练 100 epoch yolo detect train \ data=data.yaml \ model=yolov8s.pt \ epochs=100 \ imgsz=640 \ batch=16 \ lr0=0.01 \ patience=20 \ device=0 \ project=runs/transmission \ name=exp1参数逐个说:imgsz=640是输入分辨率,输电线异物里鸟巢和风筝尺度中等,640 够用,如果薄膜这种小目标漏检多,可以提到 1024 但显存要跟上。batch=16在 8G 显存上跑 640 分辨率基本安全,显存不够就降到 8。lr0=0.01是初始学习率,YOLOv8 默认用 SGD 时这个值合适,如果换 AdamW 要降到 0.001 量级。patience=20是早停,20 轮验证指标不升就停,避免过拟合。device=0指定第一块 GPU。
3.3 训练过程监控与指标解读
训练启动后重点看三个指标:box_loss、cls_loss、mAP50。box_loss 下降说明框回归在收敛,cls_loss 下降说明分类在学,mAP50 是 IoU 阈值 0.5 下的平均精度。输电线异物检测里,鸟巢和风筝通常 mAP 能到 0.8 以上,薄膜和气球因为样本少、目标小,可能只有 0.5 到 0.6,这是数据分布决定的,不是模型问题。
如果训练到 30 轮左右 mAP 还在 0.2 以下,先别怀疑模型,回去查标签。常见原因是类别 id 映射错了,或者图片和标签文件名没对上(比如图片叫001.jpg标签叫001.txt但实际内容对不上)。用yolo detect predict跑几张训练集图片,看预测框和真实框是否重合,能快速定位是数据问题还是训练问题。
# 用训练好的权重在验证集上跑预测,可视化检查 yolo detect predict \ model=runs/transmission/exp1/weights/best.pt \ source=images/val \ conf=0.25 \ save=Trueconf=0.25是置信度阈值,低于这个值的框不显示。检查时重点看漏检和误检:漏检多说明模型没学好或者目标太小,误检多说明背景干扰大或者阈值太低。这一步是判断数据集能不能用的关键,指标好看但可视化一塌糊涂的情况并不少见。
4. 避坑与排查:标注、格式、训练里最容易翻车的五件事
4.1 现象:训练 loss 正常下降但 mAP 始终为 0
原因:类别 id 和 names 映射错位,或者标签文件里 class_id 超出了nc范围。YOLO 对越界 class_id 不报错,直接忽略该目标,导致模型学不到任何有效分类。
解决:用 2.2 的统计脚本确认 class_id 最大值小于nc,再用可视化脚本把标签框画回原图,逐类核对类别名。确认无误后再重新训练。
4.2 现象:图片能读但标签全部丢失
原因:YOLO 要求图片和标签同名且在同一级目录结构下,如果图片是.jpg而标签是.JPG.txt或者放在不匹配的路径,框架找不到标签。
解决:写脚本统一文件名,去掉多余后缀,确保images/train/001.jpg对应labels/train/001.txt。批量重命名前先备份,改错了还能回滚。
4.3 现象:VOC 转 YOLO 后框位置整体偏移
原因:VOC 的坐标是 1-based 还是 0-based 取决于标注工具,有些工具 xmin 从 1 开始,转 YOLO 时没减 1,导致整体偏移一个像素。更常见的是归一化时用了错误的图像宽高,比如用了缩放后的尺寸而不是原图尺寸。
解决:转换脚本里统一用原图宽高做归一化,并在转换后随机抽 10 张图可视化对比。偏移一个像素在大目标上不明显,在小目标上可能就是 IoU 从 0.6 掉到 0.4。
4.4 现象:训练到一半显存爆了
原因:imgsz或batch设太大,或者验证阶段没有限制 batch。YOLOv8 训练和验证的显存占用不同,验证时如果val_batch没设,默认可能偏大。
解决:先把batch降到 8 或 4,imgsz保持 640。如果还爆,检查是不是有其他进程占着显存。训练命令里加val_batch=8限制验证阶段的 batch 大小。
4.5 现象:模型对薄膜和气球几乎不响应
原因:这两类样本数太少,模型被多数类主导,少数类的梯度被淹没。
解决:训练时加类别权重,或者在数据加载阶段对少数类做复制过采样。Ultralytics 不直接支持类别权重,常见做法是手动复制少数类的图片和标签,让各类框数量大致均衡。复制时注意 train/val 要同步,别只复制训练集导致验证集分布不一致。
5. 进阶技巧:用 VOC 原始标注做交叉验证与模型选型
数据集给了 VOC 和 YOLO 两套标注,大多数人只用 YOLO 那套,VOC 那套就闲置了。其实 VOC 的 XML 可以用来做一件很有价值的事:交叉验证标注一致性。具体做法是写一个脚本,把 VOC 的 XML 解析成 YOLO 格式,再和数据集自带的 YOLO 标签逐框对比,看两套标注是否一致。如果发现某些图的两套标注框数量或位置差异很大,说明标注本身有歧义,这些图在训练时可能引入噪声,可以考虑剔除或重新标。
import xml.etree.ElementTree as ET import os def voc_to_yolo(xml_path, img_w, img_h): """把 VOC XML 转成 YOLO 格式的列表,用于和自带 YOLO 标签对比""" tree = ET.parse(xml_path) root = tree.getroot() boxes = [] for obj in root.findall("object"): cls_name = obj.find("name").text 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) # 转成归一化中心点+宽高 xc = (xmin + xmax) / 2.0 / img_w yc = (ymin + ymax) / 2.0 / img_h w = (xmax - xmin) / img_w h = (ymax - ymin) / img_h boxes.append((cls_name, xc, yc, w, h)) return boxes这段代码的核心是把 VOC 的绝对坐标转成 YOLO 的归一化坐标,参数img_w和img_h必须是原图尺寸,不能是缩放后的。转换完拿两套框做 IoU 对比,IoU 低于 0.5 的就算不一致,统计不一致比例。如果比例超过 5%,这批数据在训练前就得先清洗。
另一个进阶用法是模型选型。1300 张图、4 类目标,属于中小规模数据集。YOLOv8n 和 YOLOv8s 通常够用,但如果部署端是边缘设备,n 版本更合适;如果追求精度且算力充足,可以试 YOLOv8m。选型时不要只看 mAP,还要看推理速度。用yolo detect val跑一遍验证集,同时记录每张图的推理耗时,综合精度和速度再定。
# 验证模型精度和速度 yolo detect val \ model=runs/transmission/exp1/weights/best.pt \ data=data.yaml \ imgsz=640 \ batch=8 \ device=0验证输出里会包含mAP50、mAP50-95和每张图的预处理、推理、后处理耗时。输电线巡检如果走无人机实时回传,推理耗时超过 50ms 就要考虑换更小的模型或者用 TensorRT 加速。这些决策都建立在数据集跑通、指标可信的基础上,而这份双格式数据集正好把最耗时的数据准备环节省掉了。
从那以后我每次拿到新数据集,第一件事都是先跑类别统计和可视化校验,确认标签没问题再开训,这个习惯帮我省下了至少三次白跑一整晚的算力。希望帮到你。
本文还有配套的精品资源,点击获取