项目简介
本项目是一个面向钢材表面缺陷检测场景的深度学习应用系统,围绕 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_x、center_y表示目标框中心点坐标,已归一化到0~1width、height表示目标框宽高,已归一化到0~1
7. 数据集构建与处理过程
本项目在数据处理阶段主要完成了以下工作:
- 将
NEU-DET数据集整理为YOLO标准目录格式,区分训练集和验证集。 - 保持图像文件与标注文件一一对应,便于训练阶段自动索引。
- 在
core/data_config.py中自动生成neu_det_data.yaml,统一描述数据集路径、类别数量和类别名称。 - 采用相对路径组织数据集配置,方便项目迁移与复现。
- 基于统一类别映射,将后续训练、推理、统计分析和 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. 训练流程说明
本项目的训练流程可以概括为:
- 读取项目配置和数据集路径
- 自动生成
neu_det_data.yaml - 加载预训练模型
yolov8n.pt - 基于 NEU-DET 数据集进行迁移学习训练
- 在训练过程中同步进行验证并保存训练曲线
- 输出权重文件、训练日志、可视化结果图
该流程体现了深度学习目标检测项目中的典型训练范式,即以公开预训练权重为起点,通过任务数据集进行微调,并结合验证集进行持续评估。
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. 模型训练与调优思路
本项目在模型训练与调优方面体现了以下几个基本过程:
- 选择轻量化模型
YOLOv8n作为初始方案,兼顾训练速度和部署效率。 - 使用预训练权重开展迁移学习,减少从零训练的成本。
- 设定
100轮训练,观察损失曲线和评估指标变化趋势。 - 结合
Precision、Recall、mAP50、mAP50-95综合评估模型检测效果。 - 在系统部署阶段开放
conf、iou、max_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_loss、cls_loss、dfl_loss 变化曲线 |
val_loss.png |
验证阶段 box_loss、cls_loss、dfl_loss 变化曲线 |
metrics.png |
Precision、Recall、mAP50、mAP50-95 曲线 |
learning_rate.png |
学习率随 Epoch 变化的曲线 |
loss_summary.png |
训练损失与验证损失的汇总对比图 |
overview.png |
总体训练效果总览图,包括总损失、mAP、Precision/Recall 等 |
results.csv |
每轮训练与验证的原始数值日志 |
args.yaml |
当前训练实验使用的完整参数快照 |
自定义可视化脚本
项目额外实现了 plot_train_results.py 与 core/plot_results.py,可基于 results.csv 自定义生成以下训练结果图:
train_loss.pngval_loss.pngmetrics.pnglearning_rate.pngloss_summary.pngoverview.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 曲线
- 汇总显示最终轮关键指标
系统集成与工程实现
本项目并不是单纯的训练脚本,而是将模型能力封装成了完整应用系统,主要体现在:
- 将目标检测模型封装为统一的
SteelDefectDetector检测器类。 - 将训练结果与推理参数打通,在桌面端可以直接加载模型并调整阈值。
- 将推理输出解析为结构化检测结果,进一步用于表格统计、分布分析和历史记录保存。
- 将图片、视频、摄像头三种输入统一集成到一个系统中。
- 将训练阶段的指标分析功能直接集成到 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














