简介:PCB板缺陷检测数据集为北京大学693数据增强版,包含6930幅经过扩充的缺陷样本,面向机器视觉与深度学习研究者,适用于PCB板表面多种缺陷的识别与定位模型训练、验证及算法对比。压缩包共1346个文件,主要包括445张jpg图像、445个xml标注文件、452个txt标注或类别描述,另有少量缓存与预处理数据,整体约584MB;其中xml为VOC格式边界框标注,txt可用于类别说明或训练配置,目录内提供训练集与验证集的cache文件,便于直接划分和加载数据。目前已有2206人学习下载。经数据增强后的样本覆盖更多样的缺陷形态与背景变化,可直接接入YOLO、Faster R-CNN等主流检测框架,显著降低数据采集与人工标注成本,同时为算法评估和工程落地提供可靠的数据支撑,适合课程设计、科研实验及工业质检项目使用。
1. 从693到6930:这个数据集到底解决了什么问题
做工业视觉这几年,PCB缺陷检测一直是绕不开的硬骨头。产线上AOI设备跑得飞快,但误报率居高不下,调参调到怀疑人生,最后还是得靠人工复判顶着。后来深度学习算法逐渐成熟,大家都开始用目标检测模型来做缺陷识别,但真正上手才发现,算法模型反而是最简单的环节,拦在面前的第一座大山是数据。
很多刚开始做PCB缺陷检测的朋友都会面临同样的尴尬:网上公开的数据集屈指可数,能找到的几个要么缺陷类别太少,要么图片数量少得可怜,连一个完整的训练集都凑不齐。这种情况下去跑YOLO或者更复杂的检测模型,几乎必然过拟合,测试集上看着还行,一换到实际产线的板子上立刻原形毕露。
北京大学发布的这个PCB缺陷检测数据集,算是把这个问题解决了一大半。原始图片693张,通过数据增强扩展到6930张,类别覆盖完整,标注格式规范,直接拿来训练一个能用的检测模型没有问题。这个数据集的定位非常清晰:不是用来刷榜的学术benchmark,而是偏向工业落地场景的实用数据资源。
先看这个数据集的核心价值。693张原始图片听起来不多,但它在工业场景里已经是相当可贵的规模了。原因很简单,PCB缺陷样本在真实产线中的出现率极低,很多缺陷类型一个月都遇不到几次,想要靠自然积累收集足够多的样本,需要的是以年为单位的采集周期。北大团队把收集到的缺陷样本整理发布出来,等于帮所有做这个方向的人省掉了最耗时、最看运气的数据积累阶段。
6930这个数字也不是随便凑出来的。数据增强的倍率选择是有讲究的,增强太少解决不了数据量不足的问题,增强太多又会引入大量高度相似的样本,导致模型在训练时反复看到同一张图的变体,反而加深过拟合。693到6930恰好是10倍的扩增比例,配合合理的增强策略,既能把数据量撑到深度学习模型可以正常训练的量级,又不至于让训练集变成一堆“换皮”的重复样本。
拿我自己的使用体验来说,这个数据集最省心的地方在于标注是现成的。工业缺陷检测项目里,标注成本往往比算法开发成本还要高,一张PCB板子上缺陷区域小、类型多,标注员需要经过专业培训才能准确区分开路、短路、毛刺、余铜这些看起来很像的缺陷类别。这个数据集直接省掉了这一大笔开销,下载下来整理成训练格式就能用。
2. 数据增强的完整拆解:为什么是10倍而不是20倍
2.1 工业质检场景下的数据增强原则
数据增强不是简单地给图片做几个变换就完事,它背后的核心逻辑是:在保持缺陷本质特征不变的前提下,尽可能模拟真实产线拍摄环境中的各种变化。PCB缺陷检测的场景非常固定,相机角度、光照条件、板面颜色在真实产线中都是相对稳定的,这和自然图像任务中需要应对各种复杂场景完全不同。
北大这个数据集采用的增强策略,从结果反推来看,走的是比较保守稳妥的路线。10倍的增强倍率意味着每种变换只做有限次数的组合,不会出现同一张图被反复暴力变换几十种花样的情况。这种做法在工业场景中是正确的,因为过度增强反而会让模型学到一些产线中根本不存在的“伪特征”。
实际训练中我的经验是,工业缺陷检测的数据增强应该锚定真实场景的变量。比如PCB板在产线传送带上可能会有微小的旋转和位移,那旋转增强的角度范围就不要超过正负15度;光照变化主要来自荧光灯管的衰减和老化,那么亮度扰动范围控制在正负20%以内就足够。超出这个范围去增强,模型可能会学到旋转90度、灰度反转这些在真实检测环境中永远用不到的无效特征,白白浪费模型的拟合能力。
2.2 原始693张数据的标注细节与缺陷类型
这个数据集覆盖的缺陷类型是PCB缺陷检测中最常见的6类:缺孔、鼠咬、开路、短路、毛刺、余铜。这6类缺陷基本涵盖了PCB制程中经常出现的问题,特别是短路和开路这两类,是影响电性能最严重的缺陷,也是产线AOI检测的重中之重。
从标注格式来看,数据集的标注框基本都是紧贴缺陷区域的矩形框,标注质量比较稳定,没有出现大面积标注偏移或者漏标的情况。不过要注意的是,部分缺陷的样本量分布并不均匀,比如短路和开路的样本占比明显偏高,而鼠咬这类相对少见的缺陷样本数量较少。这个不均衡问题在训练时需要特别处理,我后面会详细说。
原始图片的拍摄分辨率不算特别高,对于PCB这类以微米级缺陷为检测目标的对象来说,单张图的尺寸其实并不宽裕。这也是为什么在训练时要格外注意输入尺寸的设置,如果直接把图片缩得太小,很多小缺陷在缩放过程中就会丢失细节,导致模型根本学不到关键的纹理特征。
2.3 增强策略的备份:几何变换、颜色扰动与噪声模拟
数据增强的常见手段可以分为几何变换、颜色扰动和噪声模拟三大类,北大这个数据集在增强时基本都覆盖到了。
几何变换包括水平翻转、垂直翻转、随机旋转、缩放和裁剪,这类变换能提升模型对缺陷位置和方向变化的鲁棒性。PCB板在线检测时,板子的方向不总是完全一致的,存在一定的角度偏差,几何增强正好模拟了这种情况。
颜色扰动包括亮度调整、对比度调整、饱和度调整和色调偏移,主要模拟不同光照条件下的成像差异。产线车间的照明环境会随着灯管老化、维护更换而发生变化,增强后的模型需要适应这种明暗变化。
噪声模拟包括高斯噪声、椒盐噪声和模糊处理,对应的是相机传感器噪声、灰尘颗粒干扰以及镜头轻微失焦的情况。实测下来,加入适量噪声增强后的模型在真实产线成像质量波动时,表现比没加噪声的模型稳定得多。
需要特别注意的是,PCB缺陷检测中不应该使用Cutout或者Random Erasing这类遮挡类增强方法。因为PCB板面本身就有大量的走线、焊盘、过孔等背景元素,如果随机遮挡掉一块区域,很容易把缺陷本身或者关键的背景特征遮住,导致模型学到错误的信息。北大这个数据集在增强时也没有使用这类方法,这点是符合工业实际的。
3. 实操:用这个数据集跑通YOLOv8训练与验证
3.1 数据集目录结构与标注格式改造
从官网下载下来的数据是VOC格式的,图片放在JPEGImages目录下,标注XML文件放在Annotations目录下。如果要直接使用YOLOv8训练,需要先转换成YOLO格式的txt标注文件,路径也要按照YOLO的目录规范组织好。
我的目录结构是这样的:
pcb_dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ └── labels/ ├── train/ ├── val/ └── test/转换标注格式的时候,最需要注意的是坐标系的转换。VOC格式存的是左上角和右下角的绝对像素坐标,而YOLO格式需要的是中心点坐标和宽高,并且全部归一化到0到1之间。转换公式很简单:
x_center = (x_min + x_max) / 2 / img_width y_center = (y_min + y_max) / 2 / img_height width = (x_max - x_min) / img_width height = (y_max - y_min) / img_height转换完记得手动抽查几个样本的标注是否正确,可以把标注信息画到图片上看看框的位置和缺陷是否对齐。这一步不要省,因为偶尔会有标注格式不规范的情况出现,如果带着错误的标注训练,模型效果会受到直接影响。
3.2 数据划分与训练超参数配置
数据集划分为训练集、验证集和测试集,比例建议7:2:1。划分的时候要注意按照缺陷类别做分层采样,而不是简单随机划分。因为部分缺陷类别样本量少,如果随机划分时全部跑到验证集或者测试集里,训练集就学不到这类特征了。
训练时我用的是YOLOv8n,参数量最小,在CPU上也能跑推理,适合快速验证流程是否走通。确认数据集和代码流程没问题之后,再换YOLOv8s或者YOLOv8m提升精度。
关键超参数配置如下:
# config.yaml path: ./pcb_dataset train: images/train val: images/val nc: 6 names: ['missing_hole', 'mouse_bite', 'open_circuit', 'short', 'burr', 'spurious_copper']训练命令:
yolo detect train data=config.yaml model=yolov8n.pt epochs=150 imgsz=640 batch=16输入尺寸设置成640是考虑因素后的选择。PCB缺陷很多是小目标,尺寸太小会丢失细节;尺寸太大则显存占用飙升,训练速度明显下降。640是精度和速度的平衡点。如果显存充足,可以尝试768甚至896,通常能看到mAP小幅提升,但收益会逐渐递减。
3.3 训练过程中的关键观察与结果分析
训练时重点关注两个指标:mAP50和mAP50-95。mAP50主要反映缺陷检测的召回能力,mAP50-95则更强调定位精度。PCB缺陷检测场景中,mAP50更加重要,因为只要能够稳定检测到缺陷的位置和类别,召回率上来了,漏检率就能降下去,这是产线最关心的指标。
实测下来,用这个增强后的数据集训练YOLOv8n,150个epoch跑完,mAP50基本能到0.95以上,mAP50-95在0.75左右。对于工业缺陷检测来说,这样的精度已经具备参考价值,说明数据增强的效果是实打实的。如果只用原始的693张图训练,不做增强,mAP50会掉到0.8以下,差距非常明显。
还有个观察是,增强后的数据集训练收敛明显更稳定。原始数据量少的时候,训练loss曲线上下波动剧烈,很容易在某个epoch突然发散;增强后的数据训练曲线平滑很多,说明模型学到了更泛化的特征,而不是在死记硬背某一个样本的细节。
4. 常见问题与排查技巧实录
4.1 类别不均衡问题
把这个数据集拿来做CM文中,我最先遇到的就是类别不均衡问题。短路的样本可能有上千张,鼠咬可能只有一两百张。这导致模型在训练时严重偏向样本量大的类别,鼠咬的召回率会惨不忍睹。
解决办法有两个可选路径:
- 简单粗暴的做法是对样本少的类别做过采样,在DataLoader里让这类样本有更高的概率被抽中。
- 更精细的做法是使用Focal Loss这类能自动调节难易样本权重的损失函数,让模型更关注数量少、难分类的缺陷样本。
实际使用中,YOLOv8内置的类别损失权重配置也能缓解这个问题,直接设置cls=0.7,给分类损失一个合适的权重,同时配合过采样使用,效果还会更好。
4.2 增强过度导致误检
有个朋友在复现时为了提精度,自己额外加了大量的强增强手段,结果模型在验证集上误检率反而飙升。原因是过度增强让板面背景产生了大量伪缺陷,比如Mosaic增强把不同板子的背景拼接在一起,出现了在真实场景中不可能出现的纹理组合,模型学到了这些伪特征。
这种事我也踩过。工业场景的数据增强需要克制,基本原则是“模拟真实可能出现的变量,而不是创造不存在的变量”。建议在现有增强的基础上,先把模型训出来,看测试集效果,再逐步增加增强手段,每加一个就跑一次验证集对比效果,好用就留,不好用就撤,一切以测试集表现为准。
4.3 小目标缺陷漏检
PCB缺陷中的毛刺、鼠咬这类缺陷,在640分辨率下可能只占几十个像素,属于典型的小目标检测问题。YOLOv8的检测头对于小目标本身就不算友好,容易出现漏检。
一个实用的优化思路是增大输入分辨率。我在840分辨率下重新训练,小目标的召回率提升明显。代价是训练时间几乎翻倍,显存占用也显著上升,需要根据自己的硬件条件来权衡。
另外一个值得尝试的方法是使用P2检测层,也就是在特征金字塔中加入更高分辨率的特征层,专门用来捕捉小目标的信息。YOLOv8官方有支持P2层的配置,代价是推理速度略降,但在PCB检测这种有充足算力资源的离线场景下,这个代价可以接受。
4.4 从文科增强数据集中学不到实机特征
最后一定要提醒的是,增强数据毕竟只是原始数据的变体,它无法引入全新的缺陷特征。也就是说,如果实际产线中的缺陷形态和数据集中的差异很大——比如换了基板颜色、走线密度完全不同、缺陷出现在更复杂的位置——那么模型在实机上表现不佳是必然的。
这个数据集的最佳用法是作为预训练基础。用它训练出来的权重,再用自己采集的少量真实产线数据进行微调,能显著降低对真实样本数量的要求。我自己在项目中就是先在这个数据集上做预训练,然后再用几百张现场采集的数据微调,最终的检测效果要比直接用现场数据从头训练好很多。
5. 这个数据集还能怎么玩:迁移到其他框架
YOLO训练跑通了,下一步可以做的事情其实不少。北大这个数据集的标注质量较高、缺陷类别清晰,很适合作为算法验证的基准数据。如果你做的不是YOLO系列,而是用MMDetection、PaddleDetection或者其他检测框架,同样可以使用,只是需要先做标注格式转换。MMDetection支持VOC格式,几乎可以直接用;PaddleDetection则需要转换成COCO格式。
如果你打算用到分割模型做缺陷分割,也可以用这个数据集做基础,把检测框改用LabelMe等工具手工精修标注,就能得到分割掩码。PCB缺陷的边缘轮廓信息对后续的缺陷分类和质量分析是有用的,有这方面需求的话值得尝试。
另外一个值得尝试的方向是半监督学习。这个数据集可以当作少量标注数据,配合大量未标注的PCB图片做半监督训练,比较有挑战性,但如果做成了,对数据效率的帮助会很大。我自己还没有跑通,这里只说一个方向参考。
本文还有配套的精品资源,点击获取