铝合金瑕疵识别系统
一、项目概述
本项目是一个基于 YOLOv8 目标检测 的铝合金表面瑕疵识别系统,通过弱监督学习方法(Grad-CAM)生成伪边界框标注,训练出能够同时定位和识别 11 种瑕疵类型的深度学习模型。系统同时提供了基于 PyQt5 的图形用户界面,支持图片检测、训练结果可视化、数据集浏览和模型训练控制等完整功能。
核心特点
- 端到端检测:输入图片 → 自动定位瑕疵位置 → 输出类别和置信度
- 弱监督标注:利用分类模型 + Grad-CAM 自动生成边界框标注,无需人工标注
- 高精度模型:mAP@0.5 达到 92.55%,可部署于工业质检场景
- PyQt5 GUI:提供直观的可视化界面,支持单张/批量检测
- 中文原生支持:所有类别名称、界面标签均为中文
二、技术架构
┌─────────────────────────────────────────────────────────────┐
│ PyQt5 图形界面层 │
│ ┌──────────────┬──────────────┬──────────────┬────────────┐│
│ │ 🔍 瑕疵检测 │ 📈 训练结果 │ 📂 数据集 │ ⚙ 训练控制 ││
│ └──────────────┴──────────────┴──────────────┴────────────┘│
└─────────────────────────────────────────────────────────────┘
│
┌─────────────────────────────────────────────────────────────┐
│ YOLOv8 目标检测模型 │
│ output/yolov8_train/weights/best.pt │
│ mAP@0.5 = 92.55% │
└─────────────────────────────────────────────────────────────┘
│
┌─────────────────────────────────────────────────────────────┐
│ ResNet18 分类模型 + Grad-CAM │
│ 生成伪边界框标注 → YOLO格式数据集 │
└─────────────────────────────────────────────────────────────┘
│
┌─────────────────────────────────────────────────────────────┐
│ 铝合金瑕疵数据集 │
│ Guangdong Round 1 初赛数据集(11个瑕疵类别) │
└─────────────────────────────────────────────────────────────┘
技术栈
层级
技术
深度学习框架
PyTorch 2.5.1 + CUDA 12.1
目标检测
Ultralytics YOLOv8
图像分类
torchvision ResNet18
弱监督标注
pytorch-grad-cam
图形界面
PyQt5
图像处理
OpenCV, Pillow
数据可视化
matplotlib, pandas
三、项目结构
d:\123\铝合金瑕疵识别\
├── configs/
│ └── config.yaml # 项目配置文件
│
├── dataset/
│ ├── guangdong_round1_train2_20180916/ # 原始训练数据
│ │ └── 瑕疵样本/ # 按瑕疵类别分类的图片
│ │ ├── 不导电/ # 不导电瑕疵图片
│ │ ├── 凸粉/
│ │ ├── 擦花/
│ │ ├── 桔皮/
│ │ ├── 横条压凹/
│ │ ├── 涂层开裂/
│ │ ├── 漏底/
│ │ ├── 碰伤/
│ │ ├── 脏点/
│ │ └── 起坑/
│ │
│ ├── annotations/ # Grad-CAM 生成的伪标注
│ ├── splits/ # 数据集划分文件
│ │ ├── train.txt
│ │ └── val.txt
│ │
│ └── yolo/ # YOLO 格式数据集
│ ├── dataset.yaml # YOLO 数据集配置
│ ├── images/train/
│ ├── images/val/
│ ├── labels/train/
│ └── labels/val/
│
├── output/
│ ├── yolov8_train/ # YOLOv8 训练输出
│ │ ├── weights/
│ │ │ ├── best.pt # 最佳模型权重
│ │ │ └── last.pt # 最新模型权重
│ │ ├── results.csv # 训练指标记录(46轮)
│ │ ├── results.png # 训练曲线(如有)
│ │ ├── confusion_matrix.png # 混淆矩阵(如有)
│ │ ├── PR_curve.png # PR 曲线(如有)
│ │ ├── F1_curve.png # F1 曲线(如有)
│ │ ├── labels.jpg # 类别分布图
│ │ └── train_batch*.jpg # 训练批次预览
│ │
│ ├── class_to_idx.json # 类别到索引映射
│ ├── ultralytics_config/ # Ultralytics 配置缓存
│ └── train_log.txt # 训练日志
│
├── src/
│ ├── data/
│ │ ├── classification_dataset.py # 分类数据集加载器
│ │ ├── dataset_utils.py # 数据集工具函数
│ │ └── transforms.py # 数据增强变换
│ │
│ ├── models/
│ │ ├── classifier.py # ResNet18 分类模型
│ │ └── __init__.py
│ │
│ └── gui/ # === PyQt5 图形界面 ===
│ ├── __init__.py
│ ├── main_window.py # 主窗口(QMainWindow)
│ ├── detector_tab.py # 标签页1:瑕疵检测与可视化
│ ├── training_results_tab.py # 标签页2:训练结果查看
│ ├── dataset_tab.py # 标签页3:数据集浏览与统计
│ ├── training_control_tab.py # 标签页4:模型训练控制
│ ├── detector_worker.py # 检测后台线程(QThread)
│ └── utils.py # GUI 工具函数(字体、图像转换等)
│
├── scripts/
│ ├── run_gui.py # GUI 启动入口
│ ├── train_detector.py # YOLOv8 训练脚本
│ ├── train_classifier.py # ResNet18 分类训练脚本
│ ├── generate_pseudo_labels.py # Grad-CAM 伪标注生成
│ ├── prepare_yolo_dataset.py # YOLO 数据集准备
│ ├── split_dataset.py # 数据集划分
│ └── analyze_dataset.py # 数据集分析
│
├── requirements.txt # Python 依赖列表
├── verify_gui.py # GUI 模块验证脚本
└── README.md # 本文件