PCB 缺陷检测系统
基于 YOLOv8 目标检测算法,针对 PCB(印刷电路板)表面缺陷进行识别与分类的桌面端智能检测系统。系统覆盖从数据集构建、模型训练调优到多场景可视化检测的完整深度学习开发链路。
目录
数据集
数据来源
本项目使用 DeepPCB 公开数据集(由北京大学团队提供),包含真实 PCB 生产线上采集的缺陷图像,每张图像均配有对应的缺陷标注文件。
缺陷类别
共 6 种 PCB 表面缺陷类型:
| 英文标签 | 中文名称 | 说明 |
|---|---|---|
open |
断路 | 铜线断开,导致电路不通 |
short |
短路 | 两条相邻导线意外连接 |
mousebite |
鼠咬 | 导线边缘出现连续小缺口 |
spur |
毛刺 | 铜线边缘不规则突起 |
spurious_copper |
多余铜 | 非预期位置残留多余铜箔 |
pin_hole |
针孔 | 铜面上出现的微小圆孔 |
图像数量与划分
| 数据集划分 | 图像数量 | 说明 |
|---|---|---|
| 训练集(train) | 1050 张 | 用于模型权重学习 |
| 验证集(val) | 150 张 | 用于训练过程中监控指标 |
| 测试集(test) | 300 张 | 用于最终模型性能评估 |
| 合计 | 1500 张 | --- |
- 图像格式:JPG
- 标注格式:YOLO 格式(
.txt,每行类别ID cx cy w h,坐标归一化) - 图像尺寸:训练时统一缩放至 640×640
深度学习开发过程
1. 数据集的构建与处理
原始数据整理
DeepPCB 数据集按 PCB 板块编号分组存放(group00041、group12000 等),每个组包含带缺陷的测试图(*_test.jpg)和对应的无缺陷参考图(*_not 目录)。
格式转换
将 DeepPCB 原始标注格式转换为 YOLOv8 所需的 YOLO 格式,每个图像对应一个 .txt 标注文件,类别从 0 开始编号,边界框坐标转换为相对归一化值(cx、cy、w、h)。
数据集配置
通过 data.yaml 声明训练集/验证集/测试集路径及类别信息:
nc: 6
names: ['open', 'short', 'mousebite', 'spur', 'spurious_copper', 'pin_hole']
train: train/images
val: val/images
test: test/images
数据增强策略(训练时在线增强)
| 增强方式 | 参数 | 说明 |
|---|---|---|
| Mosaic | 1.0 | 4 图拼接,丰富背景和尺度 |
| 水平翻转 | 0.5 | 随机左右翻转 |
| HSV 色调抖动 | H=0.015, S=0.7, V=0.4 | 亮度/饱和度/色调随机扰动 |
| 缩放 | 0.5 | 随机图像缩放 |
| 平移 | 0.1 | 随机平移 |
| 随机擦除 | 0.4 | 随机遮挡区域,提升遮挡鲁棒性 |
| RandAugment | auto | 自动组合多种增强策略 |
| Close Mosaic | 最后 10 epoch 关闭 | 收敛阶段取消 Mosaic,精细拟合 |
2. 模型训练与调优
基础模型
以 YOLOv8n(Nano 版本)的官方预训练权重(yolov8n.pt)为起点,进行迁移学习微调。
完整训练参数
| 参数 | 值 | 说明 |
|---|---|---|
epochs |
30 | 总训练轮次 |
batch |
8 | 每批次图像数量 |
imgsz |
640 | 输入图像尺寸 |
optimizer |
auto(AdamW) | 自动选择优化器 |
lr0 |
0.01 | 初始学习率 |
lrf |
0.01 | 最终学习率系数(余弦衰减) |
cos_lr |
true | 余弦学习率调度 |
momentum |
0.937 | 优化器动量 |
weight_decay |
0.0005 | L2 正则化权重衰减 |
warmup_epochs |
3 | 学习率热身轮次 |
warmup_momentum |
0.8 | 热身阶段初始动量 |
dropout |
0.1 | Dropout 正则化率 |
patience |
20 | 早停耐心(验证指标无提升时的等待轮次) |
seed |
42 | 随机种子(保证可复现) |
amp |
true | 自动混合精度训练 |
device |
cpu | 训练设备 |
损失函数权重
| 损失项 | 权重 | 说明 |
|---|---|---|
box |
7.5 | 边界框回归损失(CIoU) |
cls |
0.5 | 分类交叉熵损失 |
dfl |
1.5 | 分布式焦点损失(DFL) |
训练日志目录 :yolov8_pcb_detection_results/models/train_20251230_163934/
3. 训练指标说明
训练结束后的关键性能指标(取各指标最优值):
| 指标 | 值 | 说明 |
|---|---|---|
| mAP50 | 98.58% | IoU=0.5 时的平均精度均值,衡量整体检测能力 |
| mAP50-95 | 71.42% | IoU=0.5~0.95 的平均精度均值,衡量精确定位能力 |
| Precision(精确率) | 97.48% | 所有预测为正例中真正为正例的比例,反映误检控制能力 |
| Recall(召回率) | 96.04% | 所有真实正例中被检测出的比例,反映漏检控制能力 |
| F1 分数 | ≈96.75% | 精确率与召回率的调和平均,综合评估指标 |
| 最终 Val Box Loss | 1.0975 | 验证集边界框回归损失 |
| 最终 Val Cls Loss | 0.5392 | 验证集分类损失 |
| 最优 Epoch | Epoch 30 | mAP50 达到最高点的训练轮次 |
| 总训练耗时 | ~7527 秒 | CPU 环境完整 30 轮训练时长 |
指标含义说明
- mAP50:以 IoU=0.5 为正样本判定阈值,计算所有类别 AP(精度-召回曲线下面积)的均值,是目标检测最常用的综合性能指标。
- mAP50-95:在 IoU=0.50、0.55、...、0.95 共 10 个阈值下分别计算 mAP 后取平均,对定位精度要求更严格。
- Precision :
TP / (TP + FP),值越高代表误报越少。 - Recall :
TP / (TP + FN),值越高代表漏报越少。 - Box Loss:衡量预测框与真实框之间的位置偏差,值越小越好。
- Cls Loss:衡量缺陷类别分类误差,值越小越好。
- DFL Loss:分布式焦点损失,用于精确预测边界框坐标的概率分布,值越小定位越精准。
4. 可视化图含义
训练结束后在 models/train_20251230_163934/ 目录下自动生成以下可视化图:
| 文件名 | 含义 |
|---|---|
results.png |
综合训练曲线:包含训练损失(box/cls/dfl)、验证损失、Precision、Recall、mAP50、mAP50-95 随 Epoch 的变化折线图,可直观观察模型收敛过程和过拟合情况。 |
confusion_matrix.png |
混淆矩阵(绝对值):行为真实类别,列为预测类别,对角线为正确识别数量,非对角线为误判数量,用于分析哪些缺陷类别容易混淆。 |
confusion_matrix_normalized.png |
归一化混淆矩阵(百分比):每行归一化为 1,对角线色块越亮代表该类识别准确率越高,便于跨类别横向比较。 |
BoxF1_curve.png |
F1-置信度曲线:展示不同置信度阈值下 F1 分数的变化,曲线峰值点对应最优 F1 及最佳检测阈值。 |
BoxPR_curve.png |
P-R 曲线(精确率-召回率曲线):曲线下面积即 mAP,曲线越"胖"(靠近右上角)代表模型综合性能越好。 |
BoxP_curve.png |
Precision-置信度曲线:展示不同阈值下查准率的变化,阈值越高精确率通常越高但召回率下降。 |
BoxR_curve.png |
Recall-置信度曲线:展示不同阈值下查全率的变化,阈值越低召回率越高。 |
labels.jpg |
标签分布图:展示各类别目标框的尺寸分布(宽高散点图)及位置分布(热力图),用于分析数据集分布特征。 |
train_batch*.jpg |
训练批次样本图:展示训练时某批次图像及其真实标注框,可验证数据标注和增强效果是否符合预期。 |
val_batch*_labels.jpg |
验证集真实标注:验证集某批次图像的真实标注框,用于与模型预测结果对比。 |
val_batch*_pred.jpg |
验证集模型预测 :对应批次上模型的实际预测结果,与 labels 图对比可直观感受检测效果。 |
系统功能
系统采用 PyQt6 构建桌面端 GUI,集成用户管理、多场景检测与历史记录功能。
用户管理
- 登录 / 注册功能,密码经 SHA-256 哈希后存储至 SQLite 数据库
- 内置默认管理员账户(用户名
admin,初始密码admin123)
图片检测
- 支持打开单张图片(JPG / PNG / BMP / TIF 等格式)
- 加载模型后一键推理,结果页展示:
- 带标注框的结果图(可导出为图片)
- 统计摘要(总检测数、类别数、平均置信度、最高置信度)
- 类别分布表格(各类缺陷数量及占比)
- 详细数据表格(每个目标的类别、置信度、坐标、面积)
- 置信度分布直方图
- 支持导出 CSV 报告
视频检测
- 导入本地视频文件,逐帧推理并实时显示检测结果
- 支持帧率间隔设置,兼顾检测精度与播放流畅度
摄像头实时检测
- 调用本地摄像头进行实时视频流检测
- 支持一键开启/暂停检测,推理结果实时叠加显示
训练指标可视化
- 训练曲线页:4 子图展示训练损失、验证损失、mAP 指标、精确率/召回率随 Epoch 的变化
- 指标汇总页:卡片式展示最优 mAP50、mAP50-95、精确率、召回率、最优轮次、损失值,以及核心指标柱状图
- 雷达分析页:雷达图多维度综合展示 mAP50、mAP50-95、精确率、召回率、F1 分数,并附 mAP50 趋势面积图和综合评分
- 支持多个训练记录切换对比
模型管理
- 支持加载本地任意
.pt格式的 YOLOv8 模型文件 - 可动态调整推理置信度阈值(conf)、IoU 阈值、最大检测数
历史记录
- 每次检测结果自动写入本地 SQLite 数据库
- 支持按检测类型(图片/视频/摄像头)筛选,支持关键词搜索
- 支持导出历史记录为 CSV 文件,支持一键清除历史
项目技术栈
| 技术 / 库 | 用途 |
|---|---|
| Python 3.9 | 运行环境 |
| PyQt6 | 桌面 GUI 框架 |
| Ultralytics YOLOv8 | 目标检测模型(训练 + 推理) |
| OpenCV(opencv-python) | 图像/视频读取与处理 |
| Matplotlib | 训练曲线、雷达图、柱状图等可视化 |
| NumPy | 数值计算与数组操作 |
| SQLite3(内置) | 用户信息与历史记录持久化 |
项目结构
c180/
├── main.py # 程序入口,初始化应用与窗口
├── config.py # 全局配置(路径、类别、默认参数)
├── pcb_data.yaml # 训练数据集配置文件
├── yolov8n.pt # YOLOv8n 官方预训练权重
├── requirements.txt # Python 依赖列表
│
├── data/
│ └── history.db # SQLite 数据库(用户 + 历史记录)
│
├── ui/ # UI 层
│ ├── login_window.py # 登录 / 注册窗口
│ ├── main_window.py # 主窗口(侧边栏 + 页面容器)
│ └── pages/ # 各功能页面
│ ├── image_page.py # 图片检测页
│ ├── video_page.py # 视频检测页
│ ├── camera_page.py # 摄像头实时检测页
│ ├── metrics_page.py # 训练指标可视化页
│ ├── model_page.py # 模型管理页
│ └── history_page.py # 历史记录页
│
├── utils/ # 工具层
│ ├── detector.py # YOLO 检测器封装(同步 + 视频/摄像头线程)
│ ├── database.py # 数据库管理(用户、历史记录 CRUD)
│ └── styles.py # 全局样式定义
│
├── DeepPCB/ # 原始数据集目录
│ ├── PCBData/ # PCB 图像及标注数据
│ │ ├── group00041/ # 各板块分组原始数据
│ │ ├── ...
│ │ └── yolov8_pcb_detection_results/ # 训练结果(含模型权重)
│ └── tools/ # 数据标注工具(Qt C++)
│
└── yolov8_pcb_detection_results/ # 最终训练结果(供系统调用)
└── yolov8_pcb_detection_results/
├── best_model.pt # 最优模型权重
├── models/
│ └── train_20251230_163934/ # 本次训练记录
│ ├── results.csv # 逐 Epoch 训练日志
│ ├── results.png # 综合训练曲线图
│ ├── confusion_matrix*.png # 混淆矩阵
│ ├── Box*.png # F1/PR/P/R 曲线
│ ├── labels.jpg # 标签分布图
│ ├── train_batch*.jpg # 训练批次样本
│ ├── val_batch*_labels.jpg # 验证集真实标注
│ ├── val_batch*_pred.jpg # 验证集预测结果
│ ├── args.yaml # 完整训练参数记录
│ └── weights/ # 阶段性权重存档
│ ├── best.pt
│ └── last.pt
└── yolo_dataset/ # YOLO 格式转换后的数据集
├── data.yaml
├── train/images & labels
├── val/images & labels
└── test/images & labels
启动教程
1. 安装依赖
pip install -r requirements.txt
2. 确认模型文件
确保以下路径存在模型文件(已包含在项目中):
yolov8_pcb_detection_results/yolov8_pcb_detection_results/best_model.pt
3. 启动程序
在项目根目录下运行:
python main.py
4. 登录系统
使用默认管理员账户登录:
- 用户名:
admin - 密码:
admin123
也可在登录界面注册新账户后使用。
5. 加载模型并开始检测
进入【模型管理】页面,选择本地 .pt 模型文件完成加载,随后即可在【图片检测】、【视频检测】、【摄像头检测】页面进行推理。
作者信息
| 作者 | Jay |
| 定制联系 | vx:Jay8059 |
| 开发年份 | 2026 年 |














