基于YOLOv8的钢材表面缺陷检测系统

项目简介

本项目是一个面向钢材表面缺陷检测场景的深度学习应用系统,围绕 YOLOv8 完成了从数据集组织、模型训练、结果评估,到桌面端检测系统开发与功能集成的完整流程。项目以 NEU-DET 钢材表面缺陷数据集为基础,训练得到钢材缺陷检测模型,并基于 PyQt6 开发了可视化检测系统,支持图片识别、视频识别、摄像头实时识别、检测历史管理、模型参数管理和训练指标展示等功能。

该项目不仅体现了目标检测模型开发的基本过程,也体现了深度学习模型向工程化系统落地的完整思路。

项目目标

  • 面向钢材表面质量检测任务,构建可用的缺陷检测模型
  • 基于标准数据集完成目标检测任务的数据组织与训练验证
  • 通过训练损失、精确率、召回率、mAP 等指标评估模型性能
  • 将训练后的模型封装为可交互的桌面应用,实现实际检测功能
  • 形成"数据处理 -> 模型训练 -> 结果分析 -> 系统集成"的完整项目闭环

项目技术栈

类别 技术/工具 说明
深度学习框架 YOLOv8 / Ultralytics 用于目标检测模型训练、验证与推理
模型基础 yolov8n.pt 采用预训练 nano 级模型作为训练起点
编程语言 Python 项目核心开发语言
图像/视频处理 OpenCV 用于视频读取、摄像头采集、结果保存
数值计算 NumPy 用于图像与推理数据处理
数据分析 Pandas 用于读取训练日志 results.csv
可视化 Matplotlib 用于训练曲线和指标图绘制
桌面界面 PyQt6 用于构建检测系统 UI
数据存储 SQLite 用于保存检测历史记录

数据集介绍

1. 数据集来源

项目使用 NEU-DET(Northeastern University Surface Defect Detection Dataset)钢材表面缺陷数据集。该数据集是钢材表面缺陷检测领域常用的公开数据集之一,适用于工业视觉检测和目标检测算法研究。

2. 数据集基本信息

项目 内容
数据集名称 NEU-DET
应用场景 钢材表面缺陷检测
图像类型 灰度图像
图像格式 JPG
图像分辨率 200 x 200
标注格式 YOLO 目标检测格式
缺陷类别数 6
总图像数量 1800
标注文件数量 1800

3. 缺陷类别

类别ID 英文名称 中文名称 每类总数
0 crazing 龟裂 300
1 inclusion 夹杂 300
2 patches 斑块 300
3 pitted_surface 点蚀表面 300
4 rolled-in_scale 压入氧化皮 300
5 scratches 划痕 300

4. 数据划分

项目中的数据划分如下:

数据集划分 图像数量 标注数量 说明
训练集 train/images 1770 1770 每类 295 张
验证集 valid/images 30 30 每类 5 张
总计 1800 1800 6 类均衡分布

5. 数据集目录结构

复制代码
NEU-DET/
├── train/
│   ├── images/                # 训练图像
│   └── labels/                # 训练标注
├── valid/
│   ├── images/                # 验证图像
│   └── labels/                # 验证标注
└── 数据集介绍.md              # 数据集说明文档

6. 标注格式说明

每张图片对应一个同名的 .txt 标注文件,采用 YOLO 检测格式:

复制代码
class_id center_x center_y width height

其中:

  • class_id 表示类别编号
  • center_xcenter_y 表示目标框中心点坐标,已归一化到 0~1
  • widthheight 表示目标框宽高,已归一化到 0~1

7. 数据集构建与处理过程

本项目在数据处理阶段主要完成了以下工作:

  1. NEU-DET 数据集整理为 YOLO 标准目录格式,区分训练集和验证集。
  2. 保持图像文件与标注文件一一对应,便于训练阶段自动索引。
  3. core/data_config.py 中自动生成 neu_det_data.yaml,统一描述数据集路径、类别数量和类别名称。
  4. 采用相对路径组织数据集配置,方便项目迁移与复现。
  5. 基于统一类别映射,将后续训练、推理、统计分析和 UI 展示保持一致。

当前数据配置文件如下:

复制代码
path: NEU-DET
train: train/images
val: valid/images

nc: 6
names: ['crazing', 'inclusion', 'patches', 'pitted_surface', 'rolled-in_scale', 'scratches']

模型训练流程

1. 训练入口

模型训练入口文件为 train.py。程序会先初始化项目路径与编码配置,然后自动生成数据集配置文件,再加载 YOLOv8 模型并开始训练,训练结果默认输出到 train_result/exp/

2. 训练流程说明

本项目的训练流程可以概括为:

  1. 读取项目配置和数据集路径
  2. 自动生成 neu_det_data.yaml
  3. 加载预训练模型 yolov8n.pt
  4. 基于 NEU-DET 数据集进行迁移学习训练
  5. 在训练过程中同步进行验证并保存训练曲线
  6. 输出权重文件、训练日志、可视化结果图

该流程体现了深度学习目标检测项目中的典型训练范式,即以公开预训练权重为起点,通过任务数据集进行微调,并结合验证集进行持续评估。

3. 训练参数

代码默认训练参数

以下参数定义在 core/config.py 中:

参数 说明
模型 yolov8n.pt 轻量级预训练检测模型
epochs 100 训练轮数
batch 16 批大小
imgsz 640 输入图像尺寸
seed 42 随机种子
workers 0 Windows 环境下避免页面文件不足问题
project train_result 训练结果输出目录
name exp 当前实验名称
save True 保存训练结果
plots True 保存训练曲线图
val True 每轮执行验证

当前训练记录中的主要参数

根据 train_result/exp/args.yaml,本项目现有训练记录包含以下超参数信息:

参数
optimizer auto
pretrained true
patience 100
iou 0.7
lr0 0.01
lrf 0.01
momentum 0.937
weight_decay 0.0005
warmup_epochs 3.0
mosaic 1.0
fliplr 0.5
translate 0.1
scale 0.5

这些参数体现了模型训练中的基础调优手段,包括:

  • 使用预训练权重提升收敛速度
  • 通过学习率、动量、权重衰减控制优化过程
  • 通过数据增强提升模型泛化能力
  • 通过验证指标持续监控训练效果

4. 模型训练与调优思路

本项目在模型训练与调优方面体现了以下几个基本过程:

  1. 选择轻量化模型 YOLOv8n 作为初始方案,兼顾训练速度和部署效率。
  2. 使用预训练权重开展迁移学习,减少从零训练的成本。
  3. 设定 100 轮训练,观察损失曲线和评估指标变化趋势。
  4. 结合 PrecisionRecallmAP50mAP50-95 综合评估模型检测效果。
  5. 在系统部署阶段开放 confioumax_det 等推理参数,实现训练后应用层调优。

训练结果与指标分析

1. 当前训练记录结果

根据 train_result/exp/results.csv 最终轮结果,当前模型在第 100 轮训练结束时的关键指标如下:

指标 数值
Precision 0.74897
Recall 0.88631
mAP@0.5 0.84935
mAP@0.5:0.95 0.47914
Train Box Loss 1.04576
Train Cls Loss 1.00979
Train DFL Loss 1.24859
Val Box Loss 1.40737
Val Cls Loss 1.10456
Val DFL Loss 1.44337

2. 指标含义说明

指标 含义
Precision 预测为缺陷的目标中,有多少是真正正确的,反映误检控制能力
Recall 实际存在的缺陷中,有多少被模型检测出来,反映漏检控制能力
mAP@0.5 在 IoU=0.5 条件下的平均精度,常用于衡量整体检测效果
mAP@0.5:0.95 在多个 IoU 阈值下综合计算的平均精度,对定位质量要求更高
Box Loss 边界框回归损失,反映定位学习效果
Cls Loss 分类损失,反映类别判别能力
DFL Loss Distribution Focal Loss,反映边界框细粒度回归质量

3. 结果分析

  • Recall 高于 Precision,说明模型对缺陷目标的召回能力较强,漏检相对较少。
  • mAP@0.5 达到较高水平,说明模型在基础检测任务上具备较好的识别能力。
  • mAP@0.5:0.95 明显低于 mAP@0.5,说明在更严格定位标准下,边界框质量仍有继续提升空间。
  • 验证损失整体高于训练损失,说明模型在小规模验证集上存在一定泛化波动。
  • 由于当前验证集仅 30 张图像,指标更适合作为项目训练结果展示与工程验证参考。

可视化结果图说明

项目训练结果保存在 train_result/exp/ 下,当前目录中包含以下结果文件:

复制代码
train_result/exp/
├── args.yaml
├── labels.jpg
├── train_batch0.jpg
├── train_batch1.jpg
├── train_batch2.jpg
├── train_loss.png
├── val_loss.png
├── metrics.png
├── learning_rate.png
├── loss_summary.png
├── overview.png
└── results.csv

各图像和结果文件的含义如下:

文件名 含义说明
labels.jpg 展示数据集标签分布、框位置分布等,用于检查标注质量与类别分布
train_batch0.jpg / train_batch1.jpg / train_batch2.jpg 训练批次样本可视化,展示训练时输入图像及目标框
train_loss.png 训练阶段 box_losscls_lossdfl_loss 变化曲线
val_loss.png 验证阶段 box_losscls_lossdfl_loss 变化曲线
metrics.png PrecisionRecallmAP50mAP50-95 曲线
learning_rate.png 学习率随 Epoch 变化的曲线
loss_summary.png 训练损失与验证损失的汇总对比图
overview.png 总体训练效果总览图,包括总损失、mAP、Precision/Recall 等
results.csv 每轮训练与验证的原始数值日志
args.yaml 当前训练实验使用的完整参数快照

自定义可视化脚本

项目额外实现了 plot_train_results.pycore/plot_results.py,可基于 results.csv 自定义生成以下训练结果图:

  • train_loss.png
  • val_loss.png
  • metrics.png
  • learning_rate.png
  • loss_summary.png
  • overview.png

这部分体现了项目在训练后分析阶段的工程补充能力,而不只是依赖框架默认输出。

系统功能介绍

项目基于 PyQt6 开发了桌面端钢材表面缺陷检测系统,主要包括以下功能模块:

1. 登录与注册

  • 支持用户登录和注册
  • 用户信息保存在本地 users.json
  • 密码使用 SHA-256 哈希保存

2. 图片识别

  • 导入单张图片进行缺陷检测
  • 显示检测后的标注结果图
  • 展示目标总数、类别数、平均置信度、最高置信度
  • 展示类别分布表、目标明细表、置信度分布图
  • 支持导出检测结果图片和 CSV
  • 支持将检测记录写入历史数据库

3. 视频识别

  • 导入本地视频文件进行检测
  • 支持按"每 N 帧检测一次"控制推理频率
  • 展示当前帧检测结果和本次视频累计统计
  • 支持将视频检测结果保存到历史记录

4. 摄像头实时识别

  • 支持选择摄像头编号并启动实时检测
  • 支持检测开关切换
  • 支持按"每 N 帧检测一次"平衡实时性与性能
  • 支持截图保存
  • 支持保存当前会话统计到历史记录

5. 检测历史管理

  • 使用 SQLite 保存图片、视频、摄像头检测记录
  • 支持按类型筛选、按关键词搜索
  • 支持查看详细记录
  • 支持导出历史 CSV
  • 支持清空历史记录

6. 模型管理

  • 支持浏览并加载本地 .pt 模型权重
  • 默认尝试加载 train_result/exp/weights/best.pt
  • 支持配置推理参数:
    • conf:置信度阈值
    • iou:NMS 的 IoU 阈值
    • max_det:单图最大检测目标数
  • 展示模型基本信息和类别说明

7. 指标展示

  • 自动扫描 train_result/ 下的训练记录
  • 可切换不同训练实验查看指标
  • 展示训练损失曲线、mAP 曲线、Precision/Recall 曲线
  • 汇总显示最终轮关键指标

系统集成与工程实现

本项目并不是单纯的训练脚本,而是将模型能力封装成了完整应用系统,主要体现在:

  1. 将目标检测模型封装为统一的 SteelDefectDetector 检测器类。
  2. 将训练结果与推理参数打通,在桌面端可以直接加载模型并调整阈值。
  3. 将推理输出解析为结构化检测结果,进一步用于表格统计、分布分析和历史记录保存。
  4. 将图片、视频、摄像头三种输入统一集成到一个系统中。
  5. 将训练阶段的指标分析功能直接集成到 UI 中,形成训练与应用闭环。

这体现了深度学习项目从"模型开发"走向"系统落地"的完整过程。

项目结构

复制代码
c29/
├── core/
│   ├── config.py                 # 训练配置常量
│   ├── data_config.py            # 自动生成数据集 YAML
│   ├── path_utils.py             # 路径与编码工具
│   └── plot_results.py           # 训练结果绘图
├── NEU-DET/
│   ├── train/
│   │   ├── images/
│   │   └── labels/
│   ├── valid/
│   │   ├── images/
│   │   └── labels/
│   └── 数据集介绍.md
├── train_result/
│   └── exp/                      # 训练输出目录
├── ui/
│   ├── pages/
│   │   ├── image_page.py         # 图片识别页
│   │   ├── video_page.py         # 视频识别页
│   │   ├── camera_page.py        # 摄像头识别页
│   │   ├── history_page.py       # 检测历史页
│   │   ├── model_page.py         # 模型管理页
│   │   └── metrics_page.py       # 指标展示页
│   ├── utils/
│   │   ├── detector.py           # YOLOv8 检测器封装
│   │   ├── db.py                 # SQLite 历史记录工具
│   │   ├── styles.py             # 界面样式
│   │   └── button_helpers.py     # 按钮样式辅助
│   ├── login_window.py           # 登录/注册窗口
│   ├── main_window.py            # 主窗口
│   └── users.json                # 用户数据
├── neu_det_data.yaml             # 数据集配置文件
├── train.py                      # 模型训练入口
├── plot_train_results.py         # 训练结果绘图入口
├── run_ui.py                     # 桌面系统启动入口
├── detection_history.db          # 检测历史数据库
└── requirements.txt              # 项目依赖

项目运行说明

1. 安装依赖

复制代码
pip install -r requirements.txt

2. 模型训练

复制代码
python train.py

训练完成后,结果默认保存在 train_result/exp/

3. 训练结果可视化

复制代码
python plot_train_results.py

4. 启动检测系统

复制代码
python run_ui.py

相关推荐
天若有情6732 小时前
通用个性化推荐核心架构思路:从视频到电商的跨场景落地实践
人工智能·算法·架构·推流·个性化推荐·猜你喜欢
s09071362 小时前
【声纳成像】基于滑动子孔径与加权拼接的条带式多子阵SAS连续成像(MATLAB仿真)
开发语言·算法·matlab·合成孔径声呐·后向投影算法·条带拼接
zzh940772 小时前
Gemini 3.1 Pro 训练范式深度解析:合成数据、课程学习与多阶段优化的工程实践
人工智能·深度学习
xixixi777772 小时前
2026 年 03 月 20 日 AI+通信+安全行业日报(来更新啦)
大数据·人工智能·安全·ai·大模型·通信
愚公搬代码2 小时前
【愚公系列】《剪映+DeepSeek+即梦:短视频制作》018-特效:轻松提升视频质感(知识拓展:轴线原则)
人工智能·音视频
sanshanjianke2 小时前
AI辅助网文创作理论研究笔记(五):测试环境的搭建和一些问题的讨论
人工智能·笔记·ai写作
Accerlator2 小时前
2026年3月21日刷题
算法
2401_891655812 小时前
此电脑网络位置异常的AD域排错指南的技术文章大纲
开发语言·python·算法