简介:本资源是一套面向工业视觉入门与电子质检科研的教学级PCB缺陷检测数据集,专为YOLO系列目标检测模型训练优化,适用于高校课程设计、算法验证及产线质检预研等轻量化实训场景。数据集共680张1920×1080 PNG图像,覆盖焊点桥接、元件缺失、线路短路、断路、焊盘偏移、极性错误六类IPC标准缺陷,配套693个YOLO格式标注txt文件、2个cache索引文件及1个data.yaml配置文件,总大小77.85MB,结构清晰分为images/train-val-test与labels对应层级,开箱即用于Ultralytics等主流框架。已有18人学习下载。配套提供readme_zh.md中文指南、缺陷可视化分析工具包(含热力图、尺度分布、亮度直方图等功能)、完整设备参数与标注规范说明,并经YOLOv8n实测验证达mAP@0.5=86.3%,各类别AP均超82.5%,支持一键导入Roboflow、CVAT等平台,无需格式转换。 PCB 缺陷检测数据集(6类,680张图像)YOLO格式
做PCB外观检测这块的同行,应该都懂找数据的痛。产线上AOI设备跑出来的缺陷样本,要么涉及客户保密协议没法外传,要么缺陷种类单一、背景干净得跟实验室照片似的,拿来做算法验证和方案demo总差那么点意思。我去年接一个电路板质检项目预研的时候,就在到处翻公开数据集,最后锁定了这份PCB缺陷检测数据集——6类常见缺陷、680张真实板卡图像、直接标注成YOLO格式。这个规模放在深度学习训练里确实不算大,但它胜在缺陷类型覆盖了PCBA制程里最典型的几类外观不良,而且标注格式规范,拿来跑通YOLOv8、做算法选型对比、写毕业论文的消融实验,都是非常趁手的起步素材。这篇就把数据集内容、标注格式、训练实操和我在调参过程中踩过的坑一次说清楚。
1. 项目拆解:这个数据集到底解决什么问题
1.1 从PCB缺陷检测的行业需求说起
PCB板在制造和贴片过程中,受材料、蚀刻精度、曝光对位、焊接温度等多种因素影响,表面会出现各种外观缺陷。在产线上,这些缺陷的传统检测手段是AOI(自动光学检测)设备加人工复判。AOI设备本身价格不低,而且换线换机型的时候,检测程序需要重新调试,对中小型PCBA工厂来说是个不小的负担。近年来越来越多团队尝试用深度学习目标检测方案替代或辅助传统AOI,核心思路很简单:把缺陷检测当成目标检测任务,用算法模型在板卡图像里把缺陷位置和类别框出来。
这个场景对数据集的要求有几个特点:第一,缺陷是小目标,很多缺陷在整板图像里只占几十个像素,非常考验模型的细粒度特征提取能力;第二,缺陷形态多样,同一类缺陷在不同位置、不同光照下的表现差异很大;第三,产线对误判率极其敏感,宁可多报让人工复判,也不能漏检。这些特点决定了PCB缺陷检测不能简单套用通用目标检测的流程,需要针对性优化。
1.2 六类缺陷逐个拆解
这份数据集标注了6类典型PCB外观缺陷,我按照工业现场出现频率和检测难度逐个说明。
缺孔(missing_hole):焊盘或过孔位置该有的孔没有钻出来,或者孔位偏移严重。这类缺陷在背光照射下特征非常明显,因为透光和不透光的区域对比强烈。但在正面打光条件下,如果孔很小,模型容易漏检。
鼠咬(mouse_bite):导线边缘出现半月形或锯齿状的缺损,像是被老鼠啃过一样。这类缺陷常见于蚀刻过度或铜箔附着力不足的板子,缺陷尺寸通常很小,边缘和正常导线轮廓混在一起,检测难度偏高。
开路(open_circuit):导线在某处断开,电路连通性被破坏。开路缺陷的关键是断点位置,有的断点间隙只有几个像素,需要模型对线宽变化极其敏感。
短路(short):本不应该相连的导线之间出现了多余的铜桥,造成电路短路。短路缺陷和开路正好相反,它是在两条线之间多了一块铜,特征相对好抓,但细小的铜桥在复杂布线区域容易和正常走线混淆。
毛刺(spur):导线边缘凸起的小尖刺,和鼠咬正好是反过来的,一个是缺一块,一个是多一块。毛刺对电路功能的影响取决于尺寸和位置,但在外观检测中属于必须拦截的缺陷。
伪铜(spurious_copper):基板非线路区域出现了不该有的铜残留,通常呈不规则块状或细条状。这类缺陷和毛刺的区别在于位置,伪铜出现在无铜区域,背景干净,理论上好检测,但当伪铜面积小且颜色接近基板时,很容易漏掉。
从检测难度上排序,我个人体感是:开路、鼠咬、毛刺这三类最难,伪铜和短路次之,缺孔最直观。但实际训练中,这个难度排序还会受到样本数量、标注质量和图像光照的影响,这个后面细说。
1.3 为什么是YOLO格式
数据集采用YOLO格式标注,说白了就是每个图像对应一个同名txt文件,文件里每一行代表一个目标框,格式是“类别ID 中心点x坐标 中心点y坐标 框宽度 框高度”,所有坐标值都除以图像宽高做了归一化。这个格式跟Pascal VOC的XML和COCO的JSON相比,最大的好处是轻量直观,一个txt文件就能承载全部标注信息,读写效率高,训练时解码也快。
更重要的是,YOLO格式是Ultralytics YOLO系列(YOLOv5/YOLOv8)的原生格式,数据准备好了丢进去就能训,不用做任何格式转换。如果你习惯用LabelImg或者Roboflow做标注,它们也都能直接导出YOLO格式。对于想快速验证算法效果的团队来说,这个格式能省掉很多数据预处理的时间。
2. 数据格式与标注规范全解析
2.1 目录结构与文件组织
数据集拿到的第一件事,先看目录结构。规范的YOLO格式数据集通常是这样的:
pcb_dataset/ ├── images/ │ ├── train/ │ │ ├── 001.jpg │ │ ├── 002.jpg │ │ └── ... │ └── val/ │ ├── 101.jpg │ └── ... ├── labels/ │ ├── train/ │ │ ├── 001.txt │ │ ├── 002.txt │ │ └── ... │ └── val/ │ ├── 101.txt │ └── ... └── data.yamlimages和labels目录一一对应,train和val子目录各自配对。680张图像通常按8:2或者7:3划分训练集和验证集,我拿到手的这份是544张训练、136张验证的比例,划分得还算合理。需要注意的是,有的数据集会把划分好的列表单独放在train.txt和val.txt里,而不是按目录划分,两种方式YOLO都支持,配置data.yaml的时候留意路径写法就行。
2.2 标注文件长什么样
打开任意一个txt标注文件,内容大致是这样:
0 0.485156 0.634375 0.023438 0.018750 1 0.123437 0.245833 0.010938 0.012500 2 0.837500 0.456250 0.031250 0.020312第一列是类别ID,从0开始编号,对应data.yaml里names列表的顺序。第二到第五列分别是归一化后的中心点x、中心点y、框宽、框高。注意,这里用的是中心点坐标,不是左上角坐标,和COCO格式不一样,写标注解析脚本的时候千万别搞混。
我一般会用Ultralytics自带的ultralytics.data.verify_images或者简单的Python脚本快速检查标注是否越界。毕竟公开数据集也可能存在个别标注框坐标超出图像边界的情况,虽然这份数据集我用下来没发现明显问题,但养成检查习惯总是好的。
2.3 类别分布与数据平衡性
680张图像里6类缺陷的分布不一定均匀,这在真实数据集中太常见了。我在用之前先统计了各类别的目标框数量,这一步很重要,因为如果某类缺陷的样本数只有其他类的三分之一,模型很容易因为样本不足而欠拟合,导致这类缺陷的召回率明显偏低。
应对类别不平衡,最直接的手段是在训练时调整每个类别的损失权重,或者在数据加载时对不同类别的样本做重采样。YOLOv8没有直接暴露per-class loss weight的配置项,但可以通过class_weights参数传递一个列表,或者在数据增强阶段针对少数类做过采样。实操中我更多用的是后者,因为简单直接,效果也直观。
3. 从零开始训练YOLOv8模型实操
3.1 环境准备
训练深度学习模型的第一步,把环境搭好。我这里用的是Ultralytics YOLOv8,Python 3.9 + PyTorch 2.0 + CUDA 11.8,显卡是RTX 3060 12G。如果你的显卡显存小于8G,建议训练时把batch调小,或者直接用yolov8n.pt这种最小模型,不要硬上yolov8x,显存溢出跑一半崩了更浪费时间。
安装依赖很简单:
pip install ultralytics torch torchvision装完可以用yolo命令行验证安装是否成功。另外记得装一个labelimg或者roboflow用于标注检查,虽然这份数据集不需要重新标注,但你在自己扩充数据的时候会用到。
3.2 数据集配置文件
在pcb_dataset目录下创建data.yaml,内容如下:
train: ./images/train val: ./images/val nc: 6 names: ['missing_hole', 'mouse_bite', 'open_circuit', 'short', 'spur', 'spurious_copper']这里最关键的是nc(类别数量)必须和names列表长度一致,否则训练会直接报错。names的顺序必须和标注文件里的类别ID一一对应,如果顺序错了,模型训练出来的检测结果类别全乱套,损失函数还显示正常收敛,这是非常隐蔽的坑。
3.3 模型选型与训练命令
模型选型上,我建议先从yolov8m.pt起步,这个档位在精度和速度之间比较均衡。如果你的机器性能有限,yolov8s.pt也能跑,只是mAP会低一到两个点。yolov8n.pt我一般不推荐,因为PCB缺陷是小目标,轻量模型的特征提取能力太弱,容易漏检。
训练命令如下:
yolo detect train data=pcb_dataset/data.yaml model=yolov8m.pt epochs=300 imgsz=640 batch=16 device=0 patience=50几个关键参数解释一下:
epochs=300:680张图像的数据集不算大,训练300轮足够模型充分收敛,配合patience=50做早停,模型在验证集上连续50轮没有提升就自动停止,省时间。imgsz=640:输入图像尺寸。如果你的PCB板图像分辨率很高,比如2448×2048,建议先用Python脚本把图像缩放到1280或640再训练,直接拿原始分辨率训练会非常吃显存。batch=16:batch size取决于显卡显存,12G显存跑yolov8m 640分辨率,16是比较稳的数值。device=0:指定第一块GPU,如果你有多个显卡,可以换成device=0,1做多卡训练。
训练过程中会实时输出loss、精度、召回率等指标,也可以在输出目录下用TensorBoard监控训练曲线。
3.4 训练后的评估指标怎么看
训练结束,模型会保存在runs/detect/train/weights/best.pt,这是验证集上表现最好的权重,实际部署就用这个文件。评估指标主要在results.csv和验证集输出的图片里体现。
mAP50是重点看的指标,它表示IoU阈值为0.5时的平均精度均值。PCB缺陷检测场景里,因为缺陷尺寸偏小,我对mAP50的及格线设在0.75以上。mAP50-95会更严格,它计算从0.5到0.95不同IoU阈值下的平均精度,更考验框的定位精度。在PCB检测这个场景,如果mAP50-95和mAP50差距过大,说明模型虽然能大致找到缺陷位置,但框的边界不精准,这在需要精确坐标输出给机械臂抓取的场景里是不合格的。
4. 小样本条件下的训练技巧与调参心得
4.1 迁移学习的正确打开方式
680张图像对深度学习目标检测模型来说是小规模数据集,但YOLOv8提供了COCO预训练权重,也就是模型已经在千万级通用图像上学习过基础特征。直接用yolov8m.pt作为初始权重,相当于一个已经会辨认边缘、纹理、颜色等基础特征的模型,只需要在PCB缺陷数据上微调就可以了,这是小样本训练的基石。
我在训练时特别关注前20轮的loss曲线。正常情况下,迁移学习的loss应该从一开始就比较低,然后缓慢下降。如果你发现loss刚开始很高,可能的原因是学习率设置不合适,或者数据标注存在大量错标。
4.2 数据增强:从680张变6800张
YOLOv8内置了Mosaic、MixUp、HSV变换等多种数据增强策略,默认就是开启的。对于小数据集来说,数据增强是最有效的防过拟合手段。
Mosaic增强会把4张图随机拼接成一张新图,相当于变相增大了batch size,让模型在训练时看到更多的上下文信息,对PCB这种小目标检测特别有效。但Mosaic在训练后期可能会干扰收敛,YOLOv8提供了mosaic=1.0的参数控制强度,如果训练到150轮后loss还在振荡,可以尝试把mosaic调低到0.5。
我自己还会额外做一步离线增强:把原始的680张图像用Python脚本做旋转、平移、翻转、亮度变化,扩充到1200张左右再训练。虽然在线增强已经能覆盖这些变化,但离线增强可以让模型在每次epoch中看到更多不同的原始样本,实测mAP能提升2到3个点。
4.3 学习率与优化器调参实录
YOLOv8默认使用SGD优化器,初始学习率0.01。在小数据集上,我建议把初始学习率降到0.005,避免训练初期loss剧烈震荡导致模型学偏。另外一个有用的参数是warmup_epochs,默认是3,可以把前几轮的训练当做预热,学习率从很小的值逐渐升到目标学习率,防止开局就崩。
我在一次训练中遇到过loss打印出来是NaN的情况,排查下来是学习率设得过高,导致梯度爆炸。降到0.005之后训练恢复正常。如果你用的是Adam优化器,学习率可以适当降低到0.001,Adam对学习率更敏感。
4.4 提前停止和模型选择
早停参数patience非常关键。我设的是50,意味着如果连续50轮验证集精度没有提升,训练就会提前终止。这个值不能设太小,否则可能模型还没收敛就停了;也不能设太大,浪费时间。对于680张图像的数据集,我实测大概250轮到300轮之间能收敛,早停通常在200轮左右触发。
最终模型选择上,不要只看best.pt,我还会把训练过程里每个epoch的模型在产线实际图片上做个快速验证,有时候验证集mAP高不代表实际场景好用,数据分布偏差是真实存在的。
5. 常见问题与排查技巧实录
5.1 训练时Loss为NaN怎么办
训练没跑几轮,loss突然变成NaN,这是我在PCB缺陷数据集上遇到过最头疼的问题。排查步骤一般是:先看学习率,调低到0.001试试;再看batch size,如果显存不够导致OOM后自动恢复,也可能出NaN;最后检查数据,确认图像里没有损坏的文件,标签没有越界。
我后来发现一个快速定位方法:用yolo detect train加一行verbose=True,可以看到每个batch的loss数值。如果loss从某个特定step开始变NaN,把那个step之前的图像和标注对调出来检查,大概率能找到问题样本。
5.2 某一类缺陷AP特别低
如果你发现模型对毛刺或者鼠咬这两类的AP远低于其他类,优先怀疑样本量不足。我统计过这份数据集,如果某类缺陷只有40多个目标框,模型基本学不到足够的特征。
解决办法有三个方向:一是对该类缺陷做针对性过采样,训练时让加载器多读几遍含这类缺陷的图像;二是用更细粒度的数据增强,比如专门对含鼠咬缺陷的图像区域做裁剪放大再参与训练;三是检查标注质量,有时候AP低是因为标注框没有完全框住缺陷,人眼看觉得差不多,但模型学的时候会收到矛盾信号。
5.3 小目标缺陷漏检严重
PCB缺陷很多是小目标,漏检是普遍痛点。提升小目标检测率,我实践下来最有效的招是imgsz从640调到1280。输入分辨率提高后,小目标在特征图上的响应更强,但显存占用会翻倍,得适当调小batch。
另外一个容易被忽视的参数是anchor。YOLOv8是自适应anchor,正常情况下不用手动调,但如果你改动了输入图像尺寸且训练效果不佳,可以关闭自动anchor,手动指定一组更适配小目标的anchor尺寸。具体操作是训练时加anchor=None的参数,让模型从未标注数据里重新聚类生成anchor。
5.4 训练和验证的类别映射错乱
数据集里names的顺序如果和标注文件里的类别ID对不上,就会出现训练时loss正常下降,但验证时模型输出的类别完全不对的情况,比如把短路检测成伪铜。排查办法很简单:随机挑几张训练图像,跑一次模型推理,把预测结果叠加到原图上人工核对,一眼就能看出映射对不对。
5.5 推理速度vs精度取舍
如果你要把模型部署到产线的实时检测工位,推理速度是硬指标。实测yolov8m在RTX 3060上640分辨率推理时间大约20ms,50fps左右,满足一般产线需求。但如果产线节拍更快,比如每秒要处理30张以上2448×2048的大图,建议把模型降级到yolov8s并配合TensorRT导出,推理时间能压到10ms以内,精度损失大概在2到3个mAP点,这个代价在多数场景下可以接受。
6. 从数据集到落地部署的最后一步
模型训练好了,下一步就是导出部署。YOLOv8支持导出ONNX、TensorRT、OpenVINO等格式,我这里给一个最常用的TensorRT导出命令:
yolo export model=best.pt format=engine device=0 imgsz=640导出的best.engine文件可以直接放到生产环境的推理服务器上运行。如果你的产线用的是老旧的工控机,没有NVIDIA显卡,可以导出OpenVINO格式跑在Intel CPU上,虽然速度比GPU慢不少,但胜在成本低、环境兼容性好。
在自己扩充数据的时候,有几条实操经验分享给看到这里的同行:第一,在产线采集缺陷图片时,尽量覆盖不同光照条件和拍摄角度,模型在小样本下的泛化能力很大程度上取决于训练集的多样性,而不是总量;第二,标注时严格统一框选标准,是框住整个缺陷轮廓还是框住最大外接矩形,整个数据集要一致,否则模型会学到矛盾的边界信息;第三,定期用模型在生产环境跑一批新采集的数据,把误检和漏检的样本收集起来补充到训练集里,持续迭代,这是PCB检测模型效果提升最可靠的方式。
这份680张图像的PCB缺陷数据集,虽然规模不大,但作为一个起步点和算法验证平台是够用的。跑通一个完整流程、积累一套调参经验之后,你会发现真正难的不是训练模型,而是如何把模型输出转化为产线上稳定可靠的检测能力。这个数据集的价值,就是让你在一个相对干净的起点上安心把这些问题想清楚。
本文还有配套的精品资源,点击获取