PCB缺陷检测实战:1297张图训练YOLOv5的完整流程与踩坑经验
简介PCB电路板缺陷检测识别数据集面向工业质检、计算机视觉与YOLOv5目标检测方向的学习者和开发者可用于模型训练、验证与算法效果对比。压缩包共包含2000个文件其中1297张jpg图片均配有对应的txt格式标注文件另附1个yaml配置说明整体大小约120.94MB。图片与txt标注文件同名一一对应便于训练脚本直接读取yaml文件可帮助快速配置类别信息目录结构清晰即可直接接入YOLOv5训练流程。数据集中标记了电路板各类常见缺陷标签格式规范标注准确率宣称达到99.8%能够为实际产线质检场景的缺陷识别与定位提供高质量训练数据。目前已有470人学习下载适合需要快速获得已标注数据、进行多轮训练与算法复现的入门及进阶用户也有助于深入理解YOLOv5数据组织方式与训练流程。1. PCB缺陷检测数据集1297张图怎么撑起99.8%的指标做工业视觉的人对这类标题应该又爱又怕PCB电路板缺陷检测、YOLOv5格式标注、1297张图片、99.8%识别准确率。我拿到这份资源的第一反应是先冷静三步——数据量是否够、标注格式是否规范、99.8%到底指的是哪个指标。1297张图对深度学习目标检测来说不算大但PCB缺陷检测这类场景里缺陷区域通常小而集中只要标注质量够、类别分布合理配合YOLOv5自带的预训练权重做迁移学习完全能训练出一个可用的检测模型。这份资源适合三类人正在做毕业设计需要现成数据集的在校生、刚接触工业缺陷检测想跑通全流程的初学者、以及需要用真实PCB数据做算法验证的工程师。它解决的核心问题很简单省掉你花几周时间找数据、清洗标注、转格式的功夫直接进入训练环节。2. 数据集内部结构先盘清楚标签和类别再动手2.1 解包后的文件布局拿到资源后第一步不是急着训练而是把目录结构看清楚。常见做法是解压后先执行tree命令确认图片、标注文件、类别名文件是否齐全以及train/val划分是否存在。tree -L 2预期看到这样的结构images/存放JPG格式的PCB板图片labels/里是对应的YOLOv5格式txt标注可能直接带train/val子目录也可能只有一个总目录。classes.txt或data.yaml里定义了类别列表。如果资源里没有划分train/val你需要按8:2或9:1的比例自行划分这个后面会讲具体做法。YOLOv5格式的关键点在于每个txt文件对应一张同名图片文件名相同、扩展名不同。txt里每一行表示一个目标格式为class x_center y_center width height前四项是相对图片宽高的归一化值取值范围0到1。解析时要注意当前YOLOv5主分支也用v8等新版本格式作为兼容输入但v6.0及之前的经典结构就是上述五列这份资源的标注大概率也是这个规范。2.2 统计类别分布和目标尺寸格式确认完了视野别急着收。直接用脚本统计每个类别的目标数量和目标框尺寸分布这一步能让你预见训练时的难点。import os import numpy as np label_dir labels class_names [missing_hole, mouse_bite, open_circuit, short, spurious_copper, spur] cls_counts {} box_areas [] for root, dirs, files in os.walk(label_dir): for f in files: if not f.endswith(.txt): continue with open(os.path.join(root, f)) as fp: for line in fp: parts line.strip().split() if len(parts) ! 5: continue cid int(parts[0]) w float(parts[3]) h float(parts[4]) cls_counts[cid] cls_counts.get(cid, 0) 1 box_areas.append(w * h) print(类别分布:, cls_counts) print(目标框面积 中位数/均值:, np.median(box_areas), np.mean(box_areas))这段脚本会告诉你两个关键信息各类别样本是否均匀以及目标框占整图的比例。如果某类目标只有几十个训练时这个类大概率学不好如果框面积中位数在0.01以下说明是典型的小目标场景训练时需要用高分辨率输入或调整anchor。对应资源里的PCB缺陷常见类别包括漏孔、鼠咬、开路、短路、多余铜、毛刺等具体类别数以你解压得到的data.yaml或classes.txt为准。3. 训练环境配置与超参数设定用YOLOv5复现指标的前提3.1 conda环境与依赖安装YOLOv5的版本迭代很快换一个版本依赖和默认超参数都可能不同。我先说我习惯的做法固定使用YOLOv5 v6.0版本这个版本稳定、资料多、踩坑记录也全。conda create -n pcb_yolov5 python3.8 conda activate pcb_yolov5 git clone -b v6.0 https://github.com/ultralytics/yolov5.git cd yolov5 pip install -r requirements.txt这里需要解释一下为什么选v6.0而不是最新的v7.0或v8分支v6.0是YOLOv5最后一个大量用户沉淀过训练经验的版本网上能找到大量调参案例v8已经属于Ultralytics后续重构的产物代码结构变化不小数据集格式虽然兼容但训练参数和一些细节行为有差异。如果你的机器是Windows环境conda安装后建议顺手执行pip install torch1.10.0 torchvision0.11.0这个组合在v6.0下验证过兼容性。如果pip下载太慢加-i https://pypi.tuna.tsinghua.edu.cn/simple换国内源。3.2 组织数据集并生成data.yamlYOLOv5要求数据和标签按固定目录组织同时需要一个yaml文件描述类别数和类别名。这个文件写错会导致训练直接报错。train: D:/datasets/pcb/images/train val: D:/datasets/pcb/images/val nc: 6 names: [missing_hole, mouse_bite, open_circuit, short, spurious_copper, spur]注意路径用绝对路径最保险相对路径在某些版本下会解析失败。nc必须与names列表长度一致类别顺序必须与标注文件的class id一一对应。如果你在2.2节统计类别分布时发现某个类在train和val中出现次数极不均匀需要重新划分。划分时用随机种子保证可复现。import os import random from shutil import copy2 random.seed(42) img_dir images label_dir labels all_imgs [f for f in os.listdir(img_dir) if f.endswith(.jpg)] random.shuffle(all_imgs) split int(len(all_imgs) * 0.8) train_imgs all_imgs[:split] val_imgs all_imgs[split:] os.makedirs(pcb_dataset/images/train, exist_okTrue) os.makedirs(pcb_dataset/images/val, exist_okTrue) os.makedirs(pcb_dataset/labels/train, exist_okTrue) os.makedirs(pcb_dataset/labels/val, exist_okTrue) for img in train_imgs: copy2(os.path.join(img_dir, img), pcb_dataset/images/train/) lbl os.path.splitext(img)[0] .txt if os.path.exists(os.path.join(label_dir, lbl)): copy2(os.path.join(label_dir, lbl), pcb_dataset/labels/train/) # val 同理这段代码做完后务必人工抽查几张图用LabelImg或CVAT打开图片和对应txt确认框的位置、大小与缺陷区域吻合。格式正确但位置错位的标注训练不报错但指标会莫名其妙地低。3.3 训练命令与关键参数运行训练前有一批参数值得单独花时间理解因为它们直接影响最终指标。下面这条命令是我处理1297张图时的常用起点。python train.py --img 640 --batch 16 --epochs 100 --data pcb.yaml --weights yolov5s.pt --cache --name pcb_run参数含义拆开讲。--img 640是输入分辨率PCB原图如果比较大直接缩放会丢失小目标信息常见做法是先用640起跑观察map指标后再决定是否升到960或1280。--batch 16受显存限制显存不够就降到8但batch减半时学习率也应相应降低。--epochs 100是基础值1297张图通常不需要跑300轮因为训练集小、epoch多了容易过拟合。--weights yolov5s.pt是官方预训练权重从COCO数据集迁移来的特征提取能力对PCB这类纹理背景也有帮助别用随机初始化从头训练收敛速度和最终精度都会差一截。--cache把图片加载进内存加速训练这个数据集小完全放得下。还有两个训练参数常被人忽略。--rect可以按长宽比分组训练减少padding但要求验证集同样开启且batch需要能被组大小整除--multi-scale随机改变输入尺寸相当于免费的过拟合缓解手段。1297张图的规模下我一般不开multi-scale因为随机缩放会让小目标更容易丢失开rect验证集指标波动也会变大。4. 结果验证与指标解读99.8%到底准不准4.1 训练日志与weights文件训练结束后runs/train/pcb_run目录下会生成weights目录里面有两个关键文件best.pt和last.pt。它们分别对应验证集指标最优的权重和最后一个epoch的权重。我习惯先用best.pt做验证因为它是训练过程中在val上表现最好的模型。python val.py --data pcb.yaml --weights runs/train/pcb_run/weights/best.pt --img 640val.py会输出P、R、mAP50、mAP50-95这几个核心指标。你听到的99.8%如果对应的是mAP50说明模型在IoU阈值0.5时预测框和真值框的重合度要求不算苛刻这个数字是可以达到的。如果商家声称的是mAP50-95那含金量高得多但1297张图的规模下很少见到这么高的值需要看数据集本身是否简单。val.py还会生成混淆矩阵图confusion_matrix.png那是判断模型短板的关键入口。看混淆矩阵时重点看对角线以外的高值方块如果某一个缺陷类别经常被误判为另一类说明这两个类别在图像上特征过于相似或训练样本量差距过大。另一个值得看的文件是results.png它画出了训练过程中loss、P、R、mAP的变化曲线如果val loss在训练后期不降反升说明过拟合已经出现需要提前停止而不是等100轮跑完。4.2 测试集的真实泛化能力训练时的val集参与过模型选择严格来说不能完全代表模型的真实泛化水平。我的习惯是数据划分时留出10%样本完全不参与训练和验证等best.pt确定后单独做一次正式测试。import torch from pathlib import Path model torch.hub.load(ultralytics/yolov5, custom, pathruns/train/pcb_run/weights/best.pt, force_reloadTrue) model.conf 0.25 model.iou 0.45 results model([holdout_001.jpg, holdout_002.jpg], size640) results.print() results.save(holdout_pred/) results.show()model.conf和model.iou是两个直接决定输出框数量的参数conf阈值越低输出的框越多误检也越多iou阈值越低重叠框被合并得越激进相邻缺陷可能被并成一个框。工业缺陷检测场景下我一般把conf设在0.3到0.35之间太低会有大量假阳性框干扰人工复检。测试集指标和val集指标之间的差距如果超过5个百分点基本可以断定训练集和测试集分布不一致回头检查数据集划分时是否按目录随机而不是按图片名排序抽样。还有一种常见错误是泄露——划分时把同一块PCB板的不同局部图分到了train和val导致val指标虚高。5. 避坑指南PCB缺陷数据集训练常见问题与排查5.1 标注框错位图片被旋转或缩放后标注没跟着变现象训练曲线正常但推理结果在部分图上框的位置整体偏移缺陷中心差着一大截。 原因最常见的是原始图片方向不一致比如部分PCB板照片被旋转90度后保存标注工具里的框坐标没有同步旋转。另一种情况是数据集作者用了批量缩放工具处理图片但txt里的归一化坐标没重新计算。 解决写个脚本批量核对每个txt里的坐标是否都在0到1之间然后随机挑10张图叠加可视化检查。发现某张图框全偏就用标注工具重新修正这张图的标签。以后再处理类似数据批量操作图片后强制重跑一次坐标校验脚本。5.2 严重类别不平衡导致个别类mAP接近0现象训练结果里大部分类别mAP50在90以上但某一个类只有30多。 原因这个类在整个数据集里可能只有几十个标注框而其他类有几百甚至上千个。YOLOv5的类别预测头共享但分类损失贡献不同小样本类学到的主要是类别间的共性特征区分度严重不足。 解决两个方案。一是扩充数据把该类别的样本做数据增强复制多份但复制样本不会引入新信息效果有限更实用的是启用YOLOv5的类权重功能在数据配置里给不同类别分配不同损失权重。训练参数上可以调高cls_pw让分类损失对稀少类别更敏感。5.3 小目标缺陷漏检孔洞和鼠咬这类微小缺陷找不到现象验证时大缺陷比如开路、短路都能检出来但漏孔、鼠咬这类小缺陷频繁漏检尤其当缺陷宽度占整图不到2%时。 原因输入分辨率640下原图几毫米的缺陷缩放到输入图上可能只有几个像素宽特征图上的响应区域太小。 解决先把训练和推理分辨率提到960或1280配合--scale参数让YOLOv5在训练时对原图做适度缩放而非严格压到固定尺寸。另外跑一次anchor聚类检查默认anchor是否覆盖了数据集里小目标框的尺寸分布必要时手工修改模型配置里的anchor。这一步做完mAP50-95的提升通常会很明显。5.4 验证集指标高但实际图片检测差数据泄露或场景单一现象val集mAP50达98但拿现场拍的新PCB板测试漏检一片。 原因数据泄露是头号嫌疑——划分train/val时同一张PCB板的不同视角图被分到了两边模型在val上见过相似图像。其次这1297张图如果全部是同一光源、同一背景、同一相机角度拍的模型的泛化能力天然有限。 解决严格按板子批次或拍摄时间划分数据集不要随机划分全量数据。这部分资源如果只提供了一个目录没有subdir你只能通过图片文件名里可能存在的编号区分批次。更实际的做法是训练后用现场拍摄的图片做一轮增广测试把亮度、对比度扰动加进去看指标回落幅度这个数字比val集指标更能说明模型能不能落地。6. 把模型用到新图片上推理脚本、输出处理与置信度调优训练结束不代表流程走完一套能用的PCB缺陷检测流程还包括推理端到端的细节处理。先看一个标准的单图推理脚本它比hub.load方式更能反映部署环境的真实行为。import cv2 import torch model torch.hub.load(ultralytics/yolov5, custom, pathbest.pt, force_reloadTrue) model.eval() model.conf 0.3 model.iou 0.5 model.max_det 300 img cv2.imread(real_pcb.jpg) img_rgb cv2.cvtColor(img, cv2.COLOR_BGR2RGB) results model(img_rgb, size960) boxes results.xyxy[0].cpu().numpy() for box in boxes: x1, y1, x2, y2, score, cls box cv2.rectangle(img, (int(x1), int(y1)), (int(x2), int(y2)), (0, 0, 255), 2) label f{model.names[int(cls)]} {score:.2f} cv2.putText(img, label, (int(x1), int(y1)-5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2) cv2.imwrite(real_pcb_pred.jpg, img)一段段拆开说明。model.max_det 300限制单图最多输出的检测框数量防止某些噪声区域出现大量假阳性框把结果淹没。model.conf设0.3是平衡点——PCB缺陷检测的代价不对称漏检一块缺陷的损失远大于多框一个正常位置所以置信度宁可调低一点让更多的潜在缺陷暴露出来再由人工复检环节过滤。size960是从训练经验来的如果训练时用的640推理用960会得到更好的小目标召回因为网络实际看到的特征图分辨率更高但这个做法会在小目标较多时显著增加推理耗时CPU上跑一帧能差出两到三倍时间。推理输出还有一个常见需求把xyxy格式的框转成Pascal VOC或COCO格式给下游的统计报表或MES系统使用。我通常会把所有检测结果汇总到一张csv里包含文件名、类别、置信度、框坐标方便后续做缺陷统计。这里有一个实用技巧值得记住建议记录原始图尺寸而不是推理尺寸下的坐标因为推理时图片可能做了letterbox填充坐标需要按缩放比例和padding偏移换算回原图坐标系。YOLOv5的results对象里results.xyxy[0]直接给的是原图坐标但如果你自己用模型的前处理接口这一步容易翻车我见过多次部署脚本里坐标整体偏移几个像素就来源于此。至于最终系统怎么用取决于应用环境。静态图片检测一般够用如果是流水线摄像头实时检测需要把上面的脚本包成类用固定帧率从摄像头或RTSP流拉图每帧推理一次。树莓派这类低算力设备上部署yolov5s模型640分辨率下可以跑到接近实时的速度但用960分辨率会明显掉帧建议嵌入设备固定640把置信度阈值再降到0.25用小目标的召回换速度。处理完一批新图后我会强制做一次人工抽检把推理输出的框叠加图打印出来逐张和原图对比确认没有整片漏检区域。这个习惯是被一次现场事故逼出来的——当时训练集里漏孔类图片全是绿色阻焊板换到蓝色阻焊板的PCB上漏检率直接翻倍。从那以后我每次做缺陷检测项目都强制走一遍完整推理验证流程固定用不同颜色板子的图片各抽20张做交叉测试确认指标稳定后才会交付模型。希望帮到你。本文还有配套的精品资源点击获取
上一篇/下一篇内容由系统自动关联
返回资讯列表 →