1. 输电线异物检测:为什么这个"小问题"让人头疼好多年
做输电线异物检测这行的朋友,多少都有过这种经历:凌晨两点调度来电,说线路跳闸重合成功,让你去查。第二天无人机飞出去,在导线上找到一截快烧断的风筝线,或者一团被风吹到导线上的塑料地膜。异物这东西体量不大,造成的后果却一点不小。围绕智慧电力设备输电线异物检测这个方向,这两年我一直在收集和整理一套四类异物检测数据集YHT2739,也用它反复训练过好几版检测模型。这篇文章把从数据准备、标注规范、模型训练到边缘部署全过程的经验和坑都写出来,给正在做同类项目的朋友一个参考。
先说清楚这套东西适合谁看。如果你是在读学生、刚入行的算法工程师,准备拿异物检测当练手项目,这篇文章能帮你省掉大量试错时间。如果你是在电力运维单位做事,手头正好有一批现场图片不知道该怎么变成可用的训练数据,那这份从实际项目里趟出来的流程,也可以直接照着操作。核心就一句话:数据集的质量和标注口径,决定模型上限的一半以上。
1.1 异物故障为什么"不大"却"要命"
输电线路基本都是露天架设的,跨越农田、河道、树林、城镇边缘,什么环境都有。异物挂线的直接后果就是导线对地或相间距离缩短,一旦空气间隙被击穿就是短路放电。最典型的几种情况:
- 风筝线缠在导线上。风筝线很多是尼龙加金属纤维的,受潮以后导电性能上升,大风天气里导线舞动,风筝线来回磨蹭绝缘子和导线,非常容易诱发接地故障。
- 地膜和编织袋被大风卷到导线上方。这类轻质薄膜一旦搭在两根导线上,等于在相间搭了一座"桥",空气湿度大的时候直接闪络。
- 鸟巢搭在横担或绝缘子串附近。鸟巢里的树枝、铁丝、塑料绳混合在一起,下雨以后整体变成导电体,顺着绝缘子表面爬电。
- 气球、条幅这类带长飘带的异物,飘到导线上同样是隐患。
最麻烦的是,异物导致的故障多数是瞬时性的,重合闸能成功,所以现场不一定有明显的烧灼痕迹。但反复放电会烧伤导线铝股、绝缘子伞裙,一次消缺要协调停电窗口、抢修班组,成本很高。我在现场听过一个老师傅的总结:"异物故障不在于这一次多严重,而在于它会反复来。"这也是为什么运维单位愿意投钱做智能巡检——异物检测本质上是把被动抢修变成主动消缺。
1.2 为什么不能用通用目标检测数据集替代
可能有朋友会问:市面上开源的目标检测数据集那么多,直接拿来训练不就行了?我一开始也这么干过,后来发现完全行不通。原因有三点:
一是类别对不上。通用数据集里的"人、车、猫、狗"和输电场景需要的"风筝、塑料薄膜、鸟巢"没有任何交集,就算做迁移学习,网络学到的纹理特征也基本用不上。
二是尺度差异极大。异物在画面里往往非常小——一根风筝线在整幅巡检照片里可能只有几个像素宽,而一张完整的农用地膜又可能占据画面三分之一。这种极端尺度跨度,通用数据集里很少专门针对。
三是标注口径不统一。同样是"鸟巢",有人画外接矩形框,有人画多边形;同样一团塑料膜,有人标注为"垃圾",有人标注为"异物"。我用几个公开来源的图片拼过一版数据,训出来的模型在自家测试集上 AP 高低起伏特别大,后来排查发现就是标注口径混乱导致模型学到了"伪特征"。
所以最后我还是决定按统一标准整理一套自己的数据,也就是后面要展开的YHT2739数据集:全部按四类目标、统一标注规范、统一导出格式,保证每一张图都能直接用。
2. YHT2739数据集的构成与标注口径
2.1 四类目标的选择逻辑
YHT2739里包含的四类目标,不是拍脑袋定的,而是从某区域电网近几年的故障台账和缺陷记录里统计出来的。异物相关的异常事件中,风筝、塑料薄膜、鸟巢、彩带/气球这四类加起来超过八成,剩下的是施工机械靠近、烟火等低频但高风险的情况。
| 类别 | 典型形态 | 主要风险 | 常见拍摄环境 |
|---|---|---|---|
| 风筝 | 带尾巴的纸质/尼龙风筝,线条细长 | 线缠导线引发短路 | 天空背景、城市公园附近杆塔 |
| 塑料薄膜 | 农用地膜、编织袋、棚膜,多为白色/蓝色 | 搭线后相间闪络 | 农田、大棚区、风大区域 |
| 鸟巢 | 树枝、枯草、铁丝编织的巢状结构 | 阴雨天爬电、闪络 | 铁塔横担、绝缘子串附近 |
| 彩带/气球 | 庆典条幅、铝膜气球及飘带 | 缠绕导线、造成放电 | 城镇周边、道路沿线杆塔 |
这里有一个标注口径上的关键决定:只要目标出现在杆塔、导线、绝缘子附近,不论它当前是不是已经触碰带电部位,一律标为对应类别。因为巡检照片是静态的,而现场风是动的,这帧看着还悬空几十公分,下一阵大风可能就搭上去了。从风险管理角度看,即便只是"靠近",也值得让运维人员看一眼。
2.2 数据集规模与标注格式
YHT2739这个编号里的2739,就是整套数据集的图片总数。我手里这份整理好的版本里,共2739张图片、约6000多个标注实例。来源分布大概是:无人机巡检拍摄的照片占八成,杆塔固定摄像头抓拍占两成,分辨率为1920×1080为主,另有部分无人机高清航拍原图达到5472×3648。
标注格式同时导出了两种,方便不同训练框架直接使用:VOC XML和YOLO txt。附带一份类别定义文件,内容大致是:
names: 0: kite 1: plastic_film 2: bird_nest 3: banner_balloon训练集和验证集按85:15的比例划分,划分的时候特意做了处理,同一个场景的连续帧不会一半进训练集一半进验证集,避免因图像过于相似导致验证指标虚高。
2.3 标注规范里最容易吵架的几个细节
数据集项目最耗心力的不是拍摄和整理,而是定义"边界"。我整理YHT2739的过程中,和标注团队反复确认过下面几个规则,这里也分享出来给同样在做数据的人参考:
- 遮挡超过一半的目标标注吗?我的规则是"主体只要可见即可标注"。比如鸟巢半个被枝叶挡住,还能看出巢状结构,就标。这样做的好处是模型能学到"被部分遮挡的异物仍然是异物",而不是只认完整目标。
- 极小目标标不标?低于16×16像素的目标,确实很难从图上辨认。但从输电异物场景来说,绝对不能放弃这类样本——后期小目标正是漏检重灾区。所以我的规则是:只要人工放大后能判断类别,就标,同时打上一个"小目标"属性,方便后期做针对性分析。
- 边界框切多少背景?太紧会和目标混在一起,太松会导致模型学到过多背景纹理。我要求标注框在目标边缘外沿留3~5像素余量,风筝这种带长线的目标,框要包含大部分可见线体。
- 损坏的风筝还叫风筝吗?一根光秃秃的竹骨架、一团缠在导线上的断线,类别归属容易争议。统一处理规则是:能判断来源就归原类别,判断不了来源的碎屑归塑料薄膜类。
这些规则看着琐碎,但正是它们决定了训练出来的模型是"认识异物"还是"背图片"。
3. 基于YHT2739训练检测模型:参数、增强与调优
3.1 模型选型与训练环境
数据整理好之后就是模型训练。我最后选的是YOLO系列的单阶段检测器。原因很简单:这个场景不追求把每个目标的轮廓抠出来,只需要在图像里给出位置框和类别,YOLO系的性价比和部署生态都是最适合的。而且YOLO系导出ONNX、转TensorRT的链路非常成熟,后面接边缘盒子很顺畅。
训练环境不需要多豪华,单张普通显卡就能跑。我自己常用的配置是PyTorch 2.x + CUDA,显存8G以上即可。训练脚本和配置用ultralytics框架的默认方式,核心是要改几个关键参数,下面单独说。
YAML数据文件直接指到YHT2739的目录:
path: ./YHT2739 train: images/train val: images/val names: 0: kite 1: plastic_film 2: bird_nest 3: banner_balloon3.2 输入分辨率为什么不能照着默认参数来
这是我在这个项目上踩得最深的一个坑。YOLO系列默认训练尺寸一般是640×640,但这套数据里的目标普遍很小。我第一版模型直接用默认尺寸训练,验证集上的mAP勉强到0.6,看起来还行;结果一放到实际巡检照片里,十几个像素宽的风筝线几乎全部漏检,模型输出框时有时无,完全没法用。
原因不复杂:图像缩放损失了小目标信息。一张5472×3648的高清航拍图缩到640×640,原来的小目标可能只剩两三像素,卷积下采样几次之后特征就没了。
我把训练尺寸提到1280×1280之后,小目标AP立刻涨了差不多10个百分点。后来又在2048×2048试了一版,提升有限,但显存占用和训练时间翻了几倍。所以最终我用的是1280,同时在推理阶段保持同样的输入尺寸,保证训练/推理一致。
训练命令大致长这样:
yolo detect train \ data=YHT2739.yaml \ model=yolov8s.pt \ imgsz=1280 \ epochs=300 \ batch=8 \ mosaic=0.0 \ mixup=0.0 \ close_mosaic=10 \ patience=503.3 数据增强的取舍:Mosaic不是万能的
很多人训练目标检测模型习惯性开Mosaic增强,但在这个项目里,我直接把Mosaic和MixUp都关掉了。原因得从实际效果说。
Mosaic把四张图拼成一张,每张子图被等比缩小。对普通目标来说,这等于多了一个尺度增广,好处明显。但YHT2739里大量目标本身就是10~30像素的小目标,Mosaic一拼后直接缩到5像素以下,网络几乎学不到有效纹理。更麻烦的是,异物很多是长条形或丝状,拼接时目标跨接缝截断,标签和图像内容错位,训练出来的模型对"半截风筝线"特别敏感,误报高得离谱。
我最后保留的增强是:HSV色域扰动、随机平移、随机旋转、轻微缩放。这几种增强模拟了不同光照和拍摄角度,对异物检测更有意义。另外我还把"天空背景"单独做了一组翻转增强——输电塔上往下看的俯拍图,背景经常是大片天空,翻转以后能有效增加场景多样性。
3.4 一份可以照抄的调参记录
下面是我在YHT2739上最终使用的参数,附上每个参数的理由:
| 参数 | 推荐值 | 说明 |
|---|---|---|
| imgsz | 1280 | 小目标占比高,640下漏检严重 |
| batch | 8~12 | 受显存限制,1280尺寸下8比较稳 |
| epochs | 300 | 数据量不大,配合早停避免过拟合 |
| mosaic | 0.0 | 小目标会被拼接过缩掉 |
| mixup | 0.0 | 同上,且目标的纹理特征会被混合破坏 |
| optimizer | SGD | 数据量不大时SGD比Adam收敛更稳 |
| lr0 | 0.01 | 默认值即可 |
| close_mosaic | 10 | 最后10轮彻底关掉增强,让模型稳定收敛 |
还有一个容易忽略的小技巧:前50轮把backbone冻结住,只训练检测头。因为预训练模型的特征提取部分在ImageNet上学到的底层纹理特征(边缘、颜色块)依然有效,先让检测头适应新数据集,再解冻全模型微调,整体收敛更快,最终精度也有轻微提升。
4. 评估环节的真相:mAP好看不代表能上线
4.1 指标怎么定才贴合实际业务
模型训练结束之后,第一个动作不是看mAP-50-95,而是按类别拆开看AP。我在YHT2739验证集上的结果里,风筝和气球条幅两类AP最高,塑料薄膜次之,鸟巢最低。这个排序和现场直觉完全一致:鸟巢外观形态差异巨大,有的巢干净利落,有的巢是一团乱麻,再加上它经常出现在复杂钢结构背景里,模型学起来天然困难。
这里还有第二个更重要的原则:异物检测业务里,漏检的代价远大于误检。漏掉一个鸟巢,可能直接导致一次线路跳闸;误报一次,后台值班人员瞄一眼截图就能人工排除。所以我在评估时把Recall作为第一指标,mAP作为参考指标。具体要求是:每类Recall不低于0.85,整体mAP-0.5不低于0.75,才算过了我的验收线。
4.2 我在测试集上翻过的车:三组经典混淆
评估阶段最花时间的不是看指标,而是翻bad case。我整理了YHT2739测试集上最典型的三组错判,至今印象很深:
第一组:塑料薄膜 vs 水面/地面反光。白色的地膜在强烈阳光下会形成高亮区域,和水面反光、水泥地反光在特征上极度相似。模型一开始把不少水塘标成了塑料薄膜。后来我专门收集了一批反光干扰图做负样本,让模型见够"长得像但不是异物"的东西,误报才压下来。
第二组:鸟巢 vs 杆塔钢结构阴影。铁塔的斜撑、横担交叉区域,在侧光、逆光条件下会形成复杂的暗部纹理,从远处看和鸟巢乱糟糟的结构非常接近。尤其是晚间红外摄像头拍出的黑白图,塔材阴影几乎以假乱真。处理办法是砍掉一部分夜间低质量样本,优先保证白天场景准确率,夜间的误报交给后续规则过滤。
第三组:风筝 vs 空中的鸟和飞行器。风筝在天空背景里形态多变,尤其是一整面印着大图案的软体风筝,从远处看轮廓和飞鸟很像。后来我在数据增强里加入更多的天空背景干扰,并且对风筝类别单独收集了多角度样本,情况才好转。
4.3 置信度阈值不是拍脑袋定的
模型输出的置信度阈值定多少,直接影响误报率和漏报率的平衡。我见过很多项目"统一按0.5跑",实际上这是最偷懒也最容易翻车的做法。
我在YHT2739上做过一组阈值扫描:阈值从0.25到0.65逐步提升,观察每类的Recall变化。结果发现,风筝和气球条幅在0.4以上仍然保持较高召回,而塑料薄膜和鸟巢的召回在0.4之后急剧下降。原因还是这两类目标本身纹理复杂、模型信心天然不足。
所以我最后没有用单一阈值,而是把不同类别分开配置:风筝、彩带/气球类置信度阈值定0.45,塑料薄膜和鸟巢定0.35。推理时读类别后动态切换阈值,整体误报率降低了三分之一,召回还保住了。这一招强烈推荐给同样被多类目标困扰的朋友。
thres_map = { 0: 0.45, # kite 1: 0.35, # plastic_film 2: 0.35, # bird_nest 3: 0.45 # banner_balloon } for det in results[0].boxes: cls = int(det.cls) if det.conf >= thres_map[cls]: # 生成告警 pass5. 从离线模型到杆塔摄像头:部署与告警设计
5.1 推理链路与硬件选型
模型在服务器上指标好看只是第一步,真正要扛事的是把模型塞进现场设备。我这边部署的目标设备是杆塔边缘计算盒子,就是那种装在杆塔上、带一定算力的视频分析终端。芯片平台各有差异,但整体思路一致:把PyTorch模型先导出ONNX,再转成TensorRT的FP16模型。
这里要单独提醒一个坑:INT8量化在这个场景里特别容易翻车。小目标和细长条目标对量化误差非常敏感,我试过一版INT8量化后的模型,塑料薄膜类AP直接掉了十几个点。所以算力允许的情况下,建议用FP16,不要为了省那一点显存去碰INT8。
部署链路示意如下:
# PyTorch -> ONNX yolo export model=best.pt format=onnx imgsz=1280 half=True # ONNX -> TensorRT trtexec --onnx=best.onnx --saveEngine=best_fp16.engine --fp16FP16模型在边缘盒子上跑1080p输入,单帧推理大约在20~40毫秒之间,完全满足实时性要求。
5.2 不要对着视频流硬扛,用周期抓拍更稳
很多人在部署时第一个想法是"对视频流逐帧检测"。实际跑下来你会发现,边缘盒子的功耗、发热、稳定性和持续视频解码压力都比想象中大,而且输电现场的画面一分钟里绝大多数时间是没变化的,逐帧检测有效信息极少。
我最后采用的是周期性抓拍检测方案:每5分钟从摄像头抓拍一帧,先做一次轻量级的背景差分,如果画面与背景模板差异小于阈值就直接跳过检测,差异大了才跑模型推理。这样算力消耗降了一个量级,设备稳定性也好了很多。
5.3 告警确认机制:连续N帧确认
异物检测的告警不能像安防那样"一帧检出就报警"。风一吹、光一变,模型很容易出现单帧误报。我在实际项目里要求的规则是:连续两次抓拍都检出同一个区域存在同类目标,才推送告警。告警消息里带上原因帧的裁剪图和模型置信度,方便值班人员一眼确认。
另外现场的画面质量和实验室数据差距很大。雾天、暴雨、摄像头逆光、蜘蛛网遮住镜头,都会让模型失效。这里我的做法是给每根杆塔做一个基础的"画面质量分"判断,检测到过暗、过曝、异常模糊时先发一条设备维护提示,而不做异物判断。把这个机制跑顺之后,后台收到的无效告警明显减少。
5.4 季节和新增干扰的适应问题
输电场景还有一个特别容易被忽略的问题:季节变化。夏季杆塔周围的树木枝叶茂密,可能遮挡部分拍摄角度;冬天画面萧瑟,背景纹理完全不同。同一个模型在秋天调得很好,到了夏天误报率可能翻倍。
解决的思路分两层:模型层面对不同季节的图像做增强训练,系统层面预留"季节模板切换"功能——不同季节使用不同的背景差分模板和置信度阈值配置。这套机制不需要重新训练模型,但对现场实用性提升很大。
6. 数据闭环:把YHT2739变成持续生长的资产
6.1 告警截图回流,是数据集最好的增量来源
YHT2739这个数字只是第一版的规模。真正让检测系统越用越准的,是部署之后的数据闭环。我的做法是:把现场设备产生的每一次告警截图、每一次人工确认为误报或漏报的图片,全部回流到一个待标注池里,每周由标注人员统一处理一遍,然后合并进训练集做增量训练。
这个闭环里最值钱的不是那些"模型已经检出的正样本",而是误报样本。误报意味着模型把某种背景当成了异物,这些样本恰恰是当前模型最大的弱点,喂回去之后效果立竿见影。我一般在每轮增量训练后做一次回归测试,拿旧版测试集和新增样本一起跑,确保修掉误报的同时没有把老能力弄丢。
增量训练本身也有讲究。直接在新数据上继续训练,模型容易对旧数据"灾难性遗忘",风筝类AP可能掉下来。我通常的做法是:新收集数据与历史数据按2:8比例混合,学习率降到初始的十分之一,训练轮次减半。实测下来,性能是平滑上升的。
6.2 下一版数据集要补什么
从现场反馈来看,YHT2739之外还有两个值得重点关注的方向:
一是施工机械靠近。吊车臂、塔吊在输电线路附近作业是高危场景,一旦机械臂接近导线没被发现,后果比异物挂线严重得多。这个类别对检测精度要求更高,但训练样本也更难获得,需要对接施工监控视频去整理。
二是负样本类别。我给模型增加过"正常塔材""绝缘子""防鸟刺"三个负样本类。这个做法的目的不是要检测它们,而是让模型明确区分"异物"和"设备本体结构",对降低误报帮助极大。很多误报本质上就是模型"不知道那是什么东西,姑且按异物报",有了负样本类别后,它学会把不确定的对象归到背景里。
6.3 个人对这类数据集项目的一点体会
做了这么多轮迭代之后,我最深的体会是:数据集项目的成功与否,七成取决于标注规范和数据闭环,三成才取决于模型结构。YHT2739真正值钱的地方不是那2739张图,而是围绕它建立的标注口径、难例处理规则、增量回流机制。这些东西是任何公开数据集都给不了你的。
如果你现在正要开始做自己的异物检测数据,我建议第一版先不要贪多求全。四类高频异物、两千多张图、统一标注、闭环回流,这套组合跑通之后,再逐步加类别、加场景。做得糙一点没关系,重要的是把从数据到告警的整条链路跑起来,数据会在使用过程中自己长出来。