基于 YOLOv8 的PCB 缺陷检测系统

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 板块编号分组存放(group00041group12000 等),每个组包含带缺陷的测试图(*_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 后取平均,对定位精度要求更严格。
  • PrecisionTP / (TP + FP),值越高代表误报越少。
  • RecallTP / (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 年

相关推荐
tobias.b2 小时前
李宏毅-2022-深度学习课程-2-18-深度学习基础概念下
人工智能·深度学习
zhaoshuzhaoshu2 小时前
设计模式之行为型设计模式详解
python·设计模式
QQ676580082 小时前
基于yolo26算法的水下目标检测图像数据集 海洋生物识别 海胆识别 海龟识别数据集 海洋生物监测与保护工作 潜水作业安全辅助系 水下环境感知第10408期
算法·目标检测·水下目标检测·海洋生物识别·海胆 海龟识别·海洋生物监测与保护工作·潜水作业安全辅助 水下环境感知
sp_fyf_20242 小时前
【大语言模型】 揭秘OPD:大语言模型的长度膨胀与稳定化策略
人工智能·深度学习·神经网络·机器学习·语言模型
sp_fyf_20242 小时前
【大语言模型】OpenVLThinkerV2:面向多领域视觉任务的通用型多模态推理模型
人工智能·深度学习·学习·语言模型·transformer
xiaoyaohou112 小时前
014、Neck结构改进(二):自适应空间特征金字塔(ASPP)的引入
深度学习·计算机视觉·cnn
__Wedream__2 小时前
NTIRE 2026 Challenge on Efficient Super-Resolution——冠军方案解读
人工智能·深度学习·算法·计算机视觉·超分辨率重建
FL16238631293 小时前
基于深度学习mediape实现人员跌倒人体姿势跌倒检测算法源码+说明文件
人工智能·深度学习·算法