电力红外14类变压器检测数据集:VOC/YOLO转换、划分与训练避坑
简介面向电力场景电气设备红外检测需求这份数据集资料围绕变压器及相关设备的目标检测任务整理适合电力巡检、缺陷识别方向的研究人员与工程师用于模型训练和算法验证。配套文档约1MB仅含1个docx文件集中说明数据集的构成、标注规范与使用边界便于在正式取数前快速判断其适用性。数据覆盖4271张红外图像采用Pascal VOC与YOLO双格式标注共14个类别、11896个矩形框涉及空气断路器、电流互感器、连接器、避雷器、负荷开关、塑壳断路器、电压互感器、真空断路器和柜身等对象其中Connection类框数最多PF类较少类别分布差异可供采样与损失设计参考。资料同时注明标注工具为labelImg、标注规则为逐类画框并提示不对训练模型精度作保证。已有101人学习适合需要了解红外电力设备数据规格、评估数据质量与规划检测实验的读者查阅。1. 电力红外变压器检测数据集4271 张图与 14 类标签先看清电力场景电气设备红外图像变压器检测数据集4271 张红外图配 VOC 与 YOLO 双格式标注14 类设备框共 11896 个。它不是拿来就涨点的万能包最大价值是把 ACB、CT、MCCB、VCB、PT 等一次凑齐让你能把“设备定位”这件事先跑通。适合做电力巡检算法验证的工程师、做课程设计的学生也适合想练类别不均衡和小目标检测的熟手如果你的任务只是识别单一变压器直接上这份数据集反而会把问题复杂化。拿到压缩包后先别急着训练先看标签拼写、空框和类别分布这三件事比选模型更影响最终结果。2. VOC 与 YOLO 双格式拆解14 类标签的读法、分布与合并决策2.1 VOC xml 与 YOLO txt 各自管什么这份数据集给的是 jpg 图片、VOC 格式 xml、YOLO 格式 txt数量都是 4271没有分割路径的 txt也没有 mask 图。VOC 的 xml 里一张图对应一个annotation里面包含size的宽高以及若干个object每个 object 有name和bndbox的 xmin、ymin、xmax、ymax。YOLO 的 txt 每行是class_id cx cy w h坐标已经归一化到 0 到 1class_id 从 0 开始具体类别名不在 txt 里而是由训练配置里的 names 列表决定。两边唯一的硬约束是xml 的 size 必须和 jpg 实际宽高一致否则转换出来的归一化坐标会整体跑偏。常见翻车点是把 VOC 的 xmax、ymax 当成宽高或者把 YOLO 的 cx、cy 当成左上角。VOC 是绝对像素坐标左上角加右下角YOLO 是中心点加宽高再除以图片宽高。用 labelImg 标注时框的边界偶尔会贴到 0 或图片最大宽高转换时要做一次裁剪不然会出现负数或大于 1 的坐标。训练器一般会报 warning但不会帮你修数据最后表现成框偏移、mAP 虚低。2.2 14 类标签分布先看框数再谈模型原始类别名是[ACB,CT,Conection,Connection,LA,LBS,MCCB,MOF,PF,PT,VCB,body,connection,core]。注意这里有三个高度相似的写法Conection、Connection、connection。输入里明确给出中文含义的只有 ACB 空气断路器、CT 电流互感器、Connection 连接器、LA 避雷器、LBS 负荷开关、MCCB 塑壳断路器、PT 电压互感器、VCB 真空断路器、body 柜身MOF、PF、core 以及拼写变体没有给出中文先按标签字面保留不要自己猜。标签中文含义按给定框数观察ACB空气断路器94小类容易漏CT电流互感器790与 PT 外形接近Conection标签字面疑似拼写变体471与 Connection 混淆Connection连接器3961最大类主导损失LA避雷器267小类LBS负荷开关548中等MCCB塑壳断路器1600第二大类MOF标签字面273小类PF标签字面56极少先查是否有漏标PT电压互感器661与 CT 易混VCB真空断路器144小类body柜身380大框可能包住其他类connection标签字面小写变体1952与 Connection 混淆core标签字面699中等总框数 11896。Connection一类就占 3961加上Conection的 471 和connection的 1952连接器相关框合计 6384超过一半。PF 只有 56 个框ACB 94 个VCB 144 个这三个类在训练集里很可能被大类压住。先做一次统计不要凭感觉调参。from pathlib import Path import xml.etree.ElementTree as ET from collections import Counter raw Path(dataset/raw) xmls sorted(raw.rglob(*.xml)) counter Counter() empty_xml [] bad_boxes [] for xml_path in xmls: root ET.parse(xml_path).getroot() objects root.findall(object) if not objects: empty_xml.append(xml_path.name) continue for obj in objects: name (obj.findtext(name) or ).strip() counter[name] 1 box obj.find(bndbox) if box is None: bad_boxes.append((xml_path.name, name, missing bndbox)) continue try: x1 float(box.findtext(xmin)) y1 float(box.findtext(ymin)) x2 float(box.findtext(xmax)) y2 float(box.findtext(ymax)) except (TypeError, ValueError): bad_boxes.append((xml_path.name, name, non-numeric)) continue if not (0 x1 x2 and 0 y1 y2): bad_boxes.append((xml_path.name, name, (x1, y1, x2, y2))) print(类别框数:, counter) print(空 xml 数:, len(empty_xml), empty_xml[:5]) print(异常框数:, len(bad_boxes), bad_boxes[:5])这段脚本做三件事统计每个name的框数、找没有 object 的空 xml、找坐标非法或缺失 bndbox 的框。raw换成你解压后的图片和 xml 根目录strip()不能省标签名前后有空格会让类别对不上。跑出来的 Counter 应该能和上表对上如果对不上先检查是不是重复解压了目录或者 xml 和 jpg 不在同一层。2.3 合并重复类还是保留原样一张映射表定决策我一般会做两组实验而不是一上来改标签。第一组是原始 14 类完全按 txt 里的 class_id 走作为 baseline第二组把Conection和connection映射到Connection类别数从 14 变成 12总框数仍是 11896。合并后连接器类 6384 个框MCCB 1600CT 790body 380core 699PT 661小类仍然小。这个对照能回答一个问题模型到底是被“连接器样本多”带偏还是被“同一类拆成三个名字”带偏。不建议把 CT 和 PT 合并也不建议把 body 和 core 合并。CT 电流互感器、PT 电压互感器在红外图里可能外形接近但语义不同body 是柜身core 是标签字面核心部件框的层级可能不一样合并会把大框和小框混成一类。合并只处理明显拼写和大小写变体别扩散。RAW_CLASSES [ ACB, CT, Conection, Connection, LA, LBS, MCCB, MOF, PF, PT, VCB, body, connection, core ] MERGE_MAP { Conection: Connection, connection: Connection, } MERGED_CLASSES [] for name in RAW_CLASSES: target MERGE_MAP.get(name, name) if target not in MERGED_CLASSES: MERGED_CLASSES.append(target) print(MERGED_CLASSES) # [ACB, CT, Connection, LA, LBS, MCCB, MOF, PF, PT, VCB, body, core]MERGE_MAP为空时就是原始 14 类启用后类别数变成 12。关键点映射之后必须重新生成 YOLO txt 的 class_id不能只改 names 列表。训练配置里的 names 顺序和 txt 的编号是一一对应的顺序错一位所有框都会学到错误类别。原始 14 类 baseline 和 12 类合并实验各留一份 data.yaml别覆盖。2.4 用脚本把标签健康度扫一遍除了类别统计还要看每张图的框数分布。红外图里经常出现一张图只有柜身大框或者只有一个小连接器这种样本对定位有帮助但对分类帮助有限。统计每张图框数可以快速找空 txt、单框图和异常多框图。空 txt 不是一定有问题它可能被当成背景图使用但如果空 txt 数量很大说明标注覆盖不完整训练时背景样本会压低召回。from pathlib import Path from collections import Counter label_dir Path(dataset/raw/labels) box_per_image Counter() empty_txt [] for txt in label_dir.glob(*.txt): lines [ln for ln in txt.read_text(encodingutf-8).splitlines() if ln.strip()] box_per_image[len(lines)] 1 if not lines: empty_txt.append(txt.name) print(每图框数分布:, sorted(box_per_image.items())[:10]) print(空 txt 数:, len(empty_txt), empty_txt[:10])box_per_image的键是框数值是该框数对应的图片数。如果 0 框图片占比超过 10%先确认这些图是不是纯背景如果 1 框图片大量集中在 body说明很多图只标了柜身没有标内部设备训练时模型会倾向于只输出大框。空 txt 可以保留少量作背景但不要大量保留否则小类召回会被拉低。3. 从原始压缩包到可训练目录划分、转换与加载的三个脚本3.1 目录怎么摆images 与 labels 严格对应解压后先把原始文件放成dataset/raw/images和dataset/raw/labels图片和 xml 可以同目录但转换后的 YOLO txt 单独放labels。最终训练目录用dataset/transformer_ir下面分train、val、test每个 split 里各有images和labels。文件名 stem 必须完全一致abc.jpg对应abc.txt不要出现abc.JPG和abc.txt大小写不一致Linux 上会直接找不到标签。常见做法是先转换再划分这样划分脚本只复制 jpg 和 txt不碰 xml。转换脚本读 xml 和 jpg输出 txt 到dataset/transformer_ir/labels图片复制到dataset/transformer_ir/images。不要在原始目录上直接改留一份 raw 方便回滚。3.2 VOC 转 YOLO归一化、裁剪与类别映射下面这段转换脚本同时处理类别映射、坐标裁剪和未知类别报错。未知类别直接抛异常不要用continue悄悄跳过否则你会在训练后发现少了一个类回头查很费时间。from pathlib import Path from PIL import Image import xml.etree.ElementTree as ET import shutil RAW Path(dataset/raw) OUT Path(dataset/transformer_ir) RAW_CLASSES [ ACB, CT, Conection, Connection, LA, LBS, MCCB, MOF, PF, PT, VCB, body, connection, core ] MERGE_MAP {Conection: Connection, connection: Connection} CLASSES [ACB, CT, Connection, LA, LBS, MCCB, MOF, PF, PT, VCB, body, core] def clip(v, lo, hi): return max(lo, min(v, hi)) def convert_one(xml_path, img_path): w, h Image.open(img_path).size root ET.parse(xml_path).getroot() lines [] for obj in root.findall(object): name (obj.findtext(name) or ).strip() name MERGE_MAP.get(name, name) if name not in CLASSES: raise ValueError(f未知类别 {name} in {xml_path}) box obj.find(bndbox) if box is None: continue x1 float(box.findtext(xmin)) y1 float(box.findtext(ymin)) x2 float(box.findtext(xmax)) y2 float(box.findtext(ymax)) x1 clip(x1, 0, w - 1) y1 clip(y1, 0, h - 1) x2 clip(x2, 0, w) y2 clip(y2, 0, h) if x2 x1 or y2 y1: continue cx (x1 x2) / 2.0 / w cy (y1 y2) / 2.0 / h bw (x2 - x1) / w bh (y2 - y1) / h cls_id CLASSES.index(name) lines.append(f{cls_id} {cx:.6f} {cy:.6f} {bw:.6f} {bh:.6f}) return \n.join(lines) (OUT / images).mkdir(parentsTrue, exist_okTrue) (OUT / labels).mkdir(parentsTrue, exist_okTrue) for img_path in sorted(RAW.rglob(*.jpg)): xml_path img_path.with_suffix(.xml) if not xml_path.exists(): print(缺 xml:, img_path) continue shutil.copy2(img_path, OUT / images / img_path.name) txt convert_one(xml_path, img_path) (OUT / labels / f{img_path.stem}.txt).write_text(txt, encodingutf-8)RAW是解压后的根目录OUT是转换输出MERGE_MAP为空字典时保留 14 类启用时是 12 类CLASSES的顺序就是 YOLO 的 class_id 顺序必须和 data.yaml 的 names 完全一致。坐标裁剪到图片范围内防止 labelImg 的边界框贴边产生负值。:.6f保留六位小数足够训练用。转换完先看OUT/images和OUT/labels的文件数是否都是 4271 左右少一张都要查。3.3 按图像划分训练/验证/测试并防泄漏划分按图片级别做不要按框级别做。同一张图的多个框必须落在同一个 split否则验证集会出现训练时见过的设备mAP 虚高。常见比例是 8:1:1小数据集可以 7:2:1验证集至少留 300 张以上测试集至少 300 张不然单类指标波动很大。随机种子固定划分结果存一份 csv后续换模型才能公平比较。import random import shutil import hashlib from pathlib import Path OUT Path(dataset/transformer_ir) random.seed(202405) images sorted((OUT / images).glob(*.jpg)) random.shuffle(images) n len(images) n_val int(n * 0.1) n_test int(n * 0.1) splits { val: images[:n_val], test: images[n_val:n_val n_test], train: images[n_val n_test:], } seen {} for p in images: h hashlib.md5(p.read_bytes()).hexdigest() if h in seen: print(重复图片:, p.name, 与, seen[h]) seen[h] p for split, files in splits.items(): img_dir OUT / split / images lbl_dir OUT / split / labels img_dir.mkdir(parentsTrue, exist_okTrue) lbl_dir.mkdir(parentsTrue, exist_okTrue) for img in files: shutil.copy2(img, img_dir / img.name) shutil.copy2(OUT / labels / f{img.stem}.txt, lbl_dir / f{img.stem}.txt) print({k: len(v) for k, v in splits.items()})seed202405可以换成你们团队固定的种子n_val和n_test各取 10%剩下 80% 训练md5 检查重复图片重复图跨 split 是最隐蔽的泄漏源。复制而不是移动原始转换目录保留一份后面做 12 类合并实验可以重新划分不用重跑转换。划分后检查每个 split 的 jpg 数和 txt 数是否一致。3.4 自定义 Dataset 检查一圈再交给训练器训练前用一个小 Dataset 或检查脚本把路径、标签、类别范围过一遍。重点看三件事图片能否打开、txt 每行是否 5 个值、class_id 是否小于类别数。红外 jpg 偶尔有损坏文件PIL 打开时报UnidentifiedImageError这种图直接剔除或重新解压。from pathlib import Path from PIL import Image OUT Path(dataset/transformer_ir) num_classes 12 # 14 类 baseline 改成 14 for split in [train, val, test]: imgs {p.stem for p in (OUT / split / images).glob(*.jpg)} lbls {p.stem for p in (OUT / split / labels).glob(*.txt)} print(split, 图片, len(imgs), 标签, len(lbls), 缺标签, len(imgs - lbls), 多标签, len(lbls - imgs)) for stem in list(imgs)[:200]: Image.open(OUT / split / images / f{stem}.jpg).verify() for line in (OUT / split / labels / f{stem}.txt).read_text().splitlines(): parts line.split() if len(parts) ! 5: print(坏行, stem, line) continue cls_id int(parts[0]) if not (0 cls_id num_classes): print(越界类别, stem, cls_id)num_classes要和 data.yaml 的 names 数量一致verify()只检查文件完整性不保证像素能解码真正训练时还会再读一次。坏行和越界类别必须清零不要带着 warning 开跑。data.yaml 写成下面这样路径用相对路径换机器时只改path。path: dataset/transformer_ir train: train/images val: val/images test: test/images names: 0: ACB 1: CT 2: Connection 3: LA 4: LBS 5: MCCB 6: MOF 7: PF 8: PT 9: VCB 10: body 11: core如果保留 14 类names 要按原始顺序补回Conection和connectionid 不能错位。这份数据集不保证训练精度标签质量要自己抽检每个类随机抽 20 张图把框画回图上看框是否贴住设备、类别是否标错。抽检比盲目加 epoch 有用。4. YOLO 训练参数落地红外小目标、类别不均衡与增强边界4.1 基线训练配置先让 14 类都跑起来第一轮不要追求高 mAP先把 14 类原始标签跑通确认数据管道、类别数、评估流程没有错。模型选团队已有的检测权重不要拿分类权重硬改头输入尺寸先 640显存不够降到 512小目标多再上 960。batch 根据显存调8 或 16 都行workers 在 Linux 上 4 到 8Windows 上先 0 或 2避免多进程卡死。from ultralytics import YOLO model YOLO(baseline.pt) # 替换成本地已有的检测权重 model.train( datadataset/transformer_ir/data.yaml, imgsz640, epochs100, batch8, workers4, device0, optimizerAdamW, lr00.001, lrf0.01, warmup_epochs3, mosaic0.4, close_mosaic10, hsv_h0.0, hsv_s0.1, hsv_v0.2, degrees0.0, translate0.1, scale0.3, fliplr0.5, flipud0.0, projectruns_ir, namebaseline_14cls, seed202405, )baseline.pt是占位换成本地权重文件device0是单卡CPU 改成cpuimgsz640是基线PF、ACB 这种小类如果框很小可以再做一组 960 的对照epochs100配close_mosaic10最后 10 轮关掉 mosaic 让模型收一收optimizer用 AdamW 对学习率不敏感SGD 需要更大的 lr0。project和name用来分目录别把 14 类和 12 类实验混在一起。4.2 红外图像增强边界HSV、Mosaic 与旋转怎么设红外图有两种常见形态灰度图和伪彩图。灰度图没有色相语义hsv_h设 0hsv_s也可以设 0hsv_v小幅度调模拟曝光和温度对比变化。伪彩图的颜色对应温度带hsv_h大了会把高温色改成低温色模型学到的颜色线索直接乱掉所以hsv_h0.0是保守起点最多给到 0.01。hsv_s0.1、hsv_v0.2属于轻增强不要照搬自然图像的 0.7。Mosaic 会把四张图拼成一张对密集小目标有帮助但电力柜体有明确结构拼得太狠会把柜身、连接器、断路器的上下文切碎。mosaic0.4比默认 1.0 温和小目标多可以 0.5PF 只有 56 个框时不要开到 1.0。degrees0.0是因为设备安装方向固定旋转 10 度以上会出现不存在的姿态flipud0.0是上下翻转在电力场景不真实fliplr0.5左右翻转一般可以接受但涉及固定柜门方向时先抽检。scale0.3控制缩放范围translate0.1控制平移别让框被裁掉太多。4.3 类别不均衡处理重采样、损失与阈值14 类里 PF 56 框、ACB 94 框、VCB 144 框Connection 相关 6384 框。直接训练时大类会主导分类损失小类容易变成背景。第一步不是复制小类而是看 per-class AP如果 PF 的 AP 为 0先查测试集里 PF 有多少框测试集本身太少的话指标没有统计意义如果测试集够但 AP 低再考虑训练集过采样。过采样可以复制含小类的图片但要在训练集内部复制不能跨到验证集复制倍数 2 到 3 倍就够太多会过拟合。损失层面YOLO 的分类损失对类别频率有一定敏感性但不要指望换损失解决所有问题。更实际的做法是先跑 14 类 baseline再跑 12 类合并版比较 PF、ACB、VCB 的单类 AP如果合并后小类 AP 明显上升说明拼写重复类在分散学习能力如果没变化问题在样本本身。推理阶段可以按类设阈值PF 这种小类降低置信度阈值MCCB 这种大类提高阈值减少误检。4.4 训练日志看什么分项损失与单类 AP训练日志里重点看box_loss、cls_loss、dfl_loss和验证集的 mAP50、mAP50-95。box_loss降不下去先查框坐标和图片尺寸是否匹配cls_loss降但 mAP 不升查标签类别是否错位dfl_loss波动大可能是小目标框太小或增强太强。验证集 mAP50 高、mAP50-95 低说明框的位置不够准红外图边缘模糊时很常见可以把imgsz提上去或者减少 mosaic。单类 AP 比总 mAP 更有诊断价值。PF、ACB、VCB 如果一直是 0不要继续加 epoch先抽 20 张测试图看模型输出如果模型根本不输出这些小类说明训练集里小类被压制做训练集过采样或切图训练如果输出了但框错查标注框是否把设备局部当成了整体。训练日志和验证图一起看别只看一个总指标。5. 避坑与排查拼写重复类、空框和误检的 5 个现场记录5.1 拼写重复类把模型学散现象训练完看混淆矩阵Conection、Connection、connection三个类互相串单类 AP 都不高但总 mAP 看起来还能接受。原因三个名字在数据里是三个 class_id模型把它们当成三个不同类别学连接器样本被拆成 3961、1952、471 三份每一份都不够纯标注时同一个人可能今天写Connection明天写connection标签本身就不一致。解决先做映射实验把Conection和connection归到Connection类别数从 14 变 12重新生成 txt 和 data.yaml。不要只改 names必须改 txt 的 class_id。映射后跑一组对照重点看连接器类的召回和误检是否下降。如果业务上确实要区分大小写变体那得先确认它们代表不同设备从这份数据的命名看更像是拼写不统一不像两个独立类别。提示映射前备份原始 labels合并实验和原始实验各留一份目录否则回头做 14 类 baseline 又要重新解压。5.2 空标注与坐标越界让框跑偏现象训练时出现大量corrupt label或坐标越界 warning验证图上的框整体偏移甚至跑到图片外面。原因labelImg 保存时框贴边xmin 小于 0 或 xmax 大于图片宽度也有 xml 的size和 jpg 实际尺寸不一致转换脚本用 xml 宽高归一化坐标就全错空 xml 被转成空 txt训练器把整张图当背景。解决转换时用 PIL 读 jpg 实际宽高不要信 xml 的 size坐标裁剪到[0, w]和[0, h]空 txt 单独列出少量保留作背景大量空标注先回查标注流程。训练前跑一遍坏行检查len(parts) ! 5和cls_id越界必须清零。坐标问题不要靠增强掩盖增强只会让偏移更随机。5.3 图像级划分泄漏把验证集刷虚高现象验证集 mAP 很高测试集一落千丈或者同一张图在训练集和验证集都出现只是文件名不同。原因按框随机划分同一张图的多个框被分到不同 split或者数据集中有重复图片md5 相同但文件名不同划分时没去重。红外巡检图经常连续拍摄同一设备多角度文件名不同但画面几乎一样随机划分很容易泄漏。解决按图片 stem 划分同一张图的全部框跟着图走划分前算 md5重复图只保留一张或强制分到同一侧连续帧按时间或设备分组划分。验证集和测试集不要参与任何过采样。划分结果存 csv换模型时复用同一份别每次重新随机。5.4 小类 PF、ACB、VCB 被大类淹没现象总 mAP 看着还行但 PF 的 AP 是 0ACB 和 VCB 也很低推理时小类几乎不输出或者输出框很大把整个柜体框住。原因PF 只有 56 个框ACB 94 个VCB 144 个训练时被 Connection 和 MCCB 的大类损失压住小目标在 640 输入下像素太少下采样后特征消失body 大框和 core 中框又抢了定位能力。解决先确认测试集里这些小类有足够框测试集太少就只看训练集召回不强行报 AP训练集对含小类的图做 2 到 3 倍过采样输入尺寸提到 960 做对照小目标密集时用切块训练或切块推理把大图切成重叠子图再检测。阈值按类调PF 用低阈值保召回MCCB 用高阈值压误检别一套 0.25 走到底。5.5 推理阈值照搬默认值导致漏检和误检现象训练指标不错部署后要么漏掉小设备要么背景热斑被当成设备。原因验证时用的是低置信度算 PR 曲线部署时直接套 0.25小类分数普遍低全被过滤红外图背景有热源模型把热斑学成连接器或断路器不同类别的分数分布不一样统一阈值不适合。解决在测试集上按类扫阈值画 precision-recall 曲线选业务可接受的平衡点PF、ACB、VCB 适当降低阈值MCCB、Connection 适当提高部署前用负样本集跑一遍统计误检来源。阈值表写进配置文件不要写死在代码里换场景时只改配置。6. 验证与进阶技巧用混淆矩阵和热区回看模型到底学了什么6.1 混淆矩阵先看 CT/PT 与连接器互串训练完不要只看 mAP先导混淆矩阵。CT 和 PT 外形接近红外图上都可能是圆柱或方块互串很常见Connection合并后样本多容易把body上的局部结构也吸过去core和body的框可能有包含关系混淆矩阵里会表现为大框套小框。把混淆矩阵按行归一化看每一类的召回比看总准确率有用。from ultralytics import YOLO model YOLO(runs_ir/baseline_14cls/weights/best.pt) metrics model.val( datadataset/transformer_ir/data.yaml, splittest, conf0.001, iou0.6, ) print(mAP50-95:, metrics.box.map) print(mAP50:, metrics.box.map50) print(每类 AP:, metrics.box.ap_class_index, metrics.box.ap)conf0.001是为了让 PR 曲线覆盖低分框部署阈值另算iou0.6是评估匹配阈值和训练时的 NMS 不是一回事。跑完看ap_class_index对应的类别PF、ACB、VCB 如果还是 0回到第 5 章查小类不要直接换更大的模型。6.2 按类阈值与热区回看我一般会把测试集误检按置信度排序取前 50 张画框回看。重点看两类背景热斑被误检成设备以及小设备被大框包住。背景热斑的典型特征是框内没有明显设备边缘只有一块亮区小设备被包住时模型输出的是 body 大框里面没有独立的小框。前者加负样本或提高阈值后者切图训练或过采样。检查项看什么处理混淆矩阵CT/PT、Connection/body 互串补难例别急着合并语义类单类 APPF、ACB、VCB 是否为 0过采样、提输入尺寸、切块误检 Top50背景热斑、柜体局部加负样本按类调阈值漏检 Top50小目标、遮挡设备降阈值切块推理从那以后我每次拿到类似红外数据集都强制先做一遍类别拼写合并审计和空框扫描再谈训练模型选型放在数据健康度后面能少走很多回头路。希望帮到你。本文还有配套的精品资源点击获取