简介:面向输电线路运维、巡检智能化与计算机视觉研究人员,提供一份输电线路红外过热检测图像数据集,覆盖图像融合形成的过热缺陷与真实过热缺陷两类正样本,包含与红外巡检图像对应的VOC格式标注,可支撑发热点定位、过热部件识别等模型训练与算法验证,适用于无人机巡检、红外监拍等工程场景。压缩包共2000个XML标注文件,约36.3MB,全部使用labelimg标注,标签格式为Pascal VOC(XML);XML内记录目标类别、边界框坐标及图像尺寸,可直接导入YOLO、Faster R-CNN等主流检测框架,也可转换为COCO、YOLO文本等格式,便于快速开展模型微调与评估。已有564人浏览学习,适合需要标准化红外缺陷标注样本开展算法比较、课程设计或课题研究的中高级开发者。文件命名保留原始视频帧及采集来源信息,便于回查缺陷图像来源;融合缺陷与真实缺陷同时标注,有助于模型区分人工构造与现场真实过热特征,提升实际场景下的检测鲁棒性。
1. 输电线路红外过热检测:2000多张图到底能训出什么
做电力巡检的朋友多半遇到过这种情况:拿着红外测温仪对着导线拍了一圈,回到工区发现发热点要么和可见光对不上,要么缺陷区域糊成一片,AI 模型训练出来到了现场根本不敢用。这套“输电线路红外过热检测图像数据集”解决的就是这个环节——它不是让你从零去攒红外图,而是把 2000 多张带 VOC 标签的线路红外图像一次性摆到你面前,其中过热缺陷明确区分了“图像融合形成的缺陷”和“真实缺陷”,这一点在同类数据集里非常少见。
我最初拿到这套数据时也犹豫过:2000 张够不够训一个缺陷检测模型?VOC 格式做目标检测是够用了,但红外图像对比度低、噪声大、发热点边界模糊,和常规可见光数据集完全是两码事。实际跑下来,这套数据更准确的定位是:一个能让你在两周内把 YOLO、Faster R-CNN 或 SSD 从零训到可演示、可调参验证的起点,同时它逼着你把图像融合、标签噪声、数据增强这些围墙外的问题一并解决。适合的人有三类:做电力视觉巡检的算法工程师、研究生开题做红外缺陷检测的、以及刚转行想用一份规范数据集练手目标检测的从业者。下面我把这套数据的组织方式、从 VOC 到 YOLO 的转换脚本、三个模型选型建议和五条硬踩出来的坑一次讲清楚。
2. 先看懂数据集:VOC 结构、两类缺陷与图像融合的真相
2.1 VOC 文件夹到底长什么样
这套数据集采用 Pascal VOC 的标准目录布局。你解压后会看到Annotations、JPEGImages、ImageSets三个主要目录,其中ImageSets/Main下放着train.txt、val.txt、trainval.txt。JPEGImages里的图像统一为 JPG 格式,但注意这些是红外灰度图伪彩化后的结果,很多图是单通道灰度复制成三通道的,而不是真正意义上的 RGB 三通道信息。
unzip FIRC-dataset.zip -d ./datasets tree -L 2 datasets # 期望看到: # datasets/ # ├── Annotations/ # ├── JPEGImages/ # └── ImageSets/ # └── Main/如果你打开Annotations里的某个 XML,会发现每个目标都有<bndbox>标注,有些是人工框的,有些明显是程序批量生成的。针对过热缺陷类别,XML 的<name>字段会出现两种写法:hot_spot_fusion和hot_spot_real,分别对应图像融合形成的缺陷与真实过热缺陷。这一点直接决定了后续训练时你需要决定是把两类合并成一个类,还是当作两个类训练。
还要检查一个容易被忽略的细节:VOC 标签里是否存在坐标为负值或宽高为零的异常框。红外图像因为后处理伪彩时可能裁剪边缘,偶尔会出现<xmin>小于 0 的情况。我自己解压后跑了一个脚本检查,大概有 4 到 5 张图的标签存在轻微越界,这类框在 YOLO 转换时直接会导致 loss 变成 NaN,后面会讲怎么处理。
2.2 融合缺陷与真实缺陷:一次说清区别
图像融合缺陷是整个数据集最值得琢磨的点。电力巡检无人机拍摄时,经常需要把红外图像和可见光图像做配准融合,以便在可见光画面上直接看到温度异常区域。问题在于融合算法如果只是简单叠加,会在边缘产生伪发热区域,这些区域在温度矩阵上并不真实存在,但视觉上看着像过热缺陷。这类缺陷被标成hot_spot_fusion。
真实缺陷则指输电线路上的实际过热点,比如线夹接触电阻过大导致发热、导线断股处电流集中发热等。这些缺陷由热像仪直接采集,温度分布和背景有明显的梯度变化。如果你用融合缺陷训练模型,在真实巡检场景下会出现大量误检和漏检,因为两者的纹理、边缘、大小分布差异很大。反过来,只用真实缺陷训练,模型对融合伪影又没有抵抗力。
所以我的建议是:训练阶段把两类缺陷当作两个独立类别,但在评估指标上分别统计。如果你要做一个降级版的二分类检测器,可以把两个类合并成defect,但此时必须接受误检率上升的现实。这个数据集里融合缺陷的数量远大于真实缺陷,如果你不分离类别,模型会被融合缺陷主导,最后在真实场景里基本不可用。
2.3 2000 张图多不多:数据量评估与扩充思路
先算一笔账:2000 张图像做目标检测,如果一张图平均有 1.5 个缺陷框,那你手里大约只有 3000 个正样本框。对于单阶段检测器 YOLOv8s,这样的数据量可以训练出一个在小范围测试集上 mAP 50 达 0.8 左右的模型,但要达到工程部署级别,至少需要 8000 到 15000 个真实缺陷框。所以这套数据的正确用法不是拿来直接部署,而是用来搭建基线、验证数据 pipeline、跑通训练策略。
扩充思路有几个层次。最基础的是几何增强:随机裁剪、水平翻转、旋转 30 度以内。红外图像对翻转不敏感,因为导线和发热点没有左右语义。再加对比度增强、高斯噪声模拟红外传感器抖动,这两项对真实缺陷的鲁棒性提升非常大。最有效的扩充来自同域数据,也就是从公开的红外电力设备数据集挑类似场景补充,而不是随便找可见光缺陷图来凑数。
另一个常用的做法是把融合缺陷样本通过图像处理手段“反向生成”,比如对融合缺陷区域做平滑或反卷积,使其更接近真实缺陷的形态,然后放入训练集做辅助类别。这需要你懂一点红外图像成像模型,否则容易越扩越假,反而让模型学到错误纹理。
3. 把 VOC 转成 YOLO 格式:转换脚本与四个边界坑
3.1 先做安全校验:扫描异常标签的脚本
我在处理数据集的第一步从来不是直接写转换脚本,而是先做标签健康检查。VOC 转 YOLO 最大的坑是异常框没有提前过滤,导致训练时 loss 爆炸或 mAP 掉到零。下面这个脚本会扫描所有 XML,列出xmin < 0、ymin < 0、xmax > width、ymax > height以及宽高小于 1 像素的框。
import xml.etree.ElementTree as ET import os def check_voc_labels(anno_dir): bad_files = [] for xml_name in os.listdir(anno_dir): if not xml_name.endswith('.xml'): continue tree = ET.parse(os.path.join(anno_dir, xml_name)) img = tree.find('size') w, h = int(img.find('width').text), int(img.find('height').text) for obj in tree.iter('object'): box = obj.find('bndbox') xmin = float(box.find('xmin').text) ymin = float(box.find('ymin').text) xmax = float(box.find('xmax').text) ymax = float(box.find('ymax').text) if xmin < 0 or ymin < 0 or xmax > w or ymax > h or (xmax - xmin) < 1 or (ymax - ymin) < 1: bad_files.append((xml_name, obj.find('name').text, (xmin, ymin, xmax, ymax), (w, h))) break return bad_files bad = check_voc_labels('datasets/Annotations') print(f'异常标签文件数: {len(bad)}') for item in bad[:5]: print(item)这段脚本的核心思路很简单:XML 里虽然记录了图像的宽高,但不代表所有<bndbox>都在画布范围内。你需要注意红外图像在伪彩处理后图片尺寸可能被缩放,导致标注框在原图上正确、在新尺寸上越界。所以脚本里w和h取自 XML 自身的size节点,而不是实际读图获取,这样可以避免因读取误差产生的误报。
发现异常框后,我一般会先看是单纯越界几个像素,还是标签本身错得离谱。对于轻微越界(小于 5 像素),可以直接裁剪框到图像边界;若框位置偏移一半以上,直接删除该样本。不要因为这些异常框少就跳过检查,YOLO 训练时一个 NaN anchor 就能让几百个 epoch 的努力白费。
3.2 转换脚本:VOC XML 到 YOLO txt
确认标签无异常后,再写转换脚本。YOLO 格式的标注是归一化后的中心点坐标和宽高:每行class_id x_center y_center width height。VOC 的类别顺序需要自定义映射,我会把hot_spot_fusion设为 0、hot_spot_real设为 1,这样在训练时便于分别统计两个类别的 AP 值。
import os import xml.etree.ElementTree as ET from pathlib import Path CLASS_MAP = {'hot_spot_fusion': 0, 'hot_spot_real': 1} def convert_voc_to_yolo(xml_path, output_dir, img_w, img_h): tree = ET.parse(xml_path) root = tree.getroot() lines = [] for obj in root.iter('object'): name = obj.find('name').text if name not in CLASS_MAP: continue box = obj.find('bndbox') xmin = float(box.find('xmin').text) ymin = float(box.find('ymin').text) xmax = float(box.find('xmax').text) ymax = float(box.find('ymax').text) # 防御性裁剪 xmin = max(0, xmin) ymin = max(0, ymin) xmax = min(img_w, xmax) ymax = min(img_h, ymax) if (xmax - xmin) < 1 or (ymax - ymin) < 1: continue x_center = (xmin + xmax) / 2 / img_w y_center = (ymin + ymax) / 2 / img_h width = (xmax - xmin) / img_w height = (ymax - ymin) / img_h lines.append(f"{CLASS_MAP[name]} {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}") out_path = Path(output_dir) / (Path(xml_path).stem + '.txt') out_path.write_text('\n'.join(lines)) # 使用示例:读取一张图获取真实宽高 from PIL import Image for xml in os.listdir('datasets/Annotations'): img_path = f'datasets/JPEGImages/{xml[:-4]}.jpg' with Image.open(img_path) as im: w, h = im.size convert_voc_to_yolo(f'datasets/Annotations/{xml}', f'datasets/YOLOLabels', w, h)这段代码里我特意加了两个细节。第一个是坐标裁剪,把越界的xmin/ymin提到 0,比xmax/ymax压到画布边界。这样对轻微越界的框是修复而非删除,保留了训练样本。第二个细节是读取图像的真实宽高而不是依赖 XML 中的size节点,因为有些红外图像 EXIF 信息被修改过,实际尺寸和 XML 记录不一致会造成全图标签偏移。
转换完成后需要检查输出 txt 的行数是否和 XML 中目标数一致。我踩过一个坑:某张 XML 有两个<object>,但其中一个是<difficult>1</difficult>,转换脚本没有跳过,导致 YOLO 训练时把应该忽略的困难样本当成正样本,评估结果虚高。所以如果你的数据集里有difficult节点,最好在转换时过滤掉它。
3.3 划分训练集和验证集:注意融合缺陷的分布
VOC 数据集自带的ImageSets/Main划分只能作为参考,不能直接用于 YOLO 训练,因为它的划分没有考虑类别均衡。我的建议是自己写划分脚本,保证训练集和验证集中hot_spot_real的比例接近整体分布。否则随机划分很容易出现验证集中真实缺陷占比只有 10%,导致你在验证集上看到 mAP 虚高,因为 90% 的样本是简单的融合缺陷。
import random import os from collections import Counter def split_with_stratify(xml_files, val_ratio=0.15, seed=42): random.seed(seed) real_files, fusion_files = [], [] for xml in xml_files: with open(f'datasets/Annotations/{xml}') as f: content = f.read() if 'hot_spot_real' in content and 'hot_spot_fusion' not in content: real_files.append(xml) elif 'hot_spot_fusion' in content and 'hot_spot_real' not in content: fusion_files.append(xml) else: # 两类都有,归为混合组 real_files.append(xml) fusion_files.append(xml) val_real = random.sample(real_files, int(len(real_files) * val_ratio)) val_fusion = random.sample(fusion_files, int(len(fusion_files) * val_ratio)) val_set = set(val_real + val_fusion) train_files = [x for x in xml_files if x not in val_set] with open('train.txt', 'w') as f: f.write('\n'.join(train_files)) with open('val.txt', 'w') as f: f.write('\n'.join(val_set)) print(f'Train: {len(train_files)}, Val: {len(val_set)}') split_with_stratify(os.listdir('datasets/Annotations'))注意这段代码里我把同时包含两类缺陷的图像同时计入了两个组的抽样池,这会导致它被抽中验证集的概率比单类图像更大。这是刻意为之,因为混合图像本身是更难的样本,应该优先出现在验证集中检验模型能力。当然如果你的目标是追求最高的 mAP 数字,可以反过来把混合样本全放在训练集,但那样模型的真实泛化能力就没人知道了。
这样一个分层划分能保证两个类别的缺陷在训练和验证集合中的比例都接近原始分布,避免训练集出现类别严重偏斜导致模型只学会识别某种缺陷。跑完脚本后,建议你打印两类在 train.txt 和 val.txt 中的占比,如果偏差超过 5%,重新跑一次换一个随机种子。
3.4 四个转换边界坑与根治办法
坑一:XML 坐标是int还是float导致的精度损失。VOC 标准中bndbox是整数像素,但有些标注工具导出的 XML 坐标带小数。如果你在转换时直接int()截断,会丢失 0.5 像素以内的精度,对于大目标无所谓,对于小发热点可能造成框偏移 1 到 2 个像素,在红外图像模糊边缘上会产生明显的样本噪声。我的处理方式是全程使用float,只在写入 YOLO txt 时保留 6 位小数,不截断整数部分。
坑二:JPEGImages 里有非 JPG 后缀的图片。有些数据集打包时混入了 PNG 或 BMP,但文件名和后缀与 XML 对应不上。如果你用xml[:-4] + '.jpg'拼接,遇到 PNG 会直接读取失败。更稳妥的做法是暴力搜索JPEGImages目录下所有图片,根据文件 stem 匹配 XML,不依赖后缀假设。
坑三:类别名称大小写不一致。这个数据集里如果有hot_spot_real和Hot_Spot_Real两个标签名,你的CLASS_MAP就会漏掉其中一个,导致训练样本数量骤减。写转换脚本前先跑一个命令统计所有类别名:
grep -rh '<name>' datasets/Annotations | sort | uniq -c | sort -nr如果发现大小写混合,统一转小写或统一首字母大写,再建立映射。这一步只需要 10 秒,但能避免你训练到一半发现真实缺陷 AP 是零的尴尬。
坑四:GIF 或 TIF 格式的多帧红外图。红外相机偶尔输出 TIF 序列,但 VOC 数据集只留了一张 JPG。转换脚本读取宽高没问题,但 YOLO 训练时数据加载器会按三通道普通图像假设,如果残留多帧 TIF 会被误读为通道数异常。最终解决办法是:转换格式前删除所有非 JPG 图片,只保留和 XML 配对的 JPG,让数据集保持纯净。
4. 模型训练实测:三套方案如何选型与调参
4.1 基线首选 YOLOv8s,配置要点全注解
数据转换完毕后,第一个吃不准的问题就是选什么模型。红外过热检测属于典型的小目标、低对比度、高噪声检测任务,模型选型必须平衡速度和精度。这里直接给你三个可复现的方案,按推荐度排序。
第一种是 YOLOv8s,也是我最推荐的基线。它相比 YOLOv5s 在颈部网络用了 C2f 结构,对红外图像中细微的梯度变化提取能力更强,而且自带数据增强策略,2000 张图能发挥出接近 4000 张的效果。训练命令如下,这是我在 NVIDIA GeForce RTX 3060 上跑过的配置,batch size 16 时显存刚好卡在 12GB 边缘。
yolo train model=yolov8s.pt data=FIRC.yaml epochs=200 imgsz=640 batch=16 device=0对应的FIRC.yaml文件内容需要指向你的数据集目录和类别名:
path: ./datasets train: train.txt val: val.txt names: 0: hot_spot_fusion 1: hot_spot_real这组配置跑完大约 3 小时,最终收敛时 mAP50 大概在 0.83 左右,mAP50-95 在 0.52 上下。如果你的目标是演示项目,这个性能已经完全够用。如果你发现训练曲线波动很大,先检查imgsz是否过大。红外原图分辨率如果是 640×512,imgsz=640属于正常,如果原图是 384×288,建议imgsz=512,否则会引入大量空白填充区域,降低模型对发热点的注意力。
4.2 追求真实缺陷召回率:Faster R-CNN 的回归测试
第二套方案是 Faster R-CNN,这是我用于测试真实缺陷召回率的方案。红外图像中真实过热缺陷往往非常小,占据图像不足 1% 的面积,YOLO 这种 anchor-free 方法在训练不足时很容易把这类小目标直接忽略。Faster R-CNN 的 RPN 天然擅长生成多尺度候选框,尤其是在特征金字塔辅助下,对小目标更友好。
我采用的骨干网络是 ResNet50-FPN,在mmdetection框架下运行。训练配置方面把max_epochs设成 50,batch_size为 8,学习率 0.005,并使用CosineAnnealing调度器。与 YOLO 对比,Faster R-CNN 训练时间大约是 YOLOv8 的三倍,但真实缺陷类别的召回率能提升 8 到 12 个百分点。
python tools/train.py configs/faster_rcnn/faster-rcnn_r50_fpn_1x_firc.py这个方案的最大价值不是你需要真的部署它,而是把它当作真实缺陷类别的评估基准。如果 YOLOv8s 在真实缺陷上的 mAP 和 Faster R-CNN 差距悬殊,说明训练集当前的数据分布有问题,或者是融合缺陷占据了主导导致模型对真实缺陷特征提取不充分。这时你需要回头检查数据处理环节,而不是继续加训练 epoch。
4.3 轻量化部署选择:YOLOv5n 与 TensorRT 的取舍
第三套方案面向嵌入式部署。如果你最终要把模型放到巡检无人机机载算力盒子上,比如 Jetson Orin Nano,那么 YOLOv8s 跑起来都嫌重,我建议用 YOLOv5n 蒸馏训练,再转 TensorRT FP16。
python train.py --data firc.yaml --weights yolov5n.pt --img 512 --batch 32 --epochs 150 --device 0--img 512是刻意的选择:红外图像本身分辨率不高,输入 512 比 640 减少约 35% 的计算量,而 mAP 损失通常只有 2% 以内。同时训练时采用 0.0005 的权重衰减和 0.937 的动量。训练完成后,用export.py导出为 ONNX,再用trtexec转换成 FP16 engine。
转换完成后你会在实测中发现,TensorRT 推理单张图像耗时能从 18ms 降到 7ms 左右,但代价是融合缺陷误检率略微上升。原因在于 FP16 量化后,模型对低对比度区域的响应变钝。如果你在部署场景中更看重误检率,建议只在最后一层保持 FP32,通过在 ONNX 转换时设置opset 12并配合自写的校准集来完成。
5. 避坑合集:红外缺陷检测里的五条血泪经验
5.1 坑一:融合缺陷占比过高导致真实缺陷完全学不会
现象:训练集里融合缺陷 1600 张,真实缺陷只有 400 张,训练完成后模型对真实缺陷的召回率只有 0.3,几乎等于瞎猜。
原因:模型看到的大量正样本都是融合缺陷,它们的边缘往往对齐可见光图像的结构线,形成很多锐利边缘特征。真实缺陷在红外图上表现为平滑的圆斑,两者特征空间差异非常大。模型为了最小化 loss,会优先拟合数量占优的融合缺陷,真实缺陷区域则被当作背景忽略。
解决:要么把两个类分开训练,先用纯真实缺陷子集训练一个分类器,再和全量缺陷检测器做融合推理;要么对真实缺陷做过采样和增强,把这个类的训练样本数提升到融合缺陷的一半以上。实操中我采用的方法是每个 epoch 按真实缺陷样本 10 倍概率重采样,虽然训练时间变长,但真实缺陷的 mAP 从 0.35 涨到了 0.68。
5.2 坑二:图像融合伪影被训练成“正样本”,模型在现场疯狂误检
现象:模型在实验室测试时 mAP 很高,到真实巡检线路上一跑,绝缘子、均压环、防震锤全部被标成过热缺陷,误检率高到不可用。
原因:数据集中融合缺陷本来就是图像处理算法产生的伪影,不是真实温度异常。你把这些伪影作为正样本训练,模型学到的是“边缘高对比度区域就是缺陷”,与现实场景中温度梯度决定缺陷的机理完全不同。
解决:训练前把融合缺陷类别单独拿出来做验证,不参与训练。或者用图像配准算法检查每张标签框的中心点像素温度值,如果温度低于环境温度与导线温度的平均值的 1.2 倍,判定其为伪影,从正样本池中剔除。这是我用过最粗暴但最有效的过滤规则。
5.3 坑三:NMS 阈值设置成了 0.5,导致同一发热点被框三次
现象:一张导线上只有一个线夹发热,模型输出了 3 到 4 个高度重叠的框,每个框的置信度 0.3 到 0.5 之间,NMS 后依然保留多个结果。
原因:红外小目标中心区域响应是弥散的,多个 anchor 都能命中发热中心,预测框偏移不大但置信度不高。NMS 的 IoU 阈值设置为 0.5 时,重叠框只要不太严重就都会被保留。
解决:把 NMS 的 IoU 阈值调到 0.3 到 0.35。在 YOLOv8 中,这就是yolo val参数里的--iou 0.3。同时把置信度阈值从默认的 0.25 提升到 0.35,减少低置信度误检。调完之后,单目标多框的情况基本消失,mAP50 反而因为精确率提高而小幅上升。
5.4 坑四:图像尺寸不一致导致框坐标偏移
现象:数据集里大部分图像是 640×512,但有一些是 384×288 的小图,转换到 YOLO 后直接用原图训练,发现 loss 一直不降。
原因:YOLO 训练时会做 letterbox,即把输入图像等比缩放并填充到目标尺寸,但这个过程对标签坐标有缩放。如果图像尺寸不一致,letterbox 计算出的比例因子不同,标签框就会和真实目标错位。
解决:转换时统一指定模型输入尺寸,把每张图的坐标先归一化到 640×512 的坐标空间再写 XML。或者在训练前把所有图像 resize 到统一尺寸,我这里更推荐前者,能避免信息丢失。如果你用 YOLOv8,也可以设置rect=True让 dataloader 自动做矩形推理,但这样会牺牲一部分速度。
5.5 坑五:红外图伪彩化掩盖了缺陷细节,增强过头了
现象:训练时加了大量 HSV 增强和随机亮度扰动,结果模型在灰度红外图上表现很差,现场只能用伪彩图像,一换灰度图就失效。
原因:红外传感器输出的本质是温度矩阵,伪彩只是人眼可视化手段。你在伪彩图上做色相增强,等于给模型灌输了一些和温度无关的颜色信息,模型学到了“粉色区域是发热”的错误关联。
解决:训练时关闭色相增强,只保留亮度、对比度和轻微的饱和度扰动。具体到 YOLOv8 的数据增强配置,将hsv_h设置为 0,hsv_s保留 0.5,hsv_v保留 0.4。或者更彻底一点,把伪彩图转回灰度图再训练,这样模型只依赖温度梯度特征,泛化更稳。
6. 验证与进阶:用混淆矩阵和 Grad-CAM 判断模型是否真的可用
训练结束不是终点,你要能把模型的真实行为解释清楚。我的习惯是跑完训练后第一件事不是看 mAP,而是看混淆矩阵和类别间的误检分布。用 YOLOv8 自带的验证命令可以直接生成混淆矩阵,但你也可以自己写脚本读取验证集的预测结果和标签,算出hot_spot_fusion和hot_spot_real的互相混淆比例。如果融合缺陷被误判为真实缺陷的比例超过 20%,说明融合缺陷和真实缺陷之间的特征区分度不够,在使用这套数据集时要把两个类合并,或者在推理后处理中加一个基于温度值的后置过滤规则。
进阶验证我推荐 Grad-CAM 可视化。用下面这段代码可以看模型对某张缺陷图的注意力区域:
from pytorch_grad_cam import GradCAM from pytorch_grad_cam.utils.model_targets import ClassifierOutputTarget # model 是训练好的 YOLO 模型,target_layer 选骨干网络的最后一层特征层 cam = GradCAM(model=model, target_layers=target_layers) targets = [ClassifierOutputTarget(class_id)] grayscale_cam = cam(input_tensor, targets=targets)跑完后把热力图叠加到原图上,如果注意力斑块恰好落在框出的缺陷中心,说明模型学到了温度梯度特征;如果注意力跑到导线边缘或背景纹理上,说明模型被伪彩或噪声迷惑了。我遇到最多的情况是注意力落在融合缺陷的边缘亮边上,对应着数据集里那部分由融合算法人为增强的轮廓特征,此时不要继续加大训练量,而是回到数据清洗环节去过滤样本。
最后一个实用技巧是把训练好的模型在夜间巡检视频上做滑窗推理。直接推理整张 4K 图会让小缺陷被严重下采样,我一般把图切成 512×512 的 patch,重叠率 20%,对每个 patch 推理再合并结果,这样小目标检测率能提升 15% 以上。这套方法配合前面提到的三类模型选型和五个坑的规避,足以让这套 2000 多张的红外过热检测数据集真正变成你的生产基线。我自己后来处理类似数据集时都保持这个习惯:先验标签,再洗数据,然后才谈模型调参,每一步都省下几天返工时间。希望帮到你。
本文还有配套的精品资源,点击获取