项目简介
本项目是一个面向钢材表面缺陷检测场景的深度学习应用系统,围绕 YOLOv8 完成了从数据集组织、模型训练、结果评估,到桌面端检测系统开发与功能集成的完整流程。项目以 NEU-DET 钢材表面缺陷数据集为基础,训练得到钢材缺陷检测模型,并基于 PyQt6 开发了可视化检测系统,支持图片识别、视频识别、摄像头实时识别、检测历史管理、模型参数管理和训练指标展示等功能。
该项目不仅体现了目标检测模型开发的基本过程,也体现了深度学习模型向工程化系统落地的完整思路。
项目目标
- 面向钢材表面质量检测任务,构建可用的缺陷检测模型
- 基于标准数据集完成目标检测任务的数据组织与训练验证
- 通过训练损失、精确率、召回率、mAP 等指标评估模型性能
- 将训练后的模型封装为可交互的桌面应用,实现实际检测功能
- 形成“数据处理 -> 模型训练 -> 结果分析 -> 系统集成”的完整项目闭环
项目技术栈
类别 |
技术/工具 |
说明 |
深度学习框架 |
YOLOv8 / Ultralytics |
用于目标检测模型训练、验证与推理 |
模型基础 |
|
采用预训练 nano 级模型作为训练起点 |
编程语言 |
Python |
项目核心开发语言 |
图像/视频处理 |
OpenCV |
用于视频读取、摄像头采集、结果保存 |
数值计算 |
NumPy |
用于图像与推理数据处理 |
数据分析 |
Pandas |
用于读取训练日志 |
可视化 |
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 |
|
龟裂 |
300 |
1 |
|
夹杂 |
300 |
2 |
|
斑块 |
300 |
3 |
|
点蚀表面 |
300 |
4 |
|
压入氧化皮 |
300 |
5 |
|
划痕 |
300 |
4. 数据划分
项目中的数据划分如下:
数据集划分 |
图像数量 |
标注数量 |
说明 |
训练集 |
1770 |
1770 |
每类 295 张 |
验证集 |
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 中:
参数 |
值 |
说明 |
模型 |
|
轻量级预训练检测模型 |
|
100 |
训练轮数 |
|
16 |
批大小 |
|
640 |
输入图像尺寸 |
|
42 |
随机种子 |
|
0 |
Windows 环境下避免页面文件不足问题 |
|
|
训练结果输出目录 |
|
|
当前实验名称 |
|
|
保存训练结果 |
|
|
保存训练曲线图 |
|
|
每轮执行验证 |
当前训练记录中的主要参数
根据 train_result/exp/args.yaml,本项目现有训练记录包含以下超参数信息:
参数 |
值 |
|
|
|
|
|
100 |
|
0.7 |
|
0.01 |
|
0.01 |
|
0.937 |
|
0.0005 |
|
3.0 |
|
1.0 |
|
0.5 |
|
0.1 |
|
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
各图像和结果文件的含义如下:
文件名 |
含义说明 |
|
展示数据集标签分布、框位置分布等,用于检查标注质量与类别分布 |
|
训练批次样本可视化,展示训练时输入图像及目标框 |
|
训练阶段 |
|
验证阶段 |
|
|
|
学习率随 Epoch 变化的曲线 |
|
训练损失与验证损失的汇总对比图 |
|
总体训练效果总览图,包括总损失、mAP、Precision/Recall 等 |
|
每轮训练与验证的原始数值日志 |
|
当前训练实验使用的完整参数快照 |
自定义可视化脚本
项目额外实现了 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
本项目为个人原创,结构清晰,功能完整,适合计算机视觉方向课程设计、毕业设计和项目演示使用。有定制化需求可以评论或私信作者。