PCB缺陷检测数据集:YOLO训练一站式资源与实战避坑指南
简介面向目标检测入门与实战人群这是一份YOLO专用PCB缺陷检测数据集及配套训练资源包可帮助学习者在真实工业场景下快速开展模型训练与评估。资源共2000个文件主体为1000张图片对应的xml、txt、json三种格式标注分别适配VOC、YOLO、COCO主流检测框架另含990个txt标签、6个HTML教程页面、3个Python划分脚本和1个yaml配置文件覆盖环境搭建、数据集划分、训练调参等环节。压缩包约275.87MB按用途分目录存放便于直接引用。已有713人学习下载。内置Linux与Windows双平台环境搭建与训练教程教程以HTML页面呈现步骤清晰同时提供训练集、验证集、测试集划分脚本可根据需求灵活划分数据还给出案例修改方法方便迁移到自有数据集。标注框质量高数据场景丰富适合课程设计、毕业设计及企业项目预研。1. YOLO目标检测PCB缺陷数据集为什么说它是能直接开训的资源做目标检测最怕的从来不是模型选型而是数据。尤其是PCB缺陷检测这种工业场景网上公开数据集要么图片老旧、标注格式混乱要么缺陷类别跟你产线上的实际形态对不上。这份PCB缺陷数据集一共1000张真实场景图片关键点在于它同时提供了voc(xml)、coco(json)、yolo(txt)三种格式标签并且分文件夹存放意味着你拿到手不用做任何格式转换YOLOv5、YOLOv8、YOLOv9甚至YOLOv11都能直接指向标签路径开训。适合谁正在做工业质检、电子制造AOI相关项目的人以及被数据集格式转换折腾过的目标检测初学者。它给的还有三个数据集划分脚本和Windows/Linux双平台训练教程对于想快速跑通完整流程的人来说省掉的不只是标注时间还有那些一搜一堆却总对不上版本的教程坑。2. 数据集底座1000张图的标注格式、类别结构与应用边界2.1 标注工具与标注质量为什么LabelImg产物更容易被下游接受这份数据集使用LabelImg标注软件完成产出的原始标注是Pascal VOC格式的xml文件。LabelImg算得上目标检测领域的老牌标注工具它生成的xml遵循Pascal VOC结构包含filename、size、object节点每个object里有name和bndbox坐标。用它的好处在于——后续转coco、转yolo都有非常成熟的脚本体系几乎不会出现坐标越界、类别名带空格这类历史遗留问题。从实践角度看工业缺陷数据集最怕的是标注框质量参差。比如漏标、框过大、类别混淆。这里可以拿几个典型缺陷类别的标注框特点来验证质量比如短路缺陷通常框得紧贴铜箔边缘断路缺陷则会覆盖断裂缝隙两侧。如果标签是从网上东拼西凑来的大概率会出现某些图类别标错、某些图压根没标全这种脏数据会让训练出来的模型mAP虚高一到实际产线就现原形。2.2 三种格式标签的存放结构与切换逻辑拿到资源解压后标签部分应该按voc、coco、yolo三个文件夹区分。voc格式就是xml文件coco格式是json文件yolo格式是txt文件。对于YOLO训练而言yolo格式的txt文件里每行是“类别id 归一化中心x 归一化中心y 归一化宽 归一化高”注意是归一化坐标不是像素坐标。实际项目里我一般这样安排先用voc格式做数据检查和可视化因为xml里能看到具体类别名和像素坐标确认没问题后用脚本转成yolo格式丢给模型训练如果后面要换用mmdetection或detectron2再从voc或者coco的json重新生成。资源里直接把三种格式都放好了省掉了最繁琐的那一步你只需要确认类别顺序一致即可。提示yolo格式的txt文件中类别id是从0开始递增的coco格式中类别id也是从1开始。如果你是先用coco格式训练再切回yolo务必检查类别id映射否则会把缺陷类别全部标错。2.3 1000张图的规模判断什么时候够用什么时候需要扩充1000张图做PCB缺陷检测说多不多说少不少。如果缺陷类别控制在3到5类以内且每类样本数相对均匀用YOLOv8s或者YOLOv5s这种小模型训练配合在线数据增强mosaic、flip、hsv扰动可以达到不错的初始效果。但如果你的目标是覆盖十几类缺陷或者产线上缺陷形态变化极大那1000张图只够做预训练或算法验证还需要补充数据。另外一个关键判断维度是背景多样性。PCB板有绿油、蓝油、红油不同基板颜色有密集通孔板、高多层板、软板等不同类型。数据集描述里提到“真实场景的高质量图片数据场景丰富”这意味着它在背景多样性上不是那种实验室白底摆拍泛化性会好一些。但既然是真实场景部分图片可能存在光照不均、反光、元器件遮挡等干扰这在实际使用中反而是好事能让模型更贴近现场环境。3. 划分脚本与训练闭环从数据切分到YOLO上手的完整路径3.1 三种划分脚本的使用场景与执行逻辑资源里附了三个Python脚本分别是“训练集、验证集、测试集划分脚本”“训练集、验证集划分脚本”和“split_train_val生成ImageSets下txt文件划分脚本”。它们解决的问题不同需要按需选择。第一个脚本适用于需要单独预留测试集做最终评估的场景第二个脚本只切训练集和验证集适合样本量不大、想尽量多留训练数据的场景第三个脚本生成的是VOC系列框架常用的ImageSets/Main下的txt文件列表适合后续要跑VOC格式训练流程或mmdetection等框架的场景。这里我用“训练集、验证集、测试集划分脚本”说明执行方式。脚本的核心逻辑是扫描指定目录下的所有图片和标签文件按比例随机分配然后新建train、val、test三个文件夹把图片和标签成对复制或移动进去。常见做法是设置train_ratio0.8、val_ratio0.1、test_ratio0.1如果数据量不足1000张训练集比例可以适当提高到0.85。随机分配时还应该加上随机种子固定保证多次运行结果一致否则调试时每次划分结果不同复现实验会很痛苦。3.2 划分脚本运行的前置目录结构无论用哪个脚本都要先保证数据集目录结构符合预期。一份合格的YOLO格式数据集目录通常长这样dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ └── classes.txt注意图片和标签分别放在images和labels文件夹下并且train、val、test三个子文件夹必须同名对应YOLO训练时才会去每个子目录里找同名文件。很多人在这一步翻车图片在images/train下标签却直接丢在labels根目录导致训练时报错找不到对应标签。3.3 YOLO训练前必改的三个关键文件数据划分完成后YOLO训练需要配置三个文件数据集yaml、模型yaml、训练参数。以YOLOv5和YOLOv8为例数据集yaml文件路径和内容几乎是同一套逻辑# pcb_defect.yaml path: /home/user/dataset # 数据集根目录建议写绝对路径 train: images/train # 训练集图片目录相对于path val: images/val # 验证集图片目录相对于path test: images/test # 测试集图片目录可留空 nc: 3 # 类别数量按实际修改 names: [short, open, mousebite] # 类别名称注意与标注时保持一致模型yaml文件里需要修改的是nc值确保和数据集yaml一致。训练参数里最关键的是--img、--batch、--epochs。PCB缺陷属于小目标场景img尺寸建议设为640或832不要图省事设成320否则小缺陷会被压缩到几个像素根本学不到特征。batch大小根据显存调整6G显存跑YOLOv8s建议batch不超过1612G以上可以到32。epochs一般100到200如果训练集只有几百张300轮以内即可收敛再多就会过拟合。3.4 Windows与Linux环境下的训练命令差异资源附带了两套HTML教程分别覆盖Windows和Linux环境。两边的核心差异在于环境安装方式和命令前缀。Windows下推荐使用Anaconda创建虚拟环境命令行操作用conda activate激活Linux服务器上同样可以用conda也可以用docker镜像。启动训练的代码在两边几乎是通用的以YOLOv8为例# 激活虚拟环境Windows和Linux相同 conda activate yolov8 # 训练模型 yolo detect train datapcb_defect.yaml modelyolov8s.pt epochs150 imgsz640 batch16 device0训练前先用预训练权重yolov8s.pt做迁移学习收敛速度比从零训练快得多。device0表示使用第一张GPU如果只有CPU就把device改成cpu但训练速度会非常慢不建议。训练日志里重点看三个指标box_loss、cls_loss、dfl_loss三者都在下降说明模型在正常学习如果val_loss先降后升说明已经过拟合可以提前停止。提示Windows下跑YOLO训练时如果路径含中文PyTorch的dataloader偶尔会报编码错误。建议数据集路径中不要出现中文和空格统一用英文小写命名。4. 避坑指南标签、显存、路径与环境兼容性排查4.1 现象训练时提示“assertion error: labels not found”或“label file missing”原因是最常见的标签缺失。检查后发现可能是划分脚本只复制了图片没复制标签或者yolo格式的txt文件与jpg文件不同名。解决方法是写一段检查脚本遍历所有图片路径确认每张图片都存在同名txt标签并输出缺失清单import os img_dir dataset/images/train label_dir dataset/labels/train missing [] for img in os.listdir(img_dir): if img.endswith((.jpg, .png, .jpeg)): label_name os.path.splitext(img)[0] .txt if not os.path.exists(os.path.join(label_dir, label_name)): missing.append(img) print(缺失标签的图片数量:, len(missing)) for m in missing[:10]: print(m)这段脚本的核心逻辑是把图片文件名的主干部分与标签文件名做匹配遇到jpg、png、jpeg等不同扩展名都能正确处理。跑完后如果缺失数量为0再回到训练流程排查其他问题不要凭感觉删掉报错图片那样只会掩盖问题。4.2 现象训练时CUDA out of memorybatch调到4仍然爆显存原因大多不是batch大小问题而是图像分辨率与模型参数量共同决定的。PCB原图很多是1920x1080甚至更高分辨率如果imgsz设为640加载时会把图像resize到640但原图上的缺陷可能只有十几个像素属于典型的小目标。小目标场景下要么提升imgsz到1024以上要么做切片推理。提升imgsz会成倍增加显存占用此时可以考虑开启YOLO的缓存抑制功能或者改用模型剪枝后的轻量版本。我的习惯是先用yolov8n在640分辨率下做快速验证确认数据管道正常后再切到yolov8s或yolov8m调精度。4.3 现象torch报错提示“NotImplementedErrorCould not run torchvision::nms with arguments from the CUDA backend”原因在于torch和torchvision版本不匹配或者CUDA编译版本与运行时不一致。这种情况在Windows上尤其多见因为很多人用pip install torch是CPU版本或者装的是最新版torch但torchvision还是旧版。解决方法分两步第一步用下面这段命令检查当前环境的匹配状态python -c import torch, torchvision; print(torch.__version__, torchvision.__version__)第二步根据torch版本去官方网页选择匹配的torchvision版本安装。更省事的做法是把虚拟环境中的torch和torchvision一起重装指定版本安装而不是各自装各自的这是最稳妥的路径。不要图方便装CPU版torchYOLO训练不用GPU等于白等。4.4 现象训练完预测全部框都在同一个位置或者置信度极高但全是误检原因大概率是标签类别id与names列表不对应。比如数据集中缺陷类别只有两类标注类别id是0和1但数据集yaml的names里给了五个名字模型就会把这五个名字依次映射到概率输出上导致预测阶段框位置错乱。解决方法是检查classes.txt内容与yaml中names列表逐行对应确保长度和顺序一致。另外如果训练时用的是coco格式转yolo的产物还要检查类别id是否从0开始coco格式允许id从1开始转换后如果忘了减1类别会整体偏移一个位置。4.5 现象Windows上训练开始后十几秒就卡死CPU占用率拉满但GPU不动这种问题通常出在dataloader的num_workers设置上。Windows与Linux不同Windows下多进程数据加载需要ifname main保护否则会无限递归创建子进程。解决方法是把训练入口代码放入主函数中同时把num_workers设为0测试一次如果设为0后正常说明就是多进程问题。更简单的操作是直接用官方train.py脚本不要自己封装一层训练入口。数据集读取阶段慢也可能卡在机械硬盘随机读取上把数据集放到SSD上有显著提升。5. 进阶操作从原始voc标签快速生成yolo可用格式及弱缺陷增强5.1 xml转txt转换脚本一份留着通用的转换器虽然资源里已经提供了三种格式但实际做项目时经常需要把新的PCB缺陷图片补充进来新图用LabelImg标完是xml还得转成yolo的txt才能继续训练。这里给一份我当时用的转换脚本它的逻辑是解析voc的xml文件提取object的name和bndbox然后计算归一化坐标写入txt。这段脚本核心是坐标归一化公式归一化x (xmin xmax) / 2 / image_width归一化宽 (xmax - xmin) / image_widthy方向同理。注意标注框的坐标应该限制在图片尺寸范围内如果出现负数或超过宽度的情况说明标注时有越界需要提前剔除或裁剪。import xml.etree.ElementTree as ET import os def convert_xml_to_yolo(xml_path, output_dir, class_names): tree ET.parse(xml_path) root tree.getroot() size root.find(size) img_w int(size.find(width).text) img_h int(size.find(height).text) out_lines [] for obj in root.iter(object): name obj.find(name).text if name not in class_names: continue class_id class_names.index(name) bndbox obj.find(bndbox) xmin float(bndbox.find(xmin).text) ymin float(bndbox.find(ymin).text) xmax float(bndbox.find(xmax).text) ymax float(bndbox.find(ymax).text) x_center (xmin xmax) / 2 / img_w y_center (ymin ymax) / 2 / img_h box_w (xmax - xmin) / img_w box_h (ymax - ymin) / img_h out_lines.append(f{class_id} {x_center:.6f} {y_center:.6f} {box_w:.6f} {box_h:.6f}) output_path os.path.join(output_dir, os.path.splitext(os.path.basename(xml_path))[0] .txt) with open(output_path, w) as f: f.write(\n.join(out_lines))class_names列表需要和训练时的names保持一致比如[missing_hole, mouse_bite, open_circuit, short, spurious_copper]。这样按顺序取索引就避开了类别映射错乱问题。5.2 小目标缺陷的增强策略切图比调参更立竿见影PCB缺陷数据集的标注框通常只占整图面积的百分之一不到直接resize到640会把缺陷缩成几个像素。一个有效的做法是滑窗切图把大图切成若干patch每个patch单独参与训练和预测。切图的核心参数是patch大小和重叠率一般patch取640x640或1024x1024重叠率取20%到30%保证跨patch的缺陷不会被切断。切图后标签坐标也要同步平移。具体来说patch在原图中的偏移量需要记录在文件名或配置中。推理阶段用同一个滑窗在原图上生成预测框再把所有patch的坐标映射回原图坐标最后做NMS合并重复框。这个流程写起来有一定量代码但它对PCB这类小缺陷场景的提升往往比换模型、加注意力机制更直接。做完切图增强后再用训练好的模型跑一遍测试集对比mAP就能看出明显差异。5.3 验证完整流程从加载数据集到预测输出的自查清单训练完不要直接上板测试。先跑一遍可视化验证用训练好的权重去预测验证集里的几十张图画框保存肉眼检查框位置与类别是否一致。这一步能发现数据标签错乱、类别名不一致等隐患也可用下面的命令快速完成yolo detect predict modelruns/detect/train/weights/best.pt sourcedataset/images/val saveTrue conf0.25conf0.25是置信度阈值PCB缺陷这种小目标可以适当调低到0.15防止漏检。用best.pt而不是last.pt做预测也很关键last.pt是最后一轮权重可能在验证集上已经过拟合而best.pt是基于验证集指标保存下来的最优版本。预测结果保存到runs/detect/predict目录下逐张翻看时重点检查有没有漏检、有没有同一个缺陷被重复框、有没有背景被误检成缺陷。这三类问题分别对应阈值不合适、NMS参数不合理、背景特征混淆。这套可视化检查走完数据集本身的质量才算真正被验证过。之后你再扩充数据或调整模型结构都有一份可靠的基线结果做对照。记得我刚拿到这份数据集时第一轮训练mAP直接到了0.85以上当时还挺意外后来翻标签发现有一个类别的框整体偏移了十几个像素修掉之后精度才真正稳住。从那以后我每次拿到新数据集第一件事永远是先可视化二十张训练图的标签框确认框贴合瑕疵边缘再开训。这个习惯帮我省下的返工时间远超检查本身的花费希望帮到你。本文还有配套的精品资源点击获取