
简介面向PCB制造与质量检测从业者、机器视觉入门者以及YOLO系列模型学习者这份缺陷检测数据集围绕电路板表面的常见缺陷类别构建可支撑模型训练、验证与算法对比实验适合用于产线质检场景下的目标检测实践。压缩包共2000个文件总大小约120.94MB核心组成为1297个YOLOv5格式的txt标注文件、702张jpg电路板图像以及1个yaml配置文件图像与标注一一对应目录结构清晰拿到后即可配置训练环境。标注格式规范资料说明中识别准确率达99.8%整体数据量适中既能作为PCB缺陷检测项目的基础训练集也便于初学者动手复现完整检测流程。已有470人学习浏览适合希望快速获取标注数据、开展模型微调或进行工业视觉项目验证的读者。1. PCB电路板缺陷检测1297张标注图为什么够用PCB电路板缺陷检测是工业质检里最典型的小样本场景产线上不良品本来就不多缺陷种类又杂能拿出来做训练的图往往只有几百到两千张。这份资源用YOLOv5格式标注了1297张PCB图片标注条件下模型可以跑到99.8%的识别准确率对刚入行做质检视觉、或者课题方向是目标检测的人来说是一个能直接落地的起步数据集。它的价值不在于图多而在于标签规范、格式统一拿到手可以直接喂给YOLOv5训练省掉自己画框和格式转换的功夫。适合三类人想跑通YOLOv5全流程的初学者、需要快速验证PCB缺陷检测方案的算法工程师、以及做毕业设计需要真实工业数据的学生。2. 为什么选YOLOv5格式标签规范与目录结构2.1 YOLOv5标签格式归一化坐标与类别IDYOLOv5的标注不是VOC那种XML也不是COCO那种JSON而是每个图片对应一个同名txt文件。每行代表一个目标框格式固定为class_id x_center y_center width height四个坐标值都用图片宽高做了归一化取值范围在0到1之间。这个格式最大的优点是轻量读取快训练预处理时不需要解析复杂的树形结构。拿到这份数据集后我建议先写段脚本检查标签有没有越界或空文件这步能帮你排除后面训练时报错的隐患。常见做法是遍历labels目录下所有txt检查坐标值是否在[0,1]区间以及是否有类别ID超出类别总数。下面这个脚本就是我常用的检查方式import os label_dir datasets/pcb/labels/train num_classes 6 # 根据实际类别数调整 for fname in os.listdir(label_dir): if not fname.endswith(.txt): continue path os.path.join(label_dir, fname) with open(path, r) as f: for line in f: parts line.strip().split() if len(parts) ! 5: print(f[格式错误] {fname}: {line}) continue cls int(parts[0]) x, y, w, h map(float, parts[1:]) if cls 0 or cls num_classes: print(f[类别越界] {fname}: class{cls}) if not (0 x 1 and 0 y 1 and 0 w 1 and 0 h 1): print(f[坐标异常] {fname}: {line})逻辑说明脚本遍历训练集标签目录按YOLOv5的5字段规则逐行校验。坐标必须是0到1之间的浮点数宽度和高度必须大于0。类别ID要在0到类别总数减1之间。这个脚本逻辑很简单但能提前暴露标注软件导出的常见问题比如坐标被整型截断、误把VOC格式混进来等。参数说明num_classes要根据这份数据集实际的缺陷类别数改。比如常见PCB缺陷类别有缺孔、鼠咬、开路、短路、毛刺、铜渣那就是6类。如果跑脚本时出现坐标异常多半是标注软件导出的尺寸基准不对需要回到标注阶段检查。2.2 目录结构与数据划分train/val/test怎么摆YOLOv5训练时默认按目录结构读取数据。标准做法是images目录存放图片labels目录存放标签且两个目录下各自分train和val子目录。这份数据集如果已经是YOLOv5格式大概率就是这个结构。如果不是你也需要自己摆成下面这样再开始datasets/pcb/ ├── images/ │ ├── train/ # 训练图片约1100张 │ └── val/ # 验证图片约200张 └── labels/ ├── train/ # 对应训练图片的txt标签 └── val/ # 对应验证图片的txt标签目录结构说明YOLOv5读取数据时依靠路径拼接它默认把图片路径里的images替换成labels来寻找标签文件。所以两个目录必须严格同名对应否则会出现图片找到了但标签没找到的报错。文件名也要完全一致只是扩展名不同——图片是.jpg标签是.txt。关于数据划分我一般按8:1:1分成train/val/test。1297张图的话训练约1038张验证约130张测试约129张。如果数据集本身没分test你可以从train里再抽一部分出来做测试集。划分时要注意同一块板子的不同视角图不能同时出现在训练和验证集否则验证指标会虚高这个在工业数据集里尤其常见。参数说明train和val的比例不是死的。如果缺陷样本分布不均衡某个类别特别少应该先按类别分布做分层抽样保证验证集里每个类别都有代表。否则可能出现验证集里某种缺陷一张都没有mAP却很高的假象。2.3 类别分布与标注质量先看统计再动手开始训练前最后一个必做动作是统计类别分布。这一步能告诉你这份数据集是不是有严重的类别不均衡。PCB缺陷检测里短路和开路通常占比高而鼠咬、针孔这类小缺陷往往样本少。如果某个类别只有几十张图训练时模型很容易对它欠拟合。统计方式很简单遍历所有标签文件把每个类别ID出现的次数累加起来。我建议把统计结果打印出来同时看看有没有全黑图片、模糊图片这种坏样本。1297张图不算多人工抽查一遍标注框是否贴合缺陷边缘也是值得的因为标注框偏大或偏小会直接影响最终mAP。3. 训练前的准备环境配置与数据划分3.1 环境与依赖YOLOv5分支选择YOLOv5官方仓库一直有更新发布版本从v5.0到v7.0不等不同版本间的默认超参数和网络结构有细微差别。我的习惯是固定用一个稳定版本不要追最新否则可能遇到依赖冲突或权重不兼容的坑。常见做法是clone指定release分支然后用pip install -r requirements.txt安装依赖。git clone https://github.com/ultralytics/yolov5.git cd yolov5 git checkout v6.0 pip install -r requirements.txt命令说明git checkout v6.0把代码切到v6.0发行版这个版本比较稳定网上资料也多遇到问题容易搜到解决方案。requirements.txt里锁定了torch、opencv、pyyaml等核心依赖的版本但要注意torch版本要和你的CUDA版本匹配否则GPU用不上训练速度会慢得让人怀疑人生。参数说明如果你用的是新显卡比如RTX 30系或40系需要装对应CUDA 11.x或12.x版本的PyTorch。我一般直接用PyTorch官网的pip安装命令先装torch再装requirements.txt里的其他依赖这样避免requirements里的torch版本和本机CUDA不匹配。3.2 数据划分脚本与YAML配置数据准备好后需要做两件事把数据集按比例划分成train和val然后写一个data.yaml告诉YOLOv5路径和类别名。划分脚本用Python写很简单核心是保证标签跟着图片走。import os import random import shutil src_images raw_images src_labels raw_labels dst datasets/pcb random.seed(42) all_files [f for f in os.listdir(src_images) if f.endswith(.jpg)] random.shuffle(all_files) train_cnt int(len(all_files) * 0.85) for i, fname in enumerate(all_files): split train if i train_cnt else val shutil.copy(f{src_images}/{fname}, f{dst}/images/{split}/{fname}) label_name fname.replace(.jpg, .txt) shutil.copy(f{src_labels}/{label_name}, f{dst}/labels/{split}/{label_name}) print(ftrain: {train_cnt}, val: {len(all_files) - train_cnt})逻辑说明脚本先把所有图片按固定随机种子打乱保证每次划分结果一致。然后按85%和15%切分训练集和验证集复制图片的同时把对应的txt标签一并复制。核心逻辑是标签文件名和图片文件名一一对应所以复制时用replace把扩展名换掉就行。参数说明random.seed(42)是固定随机种子这样不同人复现时得到相同划分。比例85/15是起步值如果你的缺陷类别分布不均匀建议改成按类别分层划分别用纯随机。src_images和src_labels的路径按你实际存放位置改。data.yaml的写法如下train: datasets/pcb/images/train val: datasets/pcb/images/val nc: 6 names: [missing_hole, mouse_bite, open_circuit, short, burr, copper_slag]配置说明train和val填图片目录的绝对路径或相对路径YOLOv5会自动定位到同级的labels目录。nc是缺陷类别总数names是类别名称列表顺序必须和标注文件里的class_id一致。这里我按常见PCB缺陷类别列了六个名字你拿到数据集后以实际标注类别为准顺序错了训练出来的混淆矩阵会没法看。3.3 预训练权重与迁移学习策略1297张图训练目标检测模型从零初始化权重是不明智的。YOLOv5的常规做法是加载在COCO上预训练好的权重用--weights yolov5s.pt参数启动训练。迁移学习的原理是模型在前面100多万张自然图像上已经学会了边缘、纹理、形状等基础特征PCB缺陷的轮廓检测可以复用这些底层特征只需要微调高层语义部分。python train.py \ --data datasets/pcb/data.yaml \ --weights yolov5s.pt \ --img 640 \ --batch 16 \ --epochs 100 \ --device 0命令说明--weights yolov5s.pt指定COCO预训练权重首次运行会自动下载。--data指向刚才写的data.yaml。--img 640表示输入分辨率PCB缺陷很多是小目标这个值不建议低于640。--batch大小取决于显卡显存16是8GB显存起步的安全值。--epochs 100训练100轮对1297张图来说是够的。参数说明如果你发现显存不够优先降batch到8或4不要先降分辨率因为小目标检测对分辨率敏感。--device 0指定用第一张GPU没有GPU就改成--device cpu但训练时间会翻十几倍不推荐。4. 训练与评估超参数、损失曲线与mAP4.1 训练超参数从默认hyp到实际调整YOLOv5的训练超参数集中在data/hyps/hyp.scratch-low.yaml里。默认参数是为COCO这种通用数据集调的用在PCB缺陷检测上通常够用但也有些值得调整的关键项。首先是hsv_h、hsv_s、hsv_v这几个控制颜色增强幅度。PCB板面颜色比较统一缺陷和背景的色差是重要特征颜色增强太狠会让模型学偏我一般会把hsv_h从0.015调低到0.005。另一个关键参数是mosaic默认是1.0也就是100%概率使用马赛克增强。马赛克把四张图拼成一张训练对小目标检测有帮助但拼接后的图片和真实产线布局差异大。如果你后面要部署到产线相机建议训练后期把mosaic降到0.5或关闭让模型适应单图分布。# hyp.scratch-low.yaml 中的关键项 lr0: 0.01 # 初始学习率 lrf: 0.1 # 最终学习率 lr0 * lrf hsv_h: 0.005 # 色调增强从默认0.015调低 hsv_s: 0.5 # 饱和度增强可保持默认 hsv_v: 0.3 # 亮度增强可保持默认 mosaic: 0.7 # 马赛克概率后期可降到0.5以下参数说明lr00.01是YOLOv5在COCO上的经验值通常不需要动。如果训练时loss剧烈震荡不下降可以降到0.005。mosaic0.7的意思是每轮有70%的图片会参与马赛克拼接剩余30%保持原图。hsv_h降下来是为了避免PCB板面颜色被过度变换导致模型把颜色当噪声忽略掉。4.2 训练过程监控损失曲线与验证指标训练跑起来后YOLOv5会在runs/train/exp目录下输出results.png这个图是所有训练诊断的汇总。你需要重点关注三条曲线train/box_loss、val/box_loss和metrics/mAP_0.5。box_loss持续下降说明模型在学着定位缺陷框mAP0.5稳步上升说明检测效果在变好。如果两条曲线在第60轮后趋于平缓说明训练已收敛不必跑满100轮。mAP是评估目标检测模型的核心指标。mAP0.5指的是IoU阈值0.5时的平均精度mAP0.5:0.95是IoU从0.5到0.95按0.05步进的平均值。YOLOv5的验证结果会同时打印这两项。工业项目通常看mAP0.5就够了但你要是个严谨的人mAP0.5:0.95能发论文用。还有一个容易被忽略的是val/objectness_loss。如果这个loss一直不降说明模型分不清前景和背景。PCB板面上有很多文字、焊盘、走线长得像缺陷但不是缺陷模型容易在这里翻车。此时要回看训练集里背景样本的多样性必要时专门增加负样本。4.3 过拟合判断与早停策略1297张图的规模很容易过拟合尤其是训练到50轮以后。判断依据很直观train loss还在下降val loss开始回升这就是典型的过拟合信号。YOLOv5内置了早停机制参数是patience默认100轮。我个人习惯把patience设成20省时间。python train.py \ --data datasets/pcb/data.yaml \ --weights yolov5s.pt \ --img 640 \ --batch 16 \ --epochs 100 \ --patience 20命令说明--patience 20表示验证指标连续20个epoch没有改善就提前终止训练并保存最佳模型为best.pt。这个参数能有效避免无效训练。如果你发现20轮之内还在持续提升说明模型还没收敛不用管它让它继续跑。参数说明过拟合后除了调patience更有效的手段是增强数据多样性。把mosaic调回去到0.9开启mixup增强同时把fliplr和flipud打开。PCB板面的缺陷方向是随机的水平翻转和垂直翻转都能增加样本量且不引入噪声。另一个思路是换更小的模型从yolov5m降到yolov5s参数少反而没那么容易过拟合。5. 常见问题与排查训练和推理里的五个坑5.1 训练loss正常下降但mAP不动这个现象很常见我在PCB缺陷检测上遇到过不止一次。现象是train/box_loss降到0.05以下但mAP0.5卡在0.6上不去。原因多半是正负样本不均衡或者某个缺陷类别的框太小模型压根没学到有效特征。PCB上短路和开路这类缺陷尺寸较大而针孔、鼠咬这类缺陷只有十几个像素小目标本来就难检测。解决方法是先看类别分布确认小缺陷类别的样本数量。如果占比低于10%先做针对性的数据增强把这部分图片做随机裁剪放大再训练。另外把--img从640提升到960或1280输入分辨率变大后小目标的特征能更清晰地被提取。代价是训练和推理变慢但检测精度通常有实质提升。5.2 验证时mAP高产线上线后漏检多这是工业项目最坑的地方训练时mAP0.5有0.95一到产线就翻车。原因是训练图片和产线相机采集的图片分布不一致光照角度、板面颜色、相机分辨率都不一样。模型在验证集上表现好是因为验证集和训练集同源换个环境就失灵。解决思路是收集真实产线的图片哪怕只有几十张做一次domain adaptation。把这几十张图混入训练集重新训练或者至少用它们做一次验证集看看真实场景下的mAP到底是多少。没有产线图的话你至少要保证验证集图片的分布和部署环境接近而不是用同一个设备拍的同样板子。5.3 标签坐标越界导致训练报错YOLOv5训练时报错assertion failed: labels must be in [0, 1]或类似的坐标断言错误基本可以断定是标签文件里出现了大于1或小于0的坐标。这个错误我在处理从LabelImg导出的VOC转YOLO格式数据时经常遇到转换脚本里忘了除以图片宽高或者除的是原图尺寸而实际训练图被resize了。解决方法是运行本章开头的那个检查脚本把越界文件全部筛出来。如果越界是因为标注框有一部分在图片外可以用clip_coords把坐标裁剪回[0,1]区间。如果越界是因为转换脚本写错那就要改转换逻辑把所有坐标统一除以原始图片的宽高。5.4 显存不足导致训练中断数据集1297张图用640分辨率训yolov5sbatch 16大概是8GB显存的及格线。如果你用yolov5m或把分辨率调到128016GB显存都可能爆。显存不足的表现是训练几轮后突然报CUDA out of memory然后进程退出。解决方法是按优先级降先降batch到8或4再换更小的模型最后才考虑降分辨率。batch降到4后学习率也要跟着降否则收敛不稳。YOLOv5会自动按batch调整学习率因为lr0是标称值实际学习率会和batch联动所以不用太担心。5.5 类别名顺序与训练配置不一致如果data.yaml里的names顺序和标签文件里的class_id对不上模型训练时没问题但输出结果全乱了。比如你实际标注时缺孔是0类data.yaml里却把missing_hole放在第5位那么训练时模型学到的类别映射和推理时输出的就是错位的。排查方法是训练完成后跑一次可视化推理把检测结果画在图上人工核对每个框的类别是否和缺陷位置吻合。我吃过这个亏当时跑完训练看mAP不错一上可视化界面发现所有的框类别全偏了一个位置最后排查了半小时才发现是names顺序问题。从那以后每次拿到新数据集第一件事就是抽查标签内容和data.yaml的类别顺序。6. 进阶数据增强与模型部署的落地技巧训练收敛后如果你想把模型用起来有两个方向值得花时间。第一个是把数据增强参数按PCB场景精调把mAP再往上推一点第二个是把模型导出成ONNX或TensorRT格式部署到产线边缘设备上跑实时推理比如RK3568、树莓派这类ARM平台。数据增强方面我用得最多的技巧是针对性放宽scale参数。PCB图片里的缺陷尺寸变化很大同一张板上既有几十像素的鼠咬也有几百像素的短路。scale控制随机缩放的范围默认0.5是50%到150%的缩放我建议拉到0.8让模型看到更多尺寸变化的样本。同时把translate从0.1提高到0.2模拟缺陷出现在板面不同位置的情况。另一个实用技巧是使用YOLOv5自带的crop增强——不是mosaic那种四图拼接而是随机裁剪出一块区域训练。这样对小缺陷特别有效。做法是在hyp里把mosaic设小一些然后手动加一段预处理逻辑对标签框小于一定像素的目标做局部裁剪放大。这类针对性增强的收益比盲目调学习率大得多。部署方面导ONNX的流程是YOLOv5官方支持最成熟的。导出命令如下python export.py \ --weights runs/train/exp/weights/best.pt \ --include onnx \ --img 640 \ --dynamic命令说明export.py把PyTorch权重转成ONNX格式。--dynamic是打开动态batch维度这样部署时不用固定batch大小单张推理或多张batch都能用。--img要和训练时一致否则推理结果不可信。导出后可以用自带detect.py验证一下导出效果防止ONNX算子被转换坏了python detect.py \ --weights runs/train/exp/weights/best.onnx \ --source datasets/pcb/images/val \ --conf-thres 0.25推理说明--conf-thres 0.25是置信度阈值低于这个值的检测结果会被丢弃。PCB缺陷检测场景下我习惯把阈值调到0.3到0.4之间因为缺陷检测宁可漏检一点也别误检太多——把好板子判成坏板子产线上的损失比漏检配合人工复判更大。--source指向验证集目录输出结果会存在runs/detect/exp下人工看一遍就知道模型真实表现。最后说一下我对这份数据集的整体判断1297张图规模不大但胜在格式规范、直接可训。如果你想做课题或者快速验证PCB缺陷检测方案这份数据是够用的。但如果是实际产线项目我会用这份数据做算法预研和流程验证然后结合现场采集的真实图片扩充训练集。我曾经拿着类似规模的数据集直接上产线验证mAP很高现场跑起来就发现光照一变就不认了后来把现场图混进来再训练才算真正稳定。从那以后我每次拿到新数据集都强制走一遍流程先看标签分布再训小模型验证最后用部署环境图片做终验。希望帮到你。本文还有配套的精品资源点击获取