基于 PyTorch 和 ResNet18 的工业零件表面缺陷智能检测系统,验证集准确率达到 98.33%
本项目是《人工智能应用技术》期末课程作业,实现了一套基于 ResNet18 深度学习模型的工业零件表面缺陷智能检测系统。系统采用迁移学习策略,利用在 ImageNet 大规模数据集上预训练的 ResNet18 模型作为基础,通过冻结前 8 层参数并自定义全连接层的方式,实现了对 6 类工业零件表面缺陷的高精度分类。
- 🚀 高精度检测:验证集准确率达到 98.33%,各类别 F1 分数均不低于 0.95
- 🔄 迁移学习:利用 ImageNet 预训练模型,在小样本情况下取得优异性能
- ❄️ 参数冻结:冻结前 8 层参数,仅训练全连接层,提高训练效率
- 🎨 数据增强:采用 RandomResizedCrop 和 RandomHorizontalFlip 提高模型泛化能力
- 🌐 Web 演示:基于 Streamlit 的友好 Web 界面,支持实时缺陷检测
- 📊 可视化分析:自动生成训练曲线,支持各类别性能分析
| 英文类别 | 中文名称 | 描述 |
|---|---|---|
| crazing | 裂纹 | 表面出现细小裂纹 |
| inclusion | 夹杂 | 表面嵌入异物 |
| patches | 斑块 | 表面出现斑块状缺陷 |
| pitted_surface | 麻点 | 表面出现细小凹坑 |
| rolled-in_scale | 氧化皮 | 表面氧化形成的鳞片 |
| scratches | 划痕 | 表面被划伤的痕迹 |
| 技术 | 版本 | 说明 |
|---|---|---|
| Python | 3.9+ | 编程语言 |
| PyTorch | 2.8.0 | 深度学习框架 |
| Torchvision | 0.23.0 | 计算机视觉库 |
| Streamlit | 1.50.0 | Web 应用框架 |
| Matplotlib | 3.9.4 | 数据可视化 |
| Scikit-learn | 1.6.1 | 机器学习库 |
| NumPy | 2.0.2 | 数值计算库 |
| PIL | 11.3.0 | 图像处理库 |
- 验证集准确率:98.33%
- 训练集准确率:92.92%
- 训练轮数:15 epochs
- 训练时间:约 15 分钟(CPU)
- 推理时间:< 0.1 秒/张
| 缺陷类别 | 精确率 | 召回率 | F1 分数 |
|---|---|---|---|
| Crazing(裂纹) | 100% | 100% | 1.00 |
| Inclusion(夹杂) | 100% | 90% | 0.95 |
| Patches(斑块) | 100% | 100% | 1.00 |
| Pitted_surface(麻点) | 100% | 100% | 1.00 |
| Rolled-in_scale(氧化皮) | 100% | 100% | 1.00 |
| Scratches(划痕) | 91% | 100% | 0.95 |
- Python 3.9+
- PyTorch 2.0+
- 4GB+ 内存
- (可选)CUDA 兼容 GPU
git clone https://github.com/yourusername/resnet-defect-detection.git
cd resnet-defect-detection# 创建并激活 conda 环境
conda create -n uu python=3.9 -y
conda activate uu# 使用清华源加速安装(推荐国内用户)
pip install torch torchvision matplotlib tqdm scikit-learn streamlit pillow -i https://pypi.tuna.tsinghua.edu.cn/simple或使用 requirements.txt:
pip install -r requirements.txt确保数据集按以下结构组织:
./data/
├── train/
│ └── images/
│ ├── crazing/
│ ├── inclusion/
│ ├── patches/
│ ├── pitted_surface/
│ ├── rolled-in_scale/
│ └── scratches/
└── validation/
└── images/
├── crazing/
├── inclusion/
├── patches/
├── pitted_surface/
├── rolled-in_scale/
└── scratches/
方式一:使用启动脚本(推荐)
- Mac/Linux:
./train.sh
- Windows:
train.bat
方式二:直接运行 Python 脚本
python train.py训练完成后将生成:
best_model.pth- 最佳模型权重training_curve.png- 训练曲线图
方式一:使用启动脚本(推荐)
- Mac/Linux:
./run.sh
- Windows:
run.bat
方式二:直接运行 Streamlit
streamlit run app.py浏览器将自动打开 http://localhost:8501
停止 Web 服务:在运行终端按 Ctrl+C 即可停止
方式一:使用 GitHub Actions 自动构建(推荐)
推送到 GitHub 后,GitHub Actions 会自动构建三个平台的可执行文件:
- Windows:
工业零件表面缺陷检测.exe - macOS:
工业零件表面缺陷检测 - Linux:
工业零件表面缺陷检测
详细说明请参考:GITHUB_ACTIONS_GUIDE.md
方式二:本地打包
# 激活 conda 环境
conda activate uu
# 运行打包脚本
./build_app.sh打包完成后,可执行文件位于 dist/工业零件表面缺陷检测,可以直接双击运行。
详细说明:请参考 PACKAGING_GUIDE.md
打包功能包括:
- ✅ 独立运行,无需安装 Python
- ✅ 一键启动,双击即可运行
- ✅ 自动打开浏览器
- ✅ 便携性好,可复制到其他 Mac
resnet-defect-detection/
├── app.py # Streamlit Web 演示应用
├── train.py # 训练脚本
├── test_app.py # 测试脚本
├── requirements.txt # Python 依赖列表
├── README.md # 项目说明文档(本文件)
├── best_model.pth # 训练好的最佳模型
├── training_curve.png # 训练曲线图
├── run.sh # Mac/Linux 启动脚本
├── run.bat # Windows 启动脚本
├── train.sh # Mac/Linux 训练脚本
├── train.bat # Windows 训练脚本
├── launcher.py # 应用启动器(用于打包)
├── defect_detection.spec # PyInstaller 打包配置
├── build_app.sh # macOS 应用打包脚本
├── PACKAGING_GUIDE.md # 应用打包指南
├── GITHUB_ACTIONS_GUIDE.md # GitHub Actions 自动构建指南
├── .github/ # GitHub Actions 配置
│ └── workflows/
│ └── build.yml # 自动构建工作流
├── .gitignore # Git 忽略文件配置
├── data/ # 数据集目录
│ ├── train/
│ │ └── images/
│ │ ├── crazing/
│ │ ├── inclusion/
│ │ ├── patches/
│ │ ├── pitted_surface/
│ │ ├── rolled-in_scale/
│ │ └── scratches/
│ └── validation/
│ └── images/
│ ├── crazing/
│ ├── inclusion/
│ ├── patches/
│ ├── pitted_surface/
│ ├── rolled-in_scale/
│ └── scratches/
└── plans/ # 文档目录
├── course_paper.md # 课程论文核心章节
├── final_course_paper.md # 完整课程设计论文(初版)
├── final_course_paper_v2.md # 完整课程设计论文(更新版)
├── final_course_paper_v3.md # 完整课程设计论文(最终版)
├── system_test_results.md # 系统测试结果表格
├── paper_content.md # 论文素材
└── ppt_outline.md # PPT 大纲(29页详细内容)
为了方便 Mac 和 Windows 用户,项目提供了以下启动脚本:
训练模型:
./train.sh启动 Web 演示:
./run.sh训练模型:
train.bat启动 Web 演示:
run.bat在运行终端按 Ctrl+C 即可停止 Streamlit 服务
- ✅ 自动检测并创建 conda 环境(如果不存在)
- ✅ 自动激活 conda 环境
- ✅ 检查依赖包是否安装
- ✅ 检查必要文件是否存在
- ✅ 如果没有训练模型,会自动提示先训练
- ✅ 友好的中文提示信息
完整的训练脚本,包含以下功能:
- ✅ 数据加载与预处理
- ✅ ResNet18 模型加载与参数冻结
- ✅ 自定义全连接层设计
- ✅ SGD 优化器配置
- ✅ 训练循环与验证
- ✅ 最佳模型保存
- ✅ 训练曲线可视化
- ✅ 各类别性能评估
使用方法:
python train.py基于 Streamlit 的 Web 演示应用,包含以下功能:
- ✅ 美观的侧边栏布局
- ✅ 图片上传功能(支持 JPG/PNG/BMP)
- ✅ 实时缺陷检测
- ✅ 预测结果展示(中英文)
- ✅ 置信度显示
- ✅ 各类别概率分布可视化
- ✅ 详细数据表格
- ✅ 模型缓存加速
使用方法:
streamlit run app.py测试脚本,用于验证模型加载和推理功能:
- ✅ 模型加载测试
- ✅ 图像预处理测试
- ✅ 模型推理测试
- ✅ 结果输出测试
使用方法:
python test_app.pygraph TB
A[工业零件表面缺陷检测系统] --> B[数据预处理模块]
A --> C[模型训练模块]
A --> D[缺陷检测模块]
B --> B1[训练集数据增强]
B --> B2[验证集标准化]
B1 --> B3[RandomResizedCrop]
B1 --> B4[RandomHorizontalFlip]
B1 --> B5[Normalize]
B2 --> B6[Resize]
B2 --> B7[CenterCrop]
B2 --> B8[Normalize]
C --> C1[加载预训练ResNet18]
C --> C2[冻结前8层参数]
C --> C3[自定义全连接层]
C --> C4[训练与验证]
C --> C5[保存最佳模型]
D --> D1[加载最佳模型]
D --> D2[图像预处理]
D --> D3[模型推理]
D --> D4[结果展示]
# 加载预训练的 ResNet18 模型
model = models.resnet18(pretrained=True)
# 冻结前8层参数(除全连接层外)
for name, param in model.named_parameters():
if 'fc' not in name: # 冻结所有非fc层的参数
param.requires_grad = False
# 获取原始全连接层的输入特征数
num_ftrs = model.fc.in_features
# 修改全连接层(考核要求:Linear(输入,256) -> ReLU -> Linear(256,6))
model.fc = nn.Sequential(
nn.Linear(num_ftrs, 256), # 第一层全连接:输入特征 -> 256维
nn.ReLU(), # ReLU激活函数
nn.Linear(256, 6) # 第二层全连接:256维 -> 6类缺陷
)
# 将模型移动到GPU(如果可用)
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = model.to(device)# 训练集:包含数据增强
data_transforms = {
'train': transforms.Compose([
transforms.RandomResizedCrop(224), # 随机裁剪并调整为224x224(数据增强)
transforms.RandomHorizontalFlip(), # 随机水平翻转(数据增强)
transforms.ToTensor(), # 转换为Tensor
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) # ImageNet标准化
]),
'validation': transforms.Compose([
transforms.Resize(256), # 调整大小为256
transforms.CenterCrop(224), # 中心裁剪为224x224
transforms.ToTensor(), # 转换为Tensor
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) # ImageNet标准化
]),
}# 损失函数:交叉熵损失函数
criterion = nn.CrossEntropyLoss()
# 优化器:SGD(随机梯度下降)
optimizer = optim.SGD(filter(lambda p: p.requires_grad, model.parameters()),
lr=0.001,
momentum=0.9) # SGD优化器
# 训练轮数
num_epochs = 15
# 批次大小
batch_size = 16训练过程中的 Loss 和 Accuracy 曲线如下:
- Loss 曲线:训练集和验证集 Loss 随 epoch 变化
- Accuracy 曲线:训练集和验证集准确率随 epoch 变化
训练曲线图保存在 training_curve.png,可用于论文插图。
- 第 1 轮:验证集准确率 90%
- 第 5 轮:验证集准确率 94.72%
- 第 10 轮:验证集准确率 95.00%
- 第 14 轮:验证集准确率 98.33%(最高)
模型在前 5 轮训练中准确率提升最为明显,在第 11-15 轮中趋于稳定。
本项目支持使用 GitHub Actions 自动构建跨平台可执行文件。
推送到 GitHub 后,GitHub Actions 会自动构建三个平台的可执行文件:
| 平台 | 可执行文件名 | 说明 |
|---|---|---|
| Windows | 工业零件表面缺陷检测.exe |
.exe 可执行文件 |
| macOS | 工业零件表面缺陷检测 |
macOS 可执行文件 |
| Linux | 工业零件表面缺陷检测 |
Linux 可执行文件 |
-
推送到 GitHub:
git add . git commit -m "Initial commit" git push -u origin main
-
查看构建状态:
- 访问仓库的 Actions 页面
- 查看最新的工作流运行状态
-
下载构建产物:
- 从 Actions 页面下载构建产物
- 或从 Releases 页面下载(如果创建了版本标签)
- ✅ 推送代码到
main或master分支 - ✅ 创建 Pull Request
- ✅ 推送版本标签(如
v1.0.0) - ✅ 手动触发(通过 GitHub 网页界面)
完整的 GitHub Actions 使用指南请参考:GITHUB_ACTIONS_GUIDE.md
课程论文核心章节位于 plans/ 目录:
course_paper.md- 课程论文核心章节final_course_paper.md- 完整课程设计论文(初版)final_course_paper_v2.md- 完整课程设计论文(更新版)final_course_paper_v3.md- 完整课程设计论文(最终版,推荐使用)
论文包含以下章节:
- 摘要:研究背景、方法概述、实验结果
- 引言:研究背景、研究意义、本文结构
- 相关工作:深度学习在缺陷检测中的应用、ResNet 网络概述
- 系统总体设计:系统架构、工作流程、技术选型
- 详细设计:数据集、数据预处理、模型架构、训练策略
- 实验结果与分析:实验环境、实验设置、总体性能、各类别性能分析
- 总结与展望:总结、创新点、不足与展望
- 参考文献:15 篇中文文献
- 致谢:感谢指导教师和同学
PPT 大纲位于 plans/ppt_outline.md,包含 29 页详细内容:
- 第一部分:项目概述(5 页)
- 第二部分:技术方案(9 页)
- 第三部分:系统实现(5 页)
- 第四部分:实验结果(6 页)
- 第五部分:总结与展望(4 页)
每页包含详细的内容说明、设计建议和演讲时间分配。
欢迎贡献代码、报告 Bug 或提出新功能建议!
- Fork 本仓库
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 开启 Pull Request
- 遵循 PEP 8 代码风格
- 添加适当的注释和文档
- 编写单元测试
- 确保代码通过 lint 检查
本项目采用 MIT 许可证 - 详见 LICENSE 文件
《人工智能应用技术》课程作业
感谢《人工智能应用技术》课程任课教师的悉心指导,感谢同学们在学习和实验过程中提供的帮助和支持。同时感谢开源社区提供的优秀工具和框架(PyTorch、Streamlit 等),为本研究提供了强有力的技术支持。
如有问题或建议,欢迎通过以下方式联系:
- 提交 Issue
- 发送 Pull Request
如果本项目对你有帮助,请给个 Star ⭐
Made with ❤️ by poboll