首页 / 资讯中心 / 文章详情

变电站设备分割实战:从数据预处理到模型训练全流程解析

变电站设备分割实战:从数据预处理到模型训练全流程解析 ★ FEATURED ARTICLE
做电力视觉的同行应该都有同感通用分割模型在常规场景里跑得很顺一碰到变电站设备分割就翻车。不是模型不行是数据形态和场景特性决定了这条路必须单独调。最近我在整理一批真实变电站设备的分割数据集——1660幅图像、15个类别、总大小1.6GB覆盖绝缘子、隔离开关、变压器这些主设备拍摄方式混了人工手持、固定机位和AGV自动导引车车载相机三种。这篇就把整个训练过程从头到尾拆一遍包括怎么理解数据、怎么定训练策略、哪些坑我踩过希望对正要搞电力设备视觉落地的朋友有点用。适合的人群准备做设备分割、缺陷检测、智能巡检模型的数据工程师和算法工程师以及想系统了解变电站场景分割关键技巧的研究生。1. 训练前先读懂这份数据集1.1 15个类别到底意味着什么先别急着配环境。拿到数据集第一件事理解类别分布与层次。15类不算多但电网设备有一个特点类别间形态差异极大。绝缘子是细长条结构一串由多个伞裙组成伞裙间还有间隙隔离开关有上下导电臂、触头、底座是典型的刚性结构件变压器是大型箱体表面还有散热器、套管、油枕等附件。表面上看这是“像素级分类”实际是“多尺度、多形态、强结构上下文”的组合问题。我的建议是先把类别按形态分成三组后面设计损失函数和评估指标时非常有帮助大面积块状设备变压器、电容器组、电抗器等占据图像面积大但类内纹理复杂表面有油污、锈迹、铭牌边缘不规则。中型结构设备隔离开关、断路器、互感器等几何结构清晰开关分合状态变化会导致形态完全不同而且容易被线缆遮挡。长条/小目标绝缘子、母线、导线等长宽比极端、像素占比小是分割结果最容易断裂的部分。分组的意义在于只看整体mIoU会掩盖问题。我在第一次实验里整体mIoU做到0.75觉得还行一拆开看绝缘子IoU只有0.52断层和漏检非常严重。所以后面所有评估都按组拆开看如果你也想在电力设备方向上深入尽早建立这种分组意识。另外建议手动整理一份类别和设备的映射表。比如某个标注叫“刀闸”实际上就是隔离开关的俗称叫“CT/PT”的是互感器。数据集里不同标注人员用词可能不一致确认清楚再进训练流程否则类别对齐阶段就会出问题。1.2 三种拍摄方式带来的数据分布差异标题里提到人工、固定和AGV安装的相机组合拍摄这一点特别容易被忽略但它直接决定模型能不能在真实巡检场景里用。三种方式对应的图像风格完全不同人工手持相机视角随意拍摄高度通常在1.5米左右光照不统一有手持运动模糊但画面构图灵活目标通常比较居中。固定机位相机视角固定位置偏高能拍到大范围场景但设备在画面里尺度小近距离细节少像素占比低。AGV车载相机搭载在巡检机器人上离设备很近视角低有倾斜仰拍感背景杂乱经常出现大特写同一设备在画面里只露出一部分。如果不做任何处理直接混合训练模型往往会在某一种视角上过拟合。我做了一组对比只用人工相机图像训练直接在AGV图像上推理mIoU掉了接近10个点很夸张。后来在训练阶段加了随机透视扰动模拟AGV的倾斜视角好了一些推理阶段采用滑动窗口才基本解决。建议拿到数据后先把拍摄方式整理成一份元信息表给每张图打上“人工/固定/AGV”标签。不需要全部用上但在分析和调试时这就是最重要的参考维度。后面做训练集和验证集划分时也要参考这个维度避免验证集只包含某一种视角。2. 数据准备与预处理2.1 标注格式确认与掩膜检查先确认标注格式通常是COCO JSON、VOC XML或者PNG灰度掩膜。我这份数据是灰度掩膜每个像素值对应类别ID。格式确认后不要直接开训先做三个检查这三步能省掉后续大量调试时间第一统计每类像素占比。写个脚本把所有掩膜扫一遍输出每个类别的像素总数和出现频率。这个结果直接决定类别权重。变压器这类大面积设备可能占10%以上而母线可能只有0.2%差距可能到50倍以上。第二检查掩膜里是否有未标注区域。很多标注工具默认把未标注像素置为0如果0不是背景类模型会把“空”当成一个类别去学结果输出一堆莫名其妙的分割块。第三检查类别重叠。我遇到过绝缘子和隔离开关在连接处同时被标注的情况两个类别共享一坨像素训练时梯度冲突边缘区域来回跳。处理重叠的办法是写一个像素优先级合并脚本当多个掩膜在同一像素位置同时存在时按“小面积类别优先”的规则保留因为小目标本来就容易丢。例如导线和绝缘子重叠保留绝缘子毕竟绝缘子在视觉上更应该突出。2.2 数据划分按场景划分不按图片随机切1660张图看起来不少但对分割任务来说真不算多划分要格外谨慎。千万不要直接随机打乱然后按比例切——同一设备同一角度下的连续帧很容易同时出现在训练集和验证集里验证指标虚高推理表现却一塌糊涂。合理的做法是按“拍摄时段设备区域”划分。例如把数据集按来源整理成若干组某次巡检时段内、某个间隔区域内拍摄的图划为一组以组为单位划分而不是以单张图为单位。我目前用的是训练1300张、验证180张、测试180张比例大约811整体按场景组划分。还有一个细节划分时尽量保证每个类别在所有集合中都有出现。尤其是母线、接地开关这种低频类别如果只出现在训练集而验证集完全没有无法评估真实性能反过来如果只出现在验证集训练阶段又学不到特征。所以划分完后打印一份“集合x类别x像素占比”的透视表确认分布合理。2.3 增强策略如何适配变电站场景变电站设备大多是金属材质、形态规则通用增强可以用但必须有选择。我试下来效果明确的组合必用随机水平翻转、多尺度缩放0.5到2.0之间、色彩抖动亮度、对比度、饱和度小幅扰动。变电站光照变化大不同时段拍摄颜色差异明显色彩抖动能显著提升鲁棒性。推荐随机透视扰动适当模拟AGV的低视角和倾斜角度缓解域差异。慎用强旋转。设备有明确的上下方向绝缘子倒过来在语义上是错的旋转90度或180度会破坏结构上下文我一般只做±10度以内的轻微旋转。注意别做过度的对比度扭曲否则金属高光的纹理会被破坏模型容易学歪。还有一个非常实用的小技巧背景抑制与随机裁剪结合。变电站场景里地面、天空、栏杆、草地占比很高背景太多会干扰训练。我的做法是随机裁剪一块区域缩放到固定尺寸同时确保裁剪框里至少包含一个目标实例用掩膜判断。这样每个batch都能保证模型看到“设备”而不是大量背景。3. 模型选型与训练配置3.1 模型怎么选数据量决定了上限1660张图这个量级直接上大模型容易过拟合但也不至于只能跑小模型。我做了几组对比总结下来可以参考追求精度和稳定优先DeepLabV3Backbone用ResNet50或ResNet101。这个组合在电力设备分割里表现很稳预训练权重好找部署成熟。追求边缘精细度可以试U-Net或U2-Net。这类带深层监督和密集连接的模型对绝缘子这种长条目标和小目标更友好边缘比DeepLabV3干净。追求落地效率比如后续要部署到巡检机器人上的嵌入式设备选轻量级SegFormer-B1或B2分割精度略降但推理速度快很多支持TensorRT转换。我的实际选择是DeepLabV3ResNet50做主要实验同时用U-Net做对比。两个模型的泛化表现相差不大但DeepLabV3在大目标上更稳U-Net在边缘细节上更好。有一点必须强调预训练权重非常重要。1.6GB数据量完全不够从零训练一个深层网络用ImageNet预训练或者自监督预训练权重收敛速度和最终精度都会有质的区别。我之前试过一次从头训练ResNet5050个epoch后mIoU还在0.3左右徘徊换成预训练权重后10个epoch就超过它了。3.2 损失函数类别不均衡是主要矛盾常规交叉熵Loss在这种极端类别不平衡下效果很差。拿我这组数据来说背景像素可能占60%以上加上大面积设备类别模型很容易“偷懒”——把所有东西都预测成背景和变压器整体loss也能降得挺好看。解决思路是类别权重。最常用的是基于中位数频率平衡法median frequency balancing计算公式是weight_c median_freq / freq_c其中freq_c是类别c的像素占比median_freq是所有类别像素占比的中位数。这样占比大的类别权重小于1占比小的类别权重被放大。母线如果占比只有0.2%权重可能放大到10倍以上。但单独用加权交叉熵还不够。我实际用的是复合损失加权交叉熵 Dice Loss。Dice Loss对小目标和长条结构非常有效它直接优化区域重叠度不会因为像素占比小就被忽略。实测效果单独用加权交叉熵绝缘子IoU是0.72加上Dice Loss之后同样的训练设置绝缘子IoU到了0.81断裂情况明显减少。如果项目对边界要求更高可以再加一个边界损失Boundary Loss用距离变换来计算分割边界与真值边界之间的距离误差。这个对绝缘子伞裙边缘、隔离开关触头这种精细部位效果显著。建议先不要三个Loss一起上从“加权CE Dice”起步稳定之后再逐步加。3.3 超参数与训练细节数据量不大训练策略要稳。下面这组参数是我多次实验后比较满意的基线可以直接参考参数值说明输入尺寸512x512也可以试640x640768提升有限且显存翻倍Batch Size8单卡显存不够就梯度累积优化器AdamW初始学习率1e-4weight decay 1e-4学习率策略Poly衰减(1 - iter/total_iter)^0.9训练轮数250轮配合早停patience30混合精度开启PyTorch AMP显存省一半速度提升明显数据加载4线程多进程读取增强在GPU前完成为什么用Poly衰减而不是余弦数据量少时余弦衰减后期学习率掉得很低容易陷入局部最优附近的小抖动Poly衰减在最后阶段保持一定的调节能力实测收敛更稳定。这是个小细节但影响不小。再说一下为什么不推荐直接用SGD。SGD收敛慢对学习率极敏感在1660张这种小数据集上AdamW的前期探索能力更强。我的建议是先用AdamW跑200-300轮如果想继续提点把优化器切换成SGD并降低学习率做二次微调效果通常还好。4. 完整实操训练流程4.1 目录组织与训练代码要点环境建议用PyTorch 2.x CUDA 11.8显存16GB以上会舒服很多8GB也能跑但batch要降。依赖库除了PyTorch还需要opencv、albumentations、pandas、matplotlib。先把数据组织成固定结构data/ images/ train/ xxx.jpg val/ yyy.jpg masks/ train/ xxx.png val/ yyy.png写一个Dataset类核心是图像和掩膜一一对应读取做同步增强同一组随机参数同时作用于图像和掩膜否则增强后掩膜和图像不对应模型直接学废。albumentations的RandomResizedCrop HorizontalFlip ColorJitter就够注意掩膜用插值参数interpolationcv2.INTER_NEAREST避免掩膜边缘出现不存在的类别像素。训练循环代码不复杂关键点在于每个epoch结束时计算验证集的mIoU保存最优模型不要简单保存最后一轮。我用的保存策略只存验证mIoU最高的权重并附带记录对应的epoch和类间IoU列表。4.2 过程监控盯着曲线更要盯着图Loss曲线要盯但不能只盯Loss。我在实验中发现Loss降到0.15附近后下降非常缓慢看起来“收敛了”但验证mIoU还在缓慢爬升这是因为Dice Loss的特性导致的Loss局部平缓不代表模型最优。建议每50轮做一次可视化输出把原图、真值掩膜、预测掩膜三张图横向拼在一起保存。这一步比任何指标都直观。我最早就是靠可视化发现三个典型问题第一个问题是“断层”绝缘子串被分割成好几段视觉上是断断续续的这通常是长条目标边界Loss不足导致的。第二个问题是“粘连”隔离开关和背景里的构架被预测成一个类别通常是语义边界模糊或标注边界不清晰导致。第三个问题是“反光漏检”金属设备表面高光反射区域被预测成背景模型把高光当成了非设备区域。可视化检查建议每50轮一次不要每轮都输出一是占用磁盘空间二是不利于横向对比。每轮打印指标每50轮输出一次可视化的节奏我用了很久效率最高。4.3 评估指标按类别拆开看整体mIoU和mPA只是第一层真正发现问题要靠逐类别指标。我养成的习惯是打印一张完整的按类IoU表按之前说的三组大物体、中结构、长条小目标去对比。举例来说第一轮实验的结果可能是类别组代表类别IoU大面积块状变压器0.88中型结构隔离开关0.79长条小目标绝缘子0.52如果真的出现这种分布说明长条类别的权重还不够或者Dice Loss在整张图里对这类小区域的效果不足。这时可以考虑对Loss做局部加权比如把绝缘子、母线这类像素占比低于1%的类别单独再乘一个2-3倍的权重。另外我还会算一个边界F1指标用形态学膨胀和腐蚀提取预测掩膜与真值掩膜的边界计算边界的精确率和召回率。这个指标对变电站设备特别重要因为电气设备分割的后续应用往往是缺陷检测和机械臂操作边界精度决定了后处理环节的可靠性。5. 常见问题与排查实录5.1 高频问题速查表把我在这个数据集上踩过的典型问题整理成一张表方便对号入座现象根本原因解决思路整体mIoU还行但绝缘子IoU低类别不平衡 长条结构分割难加Dice Loss提高小类别权重使用边界损失训练Loss下降验证Loss上升模型过拟合增强数据增强强度加DropoutEarlyStopping提前停AGV视角图像推理效果差训练集视角分布单一随机透视扰动增强用少量AGV图像微调推理用滑动窗口掩膜存在类别重叠标注标准不统一写脚本按像素优先级合并重叠区域大目标边缘锯齿严重边界像素类别混淆加边界损失推理时用CRF后处理显存溢出输入尺寸太大或batch过大降分辨率开梯度累积开启混合精度预测图出现椒盐噪声掩膜插值方式错误增强时掩膜用最近邻插值不要用线性插值5.2 三个最容易被忽视的细节第一个细节是学习率热身。用电网设备图像训练时预训练权重的特征分布和真实场景差异不小一上来就用1e-4可能会把预训练权重冲坏。我在前5个epoch用线性热身从1e-6涨到1e-4效果稳定很多尤其配合Poly衰减时。第二个细节是类别ID必须连续。标注软件导出的类别ID可能不连续比如类别编号是1、2、5、9。模型输出通道数按类别数定义如果直接用原始ID做交叉熵计算会导致严重错位。把ID重映射成0到14的连续值这个坑看起来低级但很容易在匆忙实验时忽略。第三个细节是训练和推理的数据预处理完全一致。很多人训练时做归一化和增强推理时改了预处理顺序或参数导致效果下降。建议把归一化的均值和标准差写成一个配置文件训练和推理共用同一份配置。我在这上面栽过一次跟头推理结果怎么都不对最后发现是推理时忘了做归一化。6. 传统模型训练之外还能往哪走6.1 从单帧分割到视频序列分割变电站巡检录像本质是视频流而单帧分割忽略了时序信息。固定相机的镜头几乎不动设备边缘在同一位置反复出现如果用视频序列分割如利用光流或帧间一致性可以有效平滑预测结果消除单帧的偶发闪烁。实际场景里巡检机器人拍摄的视频还有一定的运动规律可以尝试把连续3-5帧打包输入一个轻量的时序融合模块分割稳定性会有明显提升代价是部署复杂度更高。6.2 半监督与主动学习的空间1660张带标注图像够启动一个项目但真实变电站设备型号多样不同厂家的绝缘子形状差异很大。如果后续要扩展场景可以考虑半监督训练用当前模型在没有标注的巡检视频上生成伪标签挑选高置信度的区域加入训练集。主动学习是另一个方向——优先挑模型最不确定的设备进行人工标注能把标注预算用在刀刃上。这个思路特别适合变电站场景因为找电力行业的标注人员门槛高标注成本也比普通数据贵很多。6.3 面向缺陷检测的联合建模分割本身通常不是终点。在变电站设备视觉任务里分割结果会被用于缺陷检测、设备状态判断等下游任务。比如绝缘子分割出来后需要进一步判断是否有破损、闪络痕迹隔离开关分割出来后需要判断分合状态是否到位。如果项目目标包含缺陷检测建议在分割模型设计阶段就考虑到底层特征是否需要同时输出“设备类别”和“纹理异常区域”这会改变模型结构选择比如是否需要在Decoder分支之外再加一个辅助分类分支。我在实际项目里的体会是这类数据集真正难的不是模型结构而是你是否把“设备的结构特点”编码进训练流程。绝缘子这种长条目标必须用边界感知AGV视角必须做域扰动类别不平衡必须靠Loss组合解决。如果只套一个通用的训练模板指标看起来还行一上现场就会露馅。最后分享一个实测特别有效的技巧推理时不要用整张图直接预测而是用带重叠的滑窗策略——把大图切成512x512的小块、步长设为256相邻窗口有重叠对重叠区域的预测取平均。这个后处理几乎不花成本但在真实巡检大图上通常能给mIoU带来3到5个百分点的提升尤其在设备尺度变化大的场景里效果显著。
阅读完成 · 觉得有帮助?
咨询建站