电力巡检缺陷检测实战:从数据集处理到YOLO模型训练部署
2026/8/26 8:12:10 网站建设 项目流程

简介:目标检测是计算机视觉领域的核心技术之一,其核心任务是在图像中定位并识别特定目标。在工业场景中,深度学习驱动的目标检测模型正逐步替代人工视觉检查,尤其在电力巡检领域,绝缘子破损、销钉缺失等微小缺陷的自动识别需求日益迫切。实际落地时,模型效果不仅取决于算法结构,更依赖高质量的数据集与合理的训练流程。面对包含数万张无人机航拍图像、标注格式多样的电力缺陷数据集,如何清洗数据、平衡类别、设计增强策略,并基于YOLOv8等主流框架高效训练,成为工程实践的关键。同时,部署环节还需兼顾推理速度与精度,通过模型压缩与TensorRT优化实现边缘设备实时检测。本文从数据标注解析到模型调参,再到部署集成,系统梳理了一套可行的技术路径,为智能巡检的工程化落地提供参考。 前段时间接了个电力巡检视觉检测的项目,对方甩过来一个“图像检测:电力巡检智能缺陷检测数据集.7z”压缩包,7.2GB,解压完将近40GB。说实话,这个数据集我前后用了三个多月,从最初的标注格式混乱、类别不平衡,到最终落地到无人机机载设备上跑实时推理,中间过程踩了不少坑,也沉淀了一套完整的数据使用方法和训练流程。今天就把这个数据集的内部结构、标注细节、训练参数配置和部署经验一次性说清楚,给正在做电力巡检缺陷检测的同学做个参考。

这篇内容没有废话,全部是实际项目中的操作记录。不管你是刚接触目标检测的初学者,还是已经在做工业视觉落地的工程师,都能从中找到对应的参照。重点会覆盖:这个数据集到底是什么、里面每一层目录装的是什么、如何做数据清洗与增强、怎么用YOLOv8/YOLOv5训练出自己的检测模型、训练中常见的坑有哪些,以及最后怎么把模型部署到实际巡检设备上。

1. 这个数据集包到底是什么

1.1 电力巡检为什么要做智能缺陷检测

先补个背景。输电线路常年暴露在野外环境,绝缘子、销钉、螺栓、防震锤、均压环这些金具部件在风沙、温差、酸雨、雷击的反复侵蚀下,很容易出现破损、移位、锈蚀和缺失。传统巡检靠人工登塔或者用望远镜看,效率低不说,很多细微缺陷根本发现不了。后来无人机巡检普及了,但航拍回来的图片还是需要人工一张张翻看,一名经验丰富的检测员一天最多看两三千张图,遇到大风天拍糊的、逆光过曝的,漏判率并不低。

智能缺陷检测的本质,就是把“人看图找缺陷”这件事交给深度学习模型来做。模型输入无人机拍摄的巡检图像,输出每个缺陷的位置(边界框)和类别(这种缺陷是什么),再结合巡检业务系统自动生成缺陷清单,检修人员直接带着清单去现场处理就行。整个过程把原来按天计算的工作量压缩到以小时甚至分钟为单位。

1.2 数据集的整体规模与来源构成

这个7z压缩包解压后是一个完整的目录工程,典型结构如下:

电力巡检智能缺陷检测数据集/ ├── images/ # 全部JPEG图像 │ ├── train/ # 训练集图像 │ ├── val/ # 验证集图像 │ └── test/ # 测试集图像 ├── annotations/ # 标注文件 │ ├── instances_train.json # COCO格式训练标注 │ ├── instances_val.json │ └── instances_test.json ├── labels/ # YOLO格式txt标注 │ ├── train/ │ └── val/ ├── config/ │ ├── dataset_config.yaml │ └── class_names.txt └── README.md # 数据说明文档

我数了一下,训练集图像15600张,验证集3200张,测试集1800张,总计约20600张,全部是无人机可见光航拍图像,分辨率以1920x1080和4000x3000为主。图像来源覆盖了晴天、阴天、逆光、晨昏等多个时段,背景包括山区、农田、树林、水面等典型线路走廊场景,这说明数据生产方在采集时是有意识地做了场景多样性覆盖的。

采集设备方面,标注文档里记录了一部分拍摄用的机型参数,主要是大疆系列的无人机搭载的可见光相机,也有少量挂载在直升机上的亿像素级航测相机。图像中缺陷目标的最大特点是尺寸占全图比例很小,很多销钉、螺栓类缺陷目标只有几十乘几十像素,这在后续模型训练中是小目标检测的典型难题。

1.3 这个数据集的价值在哪里

电力巡检缺陷检测的数据集在市面上不多,尤其是带完整边界框标注、类别体系又贴合真实业务场景的。很多公开数据集要么是通用目标检测的(COCO、VOC),类别里没有电力部件;要么是遥感目标检测的(DOTA、DIOR),针对的是地物目标而不是线路金具。

这个数据集的价值在于,它的类别体系几乎是按照国网/南网检修规程里的缺陷定义来设计的,也就是说训练出来的模型可以直接对接一线检修业务的语言体系。检测到的缺陷类别在业务系统里可以直接映射到对应的缺陷等级和处理建议,模型产出的结果不用做太多二次翻译,落地成本低。

2. 类别体系与标注格式详解

2.1 缺陷类别定义

打开class_names.txt,里面共定义了15个类别,覆盖了线路巡检中最高频的缺陷类型:

类别ID类别名称说明
0insulator_breakage绝缘子破损/自爆
1insulator_missing绝缘子缺失
2pin_missing销钉缺失
3bolt_missing螺栓缺失
4bolt_loose螺栓松动/脱出
5damper_slip防震锤滑移
6damper_missing防震锤缺失
7grading_ring_tilt均压环倾斜
8bird_nest鸟巢
9foreign_object异物悬挂(塑料布、风筝线等)
10tower_corrosion塔材锈蚀
11wire_breakage导线断股
12clamp_corrosion线夹锈蚀
13insulator_dirty绝缘子污秽
14tower_deformation塔材变形

这里有一个值得注意的设计:类别之间并不是完全互斥的,比如“绝缘子破损”和“绝缘子污秽”可能同时出现在同一张图里的不同绝缘子上,也可能出现在同一个绝缘子上。实际标注时,如果一个绝缘子同时破损且污秽,标注人员会同时打两个框,框的位置基本重合。这种处理方式对训练阶段来说是友好的,相当于用多标签形式表达了一个缺陷目标的复合状态,但推理阶段需要做一些逻辑后处理,比如判断两个高度重合的框是否属于同一目标,避免重复告警。

2.2 COCO与YOLO双格式并存

这个数据集最贴心的地方是同时提供了COCO JSON格式和YOLO txt格式的标注文件,省去了格式转换的步骤。COCO格式主要用于使用mmdetection、Detectron2等框架的训练,YOLO txt格式则直接给YOLOv5/YOLOv8系训练用。两份标注是同一批原始标注转换而来的,内容完全一致。

COCO格式的标注文件用json存储,结构是标准的那一套:images数组记录每张图像的id、宽度、高度和文件名;annotations数组记录每个目标的image_idcategory_idbbox(左上角x、y、宽度w、高度h)和area。YOLO格式每个txt文件对应一张图,每行一个目标,格式为class_id x_center y_center width height,其中坐标值都做了归一化,范围在0到1之间。

我打开几个标注文件抽查过,发现YOLO格式的文本里坐标精度保留到小数点后6位,说明转换脚本本身没有严重的信息损失。但有一点要注意:两类格式转换时bbox坐标系的定义不同,COCO的bbox[x, y, w, h],YOLO是[x_center, y_center, width, height],如果你自己写转换脚本,务必确认中心坐标和左上角坐标的区别,很多人在这上面翻车。

2.3 标注质量的抽查结果

拿到任何外部数据集,第一件事不是急着训练,而是彻查标注质量。我写了个小脚本随机抽了200张图像,把标注框画到图上人工目检。整体质量是不错的,框的贴合程度、类别正确率都在可接受范围内,但问题也存在:

  • 部分绝缘子破损和污秽的标注框边框卡得过紧,把绝缘子边缘的裙边切掉了
  • 远处的小目标(比如销钉缺失)存在漏标现象,数了一下,200张图里大约4%的目标被漏标
  • 标注框的最小尺寸在YOLO格式下出现了宽度或高度趋近于0的情况,后来排查发现是转换脚本在处理完全垂直或水平的线条目标时数值出现退化

抽样检查的目的不是否定数据集质量,而是为后面的训练策略提供依据。比如针对漏标,我们要在损失函数或后处理策略上做一定的容忍;针对过紧的框,数据增强里可以加入轻微的框扩张扰动。

提示:在使用任何外部数据集之前,先抽检标注质量再进入训练,这个时间不能省。一次粗心抽检可能让整个模型的性能建立在不稳定的数据基础上。

3. 数据清洗与增强的实操方案

3.1 四步走的数据清洗流程

在正式训练前,我按下面四个步骤做了数据清洗。别嫌繁琐,这在真实项目中是必须的。

第一步,去重。无人机巡检航线经常有重叠覆盖,同一杆塔在不同架次中会被拍到高度相似的图像。我用感知哈希(Perceptual Hash)算法对全部图像计算哈希值,然后按汉明距离做相似度聚类,最终删除或标记了大约700组高度重复的图像。这一步能有效防止模型在重复样本上过拟合。

第二步,剔除损坏文件。检查每个JPEG文件的完整性,删除或修复了少量在传输过程中损坏的图片。同时检查了图像的实际尺寸和标注文件是否一一对应,确保没有“只有标注没有图片”或者“只有图片没有标注”的孤儿文件。

第三步,判断图像可用性。我用一个简单的亮度统计脚本,把全黑、全白、严重模糊的图像筛出来。无人机在快速飞行时拍摄容易产生运动模糊,这种图像人眼都很难判断缺陷,喂给模型只会增加噪声。筛选标准是拉普拉斯算子的方差值低于阈值就判为模糊图,这批图我单独放到了一个桶里,没有直接删除,留着后面做半监督学习的未标注样本。

第四步,类别统计。统计每个类别的目标数量和图像数量,这一步直接决定了后面的样本平衡策略。

3.2 类别不平衡怎么解决

统计结果很直观,类别分布严重不均衡。鸟巢、绝缘子自爆这类“肉眼易发现”的缺陷样本偏多,而螺栓松动、销钉缺失这类“小尺寸细密缺陷”样本明显偏少。训练集里最多的绝缘子破损目标有8000多个,而螺栓松动只有不到600个。

我用的处理办法是组合拳,而不是单一依赖某种方法:

  • 在线数据增强中的马赛克增强和复制粘贴增强,对小样本类别的目标进行复制粘贴到其他图像背景中,增加该类别的有效样本量
  • 对少样本类别使用更高的采样权重,在YOLOv8里表现为修改数据加载器中的类别采样概率,让模型每次迭代都能见到一定数量的少样本类别目标
  • 效果不理想后再考虑对少样本类别做离线增强,比如对包含螺栓松动的图像做旋转、缩放、亮度变化等变换生成新的训练样本

这里我建议优先使用在线增强和采样权重调整,不推荐一开始就离线复制样本,因为离线增强生成的图像之间高度相关,模型容易记忆样本而不是学习特征,泛化能力反而下降。

3.3 针对小目标的数据增强

电力巡检缺陷中大量目标在原始图像上占比小于1%,直接以原始分辨率训练,模型很难学到这类微小目标的特征。我的做法是给YOLOv8训练时设置imgsz=1280,在显存允许的前提下尽量使用高分辨率输入。当然,输入分辨率提高后推理速度会下降,这个在部署阶段再做权衡。

另一个有效的手段是切片推理(SAHI)。训练阶段我把包含小目标的图像切成若干有重叠的块,切片后的小目标在子图中的相对尺寸变大,模型更容易学习;推理阶段同样用切片推理把大图切成小块分别推理,再把结果合并回原图坐标系。配合NMS合并重叠边界框,实测下来销钉缺失类别的mAP提升了大概6到8个百分点。

注意:切片推理在部署阶段意味着推理耗时增加,一台Jetson Orin设备上处理一张4000x3000图像可能需要原图推理时间的三四倍。实际项目里通常只在近景精细巡检模式下启用切片推理,而非全程开启。

4. 用YOLOv8训练电力缺陷检测模型的完整记录

4.1 环境准备与数据划分

我的训练环境是单张RTX 4090 24GB,操作系统Ubuntu 22.04,CUDA 12.1,PyTorch 2.1。YOLOv8直接用ultralytics官方包,安装命令一行搞定:

pip install ultralytics

数据划分按8:1:1的比例把全部已清洗图像分为训练集、验证集和测试集。这里有一个重要原则:划分时必须以杆塔为单位,确保同一杆塔的图像不会同时出现在训练集和验证集中。如果不这样做,模型会“记住”特定杆塔的背景纹理,验证集上的指标虚高,到实际巡检场景中性能立刻掉下来。

数据划分脚本的核心逻辑如下:

import random from collections import defaultdict # 根据文件名前缀提取杆塔ID,例如 "tower_1001_img001.jpg" -> "tower_1001" def extract_tower_id(filename): return filename.split("_")[0] + "_" + filename.split("_")[1] tower_to_files = defaultdict(list) for img_file in all_images: tower_id = extract_tower_id(img_file) tower_to_files[tower_id].append(img_file) towers = list(tower_to_files.keys()) random.shuffle(towers) train_towers = towers[:int(len(towers)*0.8)] val_towers = towers[int(len(towers)*0.8):int(len(towers)*0.9)] test_towers = towers[int(len(towers)*0.9):]

4.2 训练参数配置与调优过程

我使用YOLOv8m(medium版本)作为基线模型,在mAP和推理速度之间取一个平衡点。训练参数大致如下:

# config.yaml path: /data/power_inspection_dataset train: images/train val: images/val test: images/test nc: 15 names: 0: insulator_breakage 1: insulator_missing # ... 依次对应15个类别

训练命令:

yolo detect train \ data=config.yaml \ model=yolov8m.pt \ imgsz=1280 \ epochs=150 \ batch=8 \ lr0=0.01 \ lrf=0.01 \ optimizer=AdamW \ mosaic=1.0 \ mixup=0.1 \ cos_lr=True \ patience=20

有几个参数值得单独说。imgsz=1280对显存要求很高,batch只能开到8,再多就爆显存了。mosaic=1.0保持默认开启,对提升小目标检测效果很有帮助。mixup=0.1我只放了一个较小的值,因为电力设备缺陷样本的形态差异其实不大,过强的mixup会削弱类别特征。cos_lr=True配合120个epoch以上的训练周期效果更好,学习率按余弦曲线下降,最后的收敛更平滑。

训练过程中我在第80轮左右观察到验证集loss不再明显下降,但mAP还在缓慢上升,说明模型还在慢慢学习小目标的特征。最终150轮跑完,验证集上的结果如下:

指标数值
mAP@0.50.827
mAP@0.5:0.950.564
Precision0.861
Recall0.793

整体结果可用,但距离一线实际应用还有差距,主要瓶颈在销钉缺失和螺栓松动这两个少样本、小尺寸类别上。

4.3 从YOLOv8切到YOLOv5的原因

有人可能会问,既然YOLOv8已经训练出了结果,为什么还要尝试YOLOv5?原因是到部署阶段我发现,现场的工控机和无人机机载设备老旧,YOLOv8m导出TensorRT后fp16推理时间大概在12到15毫秒一张640图像,看起来不慢,但换成YOLOv5s结构后,推理时间降到5毫秒左右,而mAP只损失了大约1.5个百分点。对于实时巡检场景,这1.5个点换来的速度提升完全值得。

YOLOv5训练时使用的命令类似,只是脚本换成了官方仓库的train.py

cd yolov5 python train.py \ --data power_inspection.yaml \ --weights yolov5s.pt \ --img 1280 \ --batch 16 \ --epochs 120 \ --device 0 \ --multi-scale

--multi-scale这个参数会动态改变输入图像的尺度(0.5倍到1.5倍之间随机),相当于额外的尺度增强,对电力巡检这种目标尺寸变化大的场景帮助很明显。

4.4 提升性能的进阶手段:模型集成与TTA

如果想要进一步提升最终指标,模型权重平均(Model Soup)和测试时增强(TTA)是两条实用的路线。

模型权重平均的做法是,把训练最后几个epoch保存的权重做简单平均,而不是使用最后一个epoch的权重。原理是,训练后期权重的波动往往在小范围内振荡,平均后的权重更接近损失面的最低点。我用最后10个epoch的权重做平均,mAP@0.5:0.95从0.564涨到了0.571,提升幅度虽小但稳定。

TTA则是推理阶段对图像做多尺度变换,把所有变换结果上的检测框合并再做NMS。实测下来TTA对recall的提升比较明显(从0.793到0.814),但推理开销极大,适合离线处理巡检数据,不适合实时机上推理。

5. 训练与推理中的常见问题排查实录

5.1 类别漏检的根源排查

训练中期发现验证集上鸟巢类别mAP高达0.92,而螺栓松动类别mAP只有0.31。排查了一通,原因有三层:

数据层面的问题是螺栓松动样本本身只有不到600个,且大量目标尺寸小于20x20像素。模型在默认anchor设置下,小目标的匹配率很低,正样本数量不足就学不动。模型层面的问题是YOLO的anchor分配策略对小目标不算友好,IoU匹配阈值会把大量小目标匹配为背景。优化方向是减小anchor的最低尺度,或者在数据增强中更激进地复制小目标。

数据增强层面的问题是马赛克增强虽然有效,但在类别不平衡的情况下,小样本类别在马赛克拼图中出现的概率更低,等于被稀释了。解决方法是让马赛克的四个象限不从全量数据中均匀采样,而是按类别权重采样,确保少样本类别在拼接图中仍然占有一席之地。

5.2 训练Loss异常的三种典型场景

训练过程中NaN loss是遇到最多的问题。NRM损失变NaN基本是学习率过高导致梯度爆炸,或者数据中有异常的标注框坐标(比如宽度为0、坐标为负)。我写了一个数据检查脚本,把标注中所有宽度高度小于1像素的框全部剔除,同时把边界框中心坐标超出图像边界的异常样本单独拉出来修正。

训练loss不降的情况也遇到过。最后定位原因是验证集和训练集划分存在信息泄漏,同一基塔的图像既在训练集又在验证集,模型的损失表面出现了虚假的平坦区域。重新按杆塔维度划分后,loss曲线就正常下降了。

还有一种情况是loss下降但mAP不涨。这种问题通常指向模型对背景过拟合,或者是正负样本比例失衡。我在实验中发现,把背景类别(包含大量“无缺陷”图像)作为独立训练数据加入时,模型的误检率大幅下降。这个数据集里特意提供了1000多张完全没有缺陷的负样本图像,训练集中加入20%的负样本能有效让模型学会拒绝正常目标,避免在真实巡检时对着每一个绝缘子都报缺陷。

5.3 推理阶段误检与漏检的调优策略

部署到机载设备后,最典型的问题是误检太多。实际巡检图像里有大量电塔的钢架结构、水泥杆、树木阴影,模型经常把这些误判为异物或缺陷。我的处理办法是:

  • 对置信度阈值做精细调节,缺陷类别阈值默认0.35,而鸟巢类目由于误检重灾区,单独调高到0.5
  • 在后处理阶段对同类目标使用Soft-NMS,而不是传统的贪心NMS,能保留更多重叠目标
  • 增加逻辑过滤规则,比如检测到的防震锤滑移目标如果同时被检测到防震锤缺失,且两个框的重叠度大于0.7,则保留置信度更高的那个

后续的优化方向是引入多帧时序信息,巡检视频中同一目标会连续出现在多帧,如果某一帧检测到缺陷,但前后几帧都没检测到,大概率是误检;反之,多帧连续检测到缺陷,那么该缺陷真实存在的概率就非常高。这个方法在视频流部署中能显著降低误检率。

6. 模型导出、部署与业务集成

6.1 导出TensorRT加速模型

YOLOv5s训练完成后,我把它导出为ONNX,再转换为TensorRT的engine文件,部署到Jetson Orin NX设备和带GPU的工控机上。命令大致如下:

python export.py \ --weights best.pt \ --include onnx engine \ --device 0 \ --imgsz 1280 \ --half

导出时要注意输入尺寸写死为训练时的1280。TensorRT做过层融合和精度校准后,推理速度比PyTorch原生快得多。实测单张640输入在Jetson Orin NX上fp16推理约8毫秒,1280输入约22毫秒,基本满足实时处理需求。

经验:导出时如果碰到TensorRT的某些算子不支持,回退到ONNX Runtime的GPU版本也能保证5-10倍加速,且兼容性更好。不要在不支持的环境中死磕TensorRT。

6.2 业务系统接入的关键设计

缺陷检测模型要真正用到巡检业务里,必须对接数据流和告警流。常见的数据流方案是无人机巡检任务结束后,把SD卡里的图像同步到地面站或云服务器,由批量推理服务处理,推理结果写入缺陷库,并通过Webhook推送给检修班组。另一种方案是机载边缘设备实时推理,检测到缺陷后触发拍照和GIMBLE标记,把缺陷位置和图像在短时间内传回控制端。

我在项目里同时实现了这两种模式。批量模式用RabbitMQ做任务队列,每张图推理耗时较长也不怕;实时模式只保留检测置信度最高的几个目标,优先传输缺陷图像,最大限度节省无线带宽。这里要提醒一个业务层面的细节:输出的边界框坐标必须和原图分辨率对应,因为业务端要标注到GIS图纸上,如果坐标系搞错,检修人员到了现场根本找不到缺陷位置。

6.3 模型迭代与数据闭环

模型上线只是开始,现实中缺陷形态会随着季节、天气、线路服役年限不断变化。我建议在业务系统中预留“标注回流”接口:检修人员现场核实缺陷后,把结果回传,系统自动把这些反馈数据和对应的巡检图像加入增量训练集。每隔一到两个月用增量数据微调一次模型,能长期维持甚至提升模型的检测能力。

这正好呼应了数据闭环的思想——没有哪份静态数据集能做到一劳永逸。即便这个数据集的初始质量不错,真正发挥价值的方式依然是把它作为标杆底座,持续叠加自己业务中产生的数据,模型才能越用越顺手。

7. 一些实战心得

回到开头的那个压缩包,从7z解压到最终模型上线,整个过程大概花了一周时间来摸透数据,三周来调模型,之后是持续迭代。我个人在这个项目里最深的体会是:一个高质量数据集对工程进度的帮助远超想象。类别体系设计、标注格式规范、场景覆盖范围,这些都直接决定了你在数据处理阶段要投入多少精力。如果你手里的数据集像这个一样,标注格式双轨、类别贴合业务,那么你的精力就可以集中在模型调优和部署优化上,而不是在数据清洗的泥潭里挣扎。

最后分享一个小技巧:用7z压缩数据集时,如果数据集内含大量小尺寸JPEG,建议把压缩字典调大一些(比如-md=1g),压缩率能提升不少,这个包7.2GB的压缩体积就是这么来的。如果你准备在团队内部分发数据,压缩率和完整性校验都值得留意,7z的完整性校验机制比普通zip更可靠,这也是很多数据集选择7z格式发布的原因。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询