news 2026/10/6 1:11:08

PCB缺陷检测数据集选型与YOLO11三平台训练实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PCB缺陷检测数据集选型与YOLO11三平台训练实战

简介:面向工业视觉与目标检测方向的开发者、算法工程师及高校学生,这份资源提供了一套真实采集的PCB板表面缺陷检测数据集,可用于缺陷识别项目落地,也可作为通用工业场景数据的补充。数据集包含1000张高清PCB板表面图片,覆盖俯拍正拍与旋转拍摄姿态,标注missing_hole、mouse_bite、open_circuit、short、spur、spurious_copper六个缺陷类别,采用labelimg标注,质量较高。资源同时提供VOC(xml)、COCO(json)、YOLO(txt)三种主流目标检测格式,可直接投入YOLO等算法训练。包内附赠YOLO11一键训练脚本,支持GPU、CPU及Mac(M芯片)多平台方案,并附博主训练结果日志供参考。资源包共1个PDF文件,大小约6.92MB,内附数据集基本情况介绍与获取方式。目前已有974人学习,适合需要快速开展PCB缺陷检测实验的读者。

1. PCB缺陷检测数据集选型:1000张图三格式标签到底能不能打

手上接过一个 PCB 外观质检的小活,客户产线每天过几千片板子,人工目检漏检率忽高忽低,想上目标检测。第一反应不是找模型,而是找数据——没有标注数据,YOLO11 再新也是空转。翻了一圈公开资源,能直接拿来练手的 PCB 缺陷数据集不多,常见的就是这种「1000 张图 + VOC/COCO/YOLO 三种格式标签 + 三平台一键训练脚本」的组合包。它解决的核心问题很实在:让你在半天内把一条从数据到推理的链路跑通,而不是花两周去啃标注工具和格式转换。

这类数据集通常覆盖 PCB 表面的典型缺陷:缺孔、鼠咬、开路、短路、余铜、毛刺、假铜这几类。1000 张的体量不算大,做工业级落地肯定不够,但用来验证 YOLO11 的流程、调通环境、跑出第一版 mAP 曲线,完全够用。适合两类人:一是刚接触目标检测、想找个真实工业场景练手的新手;二是手里有产线数据但还没标注、想先拿公开集跑通 pipeline 再迁移的工程师。下面按「数据长什么样 → 怎么转格式 → 怎么训 → 坑在哪」的顺序拆开讲。

2. 数据集结构与三种标签格式的取舍逻辑

2.1 1000 张图里到底有什么

拿到一个数据集,先别急着训,先看目录结构和类别分布。典型的 PCB 缺陷数据集目录大致长这样:

pcb_defect_dataset/ ├── images/ │ ├── 001.jpg │ ├── 002.jpg │ └── ... ├── annotations/ │ ├── voc/ # XML 格式 │ ├── coco/ # 单个 instances.json │ └── yolo/ # txt 格式 ├── classes.txt └── train_yolo11.py

classes.txt里一般列着缺陷类别名,比如missing_hole、mouse_bite、open_circuit、short、spur、copper、spurious_copper。1000 张图分摊到 6~7 类,每类大概 100~200 个实例,属于小样本偏下水平。这意味着训练时数据增强必须开足,否则模型很容易过拟合到某几类。

提示:先跑一遍类别统计脚本,确认每类实例数。如果某类少于 50 个,训练时考虑用 copy-paste 增强或调低该类别的 loss 权重。

2.2 VOC、COCO、YOLO 三种格式分别什么时候用

三种格式不是随便给的,各有各的适用场景。VOC 的 XML 是「一图一文件」,可读性最好,适合人工核对标注质量;COCO 的单个 JSON 适合做多任务扩展(检测+分割+关键点),也是很多论文评测的标准输入;YOLO 的 txt 是归一化坐标,训练时读取最快,Ultralytics 系直接吃。

格式文件组织坐标表示典型用途
VOC每图一个 XML绝对像素 xmin/ymin/xmax/ymax标注审核、格式转换源
COCO单个 JSON绝对像素 [x,y,w,h]论文评测、多任务
YOLO每图一个 txt归一化 cx,cy,w,hYOLO 系列训练

选型逻辑很简单:如果你只用 YOLO11 训练,直接用 yolo 格式,省去转换开销;如果你要对比其他框架(比如 MMDetection 吃 COCO),就用 COCO;如果你要人工复查标注有没有框错,打开 XML 最直观。三种格式同时给,本质是让你不用自己写转换脚本,省掉最容易出错的一环。

2.3 从 VOC 转 YOLO 的坐标换算与边界坑

虽然数据集号称三种格式都有,但实际用的时候经常需要自己再转一次——比如你只拿到了 VOC,或者想验证转换是否正确。VOC 转 YOLO 的核心是坐标归一化:

import xml.etree.ElementTree as ET import os def voc_to_yolo(xml_path, img_w, img_h, class_list): tree = ET.parse(xml_path) root = tree.getroot() lines = [] for obj in root.findall('object'): cls_name = obj.find('name').text if cls_name not in class_list: continue cls_id = class_list.index(cls_name) bbox = obj.find('bndbox') xmin = float(bbox.find('xmin').text) ymin = float(bbox.find('ymin').text) xmax = float(bbox.find('xmax').text) ymax = float(bbox.find('ymax').text) # 归一化并转为中心点+宽高 cx = (xmin + xmax) / 2.0 / img_w cy = (ymin + ymax) / 2.0 / img_h w = (xmax - xmin) / img_w h = (ymax - ymin) / img_h # 裁剪到 [0,1],防止标注越界 cx = min(max(cx, 0), 1) cy = min(max(cy, 0), 1) w = min(max(w, 0), 1) h = min(max(h, 0), 1) lines.append(f"{cls_id} {cx:.6f} {cy:.6f} {w:.6f} {h:.6f}") return lines

逻辑说明:VOC 的坐标是绝对像素,YOLO 要的是归一化后的中心点加宽高。img_w和img_h必须从对应图片读取,不能硬编码。参数上,class_list的顺序必须和训练时的data.yaml里names完全一致,否则类别会错位。裁剪到 [0,1] 是防止个别标注框超出图片边界导致训练时报错。

注意:有些 VOC 标注里xmax等于图片宽度,归一化后 w 可能刚好是 1.0,这是正常的。但如果出现负值或大于 1,说明标注有问题,需要回头修。

3. YOLO11 三平台训练脚本拆解与参数调法

3.1 一键脚本里到底封装了什么

所谓「一键训练脚本」,本质是把 Ultralytics 的model.train()包了一层,加上路径自动识别和设备选择。一个典型的train_yolo11.py核心逻辑如下:

from ultralytics import YOLO import torch import os def get_device(): if torch.cuda.is_available(): return 0 # GPU elif torch.backends.mps.is_available(): return "mps" # Mac M 系列 else: return "cpu" # 纯 CPU def train(data_yaml, epochs=100, imgsz=640, batch=16): device = get_device() # 根据设备调整 batch,CPU 和 Mac 显存/内存有限 if device == "cpu": batch = 4 elif device == "mps": batch = 8 model = YOLO("yolo11n.pt") # 小模型,适合小数据集 model.train( data=data_yaml, epochs=epochs, imgsz=imgsz, batch=batch, device=device, workers=4, patience=20, # 20 轮无提升就早停 augment=True, # 开启默认增强 pretrained=True ) return model if __name__ == "__main__": train("data.yaml")

逻辑说明:get_device()按 CUDA → MPS → CPU 的优先级选设备。yolo11n.pt是最小的 YOLO11 模型,1000 张图用 n 版足够,用 l 版反而容易过拟合。patience=20是早停,小数据集上很关键,防止无效训练。batch根据设备动态调整,CPU 上设 16 会直接爆内存。

参数说明:imgsz=640是默认输入尺寸,PCB 缺陷通常比较小,如果缺陷在图中占比很小,可以提到 1024,但显存翻倍。workers=4是数据加载线程数,Windows 上设太高反而慢,4 是稳妥值。

3.2 GPU、CPU、Mac 三平台的真实速度差异

同一份数据,三个平台跑起来的体验完全不同。GPU 上(比如 RTX 3060)100 轮大概 20~30 分钟;Mac M1/M2 用 MPS 大概 1.5~2 小时;纯 CPU 上可能要 6~10 小时。这不是模型问题,是矩阵运算的硬件差异。

平台设备标识建议 batch100 轮耗时(参考)备注
NVIDIA GPU01620~30 min需装 CUDA 版 torch
Mac M 系列mps81.5~2 htorch ≥ 2.0
纯 CPUcpu46~10 h仅验证流程用

Mac 上跑 YOLO11 有个坑:MPS 后端对某些算子支持不全,可能报NotImplementedError。解决办法是设环境变量PYTORCH_ENABLE_MPS_FALLBACK=1,让不支持的算子回退到 CPU。CPU 训练只建议用来验证脚本能不能跑通,真训还是上 GPU。

3.3 data.yaml 的写法与类别顺序陷阱

data.yaml是 YOLO 训练的入口配置,写错一个字段就白跑。标准写法:

path: ./pcb_defect_dataset train: images/train val: images/val nc: 7 names: 0: missing_hole 1: mouse_bite 2: open_circuit 3: short 4: spur 5: copper 6: spurious_copper

nc必须等于names的条目数。names的索引顺序必须和 YOLO 标签文件里的类别 id 一致——这是最常见的翻车点。如果你用 VOC 转 YOLO 时class_list顺序和这里不一样,训练出来的模型会把「短路」认成「缺孔」,mAP 看着还行但全是错的。

提示:转换完标签后,随机抽 5 张图用cv2把框画出来肉眼核对一遍,比看 loss 曲线管用。

4. 小数据集训练 PCB 缺陷的避坑与排查

4.1 现象:mAP 从第 10 轮开始就不动了

原因:1000 张图对 7 类缺陷来说偏少,模型很快记住训练集,验证集 loss 不再下降。这是典型的小样本过拟合。

解决:把augment开满,额外加mosaic=1.0、mixup=0.2、copy_paste=0.3。同时把epochs降到 80~100,配合patience=20早停。如果还不行,考虑冻结 backbone 前几层,只训 head。

4.2 现象:CPU 训练到一半被 kill

原因:内存不够。YOLO 默认workers=8,每个 worker 都会复制一份数据加载器,CPU 上内存直接吃满。

解决:把workers降到 2~4,batch降到 4 甚至 2。如果还爆,用imgsz=416先跑通流程,再换 GPU 上 640。

4.3 现象:Mac 上报 MPS 算子不支持

原因:YOLO11 里某些后处理算子(如 NMS 的某些实现)在 MPS 后端没有对应实现。

解决:训练前设export PYTORCH_ENABLE_MPS_FALLBACK=1。如果推理时也报,把推理设备临时切到 CPU,只训练用 MPS。

4.4 现象:验证集 mAP 很高但实际推理框全错

原因:data.yaml里names顺序和标签文件里的类别 id 不一致,或者验证集图片和标签没对上。

解决:写个脚本随机抽验证集图片,把预测框和真实框画在同一张图上对比。如果框的位置对但类别名错,就是names顺序问题;如果框位置都不对,检查图片和标签文件名是否一一对应。

4.5 现象:训练 loss 正常但推理时一个框都不出

原因:推理时的conf阈值设太高。PCB 缺陷目标小,模型输出的置信度普遍偏低。

解决:推理时把conf从默认 0.25 降到 0.1,iou从 0.7 降到 0.5,先看有没有框出来,再逐步调高。

5. 从 1000 张公开集迁移到产线数据的实操技巧

公开数据集跑通只是第一步,真正要落地得把模型迁到自己的产线图上。我一般这么做:先用这 1000 张训一个 baseline,mAP 大概能到 0.6~0.7(取决于类别难度),然后拿产线相机拍 200~300 张真实图,人工标一遍,和公开集混在一起做增量训练。混合比例控制在公开集:产线集 = 1:1 到 2:1 之间,产线集太少会被公开集带偏,太多又回到小样本问题。

增量训练时有个技巧:把 baseline 的权重作为预训练权重加载,学习率调到原来的 1/10,只训 30~50 轮。这样模型不会忘记公开集学到的通用特征,又能快速适配产线的光照和背景。验证时单独留 50 张产线图做测试集,别看公开集的 mAP,看产线测试集的召回率——工业质检里漏检比误检代价高得多。

最后说个习惯:每次训完模型,我都会把results.csv和confusion_matrix.png存到一个带时间戳的文件夹里。PCB 缺陷检测这行,换个批次、换个光源,模型表现就可能变,没有历史记录,出了问题连后悔药都没得吃。这套流程我跑了不下十次,每次翻车都翻在数据格式和类别顺序上,模型本身反而很少出问题。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/6 1:11:03

PCB Logo Creator实战:从位图到Altium Designer丝印Logo制作全攻略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/6 1:10:05

易灵思Efinity与Modelsim联仿实战:原语库编译与波形调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/6 1:09:17

嘉立创EDA专业版PCB铺铜与丝印优化实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/6 1:09:17

国产FPGA联合仿真实战:TD+Modelsim适配EF2全流程指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/6 1:08:49

立创EDA从零到打板:原理图、PCB设计全流程实操指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/6 1:07:24

Vivado LVDS环回测试三层验证法与SelectIO配置陷阱

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华