资讯动态

电网绝缘子缺陷识别:从目标检测到边缘部署的工程落地

发布时间:2026/10/27 11:27:56 来源:尧图企业网站定制
做过几年电力视觉检测的人大概都有同一个感受绝缘子本身不难拍难的是把“哪一颗、坏在哪、坏到什么程度”稳定地识别出来。我们这套基于深度学习的电网绝缘子缺陷识别方案最早是从一个巡检班组的需求里长出来的——他们每次外业回来无人机上一张存储卡里塞着几千张 4000×3000 的航拍图人工一张张翻翻到眼睛发酸一天下来能过完两三百张已经算高强度作业。漏掉一颗自爆的玻璃绝缘子后面可能就是一条线路的非计划停运。我把它定位成一个“能落地的工程方案”而不是一篇论文复现前端有图像采集和标注规范中间有目标检测模型训练和调优后端有边缘设备推理和业务流程对接。适合三类人参考——做电力/能源行业视觉算法落地的工程师、正在找真实工业场景做毕设或课题的同学、以及想搞清楚“目标检测从数据集到上线到底要踩多少坑”的开发者。下面按实际推进顺序拆开讲参数和代码都是我这边跑过或者踩过坑之后的版本。1. 方案整体设计与技术路线拆解1.1 为什么最终选目标检测而不是纯分类一开始有同事提的方案很简单把图切成小块每块做二分类判断有没有缺陷。听着省事实际做下来很快就崩了。原因在于绝缘子缺陷在整张图里占比极小一张航拍图里可能有二三十串绝缘子只有一两颗有问题图像级分类标签几乎没法给出位置信息巡检人员拿到“这张图有问题”的结论还是要自己找等于没减轻工作量。所以任务本质上是“定位 分类”的组合先要知道绝缘子在哪再判断它属于哪种状态。这就锁定了目标检测路线。更进一步我们实际用的是两级结构——第一级检测绝缘子串/单片位置第二级在裁剪出的局部图上判断缺陷类型。这么拆的理由很实际整图推理时单片绝缘子在 640 输入下可能只剩十几个像素网络根本学不动而两级结构可以让第二级输入是 512×512 的高清局部块缺陷特征的可见度提升一个量级。还有一类做法是语义分割把破损区域像素级标出来。我试过一轮标注成本直接翻了三倍而且现场巡检人员其实不需要那么精细的边界一个框加上缺陷等级就够开单了。工程上讲标注成本是隐性大头能省就省。方案标注成本位置精度小目标表现落地难度图像分类低无差低但没用单阶段目标检测中中一般中两级检测串片中高高好中高语义分割高极高一般高1.2 整条链路的五个环节真正跑起来才发现模型训练只占整个工作量的三成不到。完整链路是这样的采集无人机可见光 红外双光固定航线重叠率不低于 70%逆光角度避开。清洗与筛选剔除糊片、过曝、纯背景图按杆塔编号归档。标注两轮标注 交叉复核分歧样本进仲裁池。训练与评估分杆塔划分训练/验证集禁止同塔图像跨集泄漏。部署与回流边缘设备推理人工复核结果反向补进训练集。这里我最想强调第 4 步的划分方式。很多人习惯随机按 8:2 切图结果同一个杆塔、同一个角度、同一时刻拍的图同时出现在训练集和验证集里验证集 mAP 冲到 0.95一上现场掉到 0.6。必须按杆塔 ID 划分让验证集里的杆塔在训练集里完全没出现过这样测出来的指标才有参考价值。这一条我吃过亏改完之后指标从“好看”变成“真实”虽然数字降了但心里踏实了。1.3 算力与部署形态的取舍现场有两种部署形态机载实时和地面离线。机载要求推理延迟低于 100ms功耗受限用的是边缘计算模块地面离线是把图传回工控机批量跑追求吞吐。我们最终选择了地面离线为主、机载抽帧为辅的混合方案。理由很直接机载端算力有限跑两级检测会掉帧而巡检对实时性的要求其实没那么高——飞完一圈回来半小时内出结果班组完全可以接受。机载端只做一级粗筛把疑似有缺陷的图打上标记占比通常不到 15%剩下的交给地面工控机精算。算一下吞吐单张 4000×3000 原图切 12 块二级模型单块推理在工控机 中端显卡上约 8ms一张图约 100ms加 IO 和前后处理算 200ms一小时能处理 1.8 万张。一个班组一次外业 3000 到 5000 张十分钟左右出完比人工快了两个数量级。注意吞吐估算一定要把图像解码算进去。4K JPEG 解码单张就要 30 到 50ms用多进程预取能把这个开销藏掉单线程顺序读会直接把整体速度拖慢一倍。2. 数据集构建与标注规范2.1 缺陷类别的定义边界类别定义这一步看着枯燥但它决定了后面所有指标的上限。我们从现场反馈里收敛出六个类别每个类别都配了明确的判定标准避免标注员各理解各的。类别判定标准常见混淆玻璃自爆伞盘整片碎裂脱落剩余铁帽或残片与正常玻璃反光混淆瓷件破损伞裙缺口、掉块边缘见瓷质断面与鸟粪遮挡混淆伞裙开裂复合绝缘子硅橡胶伞裙可见裂纹与污秽纹理混淆污秽表面附着明显灰黑/黄褐色沉积层与阴影、逆光混淆闪络痕迹表面有灼烧、碳化通道或白色放电痕与污秽叠加时难分异物悬挂缠绕塑料布、风筝线、鸟巢枝条与背景植被混淆关键在于“可见即可标”原则标注员只对图像上肉眼可辨的缺陷打标不推测“可能存在”。这一条挡住了大量臆造标签也避免了模型学到标注员的想象。对于分辨率不足、看不清但疑似有问题的单独标成hard_sample放进不参与训练但参与评估的集合用来监控模型的边界能力。复合绝缘子的缺陷判定尤其麻烦因为伞裙是柔性的轻微变形不算缺陷但裂纹和撕裂必须标。我们最后给标注员配了一份 40 张的图例手册每类正例 10 张、反例 10 张标注一致性从最初的两两重合度 0.62 提到了 0.88。2.2 采集端的成像质量控制图像的底子决定了模型的天花板这一点在电力巡检里体现得特别明显。我们给飞手定了几个硬约束拍摄距离110kV 线路控制在 8 到 12 米220kV 控制在 12 到 18 米。太远小目标糊太近景深不够、边缘虚焦。重叠率航向 75%、旁向 70% 以上保证同一串绝缘子至少出现在三张图里给后续多视角融合留余地。光照避开正午顶光和逆光侧光 30 到 60 度最理想。逆光时玻璃绝缘子会整片过曝自爆和完好根本分不出来。对焦手动锁定对焦到绝缘子串中心不要用全域自动对焦飞过去的时候焦点容易飘到背景山体上。有个细节是后来才加上的每架次拍 5 张标定板图。用于后续做色彩一致性校正因为不同时段、不同机型的白平衡差异会直接导致模型在不同批次上表现飘忽。加了白平衡校正之后跨批次验证的召回方差从 0.09 降到了 0.03。2.3 标注细节框的松紧与小目标处理标注框的松紧度必须统一否则模型学到的框大小分布是乱的。我们的规范是框贴缺陷外接矩形误差不超过 3 像素超出部分需要修正。对于破损这种不规则形状按最小外接矩形标不追求贴合轮廓。小目标是标注的重灾区。单片绝缘子在原图里往往是 30×60 像素的细长条放大到屏幕上标的时候不同标注员给出的框能差出十几个像素。解决办法是给标注工具加一层固定倍率放大——把绝缘子串区域单独截出来统一放大 4 倍标注坐标再映射回原图。工具端做坐标变换标注员看到的就是放大的清晰图像。三个实操心得先标串再标片。串级框作为父级片级框作为子级层级关系存进 JSON训练时可以按需裁剪。模糊样本进仲裁池不进主训练集。让两个人独立标分歧超过阈值就进池子由第三个人裁决。每 500 张做一次抽检。抽 5% 复核发现系统性偏差立刻返工避免错误扩散。# 标注格式转换示例把扩大标注的框坐标映射回原图 def map_box_back(box, crop_origin, scale): box: [x1, y1, x2, y2] 在放大图上的坐标 crop_origin: (ox, oy) 裁剪区域在原图上的左上角 scale: 放大倍率 ox, oy crop_origin x1 box[0] / scale ox y1 box[1] / scale oy x2 box[2] / scale ox y2 box[3] / scale oy # 坐标裁剪到图像范围内 return [max(0.0, x1), max(0.0, y1), x2, y2]2.4 数据增强针对电力场景定制通用增强直接套在航拍图上效果有限我们做了几处改造。切图增强。原图很大直接 resize 到 640 会把绝缘子压成一条线。做法是随机在原图上裁 1280×1280 的区域再 resize 到网络输入尺寸。这样绝缘子的相对像素占比提升 2 到 4 倍小目标召回提升明显实测 mAP50 涨了 5 个点。光照扰动。模拟早晚时段色温变化用 HSV 空间的色调扰动 ±10、饱和度 ±20、明度 ±30比整图加减亮度更接近真实。雨雾与噪声。工业现场不会因为我们模型不喜欢就不下雨。叠加轻雾和高斯噪声让模型在低对比度下也稳一点。但要注意强度雾太浓会造出原图里不存在的伪缺陷。禁用项垂直翻转对于绝缘子串基本可以关掉因为串的悬挂方向有物理约束上下颠倒的样本在现实里不存在用它训练反而引入噪声。水平翻转问题不大可以保留。import random import numpy as np import cv2 def random_crop_enhance(img, boxes, crop_size1280): h, w img.shape[:2] if h crop_size or w crop_size: return img, boxes # 至少保证裁到部分目标的裁剪位置 for _ in range(10): x0 random.randint(0, w - crop_size) y0 random.randint(0, h - crop_size) cx1, cy1, cx2, cy2 x0, y0, x0 crop_size, y0 crop_size keep [] for b in boxes: ix1, iy1 max(b[0], cx1), max(b[1], cy1) ix2, iy2 min(b[2], cx2), min(b[3], cy2) if ix2 ix1 or iy2 iy1: continue inter (ix2 - ix1) * (iy2 - iy1) area (b[2] - b[0]) * (b[3] - b[1]) if inter / area 0.5: # 被裁掉超过一半的框丢弃 continue keep.append([ix1 - x0, iy1 - y0, ix2 - x0, iy2 - y0]) if keep: return img[cy1:cy2, cx1:cx2].copy(), keep return img, boxes3. 模型选型与训练实操3.1 主干与检测头的对比结论这块我前后试了四个方向把结论摆在前面。模型参数量mAP50本地单图延迟选型结论Faster R-CNN (R50)41M0.84295ms精度够速度不行YOLOv8-m26M0.82612ms综合最优方案主选YOLOv8-l44M0.85121ms离线批量场景可用RT-DETR-l32M0.84824ms无 NMS端到端备选最终主干选 YOLOv8-m二级检测器换成 YOLOv8-s理由是边缘部署时参数量和延迟可控。检测头用解耦头的版本分类和回归分支分开对小目标的分类精度提升大概 2 个点这是能感知到的差距。不用 Faster R-CNN 的原因很实在RPN 在长条形目标上的召回不如密集锚框而绝缘子串是典型的长宽比 5:1 到 12:1 的目标。我们特意在 anchor 设置里加了极端长宽比的先验把串级检测的召回从 0.87 拉到 0.94。3.2 长尾分布与小目标的组合拳真实数据里正常绝缘子数量是缺陷的几十倍长尾非常严重。我们的样本里正常:自爆大约 45:1。直接训练模型会倾向全预测成正常召回惨不忍睹。三个措施叠加使用重采样 过采样。按类别频次的反平方根做采样权重缺陷类样本被重复采样 3 到 5 次但同一样本不连续出现用 shuffle 打散。Focal Loss 调参。分类分支用 Focal Lossγ 设 1.5 而不是常见的 2.0。γ 太大在长尾场景下会让极难样本主导梯度训练反而不稳。我们在 γ1.5、α0.25 时收敛最好。切片推理SAHI。推理阶段把原图切成带重叠的 640 块分别推理后做 NMS 融合。小目标召回提升非常明显代价是推理时间增加约 3 倍。离线批量场景完全可以接受。# 简化版切片推理核心是重叠裁剪 全局坐标还原 融合 import numpy as np def slice_inference(model, img, slice_size640, overlap0.25, conf0.25): h, w img.shape[:2] stride int(slice_size * (1 - overlap)) boxes, scores, labels [], [], [] ys list(range(0, max(h - slice_size, 0) 1, stride)) xs list(range(0, max(w - slice_size, 0) 1, stride)) if ys[-1] slice_size h: ys.append(h - slice_size) if xs[-1] slice_size w: xs.append(w - slice_size) for y0 in ys: for x0 in xs: patch img[y0:y0 slice_size, x0:x0 slice_size] out model(patch, confconf) for b, s, l in zip(out.boxes, out.scores, out.cls): x1, y1, x2, y2 b boxes.append([x1 x0, y1 y0, x2 x0, y2 y0]) scores.append(float(s)) labels.append(int(l)) return boxes, scores, labels # 后续按全局坐标做 NMS注意切片推理的 PSI 参数重叠率别低于 0.2。低于这个值时正好落在切片边界上的绝缘子会被拦腰切断两半边各出一半的框NMS 一融合就成了错框表现为“看到了一颗不存在的缺陷”。3.3 训练超参与收敛过程超参不是抄来的是试出来的把关键几组摆出来。参数取值说明输入尺寸1280×1280640 小目标召回太低batch size16显存 24G 上限附近初始学习率0.01SGDwarmup 3 epoch 线性升到 0.01权重衰减5e-4防止过拟合到少数杆塔学习率调度余弦退火末期 lr 降到 1e-4训练轮数200120 轮后基本收敛EMA开启decay 0.9999小数据集上收敛更平滑这里有个容易忽视的点输入尺寸从 640 提到 1280显存占用大约翻 3 到 4 倍。640 下 batch 32 占 8G 左右1280 下 batch 16 就要吃到 20G 以上。显存不够的时候优先降 batch不要降分辨率分辨率对小目标的收益远大于 batch。训练到 120 轮左右验证集 mAP50 到 0.82 就基本平了后面全靠数据质量提升。我一度以为是模型到顶了后来加了一批逆光场景的图mAP 又涨了 3 个点说明瓶颈在数据分布而不是网络容量。3.4 关键代码片段数据集部分按目录组织一个缺陷类别一个文件用 YOLO 格式的 txt 标签。写 Dataset 类时注意图像读取要懒加载别在__init__里全读进内存几千张 4K 图能直接把内存吃爆。import os import torch from torch.utils.data import Dataset import cv2 import numpy as np class InsulatorDataset(Dataset): def __init__(self, root, img_dir, lbl_dir, img_size1280, transformsNone): self.img_dir os.path.join(root, img_dir) self.lbl_dir os.path.join(root, lbl_dir) self.names [f for f in os.listdir(self.img_dir) if f.endswith(.jpg)] self.img_size img_size self.transforms transforms def __len__(self): return len(self.names) def load_labels(self, name): path os.path.join(self.lbl_dir, name.replace(.jpg, .txt)) if not os.path.exists(path): return np.zeros((0, 5), dtypenp.float32) return np.loadtxt(path, ndmin2, dtypenp.float32) def __getitem__(self, idx): name self.names[idx] img cv2.imread(os.path.join(self.img_dir, name)) img cv2.cvtColor(img, cv2.COLOR_BGR2RGB) h, w img.shape[:2] labels self.load_labels(name) # letterbox 到正方形保持长宽比避免绝缘子被拉伸变形 scale self.img_size / max(h, w) nh, nw int(h * scale), int(w * scale) img cv2.resize(img, (nw, nh)) canvas np.full((self.img_size, self.img_size, 3), 114, dtypenp.uint8) canvas[:nh, :nw] img if len(labels): cls labels[:, 0:1] xy labels[:, 1:5].reshape(-1, 2, 2) * np.array([w, h]) * scale label_out np.concatenate([cls, xy.reshape(-1, 4)], axis1) else: label_out np.zeros((0, 5), dtypenp.float32) return torch.from_numpy(canvas).permute(2, 0, 1).float() / 255.0, \ torch.from_numpy(label_out).float()训练循环用 amp 混合精度能省 30% 显存、快 20% 左右。梯度裁剪别忘长尾场景偶尔会有梯度爆炸把训练带偏。from torch.cuda.amp import autocast, GradScaler scaler GradScaler() def train_one_epoch(model, loader, optimizer, criterion, device): model.train() total 0.0 for imgs, targets in loader: imgs imgs.to(device, non_blockingTrue) targets [t.to(device) for t in targets] optimizer.zero_grad(set_to_noneTrue) with autocast(): preds model(imgs) loss criterion(preds, targets) scaler.scale(loss).backward() scaler.unscale_(optimizer) torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm10.0) scaler.step(optimizer) scaler.update() total loss.item() return total / len(loader)4. 部署落地与推理加速4.1 从 PyTorch 到 TensorRT 的转换链路训练完的模型直接上线是不现实的PyTorch 在工控机上的推理速度大约是优化后的三分之一。我们走的是PyTorch → ONNX → TensorRT这条标准链路。导出 ONNX 有几个坑要避动态 batch 要开但动态尺寸最好别开动态 shape 会让 TRT 的优化策略退化实测慢 15% 左右opset 版本选 12 以上低了会遇到 NMS 算子不支持的问题。导出后先用 onnxruntime 跑一遍对拍确保输出和 PyTorch 差异在 1e-4 以内再进 TensorRT。# 导出 ONNX python export.py --weights best.pt --include onnx --opset 12 \ --dynamic --batch 16 --imgsz 1280 1280 --simplify # 构建 TensorRT 引擎FP16 加速 trtexec --onnxbest.onnx --saveEnginebest_fp16.engine \ --fp16 --workspace4096 --minShapesimages:1x3x1280x1280 \ --optShapesimages:8x3x1280x1280 --maxShapesimages:16x3x1280x1280FP16 量化在我们这个场景下的精度损失几乎可以忽略mAP50 从 0.826 掉到 0.824。INT8 就谨慎了需要一千张以上的校准集而且要用覆盖各种光照、各类缺陷的图否则玻璃绝缘子的反光区域会被量化误差吃掉自爆检测的召回直接掉 6 个点。我们最后没用 INT8FP16 的收益已经够。4.2 边缘端服务的工程化细节推理服务我写了个简单的生产者-消费者结构主线程负责解码和预处理GPU 线程做批量推理落库线程异步写结果。三个队列之间用有界队列控制防止内存失控。几个关键数字预处理线程数设成 CPU 核数的一半比较合适开满反而因为 GIL 和内存带宽争抢变慢批大小在延迟和吞吐之间取平衡离线批量场景用 8 或 16机载实时场景只能用 1。import queue import threading import numpy as np class InferencePipeline: def __init__(self, engine, batch_size8, num_workers4): self.engine engine self.batch_size batch_size self.img_q queue.Queue(maxsize64) self.res_q queue.Queue(maxsize256) self.workers [threading.Thread(targetself._preprocess, daemonTrue) for _ in range(num_workers)] self.gpu_thread threading.Thread(targetself._infer, daemonTrue) def _preprocess(self): while True: path self.img_q.get() if path is None: break img self.engine.decode(path) tensor self.engine.preprocess(img) # letterbox normalize self.res_q.put((ready, path, tensor)) def _infer(self): buf [] while True: item self.res_q.get() if item[0] ready: buf.append(item) if len(buf) self.batch_size: continue batch buf[:self.batch_size] buf buf[self.batch_size:] tensors np.stack([b[2] for b in batch]) outputs self.engine.run(tensors) # TRT 推理 for (_, path, _), out in zip(batch, outputs): self.engine.save_result(path, out)还有一处实测的经验图像解码一定要用多进程而不是多线程。OpenCV 的imdecode是 CPU 密集操作Python 多线程受 GIL 限制几乎没并行效果。换成multiprocessing.Pool之后整体吞吐提升了 40%。4.3 与巡检业务的对接方式模型输出一堆框是没用的业务侧要的是“哪基杆塔、哪一相、什么缺陷、什么等级、要不要立即处理”。所以推理之后还有一层结构化映射。我们的做法是把杆塔编号和相位信息写进图名配合航线元数据推理结果按图名解析出杆塔、相别、拍摄时间再按缺陷类型映射到三级等级缺陷类型处置时限紧急玻璃自爆≥3片、掉串、异物悬挂24 小时内安排重要单片自爆、瓷件明显破损、闪络痕迹一周内消缺一般轻微污秽、伞裙轻度开裂纳入季度计划这套映射表是跟运维班组一起定的不是算法侧拍脑袋。定完之后误报的影响也能被业务规则吃掉一部分——比如同一串绝缘子在三张图里都被判成缺陷才生成工单单张图报警只进复核池。这一条把无效工单量砍掉了约六成。5. 常见问题与排查实录5.1 指标漂亮但现场拉胯这是最高频的问题几乎每个项目都会遇到。典型表现验证集 mAP50 0.9 以上现场抽样召回不到 0.7。排查顺序我总结成三步第一步看数据集划分。按杆塔 ID 重新划分确认验证集里没有和训练集同塔同角度的图。我们第一次做的时候同一基杆塔的图被随机分到了两边改完指标直接掉了 8 个点这才是真实水平。第二步看类别分布。统计验证集里各类别占比和现场实际缺陷分布对比。如果训练集里自爆占了 30%而现场只有 8%那模型对自爆的过拟合会掩盖其他类的不足。第三步做视角实验。把验证集按拍摄角度分组侧拍、俯拍、仰拍、逆光看哪一组掉得最狠。我们当时发现仰拍组召回只有 0.52原因是训练集里仰拍图不到 5%。补了 400 张仰拍样本之后这一组召回拉到 0.79。5.2 小目标持续漏检单片绝缘子漏检是这类任务的老大难。按我踩坑的顺序检查这几个地方输入分辨率是否被降太多。1280 是底线640 基本上就废了一半。切片重叠率够不够。切到边界的目标会被切断重叠率 0.25 以上才行。标签框是否过小且被过滤。YOLO 训练时有个最小框过滤阈值宽或高小于 2 像素的框会被丢掉标注时要确认没有这类极小框混进去。正样本锚框匹配数。统计一下每张图匹配上的正样本数如果接近 0说明锚框设置和目标尺寸不匹配需要重新聚类 anchor。有个反直觉的发现加切片推理之后某些图的框反而变多了因为同一目标在多个切片里被检测NMS 融合时 IoU 阈值设得太高比如 0.7导致重复框没被压掉。把切片融合的 IoU 阈值降到 0.45 到 0.5问题解决。5.3 误报集中在几类背景误报主要来自三个方向我都遇到过玻璃反光。晴天正对太阳拍正常的玻璃绝缘子会有强烈高光形态和自爆后的残片很像。解决办法是在训练集里专门加这类高光正常样本标注成正常类让模型学会区分。加了 600 张之后这类误报下降了约 70%。鸟巢和植被。挂在塔上的枯枝、藤蔓在低分辨率下和异物悬挂几乎分不开。除了补样本加一个颜色先验也有帮助——异物多是塑料、金属色调和枯枝不同在预处理里保留色彩信息不要转灰度。阴影。塔材在绝缘子上投下的硬阴影边缘和裂纹相似。这个靠数据增强很难补我们用的是多视角融合同一串绝缘子在三张不同角度的图里如果只有一张判定有裂纹另两张没有就降级为疑似不进工单。5.4 部署后延迟抖动离线批量跑得好好的上线之后延迟忽高忽低。排查下来几个原因现象原因处理延迟周期性飙升内存回收、显存碎片预分配张量池关闭动态 shape前几十张特别慢TRT 引擎首次加载、cuDNN autotune启动时做 20 次空跑预热并发上来后变慢批处理队列阻塞有界队列 超时丢弃偶发超时大图解码慢多进程解码限制单图尺寸预热这一步特别容易被忽略。TensorRT 引擎第一次推理要走算子选择和显存分配我们实测第一张图要 1.2 秒预热后稳定在 20ms 以内。5.5 常见问题速查表问题首要排查点快速验证方法验证集好、现场差数据划分是否按杆塔按塔 ID 重划跑一遍小目标漏检多输入分辨率、切片重叠提到 1280 切片重测玻璃类误报高高光正常样本是否充足抽 100 张正常高光图看召回训练 loss 不降学习率、标签格式单张图过拟合测试训练 loss 震荡batch 太小、学习率过大降 lr、开梯度裁剪导出 ONNX 失败opset、动态 shapeopset 12 固定尺寸试INT8 掉点严重校准集覆盖不足换 1500 张多样化校准集推理延迟抖动无预热、显存碎片加预热 预分配单张图过拟合测试是个特别好用的手段拿一张图反复训 100 个 epoch如果 loss 降不到接近 0说明数据管道或者标签解析有 bug跟模型结构没关系。这个方法帮我在两次“以为是模型不行”的时候揪出了标签坐标归一化写反的问题。我个人在这类项目里最深的体会是模型结构换代很快从 YOLO 到 DETR 再到各种新架构一两年就变一轮但真正卡住项目进度的永远是数据和部署——标注一致性、杆塔级数据划分、高光样本补充、推理预热这些看起来不性感的活儿。把这几件事做扎实换个模型照样能跑做不扎实用再新的网络也是白搭。后面如果要继续往下推我建议优先做两件事一是把人工复核的结果自动回流进训练集形成闭环二是把红外通道的温升特征融进来污秽和零值这类只看可见光很难判的缺陷红外上反而更明显。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑