
简介面向计算机视觉与智能制造领域的PCB板缺陷检测数据集基于北京大学公开的693张原始板卡图像通过数据增强扩展至6930张适合深度学习目标检测模型训练、算法对比与工程落地验证。包体共1346个文件核心含445张jpg缺陷图像、445个xml标注文件与452个txt标签文件分别对应VOC与YOLO两种常用格式可直接接入主流检测框架另含2个cache缓存及2个npy数组文件可辅助训练提速。压缩包约584MB目录组织清晰目前已有2206人学习使用。数据集已覆盖增强后的多样化缺陷样本使用者无需重复采集与标注即可快速开展模型训练、性能评估以及数据增强策略研究尤其适合高校实验室、工业质检项目作为基准数据。 做工业视觉的人十有八九都被同一个问题折磨过缺陷样本太难攒了。产线上一台设备跑一天可能只产出几十张不合格品图片其中真正带缺陷的又只占一小部分。我刚开始接触PCB板缺陷检测的时候找数据集找得头大——能下载的要么尺寸不统一要么标签乱七八糟。后来用到北京大学这个PCB板缺陷检测数据集一下子顺了很多693张原始图通过数据增强扩展到6930张类别齐全标签也规整做算法验证、跑YOLO训练、写论文对比实验都够用。这篇文章就把这个数据集从内容构成、增强逻辑到训练配置完整拆一遍顺便把我实际用下来的坑也一起说了。1. 家底盘点数据规模、六类缺陷与适用场景1.1 原始图与扩展集的规模关系先把这个数据集的基本盘说清楚。它由北京大学相关课题组整理并开源原始图片数量是693张官方在原始样本基础上做了数据增强最终对外提供6930张图片正好是原始量的10倍。这个数字看起来简单但背后其实是一套完整的样本扩容思路先用基础几何变换把量做上去再用像素级扰动让模型见过更多环境变化后面我会专门拆解增强链路。很多初次接触的人会问6930张也不算多啊工业数据集动辄几万张。这话有道理但要结合PCB缺陷检测的实际情况看。PCB板缺陷是典型的小样本长尾问题——正常板子长得几乎一模一样缺陷却千奇百怪。693张原始图里每张图包含若干块板子每块板子上可能同时存在多个缺陷所以标注框的数量远大于693个。扩充到6930张之后训练集、验证集、测试集的划分就从容得多单类样本量也能支撑一个中等规模的深度学习模型。1.2 六类缺陷明细数据集的缺陷类别一共六类这六类也是PCB裸板外观检测里最常出现的缺陷类型类别英文标签通俗理解常见成因漏孔missing_hole该钻孔的位置没有钻透或根本没钻钻头磨损、断针鼠咬mouse_bite焊盘边缘出现向内凹陷的小缺口像被鼠咬过蚀刻过度、铜箔附着力不足断路open_circuit导线中间断开信号无法通过蚀刻断线、划伤、铜厚不够短路short两条不该相连的导线粘连在一起蚀刻不足、残铜残留突刺spur导线边缘向外长出细小的尖刺蚀刻参数波动、铜箔杂质残铜spurious_copper不该有铜的区域残留小块铜皮显影不净、蚀刻不均匀从检测难度上看漏孔和短路相对好认因为它们和目标形状差异很大模型容易学到强特征。真正麻烦的是鼠咬、突刺、残铜这三类——尺寸小、形状不规则、和正常板子纹理的边界很模糊经常需要放大到相当高的分辨率才能判断。我后面会单独讲这几类导致的模型混淆问题。1.3 标签形式与适合的玩法这个数据集对外提供时不同转载版本用的标签格式不完全一样常见的有VOC格式的XML标注也有整理成YOLO格式txt的版本。图像尺寸也因版本而异常见版本多为2000×1500左右的大图。如果你下到的版本没有做训练集/验证集划分建议按照8:1:1或者7:2:1的比例自己随机划分注意按图像而不是按标注框划分避免同一张图同时出现在训练集和验证集里。适用场景非常明确算法预研与模型选型对比Faster R-CNN、YOLO、SSD等目标检测模型在工业小缺陷上的表现。数据增强策略研究693→6930的官方增强结果本身就是很好的参照系。教学与课程设计类别少、标签规整、规模适中非常适合深度学习初学者做完整项目实战。迁移学习起点在PCB通用缺陷上预训练再用产线真实数据微调能明显缩短冷启动周期。2. 从693到6930的增强链路拆解2.1 为什么PCB缺陷检测特别依赖数据增强我见过不少刚入行的朋友在PCB项目上直接上生成对抗网络甚至扩散模型来造数据其实在项目初期根本没必要。PCB板本身有一个很特殊的属性高一致性与高重复性。同一款板子颜色固定、走线固定、绿油/蓝油/红油的色值区间很窄这和自然场景数据集完全不同。这种高一致性恰好让传统数据增强手段发挥最大价值——你不需要教会模型世界是什么样只需要让它在有限的成像变化下仍然认得住缺陷。反过来这也是PCB场景对增强要求更苛刻的原因。自然场景里你给图像加个强阴影、加个雾霾模型反而更鲁棒但PCB板在产线上打光稳定、背景单一如果增强手段太激进比如把绿板变成紫板、把亮度拉得离谱模型学到的特征反而会偏离真实分布推理时表现更差。所以PCB数据增强的核心原则是模拟成像系统的合理波动而不是模拟世界的任意变化。2.2 官方级别可复现的增强组合从693张扩到6930张官方采用的方法可以理解为三层叠加。第一层是几何变换第二层是像素级扰动第三层是形态类模拟。我自己按这个思路复现过体感上非常接近官方增强集的分布。几何变换层水平翻转、垂直翻转PCB板在产线上朝向并不固定镜像翻转完全合理。旋转90°、180°、270°板子在传送带上可能以任意角度进入相机视野。小角度旋转±5°左右模拟板子摆放轻微偏斜。平移与缩放模拟板子在视场内的位置变化和高度波动。像素扰动层亮度、对比度调整不同灯源亮度标定差异。高斯噪声、椒盐噪声模拟相机传感器噪声。高斯模糊、轻微运动模糊模拟镜头轻微失焦或传送带抖动。饱和度轻微扰动模拟不同批次油墨的颜色差异但幅度一定要小。形态模拟层形态学膨胀/腐蚀的局部变化模拟蚀刻不均导致的走线粗细波动。边缘轻微扭曲模拟基材涨缩导致的走线形变。局部区域对比度拉伸模拟反光不均。这层是关键。PCB缺陷检测真正难的往往不是看得到缺陷而是缺陷和正常走线之间的边界太接近。通过形态学操作把走线边缘轻微变形模型才会被迫去学习形状关系而不是像素值匹配。2.3 增强操作的边界与禁忌这条我建议每个做工业检测的人都刻在工位上。第一不要让几何变换破坏标签语义。90°旋转对PCB板几乎总是安全的但180°旋转对于有方向性丝印的板子要小心。如果板子上有二维码、IC丝印方向标识这类样本一旦旋转错方向模型会学到错误的方向特征。我建议做数据清洗时把带明显方向标识的图单独拎出来只做水平翻转不做任意角度的旋转。第二颜色扰动幅度要克制。有次我把饱和度增强设得偏高跑出来的模型在验证集上mAP很好看一上产线就崩。排查半天发现产线绿色板子在特定角度下反光偏黄而训练集里的绿色过于标准模型反而把偏黄的绿当成了异常。后来我把色相扰动幅度砍到原来的三分之一问题立刻缓解。第三增强后的标签必须二次检查。旋转、裁剪、平移这类几何操作虽然会自动变换标注框但当目标贴近图像边缘时变换后可能被截断一半甚至完全移出画面。很多增强库不会自动删除这种残废标签你稀里糊涂拿去训练等于每天都在给模型喂错误标注。我习惯在增强pipeline里加一步过滤标注框被裁掉超过20%面积就丢弃该目标。3. 整理成YOLOv8可用的训练格式3.1 目录结构与标签格式转换拿到数据集第一步不是急着训练而是先把文件结构捋顺。我自己常用这套目录组织方式PCB_Dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ ├── classes.txt └── pcb.yaml如果下到的是VOC XML标注需要转成YOLO格式的txt。YOLO格式每行代表一个目标内容是类别id 中心点x 中心点y 宽度w 高度h其中坐标全部归一化到0到1之间。转换时有几个细节容易踩坑XML里常见的坐标系是左上角原点而YOLO需要的是中心点坐标。宽度和高度必须除以图像原始宽高做归一化。解析XML时要注意有的框会超出图像边界直接裁剪到边界内。单张图里如果同一类别出现多个框正常写多行即可不要合并。3.2 配置文件与训练命令我用YOLOv8跑过这个数据集效果稳定且标签格式直接兼容这里给一份完整的配置文件参考# pcb.yaml path: /path/to/PCB_Dataset train: images/train val: images/val test: images/test names: 0: missing_hole 1: mouse_bite 2: open_circuit 3: short 4: spur 5: spurious_copper训练命令yolo detect train \ modelyolov8s.pt \ datapcb.yaml \ epochs100 \ imgsz1280 \ batch16 \ patience20 \ projectpcb_yolo \ nameexp1这里特别提一下imgsz的选择。很多人习惯用640但在PCB缺陷检测里我不建议。漏孔、缺口这类缺陷在2000×1500的原图里可能只有几十个像素640输入下直接就糊成一片了。实测下来输入分辨率提到1280以上mAP50的涨幅常常能有5到10个点。代价是显存占用和训练时间翻倍但对工业场景来说模型精度优先级远高于训练速度。3.3 训练过程中的评估指标怎么读训练完别只盯着mAP看工业缺陷检测有几个指标必须分开读指标含义工业场景的关注重点mAP50IoU阈值0.5时的平均精度初步验证模型有没有学对类别mAP50-95从0.5到0.95每隔0.05取一次的平均反映定位精度小目标很敏感precision预测为正的样本里真正正确的比例误报率高会导致产线频繁停机recall真实缺陷里被检出多少漏检是产线最不能接受的PCB项目的验收逻辑通常是先保召回再控误报。漏检一个缺陷可能导致整批板子返工而误报只是让AOI多检几次、人工多看一眼。所以调参时如果precision和recall冲突我一般往recall那边偏一偏。YOLOv8训练结束后可以用yolo predict在测试集上批量推理再用yolo val拿到详细混淆矩阵这一步一定要做。4. 实际训练中的教训与调试经验4.1 最常出现的类别混淆组合我用这个数据集跑过的模型不在少数每次看混淆矩阵固定有那么几对缺陷容易互相认错。第一对是mouse_bite和spur。二者都表现为焊盘或走线边缘的突起/凹陷在低分辨率下几乎一模一样。唯一的区分线索在形态鼠咬通常是圆润的凹坑突刺则是尖锐的细长突出。这个特征人类肉眼很容易分辨但模型在特征图上很容易混在一起。第二对是open_circuit和missing_hole。两种都是该有铜的地方没铜区别在于断路的缺口出现在走线中间漏孔出现在焊盘位置。当断路恰好发生在焊盘边缘时这两类在视觉上高度重叠。第三对是short和spurious_copper。短路的本质是两条网络之间出现了不该有的连接残铜是大片游离的铜屑。但残铜如果恰好搭在两条走线之间它同时也构成了短路。这类边界案例在标注时就会产生分歧模型学起来也很痛苦。针对这些混淆我的处理经验有两个。一是不要盲目追求六类分开的mAP有些边界样本连人眼都难以判定模型出错是可以接受的关键看最终产线的良率指标。二是可以用多标签策略缓解把严重混淆的类别合并成一个大类先保证检出再细分。比如短路和残铜很难分但有没有多余铜这个大类很好学。4.2 增强后的标签质量检查我强烈建议在训练前写一段脚本遍历所有增强后的图像和标签做三件事检查坐标是否越界、检查标注框面积是否小于某个阈值、检查类别id是否在合法范围内。这个脚本可能只需要几十行但能拦住大部分低级错误。import os from PIL import Image def check_labels(img_dir, label_dir, min_area100): for img_file in sorted(os.listdir(img_dir)): stem os.path.splitext(img_file)[0] label_path os.path.join(label_dir, stem .txt) img_path os.path.join(img_dir, img_file) if not os.path.exists(label_path): print(f缺少标签: {label_path}) continue img Image.open(img_path) W, H img.size with open(label_path) as f: lines f.readlines() for line in lines: parts line.strip().split() cls int(parts[0]) cx, cy, w, h map(float, parts[1:]) if not (0 cls 5): print(f非法类别id: {label_path}) if cx 0 or cx 1 or cy 0 or cy 1: print(f中心点越界: {label_path}) if w * W * h * H min_area: print(f目标过小: {label_path} 面积{w * W * h * H:.1f})这段脚本跑的体感是数据集越大奇奇怪怪的标注问题越多。有的标签文件里混入了空行有的框的宽高写反了有的坐标没有归一化。在干净数据上多花半小时比训练完再回头排查节省的时间多得多。4.3 从公开数据集到产线真实数据的迁移这是这个数据集最容易被误解的地方。很多人以为用北京大学这个数据集训出一个模型就能直接部署到自家产线。实际上公开数据集只能作为预训练基础和Benchmark基准直接迁移到产线往往会有不小的性能落差。原因很现实不同板厂的油墨颜色不同、打光方式不同同轴光、环形光、条光、相机分辨率不同甚至同一张板子在不同角度下的反光都不一样。公开数据集训练出的模型已经学会了PCB板的一般长相这是它的价值所在。要落地必须在产线采集一批真实图片哪怕是几百张对模型做fine-tune。我常用的做法是用6930张公开集先训到收敛然后冻结backbone的前几层用产线真实图片只训练检测头和后面几层特征。如果产线图片只有几十张那就在真实图上做更强的增强Mosaic、Copy-Paste凑够两三百张再微调。这样既能保住公开集上学到的通用特征又能快速适应产线分布。5. 小目标缺陷检测的几个通用注意点5.1 高分辨率推理与滑窗策略PCB缺陷的尺寸分布跨度非常大短路可能是横跨整个板面的长条漏孔却可能只有十几个像素。这类任务里高分辨率推理是绕不开的。如果你在1280分辨率下训练那就尽量在1280分辨率下推理不要为了省算力偷偷降到640。实在显存不够可以走切图推理把大图切成若干小块注意重叠区域分别推理后再拼接结果用NMS处理重叠区域的重复框。切图尺寸一般取训练尺寸的1.5到2倍重叠率设20%到30%比较稳妥。切图的缺点是需要额外写后处理逻辑但对于动辄2000×1500的大图很多时候这是唯一方案。5.2 类别不平衡不一定要重采样这个数据集六类缺陷的数量并不是严格均匀的有些类别天然少。遇到类别不平衡新手喜欢上来就重采样或加Loss权重其实先别急。PCB缺陷有个特点少的那几类往往是难的那几类而难样本的一两条精细特征可能比一千张易样本管用得多。我给个可操作的判断方法先看模型在各类别上的PR曲线。如果少数类的precision低、recall也低说明模型确实没学会这时候才考虑针对性增强该类别如果只是recall稍低但precision不错说明模型已经掌握了基本特征只是阈值偏保守用类别级的置信度阈值就能解决不必把数据分布搞得过度复杂。5.3 验证集划分里最容易忽略的事最后提醒一个很容易踩的坑划分验证集和测试集时一定要回原始样本去分而不是在增强后的6930张上随机分。原因很简单同一张原始图经过10种增强得到的10张图在语义上高度相似。如果其中几张进了训练集、另有几张进了验证集验证分数会虚高因为模型见过几乎一样的图。我见过有人在这个数据集上测试集准确率报了98%换到真实产线场景直接掉到70%以下多半就是划分阶段出了问题。正规做法是先在693张原始图上按比例划分出train原始集、val原始集、test原始集然后只对train原始集做增强val和test保持未增强状态。这样验证集和测试集才真正具备评估意义。这个数据集我前前后后用了大半年从最早的Faster R-CNN换到YOLOv8又从YOLOv8的检测头结构里挖了不少细节。它不算大但作为工业小缺陷检测的入门基准非常合适。如果你想深入做PCB方向建议把官方增强策略吃透再结合自己产线的情况微调增强参数。这套从数据理解到增强设计再到训练评估的完整链路才是比数据集本身更值钱的东西。本文还有配套的精品资源点击获取