
简介面向工业视觉与目标检测方向的开发者、算法工程师及高校学生这份资源提供了一套真实采集的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.pyclasses.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, epochs100, imgsz640, batch16): device get_device() # 根据设备调整 batchCPU 和 Mac 显存/内存有限 if device cpu: batch 4 elif device mps: batch 8 model YOLO(yolo11n.pt) # 小模型适合小数据集 model.train( datadata_yaml, epochsepochs, imgszimgsz, batchbatch, devicedevice, workers4, patience20, # 20 轮无提升就早停 augmentTrue, # 开启默认增强 pretrainedTrue ) return model if __name__ __main__: train(data.yaml)逻辑说明get_device()按 CUDA → MPS → CPU 的优先级选设备。yolo11n.pt是最小的 YOLO11 模型1000 张图用 n 版足够用 l 版反而容易过拟合。patience20是早停小数据集上很关键防止无效训练。batch根据设备动态调整CPU 上设 16 会直接爆内存。参数说明imgsz640是默认输入尺寸PCB 缺陷通常比较小如果缺陷在图中占比很小可以提到 1024但显存翻倍。workers4是数据加载线程数Windows 上设太高反而慢4 是稳妥值。3.2 GPU、CPU、Mac 三平台的真实速度差异同一份数据三个平台跑起来的体验完全不同。GPU 上比如 RTX 3060100 轮大概 20~30 分钟Mac M1/M2 用 MPS 大概 1.5~2 小时纯 CPU 上可能要 6~10 小时。这不是模型问题是矩阵运算的硬件差异。平台设备标识建议 batch100 轮耗时参考备注NVIDIA GPU01620~30 min需装 CUDA 版 torchMac M 系列mps81.5~2 htorch ≥ 2.0纯 CPUcpu46~10 h仅验证流程用Mac 上跑 YOLO11 有个坑MPS 后端对某些算子支持不全可能报NotImplementedError。解决办法是设环境变量PYTORCH_ENABLE_MPS_FALLBACK1让不支持的算子回退到 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_coppernc必须等于names的条目数。names的索引顺序必须和 YOLO 标签文件里的类别 id 一致——这是最常见的翻车点。如果你用 VOC 转 YOLO 时class_list顺序和这里不一样训练出来的模型会把「短路」认成「缺孔」mAP 看着还行但全是错的。提示转换完标签后随机抽 5 张图用cv2把框画出来肉眼核对一遍比看 loss 曲线管用。4. 小数据集训练 PCB 缺陷的避坑与排查4.1 现象mAP 从第 10 轮开始就不动了原因1000 张图对 7 类缺陷来说偏少模型很快记住训练集验证集 loss 不再下降。这是典型的小样本过拟合。解决把augment开满额外加mosaic1.0、mixup0.2、copy_paste0.3。同时把epochs降到 80~100配合patience20早停。如果还不行考虑冻结 backbone 前几层只训 head。4.2 现象CPU 训练到一半被 kill原因内存不够。YOLO 默认workers8每个 worker 都会复制一份数据加载器CPU 上内存直接吃满。解决把workers降到 2~4batch降到 4 甚至 2。如果还爆用imgsz416先跑通流程再换 GPU 上 640。4.3 现象Mac 上报 MPS 算子不支持原因YOLO11 里某些后处理算子如 NMS 的某些实现在 MPS 后端没有对应实现。解决训练前设export PYTORCH_ENABLE_MPS_FALLBACK1。如果推理时也报把推理设备临时切到 CPU只训练用 MPS。4.4 现象验证集 mAP 很高但实际推理框全错原因data.yaml里names顺序和标签文件里的类别 id 不一致或者验证集图片和标签没对上。解决写个脚本随机抽验证集图片把预测框和真实框画在同一张图上对比。如果框的位置对但类别名错就是names顺序问题如果框位置都不对检查图片和标签文件名是否一一对应。4.5 现象训练 loss 正常但推理时一个框都不出原因推理时的conf阈值设太高。PCB 缺陷目标小模型输出的置信度普遍偏低。解决推理时把conf从默认 0.25 降到 0.1iou从 0.7 降到 0.5先看有没有框出来再逐步调高。5. 从 1000 张公开集迁移到产线数据的实操技巧公开数据集跑通只是第一步真正要落地得把模型迁到自己的产线图上。我一般这么做先用这 1000 张训一个 baselinemAP 大概能到 0.6~0.7取决于类别难度然后拿产线相机拍 200~300 张真实图人工标一遍和公开集混在一起做增量训练。混合比例控制在公开集:产线集 1:1 到 2:1 之间产线集太少会被公开集带偏太多又回到小样本问题。增量训练时有个技巧把 baseline 的权重作为预训练权重加载学习率调到原来的 1/10只训 30~50 轮。这样模型不会忘记公开集学到的通用特征又能快速适配产线的光照和背景。验证时单独留 50 张产线图做测试集别看公开集的 mAP看产线测试集的召回率——工业质检里漏检比误检代价高得多。最后说个习惯每次训完模型我都会把results.csv和confusion_matrix.png存到一个带时间戳的文件夹里。PCB 缺陷检测这行换个批次、换个光源模型表现就可能变没有历史记录出了问题连后悔药都没得吃。这套流程我跑了不下十次每次翻车都翻在数据格式和类别顺序上模型本身反而很少出问题。希望帮到你。本文还有配套的精品资源点击获取