PCB缺陷检测数据集全解析:6类缺陷、680张图像与YOLOv8训练实战

发布时间:2026/8/31 23:42:02
PCB缺陷检测数据集全解析:6类缺陷、680张图像与YOLOv8训练实战 简介本资源是一套面向工业视觉入门与电子质检科研的教学级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实测验证达mAP0.586.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 YOLOv8Python 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 datapcb_dataset/data.yaml modelyolov8m.pt epochs300 imgsz640 batch16 device0 patience50几个关键参数解释一下epochs300680张图像的数据集不算大训练300轮足够模型充分收敛配合patience50做早停模型在验证集上连续50轮没有提升就自动停止省时间。imgsz640输入图像尺寸。如果你的PCB板图像分辨率很高比如2448×2048建议先用Python脚本把图像缩放到1280或640再训练直接拿原始分辨率训练会非常吃显存。batch16batch size取决于显卡显存12G显存跑yolov8m 640分辨率16是比较稳的数值。device0指定第一块GPU如果你有多个显卡可以换成device0,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提供了mosaic1.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.001Adam对学习率更敏感。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加一行verboseTrue可以看到每个batch的loss数值。如果loss从某个特定step开始变NaN把那个step之前的图像和标注对调出来检查大概率能找到问题样本。5.2 某一类缺陷AP特别低如果你发现模型对毛刺或者鼠咬这两类的AP远低于其他类优先怀疑样本量不足。我统计过这份数据集如果某类缺陷只有40多个目标框模型基本学不到足够的特征。解决办法有三个方向一是对该类缺陷做针对性过采样训练时让加载器多读几遍含这类缺陷的图像二是用更细粒度的数据增强比如专门对含鼠咬缺陷的图像区域做裁剪放大再参与训练三是检查标注质量有时候AP低是因为标注框没有完全框住缺陷人眼看觉得差不多但模型学的时候会收到矛盾信号。5.3 小目标缺陷漏检严重PCB缺陷很多是小目标漏检是普遍痛点。提升小目标检测率我实践下来最有效的招是imgsz从640调到1280。输入分辨率提高后小目标在特征图上的响应更强但显存占用会翻倍得适当调小batch。另外一个容易被忽视的参数是anchor。YOLOv8是自适应anchor正常情况下不用手动调但如果你改动了输入图像尺寸且训练效果不佳可以关闭自动anchor手动指定一组更适配小目标的anchor尺寸。具体操作是训练时加anchorNone的参数让模型从未标注数据里重新聚类生成anchor。5.4 训练和验证的类别映射错乱数据集里names的顺序如果和标注文件里的类别ID对不上就会出现训练时loss正常下降但验证时模型输出的类别完全不对的情况比如把短路检测成伪铜。排查办法很简单随机挑几张训练图像跑一次模型推理把预测结果叠加到原图上人工核对一眼就能看出映射对不对。5.5 推理速度vs精度取舍如果你要把模型部署到产线的实时检测工位推理速度是硬指标。实测yolov8m在RTX 3060上640分辨率推理时间大约20ms50fps左右满足一般产线需求。但如果产线节拍更快比如每秒要处理30张以上2448×2048的大图建议把模型降级到yolov8s并配合TensorRT导出推理时间能压到10ms以内精度损失大概在2到3个mAP点这个代价在多数场景下可以接受。6. 从数据集到落地部署的最后一步模型训练好了下一步就是导出部署。YOLOv8支持导出ONNX、TensorRT、OpenVINO等格式我这里给一个最常用的TensorRT导出命令yolo export modelbest.pt formatengine device0 imgsz640导出的best.engine文件可以直接放到生产环境的推理服务器上运行。如果你的产线用的是老旧的工控机没有NVIDIA显卡可以导出OpenVINO格式跑在Intel CPU上虽然速度比GPU慢不少但胜在成本低、环境兼容性好。在自己扩充数据的时候有几条实操经验分享给看到这里的同行第一在产线采集缺陷图片时尽量覆盖不同光照条件和拍摄角度模型在小样本下的泛化能力很大程度上取决于训练集的多样性而不是总量第二标注时严格统一框选标准是框住整个缺陷轮廓还是框住最大外接矩形整个数据集要一致否则模型会学到矛盾的边界信息第三定期用模型在生产环境跑一批新采集的数据把误检和漏检的样本收集起来补充到训练集里持续迭代这是PCB检测模型效果提升最可靠的方式。这份680张图像的PCB缺陷数据集虽然规模不大但作为一个起步点和算法验证平台是够用的。跑通一个完整流程、积累一套调参经验之后你会发现真正难的不是训练模型而是如何把模型输出转化为产线上稳定可靠的检测能力。这个数据集的价值就是让你在一个相对干净的起点上安心把这些问题想清楚。本文还有配套的精品资源点击获取