
简介面向工业自动化、智能制造与电力设备维护场景这套YOLO格式目标检测数据集覆盖绝缘体、导线、熔断器、电缆接头、开关组件等电气部件可用于缺陷检测、组装错误识别与设备状态监控。压缩包共2000个文件以1832个txt标注文件为主体配合166张jpg工业场景原图、1个yaml类别配置及1份docx使用说明整体约164.68MB目录按训练/验证/测试划分标注格式与YOLO系列框架直接兼容。已有252人学习下载。数据源自真实制造、装配与巡检场景包含不同光照和角度下的电气部件样本类别多样且边界框标注精准既适合工程师快速搭建工业检测原型也可作为高校智能制造、计算机视觉方向的教学与科研数据帮助省略数据采集与清洗环节直接聚焦模型调优、误差分析与落地部署。1. 拿到工业电气部件目标检测数据集.zip第一步不是解压是摸底生产线上要判断配电柜里的断路器装没装、端子排的接线有没有漏、接触器型号是否装错落到算法上都是同一个需求目标检测。别人丢给你一个「工业电气部件目标检测数据集.zip」它不是模型也不是现成方案而是一份标注过的图像集合——你要先把它变成能喂给训练管线的格式才有机会训练出自己的检测权重。下面只讲一件事怎么把这个 zip 从解压、认标注格式、格式转换、训练到验证完整用起来涉及的做法、参数依据和坑位都摊开说。适合正在做开关闭合检测、装配质检、机器人抓取定位的视觉工程师也适合拿电气部件练目标检测的初学者。开头先提醒一句别急着双击解压先学会摸底后面能少踩一半坑。2. 拆包摸底三件事验 zip 完整性、判定标注格式、跑类别统计脚本拿到任何一个「某某数据集.zip」我最先做的不是解压完就开训练而是把包当成黑匣子先摸底。电气部件数据集跟自然图像数据集最大的区别是它往往是工厂内部由标注员用 LabelImg 或 CVAT 手工标注的格式、命名、类别体系完全随项目走。同一个「断路器」在 A 包里叫 breaker在 B 包叫 CircuitBreaker在 C 包可能直接归进 switch 类。如果不摸底直接套固定转换脚本类别 ID 对不上、xml 解析失败这类事迟早找上门。2.1 解压姿势先校验完整性再处理伪加密命令行解压比双击更可控。我一般先把 zip 放到工作目录用 unzip 的测试模式过一遍确认没有坏条目unzip -t industrial_electrical_parts_dataset.zip unzip -o industrial_electrical_parts_dataset.zip -d ./electrical_parts-t是测试压缩包完整性只报坏文件不实际解压-o表示覆盖已有文件-d指定解压目录。如果-t报「CRC failure」「missing entry」或者解压中途卡住说明包在传输或封装阶段已经损坏最常见原因是网盘工具断点续传没做完或者别人用 macOS 的归档工具压出来的包带了多余条目。这时候别硬解压先用 7-Zip 打开看能否看到完整文件列表再决定是让对方重新打包还是手动把能读的部分捞出来。提示解压工具推荐 7-Zip它对损坏包的容错比 Windows 自带解压强右键能看到「测试压缩文件」入口修包时也有「修复压缩文件」功能。还有一个容易误判的点zip 伪加密。伪加密是指压缩包头的加密标志位被手工改过表现出来是双击要密码、输入空密码或常见弱密码能进去一部分但某些文件解出来是坏的或 0 字节。判断方法很简单用 7-Zip 打开如果每个文件都带锁但文件属性的「加密」状态不一致或者输入 123456 这类密码能解开大部分文件基本就是伪加密。处理办法是选中全部文件用「文件→重新压缩」把加密标志去掉而不是逐个试密码。我碰到过一次包内 80 个 xml 全部变成 0 字节就是伪加密加解压工具自动跳过导致的排查了大半天。真正的加密包也别慌密码不在手上时先用zipinfo看看文件列表是不是可见的。可见就能先确认包内结构再找来源方要密码。解压完之后先不进训练把顶层目录结构列出来tree -L 2 ./electrical_parts -d这一步要回答三个问题图片和标注是不是分目录放的、有没有单独的 class_names.txt 或 data.yaml、train 和 val 是不是已经切好。常见的包内组织方式有两种一种是 images/ 与 annotations/ 平级标注跟着图片走的另一种是已经按 train/val/test 分成三个子集每个子集里图片和标注混放。前一种要做划分脚本后一种可以省掉划分但必须核对划分是否合理——有人把同一柜子的照片按文件序号切开分到两个子集这种划分后面一定会让你在验证阶段怀疑人生。2.2 标注格式一眼判定VOC、COCO、YOLO 各看什么打开标注目录看文件后缀基本能锁定格式xml 是 VOCjson 大概率是 COCOtxt 是 YOLO 的归一化坐标。电气部件数据集里 VOC 格式最多因为 LabelImg 默认输出就是它规模稍大的包会用 COCOCVAT 导出和大部分开源工具链都认 COCO已经预处理成 YOLO txt 的包最少一般只有转过一手的人才会这么给。三种格式对同一张图、同一个目标框的表达完全不同。下面是我判断时的阅读重点格式文件形态找哪几个字段坐标含义VOC每图一个 .xmlobject/name/bndboxxmin, ymin, xmax, ymax 像素绝对坐标COCO整个数据集一个 .jsonannotations 数组的 bbox、category_idbbox 是 [x, y, w, h] 像素坐标YOLO每图一个 .txt每行「类ID cx cy w h」相对图宽高的 0~1 归一化值判定格式只是第一步更重要的是核对坐标约定。COCO 的 bbox 原点在左上角width/height 是框的实际宽高这个基本一致但 VOC 的 XML 里有些工具会写出 xmin 大于 xmax 的倒置框COCO 的 JSON 里有些类别从 0 计、有些从 1 计YOLO 的 txt 几乎一律从 0 开始计类。这些细节不摸清转换脚本写出来必然出错。另一个要顺手确认的是包里有没有留下标注工具的附加信息。LabelImg 的 xml 里常有difficult字段CVAT 导出的 COCO 里有iscrowd、segmentation这些东西转 YOLO 时都要有明确的处理策略difficult 目标我一般直接丢因为训练时它既不是正样本也不是负样本留着只会让 loss 震荡iscrowd 目标代表一群目标糊在一起在电气部件场景里很少见遇到就按单框处理不展开成多个框。2.3 类别分布与坏标注统计用脚本替眼睛跑一遍电气部件类别的样本量天然不均衡接线端子的出现频率可能是断路器的几十倍因为一张柜内图里端子排能占几十个框。不要靠肉眼数写个脚本把类别频次、空标注图片、异常框一次统计出来。下面这段按 VOC 格式统计其他格式改一下解析段就行import os import xml.etree.ElementTree as ET from collections import Counter ann_dir electrical_parts/annotations # 按包内实际路径改 class_count Counter() empty_imgs [] # 有 xml 但没有 object 的图 bad_boxes [] # 坐标异常的框 for fname in sorted(os.listdir(ann_dir)): if not fname.endswith(.xml): continue path os.path.join(ann_dir, fname) root ET.parse(path).getroot() objs root.findall(object) if not objs: empty_imgs.append(fname) continue size root.find(size) W float(size.findtext(width)) H float(size.findtext(height)) for obj in objs: name obj.findtext(name) class_count[name] 1 b obj.find(bndbox) xmin float(b.findtext(xmin)); xmax float(b.findtext(xmax)) ymin float(b.findtext(ymin)); ymax float(b.findtext(ymax)) if xmin xmax or ymin ymax: bad_boxes.append((fname, name, inverted)) if xmin 0 or ymin 0 or xmax W or ymax H: bad_boxes.append((fname, name, out_of_bounds)) print(类别频次:, class_count.most_common()) print(空标注图片数:, len(empty_imgs)) print(异常框数:, len(bad_boxes)) for row in bad_boxes[:20]: print(row)这段脚本的核心逻辑是逐 xml 解析并统计三类信息。类名统计用 Counter 直接排序输出能立刻看出哪些类是小样本空标注列表用于排查漏标——有些标注员把难标的目标整张图跳过留下「有图无物」的废样本异常框检查了两件事倒置框xmin xmax和越界框超出图像宽高这两类框到训练阶段会直接导致 loss 异常。参数上需要按实际包调整的就是ann_dir路径和 XML 标签结构。如果标注工具输出的是 polygon 而不是 bndbox解析段要改成遍历 polygon 点集取外接矩形如果包是 COCO 格式这段脚本要替换成 json 解析逻辑等价改字段名即可。跑完这份统计你会得到三张清单类别频次表、空标注清单、坏框清单。它们直接决定后面是直接训练还是先补标、清洗再进管线。我见过有人把 2000 张含标注的包直接拿去训练验证集 mAP50 只有 0.2回头一查坏框占了 15%坐标倒置让模型从第一轮就在学错误信号。摸底这二十分钟省的是后面好几天的排错时间。3. 把 VOC 标注转成 YOLO 格式归一化脚本与四个边界坑3.1 为什么走 YOLO 这条路而不是原地用 VOC常见做法是把这类包转成 YOLO txt 再训练原因有三条。第一YOLO 系训练管线ultralytics 的 yolov8、早期 yolov5原生消费 txt 标注图片和标签各放一个目录就能训不用中间层适配第二txt 每行一个目标行数就是目标数空文件一眼看出漏标第三COCO 格式在电气部件这种小项目里反而重——一个 json 好几 MB想增删类、换包重组都要动脚本而 txt 按图分布换工具、换训练框架都不受影响。对几百张到上万张的工业数据集txt 是最省心的中间格式。这不是说 VOC/COCO 不好而是不要在训练入口上跟格式较劲。标注阶段用 LabelImg 或 CVAT 导出 VOC/COCO 保留原始语义训练阶段转 YOLO这个「标记得原始、训练得通用」的分工我一直坚持。还有一种常见做法是直接给 ultralytics 喂 COCO json新版本确实支持但坐标系、类别 ID 映射都要重新核对一遍对电气部件这种类名本来就乱的包中间加一层 txt 反而给了你一次兜底校验的机会。3.2 VOC 转 YOLO 标准化脚本归一化公式与类名表维护写脚本前先定类名表。做法是把包里出现的所有类名收集起来排序写死到 classes 列表列表顺序就是 YOLO 类别 ID。这个顺序一旦定了就不要改后面训练和推理都用同一份。下面是完整转换脚本import os import xml.etree.ElementTree as ET from PIL import Image # 类名表顺序 YOLO 类别 ID按摸底统计结果手动维护 classes [circuit_breaker, contactor, relay, terminal_block, fuse, indicator_light] class_map {name: i for i, name in enumerate(classes)} def voc_to_yolo(xml_path, img_w, img_h, out_txt): root ET.parse(xml_path).getroot() lines [] for obj in root.findall(object): name obj.findtext(name) cid class_map.get(name) if cid is None: print(f[skip] 未知类 {name} 出现在 {xml_path}) continue b obj.find(bndbox) xmin float(b.findtext(xmin)); xmax float(b.findtext(xmax)) ymin float(b.findtext(ymin)); ymax float(b.findtext(ymax)) # 电气部件图里经常有框越出图像边界先夹紧再归一化 xmin max(0.0, min(xmin, img_w - 1)) xmax max(0.0, min(xmax, img_w - 1)) ymin max(0.0, min(ymin, img_h - 1)) ymax max(0.0, min(ymax, img_h - 1)) if xmin xmax or ymin ymax: print(f[warn] 夹紧后空框 {xml_path} 类 {name}) continue cx (xmin xmax) / 2.0 / img_w cy (ymin ymax) / 2.0 / img_h bw (xmax - xmin) / img_w bh (ymax - ymin) / img_h lines.append(f{cid} {cx:.6f} {cy:.6f} {bw:.6f} {bh:.6f}) with open(out_txt, w, encodingutf-8) as f: f.write(\n.join(lines)) # 批量处理入口 ann_dir electrical_parts/annotations img_dir electrical_parts/images label_dir electrical_parts/labels os.makedirs(label_dir, exist_okTrue) for xml_name in sorted(os.listdir(ann_dir)): if not xml_name.endswith(.xml): continue stem os.path.splitext(xml_name)[0] img_path os.path.join(img_dir, stem .jpg) # 注意实际扩展名 if not os.path.exists(img_path): print(f[missing] 找不到图片 {img_path}) continue w, h Image.open(img_path).size # 用真实图宽高不信任 xml 的 size 字段 voc_to_yolo( os.path.join(ann_dir, xml_name), w, h, os.path.join(label_dir, stem .txt) )这段脚本有四个细节值得说明。一是归一化公式中心点 x 是 (xminxmax)/2 再除以图宽宽是 (xmax-xmin) 除以图宽y 方向同理坐标系与 VOC 一致以图像左上角为原点不需要翻转。二是夹紧处理电气部件照片经常把部件拍到图外标注员会标出越界框直接归一化会产生大于 1 的宽或高训练时损失函数直接出 NaN。三是宽高取自图片文件本身而不是 xml 的size标注工具偶尔把 size 写错用 PIL 读真实尺寸最稳。四是未知类名不静默跳过而是打 skip 警告——这一步能反向校准类名表把「Breaker」和「breaker」这类大小写不一致的雷提前排掉。注意类名表一经发布后续所有脚本、训练、推理、部署都用这一份。中途加类要追加到末尾不要插到中间否则旧模型和新模型的类别 ID 全部错位。输出文件用 6 位小数归一化坐标精度足够文件体积也不会失控。整包转完后抽查 10 个 txt打开对着图片看框是否贴合目标这一步不要省。3.3 电气部件场景最容易踩的四个边界坑旋转框。端子排、接触器在柜内照片里往往不是横平竖直的标注员习惯用带角度的矩形去框。但 VOC 的 bndbox 只支持轴对齐的 xmin/ymin/xmax/ymax如果 XML 里出现 polygon 坐标或额外角度字段说明原始标注是旋转框。转成 YOLO txt 会丢失角度信息模型对斜向端子的检测会变得像是「随机蒙」。这类数据要么退回标注工具按轴对齐框重标要么换用支持旋转框的训练管线——参照遥感图像目标检测的做法用 mmrotate 这类工具训练 DOTA 风格的角度框标签代价是部署推理多一个角度回归头工业现场如果没必要不建议为少数斜框上旋转检测。截断目标。柜门半遮住断路器、线缆挡住保险丝这种截断在工业场景极其常见。模型对截断框其实学得动但前提是框法统一——很多标注员把「能看见的部分」框起来而不是「完整目标范围」框起来。这两种框法在训练时会产生矛盾语义。我建议统一按「可见部分外接矩形」标因为检测任务的目的是定位可见目标不是补全被遮挡物体。如果包内两种框法混着来模型在截断场景下会同时预测两个互相矛盾的框。重叠框。多个端子紧挨着框间 IoU 超过 0.9NMS 阶段会被当成重复检测压掉一个造成漏检。清洗时对转换后的 txt 跑一遍框对 IoU 统计人工确认是不是真重叠同一目标被标注两次就删一个两个紧邻的不同目标则保留模型会自己学会把置信度分开。电气柜里导轨上的端子排是重灾区一张图几十个框挨着重叠问题不处理验证集的 mAP 会被 NMS 拖低 3 到 5 个点。类名不一致。包里 class_names.txt 写着 Breaker Switchxml 里却是 breaker还有把型号和类别写在一起的 C65N_Breaker这种事很常见。解决办法只有一个以 xml 实际出现的名字为准建立类名表不盲信任何外部 names 文件转换脚本里的 skip 警告把所有差异打出来一个个确认归并。这一步像给数据做一次「字典校准」做完后面训练、评估、部署全都顺畅。4. 用 YOLOv8 训练电气部件数据目录规范、六个参数与小目标调整4.1 目录规范与 data.yamltrain/val 划分先固定下来ultralytics 的 YOLO 训练入口认的是 data.yaml 里写的路径关系不认你文件夹叫什么。所以第一步是把图片和标注整理成它要的结构。常见做法是electrical_parts/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/ └── data.yamltrain 和 val 的图片放 images 下对应子目录同名 txt 放 labels 下对应子目录。ultralytics 按图片名的 stem 去 labels 目录找同名 txt所以图片和 txt 的「文件名主干」必须一致扩展名可以不同。划分比例工业小数据集常用 8:2图片少于 500 张时改用 9:1 或者做 K 折验证。这里我要强调一个比比例更重要的原则按「场景」划分不要按「文件」划分。同一配电柜从不同角度拍的一批照片必须整批进 train 或整批进 val否则就是数据泄露验证集 mAP 会虚高到没法看一上产线就现原形。实操上我会先用一个脚本把图片按「文件名前缀或拍摄批次」聚类再按批次随机分而不是逐张随机分。data.yaml 写成这样path: /data/electrical_parts # 绝对路径不要写相对路径 train: images/train val: images/val names: 0: circuit_breaker 1: contactor 2: relay 3: terminal_block 4: fuse 5: indicator_light这里用常见电气类别举例实际以你包里统计出来的类名表为准。path字段是根目录train/val 是相对根目录的子目录路径。最容易踩的坑是 path 写成相对路径训练脚本从另一个目录启动时会报「dataset not found」我习惯直接写绝对路径。names的 ID 必须与转换脚本里的类名表顺序完全一致一个数字错位整份数据集的语义就全乱了。提示ultralytics 也支持把整份数据放在一个目录里由它自动划分但自动划分是逐张随机的对工业场景不友好我从不依赖它划分脚本自己写。4.2 yolov8 训练命令与六个关键参数目录和 yaml 就绪后训练命令是yolo detect train \ data/data/electrical_parts/data.yaml \ modelyolov8n.pt \ imgsz640 \ batch16 \ epochs100 \ patience15 \ lr00.01 \ seed42逐个说参数。model选 yolov8n.pt 是最小模型电气部件这种背景相对固定、类别有限的任务n 和 s 级就够用了没必要直接上 x 级——工业侧推理卡资源有限n 模型在不少工控机上能跑实时。imgsz是训练图像尺度默认 640后面单讲。batch受显存限制16 这个值在 12G 显存上配 640 尺寸基本安全显存小就改 8。epochs对工业数据集 100 起步是合理值500 到 2000 张数据时100 轮足够收敛。patience是早停轮数连续 15 轮验证指标无提升就自动停防过拟合。lr0是初始学习率0.01 是 ultralytics 默认适合从头训练用官方预训练权重微调时经常要降到 0.005 甚至 0.001不然前几轮 loss 不降反升。seed固定成 42 这类值保证实验可复现。工业项目最怕「昨天跑出 0.87今天重跑变成 0.82」随机种子不固定你连问题都定位不了。下面的参数表是我常用的基准新手可以直接照抄起步参数建议值设置理由imgsz640 起步小目标提到 960/1280丝印、编号这类小目标需要更高分辨率batch8~16尽量大但别让显存打满显存利用率高训练稳定epochs100 起步工业小数据集基本 100 轮内收敛patience15连续 15 轮无提升早停防过拟合lr0微调 0.001从头训 0.01预训练权重微调用默认值容易崩seed固定一个值保证指标可复现训练监控主要看两条曲线train loss 在降但 val 指标在涨说明过拟合train 和 val 都纹丝不动说明学习率太低或数据本身有问题。电气部件数据集有个典型形态前 10 轮 mAP50 涨得飞快30 轮后开始震荡这正是小目标加小数据集的正常表现别急着调参。中途想换参数继续跑用resumeTrue接着权重续训不要从头再来。4.3 电气部件小目标的三个调整方向第一是 imgsz。断路器的型号丝印、端子排上的编号这类目标在原图里可能只有十几个像素。默认 640 会把它们缩到不可见。常见做法是提到 960 或 1280显存不够就先提 imgsz 再降 batch。代价是训练和推理时间线性上涨——如果相机分辨率本身只有 720pimgsz 提到超过原图尺寸没有意义。第二是 Mosaic 增强。ultralytics 默认开 Mosaic把四张图拼在一起训练对自然场景很好但对电气部件这种目标密集、小目标多的图Mosaic 后目标被切碎的概率很高小目标样本进一步失真。数据量超过 2000 张时我习惯把 Mosaic 概率调低甚至关掉。判断依据很简单如果验证集里小目标类别的 AP 明显低于大目标类别关掉 Mosaic 重跑一版对比。Mosaic 在 ultralytics 里由超参控制不同版本入口不一致用yolo cfg查当前版本支持的超参名最稳。第三是类别权重。摸底时统计出的类别频次现在派上用场了。把样本少的类比如只有几十个框的继电器在 loss 里加权常见做法是算每类目标框数量的倒数并归一化成权重通过 ultralytics 的类别权重参数喂进去。跳过这步直接训练的后果是端子的 AP 到 0.9继电器的 AP 只有 0.1整体指标被高频类撑起来部署时低频类全部漏检。工业质检漏一个继电器可能就是整柜返工这个参数值得花十分钟调。5. 电气部件数据集避坑指南五类翻车现象与修正办法5.1 解压阶段zip 报错、伪加密与文件名乱码现象双击解压到一半报「CRC 校验失败」或者输入网传的「通用密码」后解出来一堆 0 字节文件Linux 下解压后中文文件名全变乱码。 原因压缩包文件头损坏、伪加密标志被修改或者包内文件名用了非 UTF-8 编码Windows 下用 GBK 压缩的文件名在 Linux 解出来必然乱码。 解决先用unzip -t完整测试一遍再解压损坏的包用 7-Zip 的「修复压缩文件」重建修复不了就回到来源方重新打包文件名乱码在 Linux 下用convmv -f GBK -t UTF-8转换编码或者在 Windows 下直接右键解压。乱码不是小事——图片和标注 txt 会因文件名不匹配而全部配对失败训练直接报「image not found」。5.2 训练阶段标注里的 0 尺寸框导致 loss 直接 NaN现象训练第一个 step 就报loss: nan或者跑几个 epoch 后验证集 AP 突然全部归零。 原因txt 里混入了归一化后为 0 的宽或高——前文说的倒置框、越界框夹紧后变成空框还有一种是把 cx cy 写成了像素值数值超过 1归一化失效。 解决转换脚本里已经加了两道闸门但保险起见训练前再跑一个检查脚本读每行 txt解析五个数凡是宽高小于等于 0 或任一坐标大于 1 的行全部列出直接删掉问题行或排除整张图。检查脚本几十行就能跑完整个 labels 目录这一步省掉的是后面定位 NaN 的折腾时间。训练时可以用ampFalse排除混合精度导致的数值问题把嫌疑先锁定在数据上。5.3 类别失衡端子、螺丝淹没了断路器现象整体 mAP50 看着不错但按类看terminal_block 的 AP 是 0.92circuit_breaker 只有 0.35整体指标被高频类撑起来。 原因数据包里端子排每张图几十个框断路器一张图最多一两个模型把「学什么」的注意力几乎全给了高频类。 解决数据层面做两种补偿——按类复制增强低频类样本或者训练时给低频类加 loss 权重更实际的做法是补标。低压柜的图纸往往能对应到一排排端子去现场多拍 30 分钟就能补齐继电器的样本。补标比调参收敛快得多这句话在类别失衡场景下永远是第一优先级。5.4 微调崩了预训练权重与工业小目标特征冲突现象用 yolov8n.pt 在自己的电气部件数据上微调前几轮 loss 不降反升甚至出 NaN。 原因预训练权重是在 COCO 上学出来的COCO 里几乎没有端子、断路器这类细长小目标骨干网络前期特征对不上更常见的是 lr0 用默认 0.01 太高微调阶段应该更低。 解决微调一律把 lr0 降到 0.001epochs 从 50 起步如果骨干特征冲突仍然明显先冻结前 10 层只训检测头跑通一版再解冻。这个顺序能避免「一上来全参微调崩了不知道是数据问题还是权重问题」的窘境。还有个细节保留第一次训练跑通的 best.pt后续调参都以它为基准对比不要每次重训都换新起点。5.5 验证指标虚高数据泄露在电气场景的两种形态现象训练时 mAP50 到了 0.95信心满满拿到现场一测表现惨不忍睹。 原因80% 是划分问题——同一台柜子拍的两张照片一张进 train 一张进 val模型等于背了答案20% 是标注泄漏——标注员对「见过的目标」标得特别准现场未见过的新目标漏标验证时没有对应真值框误判被当成正确。 解决划分前按「场景」去重同一个柜号、同一次拍摄的所有帧归到同一子集要更稳的做法是验证集单独从现场重新拍哪怕只有 100 张也比拿训练同源的图验证可信。这件事没有捷径我在这上面栽过一次之后所有工业项目都维持「train 与 val 不同源」的红线。6. 最后一步验证与增量微调用现场数据续训更省成本6.1 用 F1-置信度曲线选阈值不拍脑袋定 conf部署时 conf 阈值定 0.25 还是 0.5直接决定漏检率和误报率的平衡这个阈值不该拍脑袋。常见做法是训练完跑一遍验证集输出每个置信度阈值下的 F1 值挑最高点作为部署基准电气部件质检场景漏检代价大宁可把阈值从 F1 最高点再往下调一点换取更低的漏检率。from ultralytics import YOLO model YOLO(runs/detect/train/weights/best.pt) metrics model.val(data/data/electrical_parts/data.yaml) print(metrics.f1_curve) # 每类在每个阈值下的 F1 曲线找峰值对应的 conf这段代码用训练好的权重在验证集上重跑一次评估f1_curve返回的是形状为 (类别数, 阈值数) 的数组遍历取每个类别的峰值点再根据业务侧漏检代价确定最终阈值。输出中还附带每类的 AP 和混淆矩阵能看出哪两类容易互相误检——断路器、接触器外观相似度高混淆矩阵里这两类如果互串明显就要回头检查标注是否把两类标混了。6.2 增量微调换现场数据续训而不是重训模型要换产线、换柜型时最稳的做法是在旧权重上续训把 epochs 设 30、lr0 设 0.0005让模型在旧记忆的基础上适应新场景。重训则要重新攒数据、重新调参成本翻倍而且不一定比续训更稳。这个习惯我保留了很久——每次训练完把 best.pt、当时的 data.yaml、类名表、转换脚本和清洗脚本一起打包归档文件名带日期。这样增量时能精确回到上一次的状态而不是靠记忆重构。对「工业电气部件目标检测数据集.zip」这类包也是一样的底线解压后的原始标注目录永远保留所有清洗、转换、划分操作都在副本上进行原始 zip 不做任何改动。这样不管模型训练翻车多少次永远有后悔药可以回到起点。记住一条转换脚本、统计脚本、训练配置和数据集放同一个目录下次拿到新包直接复用脚本而不是重写一遍。希望帮到你。本文还有配套的精品资源点击获取