简介PCB电路板缺陷检测识别数据集面向计算机视觉工程师、工业质检人员及科研工作者可用于搭建基于YOLOv9的电路板缺陷识别系统解决生产中的外观质检与缺陷分类问题。包内共2000个文件包含702张JPG缺陷样本图片、1297个TXT标注文件及1个YAML数据配置文件。TXT文件采用YOLOv9标准格式坐标信息与图片一一对应YAML中存放类别配置导入后即可直接训练。压缩包整体大小约120.79MB规模紧凑能够在普通显卡上完成数据预览、模型训练与指标验证。数据集图片取自真实拍摄场景覆盖多种常见的电路板工艺缺陷据作者说明模型可达到99.8%的识别准确率具有较高的工程参考价值。目前已有434人学习访问尤其适合缺少标注样本的开发者作为预训练基准可显著节省数据采集与标注时间加快缺陷检测方案落地。1. PCB 电路板缺陷检测这份 1297 张的 yolov9 数据集到底能做什么上一轮我帮朋友做 AOI 复检项目机器视觉等设备扫完 PCB 电路板之后会在屏幕上标一堆疑似缺陷最后靠人工一张张复核一天下来眼睛都花了。我当时想用目标检测把这一步自动掉就在找现成数据集。这份 PCB 电路板缺陷检测数据集就是那时候淘到的1297 张图片按 yolov9 格式标注标题写着 99.8% 的识别准确率。它适合两类人一类是想快速跑通 YOLOv9 训练到部署全流程的工程师另一类是正在做工业视觉缺陷检测、想拿真实板面数据验证思路的开发者。先泼盆冷水1297 张不算多精度数字也要实测确认但它作为起步和验证数据比多数教程里那些花瓶猫狗图有用得多。2. 先盘清数据集的底细目录结构、标注格式与数据划分2.1 下载后先检查目录结构别急着开训数据集拿到手第一件事不是训练而是确认文件形态。YOLOv9 官方代码沿用了 YOLOv5 的目录习惯一般解压后是这种结构pcb_defect/ ├── data.yaml ├── train/ │ ├── images/xxx.jpg │ └── labels/xxx.txt ├── valid/ │ ├── images/... │ └── labels/... └── test/ ├── images/... └── labels/...images 里是图片labels 里是同名 txt。txt 文件每一行是一条标注没有标注的图片对应空 txt 文件或者干脆没有对应文件。我拿到手先跑一遍计数脚本确认图片和标注数量对得上import os from pathlib import Path base Path(pcb_defect) for split in [train, valid, test]: img_dir base / split / images lbl_dir base / split / labels imgs sorted(img_dir.glob(*.jpg)) lbls sorted(lbl_dir.glob(*.txt)) missing_labels [f.stem for f in imgs if not (lbl_dir / (f.stem .txt)).exists()] print(f{split}: images{len(imgs)} labels{len(lbls)} missing_labels{len(missing_labels)})逻辑说明Path.glob(*.jpg)列出所有 jpg 文件再逐个检查同名 txt 是否存在。missing_labels里出现文件名说明标注丢了这种图训练时会被跳过白白浪费样本。参数说明如果你的图片有 png 后缀把 glob 里的*.jpg换成*.png或直接*.jpeg。1297 张图的数据集这一步花不到一分钟但能阻止你带病训练。顺带检查一下有没有空 labels 文件。空 txt 文件代表负样本即没有缺陷的正常板面这在工业场景里很常见。如果整个数据集几乎没有空 txt说明它全部是缺陷图后面评估误检率时要小心。2.2 YOLOv9 标注格式一行的五个数字分别是什么YOLOv9 使用的标注格式和 YOLOv5 完全一致txt 里每一行是class_id x_center y_center width height其中x_center、y_center是目标框中心点的相对坐标width、height是框的相对宽高数值都除以了图像宽高做归一化。举个例子2 0.512305 0.438146 0.018750 0.013889含义是类别 id 为 2中心点在图像横向 51.23%、纵向 43.81% 的位置框宽占图像宽度 1.875%框高占图像高度 1.3889%。我写了个小脚本把归一化坐标还原成像素坐标方便肉眼核对line 2 0.512305 0.438146 0.018750 0.013889 class_id, x_c, y_c, w_norm, h_norm map(float, line.split()) img_w, img_h 640, 480 # 用 cv2.imread 读取真实分辨率替换 x_min (x_c - w_norm / 2) * img_w y_min (y_c - h_norm / 2) * img_h box_w w_norm * img_w box_h h_norm * img_h print(fclass{int(class_id)} x_min{x_min:.1f} y_min{y_min:.1f} w{box_w:.1f} h{box_h:.1f})逻辑说明归一化坐标乘回图像宽高就得到了左上角坐标和框的宽高。x_c - w/2得到左边界相对位置再乘img_w换成像素y方向同理。这套换算在可视化验证标注时经常用。参数说明如果读到的w_norm、h_norm大于 1或者x_c、y_c超出 [0,1]说明这个 label 没有正确归一化。我遇到这种情况会直接把这个样本挑出来而不是硬训因为它会污染模型的回归头学习。2.3 从文件名反推数据来源手动分组再划分和其他数据集不同这部分的文件名有规律。看几个典型6_PNG_jpg.rf.9d8afdf3c8af9092dd5497554d1020e0.jpg 12_PNG_jpg.rf.4535dbaedb94356501f29eba99673a8f.jpg IMG_6850_JPG_jpg.rf.58867852aab90335cf2e984959199108.jpg middle_PNG_jpg.rf.e108238c9803ac99cfc629a78a6bac0b.jpg.rf.是 Roboflow 平台导出时留下的标记前面的字母才是原始文件名。IMG_6850这类像是相机拍摄的现场图片middle像是从大图上裁出来的中间区域12_PNG则可能是某批样板的编号。它们不是同一光源、同一角度下拍的数据的分布差异很大。这个观察直接影响数据划分。如果直接把所有图片随机分成训练集和验证集同一块板或同一批次的图片会同时出现在两边因为拍摄条件相似验证集指标会虚高。换一批真正没见过的板子精度立刻下滑。我的做法是先按文件名的前缀分组再按组划分import os import random from pathlib import Path base Path(pcb_defect) images sorted((base / train / images).glob(*.jpg)) groups {} for img in images: prefix img.name.split(_jpg)[0][:20] # 取原始文件名前缀作为组名 groups.setdefault(prefix, []).append(img) all_imgs [] for prefix, imgs in groups.items(): random.Random(42).shuffle(imgs) n_test max(1, int(len(imgs) * 0.2)) all_imgs imgs[n_test:] # 每组留 80% 做训练 # 每组留出的 20% 单独汇总到 val逻辑说明prefix取_jpg前的原始名random.Random(42)固定随机种子保证可复现。这样分组后同一前缀下的图片不会同时在训练集和验证集里“串场”。参数说明如果你不需要严格分组直接用官方data.yaml里的随机划分也可以跑通流程但后续要汇报精度或做方案选型时分组划分的结果更有说服力。对 1297 张这种小数据集分组划分通常会比随机划分的验证分数低几个点那是真实的差距。2.4 99.8% 识别准确率该怎么理解标题里的“99.8% 识别准确率”是个营销味很浓的数字。目标检测领域一般不用“准确率”这个词而是看 mAP50、mAP50-95、Precision、Recall。99.8% 如果是指训练集上的分类准确率那很可能是过拟合如果是指某一次验证的 mAP50还有参考价值。我拿到这类数据集的习惯是先不管宣传指标自己跑一遍 val看 mAP50 是多少再看 P-R 曲线在哪些类别上拉胯。1297 张图在 PCB 缺陷检测方向上规模不大好在 PCB 板面本身纹理规整类别差异也较明确配合 YOLOv9 的预训练权重训练集指标很容易做得好看关键看验证集能不能立住。3. 基于 YOLOv9 训练 PCB 缺陷检测从环境到命令行3.1 拉取仓库与准备环境YOLOv9 官方仓库是 WongKinYiu/yolov9安装依赖后用它的train.py直接开训。我本地的 Python 版本是 3.10PyTorch 用的 2.0.1CUDA 11.8。装完依赖后建议先跑一个最简单的推理 demo 确认环境没问题再进入训练。git clone https://github.com/WongKinYiu/yolov9.git cd yolov9 pip install -r requirements.txt逻辑说明requirements.txt会安装 torch、torchvision、opencv-python、pyyaml、tqdm 等基础库。如果机器上已经有 PyTorch不建议用 pip 直接装因为默认源装的往往是 CPU 版本。我一般先确认python -c import torch; print(torch.cuda.is_available())输出为 False 就去官网按 CUDA 版本重新装。参数说明YOLOv9 的train.py对 torch 版本不挑2.0 及以上都跑得动。内存方面1297 张图直接用--cache加载约占用 4~8 GB 内存普通 16 GB 内存的机器没问题。3.2 修改数据集配置 pcb.yaml训练之前要写一个 pcb.yaml告诉训练脚本数据在哪、类别有几个、类别名是什么。我的配置长这样# pcb.yaml path: /data/pcb_defect train: train/images val: valid/images nc: 6 names: 0: missing_hole 1: mouse_bite 2: open_circuit 3: short 4: spur 5: spurious_copper逻辑说明path是数据集根目录绝对路径train、val是相对于path的图片目录。如果某个类没出现也不要删掉编号保持类别索引和标注文件里的 class_id 对齐即可。YOLOv9 会根据nc初始化检测头输出通道改了nc后之前训练好的权重大概率没法直接用需要重新 finetune。参数说明names的顺序必须和标注里的 0~5 一一对应否则训练不报错但推理时输出类别名全乱掉。标签里最大类别号加一就是nc所以第一步数清楚类别数量很重要。如果这个数据集的类别编号只用了 0、1、2那就把nc改成 3names 也只写三条。3.3 训练命令与关键参数以 YOLOv9 的 c 系列模型为例训练命令如下python train.py \ --batch 16 \ --epochs 200 \ --data pcb.yaml \ --weights yolov9-c.pt \ --img 640 \ --device 0逻辑说明--weights yolov9-c.pt是从 COCO 预训练权重开始迁移学习比从零训练收敛快得多。PCB 缺陷检测和 COCO 的域差距较大但前几层特征提取依然有用。--img 640是训练时的输入分辨率。PCB 缺陷往往比较小640 是起步值显存允许的话可以试 960 或 1280。参数说明--batch 16在 24 GB 显存的 3090/4090 上比较稳妥8 GB 显存降到 4~8否则会 OOM。--epochs 200对小数据集来说有点多我一般配--patience 50开启早停连续 50 个 epoch 验证指标不涨就自动停。想快速验证流程先跑 10 个 epoch 看 loss 能降再拉长正式训练。3.4 训练过程中看什么loss 曲线和权重选择训练过程中的终端输出会每轮打印 loss 和各指标变化。我更习惯重定向到日志文件方便事后翻python train.py ... 21 | tee train_log.txt tail -f train_log.txt逻辑说明tee同时把输出写到文件和终端日志里能看到每个 epoch 的 box_loss、cls_loss 和验证指标。正常的训练曲线是 loss 前 30 个 epoch 快速下降之后缓慢震荡下行如果 loss 一路降到很低但验证 mAP 不动说明过拟合了。参数说明训练结束后看runs/train/exp/weights/下的best.pt和last.pt。best.pt是验证集上指标最高的权重训练集 loss 最低的 epoch 不一定是验证集最优的 epoch。部署时我一般用best.pt不用last.pt。4. 常见问题排查五个踩坑记录4.1 验证集指标虚高换新板子就崩现象训练时 mAP50 一路飙升到 0.95 以上验证集也不错但拿一批现场新拍的 PCB 板一测漏检率特别高。原因很大概率是数据划分有问题。文件名前缀相同意味着图片可能来自同一块板或同一批次随机划分时相同分布的图片同时进了训练集和验证集模型学的其实是拍摄条件而不是缺陷本身。解决按 2.3 节的分组逻辑重新划分数据集确保同一个前缀的图片只出现在一个集合里。如果分组后指标掉下来那掉下来的幅度才是真实水平的反映。我后面做数据汇报时一律用分组划分的结果。4.2 标注里的归一化坐标越界现象训练 loss 波动剧烈不收敛画验证框发现有些框超出图像边界特别多像是被人为拉过。原因标注导出的尺寸和实际图片尺寸不一致。比如标注工具基于模板图导出但实际图片被重新缩放过导致中心点和宽高的归一化数值不对。解决训练前用脚本逐张检查标注是否越界。判断条件是x_c - w/2 0、x_c w/2 1这类情况越界的标签要裁剪回 [0,1] 或者直接删除。注意裁剪后宽高会变小如果目标被裁掉一半不如删除整个样本让模型少学一个脏数据。4.3 显存 OOM训练跑不起来现象启动训练没几分钟终端报CUDA out of memory然后进程直接退出。原因--batch、--img和显存不匹配。分辨率 640 时 batch 16 需要约 12 GB 显存分辨率提到 1280 后显存需求接近翻倍8 GB 卡必挂。解决优先把 batch 降到 4 或 2。如果还在报 OOM就把--img降到 512先跑通流程。工业场景中训练分辨率 640 和推理分辨率 1280 可以不同训练先低一点不影响后续验证高分辨率的效果。4.4 小目标缺陷漏检严重现象验证集 mAP50 还可以但那些只有十几个像素的细小缺陷比如开路、鼠咬预测框总是出不来或者框偏了一大截。原因缺陷目标太小在 640×640 输入下可能只占几个像素特征图下采样到 20×20 时几乎丢失。解决训练和推理都用更高的分辨率。训练设--img 1280若显存不足就降低 batch推理时用 1280 或更高。另外可以检查 labels 里的框宽高分布如果大量框的宽度不到图像宽度的 1%后续做切片推理比调模型结构更划算。4.5 缺陷类别不平衡少数类学不到现象训练 200 个 epoch 之后某几个类别 AP 始终很低甚至 F1 曲线惨不忍睹。原因数据集中各类缺陷数量差异大几百张图里可能某类只出现几十次模型根本不够学。YOLO 框架本身对多数类有偏向小类梯度被压制。解决先统计每类框数量。差的类别做离线增强——旋转、翻转、亮度扰动并配好对应标签。另一种思路是降低置信度阈值用低阈值把少数类捞回来但最终要扩展数据才能根治。5. 验证与推理把模型输出变成可用的检测结果5.1 用 val.py 复现指标拿到权重后第一步是在验证集上跑出真实的 Precision、Recall、mAPpython val.py \ --data pcb.yaml \ --weights runs/train/exp/weights/best.pt \ --img 640 \ --conf 0.25 \ --iou 0.45逻辑说明val.py会把验证集图片逐张做前向推断与标注做 IoU 匹配输出 mAP50 和 mAP50-95。--conf 0.25表示置信度阈值 0.25 以下的预测框被过滤--iou 0.45是 NMS 时的 IoU 阈值。参数说明验证时的--img尽量和训练一致。如果你想看模型在更高分辨率下的表现可以单独用--img 1280跑一次这个分数代表部署时放大图像后的真实收益。mAP50 达到 0.95 以上且 mAP50-95 在 0.7 左右说明模型在 1297 张图上效果已经不错如果 mAP50-95 偏低就看下一小节的可视化结果。5.2 可视化预测结果与保存标签val 跑完会生成runs/val/exp*/目录里面有带框标注图、混淆矩阵和各类曲线。我一般会保留现场图片python val.py --data pcb.yaml --weights best.pt --img 640 --save-conf --save-txt逻辑说明--save-txt把预测框写到 txt和标注格式一致--save-conf在 txt 里额外保存置信度。这样可以直接把预测结果和原始标注做差集把差异部分找出来人工看。参数说明如果要统计漏检情况重点看那些“标注有框但预测没框”的图片如果要统计误检看“预测有框但标注没框”的图片。PCB 板面纹理复杂很多误检是铜箔上的字符、划痕和过孔引发这种误检在纯数据集上很难规避要在应用层面加规则过滤。5.3 评估时看四张图不只看一个数训练完成后我按优先级检查四张图文件作用confusion_matrix.png看哪些类别互相混淆比如毛刺被识别成余铜P_curve.png / R_curve.png看当前阈值下 Precision 和 Recall 的取舍F1_curve.png选生产环境的置信度阈值labels.jpg检查标注框尺寸分布判断小目标占比二维矩阵里如果某个类别的行有大量值落到了对角线之外说明这两个类别特征太像需要看原图去找差异特征。P-R 曲线是另一个参考维度曲线下的面积越大越好曲线靠近右上角说明模型在高召回下还能保持高精确率。6. 产线落地技巧小目标召回与置信度阈值选择6.1 训练后期关掉马赛克增强YOLOv9 的增强策略里有mosaic把四张图拼成一张训练能提升小目标泛化。但训练后期它会让定位不稳定模型的输出框偶尔偏移。常见做法是最后 10~20 个 epoch 把 mosaic 关掉让模型回归正常分布。改hyp.scratch-high.yaml里的mosaic: 1.0或在命令行指定python train.py --data pcb.yaml --weights yolov9-c.pt --hyp hyp.scratch-high.yaml --epochs 200如果训练脚本支持动态关闭我习惯在总 epoch 的 90% 之后把 mosaic 调到 0.15 左右具体看训练日志里验证集的 mAP 走向。6.2 推理时上高分辨率必要时加 TTA部署阶段用小目标召回不够时第一个动作是提升推理分辨率。训练用 640推理用 1280对小缺陷的提升立竿见影。TTA 也可以叠加但时间成本高产线节拍不够时没必要常开。from ultralytics import YOLO model YOLO(runs/train/exp/weights/best.pt) results model.predict( sourcetest_pcb.jpg, imgsz1280, conf0.25, augmentTrue, verboseFalse ) for r in results: for box in r.boxes: cls_id int(box.cls[0]) conf float(box.conf[0]) x1, y1, x2, y2 map(int, box.xyxy[0]) print(fcls{cls_id} conf{conf:.3f} bbox({x1},{y1},{x2},{y2}))逻辑说明imgsz1280把输入拉伸到 1280 再做前向augmentTrue启用测试时增强用多尺度 翻转的平均结果作为最终预测。对 PCB 这类静态拍摄场景TTA 通常能稳定提升 1~3 个百分点的 mAP代价是单图推理时间从几十毫秒涨到几百毫秒。参数说明conf阈值在产线里要单独调。漏检成本高就把阈值调到 0.1~0.15宁可多误检几块板再靠人工复核误检成本高就调到 0.4 以上。这个值没有通用的最优解需要根据实际产线抽样标定。6.3 置信度阈值怎么选漏检和误检之间的平衡点PCB 缺陷检测的最终指标不是准确率高低而是漏检率与误检率之间的代价平衡。我一般会在验证集上画出 F1-Confidence 曲线取曲线最高点对应的置信度再根据产线反馈往左或往右压一点。如果一块坏板流出造成的损失很大阈值就压低点如果人工复核资源紧张阈值就调高点。最后说说我个人的习惯每次接到新的 PCB 缺陷数据集都强制自己走一遍三件事——标签越界检查、按组划分数据、用最小 batch 跑通全流程再加参数。这套流程看起来多花一两个小时但能省掉后面大量翻车的“玄学排查”时间。希望这些经验对你复现这套数据集有帮助。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
OpenCV仪表盘指针读数识别:从Hough直线检测到参数调优实战 简介:基于OpenCV的仪表盘指针读数识别系统,面向工业仪表自动抄表、课程设计以及计算机视觉项目开发者,解决传统人工读取仪表效率低、易出错的问题。压缩包共6个文件,包含3个C源文件、2个头文件和1个说明文档,整体仅9KB… · 2026/9/24 19:11:08
SQL注入绕过技巧全解析:从WAF原理到实战攻防 1. 为什么到现在还要聊SQL注入绕过先说个反直觉的事实:2025年了,SQL注入依然是OWASP Top 10里的常客,WAF(Web应用防火墙)和各类安全产品越铺越广,但真实攻防场景里,SQL注入绕过的话题从来就没冷… · 2026/9/24 19:11:08
Docker存储卷完全指南:从数据持久化到备份恢复实战 先讲个我自己的经历。第一次用 Docker 跑 MySQL,升级容器版本时,我想都没想就把旧容器删了,然后 docker run 重新起了一个新容器,结果数据库数据全部归零。当时整个人是懵的,翻了一圈文档才意识到问题出在哪࿱… · 2026/9/24 19:11:08
2026年组件安全扫描选型指南:商业、开源与信创方案对比 1. 组件安全扫描到底在扫什么,为什么2026年突然成了刚需组件安全扫描,圈子里更习惯叫SCA(Software Composition Analysis),说白了就是把你项目里用到的所有第三方依赖——不管是Maven拉下来的jar包、npm装的node_modul… · 2026/9/24 20:25:57
拯救者玩游戏花屏闪退,不一定是显卡驱动问题 不少拯救者游戏本用户碰到这样的故障:桌面浏览网页、看视频一切正常,只要打开大型游戏,画面就出现色块、条纹、马赛克花屏,紧接着游戏闪退,严重时直接蓝屏。很多人第一反应就是显卡驱动出问题,反复卸载、重… · 2026/9/24 20:25:51
求职焦虑自救指南:用能力定位和项目思维破局就业困境 1. 焦虑人人都有,但别被"数字"牵着走我最近后台收到不少年轻朋友的留言,都在问同一个问题:大环境不好,是不是毕业就等于失业?是不是再怎么努力也没用?说实话,只要打开社交平台&#x… · 2026/9/24 20:25:51
全开源超级签名系统部署指南:iOS内部分发与UDID签名原理详解 简介:面向需要搭建iOS应用分发与签名服务的开发者和企业,这是一套全开源的APP分发系统及超级签名系统源码,基于PHP开发,具备后台管理功能,并附详细部署文档。系统方案涵盖后台账号配置、阿里云OSS存储、七牛云下载包托… · 2026/9/24 20:25:51
Edge无法发送验证码?揭秘浏览器UA检测与兼容性问题 “全国新书目-书籍-教材查询-最全面-用chrome 浏览器才能发送验证码——用edge浏览器登入提示无法发送验证码,为何?”这个标题里的问题,我太熟了。遇到这个问题的绝对不止你一个人,它背后牵扯出的其实是很多老网站做浏览器适配时留… · 2026/9/24 20:25:39
订单多了,利润却薄了?模具注塑厂的效率困局 订单量上涨,账上利润却没同步变厚,这是当下不少模具注塑厂的真实体感。旺季产线排满,淡季又空转,摊薄下来单件成本反而走高。问题往往不在订单本身,而在从开模到量产之间的衔接损耗。有行业统计显示,制造环… · 2026/9/24 20:25:39
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程 简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13
1D-CNN时间序列建模实战:从Conv1d原理到工业落地 简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26
柔软的L:汉语语流中被忽视的舌肌张力控制 1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44