新闻详情

新闻详情

首页 / 资讯中心 / 详情

基于ResNet的煤矸石识别分类系统:Python+PyQt实战

发布时间:2026/10/2 7:47:12来源:尧图网络
基于ResNet的煤矸石识别分类系统:Python+PyQt实战
简介这份资源面向计算机、人工智能、自动化等专业的在校学生与教师提供一套基于ResNet卷积神经网络的煤矸石识别分类系统完整Python源码可用于毕业设计、课程设计或项目立项演示。压缩包共45个文件约4.37MB包含11个py脚本、10个csv数据表、7张jpg样本图、4个ipynb实验笔记及若干模型与缓存文件覆盖数据预处理、图像分割、GLCM特征提取、CNN与VGG16对比实验、SVM与随机森林等传统方法对照以及GUI界面主程序结构完整、层次清晰。目前已有182人学习下载。项目经导师指导并通过答辩评审代码均测试运行成功附带数据集、训练模型与操作教程读者可据此复现煤矸石识别流程理解ResNet迁移学习与图像分类的落地方式也可在现有代码上修改扩展用于毕设、课设或算法进阶练习。1. 煤矸石识别为什么要用 ResNet从人工选矸到卷积分类的落地切口在煤矿地面筛分车间待过的人都知道皮带上的煤和矸石混在一起靠工人肉眼盯着挑一个班下来眼睛发花漏拣、误拣是常态。煤矸石识别分类系统的核心诉求很朴素给一张皮带上的物料图像判断它是煤还是矸石并且把结果实时显示出来。这件事用传统图像处理做靠灰度阈值、纹理算子遇到煤块表面反光、矸石带泥、光照波动就集体翻车泛化能力差得离谱。深度学习介入之后思路变成让卷积神经网络自己从大量样本里学特征ResNet 因为残差结构解决了深层网络退化问题成了这类工业图像分类里最稳的骨干网络之一。这个标题对应的是一套完整的 Python 落地工程ResNet 卷积神经网络做分类内核PyQt 或 Tkinter 做 GUI 界面附带数据集、训练好的模型权重和操作教程。它适合三类人想拿一个完整深度学习项目练手的入门者需要快速搭工业图像分类原型的工程师以及要做课程设计但不想从零造轮子的学生。下面我按自己实际搭这类系统的顺序把数据、模型、训练、界面、踩坑一条线讲透你照着能复现出一套能跑的煤矸石识别分类系统。2. 数据集准备与 ResNet 输入管线煤矸石图像怎么整理才能喂给网络2.1 煤矸石数据集的目录结构与类别划分煤矸石图像分类是二分类问题类别就是煤和矸石。常见做法是按 ImageFolder 的格式组织训练集和验证集分开每个类别一个文件夹。我一般会留出 8:2 的划分比例如果样本本身少就上 K 折或者用数据增强硬撑。目录长这样dataset/ ├── train/ │ ├── coal/ # 煤样本 │ └── gangue/ # 矸石样本 └── val/ ├── coal/ └── gangue/每个类别建议至少 300 张低于这个数模型很容易过拟合到背景。图像来源可以是现场拍摄也可以是公开的煤矸石图像集注意剔除模糊、遮挡严重、标签存疑的样本脏数据比少数据更致命。2.2 用 torchvision 搭 ResNet 输入变换管线ResNet 预训练模型要求输入是 224×224 的 RGB 图像并且要做标准化。下面这段是训练和验证各自的变换定义import torch from torchvision import transforms # 训练集变换加随机增强提升泛化 train_transform transforms.Compose([ transforms.Resize((256, 256)), # 先放大再裁剪保留更多细节 transforms.RandomCrop(224), # 随机裁剪到 224 transforms.RandomHorizontalFlip(), # 水平翻转煤矸石左右对称合理 transforms.RandomRotation(15), # 小角度旋转模拟拍摄角度偏差 transforms.ColorJitter(brightness0.2, contrast0.2), # 光照鲁棒性 transforms.ToTensor(), transforms.Normalize( # ImageNet 统计量预训练模型必须对齐 mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225] ), ]) # 验证集变换只做确定性的缩放和标准化 val_transform transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize( mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225] ), ])逻辑说明训练变换里的随机增强是为了让模型见过更多变化验证变换必须确定性否则每次评估结果都在抖没法判断模型好坏。参数上Resize 到 256 再 RandomCrop 224 是经典做法比直接 Resize 224 保留的纹理信息更多Normalize 的均值和方差必须和预训练权重一致用错会导致收敛慢甚至不收敛。ColorJitter 的强度别开太大煤和矸石的颜色差异本身就是重要特征抖过头反而帮倒忙。2.3 用 DataLoader 组装批次并检查类别平衡from torchvision import datasets from torch.utils.data import DataLoader train_set datasets.ImageFolder(dataset/train, transformtrain_transform) val_set datasets.ImageFolder(dataset/val, transformval_transform) train_loader DataLoader(train_set, batch_size32, shuffleTrue, num_workers4) val_loader DataLoader(val_set, batch_size32, shuffleFalse, num_workers4) print(类别映射:, train_set.class_to_idx) print(训练样本数:, len(train_set), 验证样本数:, len(val_set))batch_size 设 32 是显存和稳定性的折中显存够可以上 64。num_workers 在 Windows 上如果报错就设 0这是血泪经验多进程加载在 Windows 下经常出玄学问题。打印 class_to_idx 是为了确认 coal 和 gangue 的索引顺序后面推理时类别名要对得上否则界面显示会张冠李戴。3. ResNet 模型改造与训练从预训练权重到煤矸石二分类器3.1 为什么选 ResNet18 而不是更深的 ResNet50煤矸石图像分类的特征层次不算特别深ResNet18 在精度和速度上平衡得最好。ResNet50 参数多小数据集上更容易过拟合训练也慢。如果样本量上万、类别细分成多种煤和多种矸石再考虑 ResNet50 或 ResNet101。选型原则是数据规模决定容量别一上来就堆大模型。用预训练权重是必须的ImageNet 上学到的边缘、纹理特征对煤矸石同样有效能省掉大量训练时间。3.2 替换全连接层构建二分类头import torch.nn as nn from torchvision import models def build_model(num_classes2, pretrainedTrue): # 加载 ResNet18使用预训练权重 model models.resnet18(pretrainedpretrained) # 替换最后的全连接层输出类别数改为 2 in_features model.fc.in_features model.fc nn.Linear(in_features, num_classes) return model device torch.device(cuda if torch.cuda.is_available() else cpu) model build_model(num_classes2).to(device) print(使用设备:, device)逻辑说明ResNet18 的 fc 层原本输出 1000 类替换成 2 类就完成了迁移学习的头部改造。pretrainedTrue 会下载预训练权重第一次运行需要联网。如果环境不能联网就提前把权重文件放到 torch 的缓存目录。device 判断保证有 GPU 用 GPU没有就退回 CPUCPU 训练会慢很多但小数据集也能跑通。3.3 训练循环与关键超参数设置import torch.optim as optim criterion nn.CrossEntropyLoss() # 只优化 fc 层骨干网络冻结小数据集推荐 optimizer optim.Adam(model.fc.parameters(), lr1e-3) EPOCHS 20 best_acc 0.0 for epoch in range(EPOCHS): model.train() running_loss 0.0 for imgs, labels in train_loader: imgs, labels imgs.to(device), labels.to(device) optimizer.zero_grad() outputs model(imgs) loss criterion(outputs, labels) loss.backward() optimizer.step() running_loss loss.item() # 验证阶段 model.eval() correct, total 0, 0 with torch.no_grad(): for imgs, labels in val_loader: imgs, labels imgs.to(device), labels.to(device) outputs model(imgs) _, preds torch.max(outputs, 1) correct (preds labels).sum().item() total labels.size(0) acc correct / total print(fEpoch {epoch1}/{EPOCHS} loss{running_loss/len(train_loader):.4f} val_acc{acc:.4f}) # 保存最优模型 if acc best_acc: best_acc acc torch.save(model.state_dict(), best_model.pth)逻辑说明这里冻结了骨干网络只训练 fc 层适合样本量不大的场景收敛快且不容易过拟合。如果数据量充足可以解冻后面几个 layer 做微调学习率要调小到 1e-4 量级。Adam 的 lr 设 1e-3 是常用起点loss 不降就降到 1e-4。EPOCHS 设 20 是保守值看验证准确率不再提升就可以停。保存最优模型而不是最后一个避免过拟合后的权重被留下。参数上CrossEntropyLoss 内部带 softmax推理时不要再手动加 softmax 再取 argmax直接 argmax 就行。3.4 训练过程怎么判断好坏盯两个信号训练 loss 持续下降但验证 acc 停滞甚至下降说明过拟合该加增强或减模型容量训练 loss 都不降说明学习率太大或数据有问题。验证 acc 在 90% 以上基本可用工业场景里如果误判代价高还要看混淆矩阵确认煤被判成矸石的比例能不能接受。4. GUI 界面开发用 PyQt5 把模型封装成可操作工具4.1 界面功能拆解与布局设计一个能用的煤矸石识别界面至少要有图片选择按钮、预览区域、识别按钮、结果显示区类别加置信度。布局用 QVBoxLayout 竖排上面放预览中间放按钮下面放结果文本。别把界面做复杂工业工具讲究一眼看懂。下面是一个最小可运行版本import sys import torch from PyQt5.QtWidgets import (QApplication, QWidget, QLabel, QPushButton, QVBoxLayout, QFileDialog) from PyQt5.QtGui import QPixmap from torchvision import transforms from PIL import Image class CoalGangueApp(QWidget): def __init__(self, model, device): super().__init__() self.model model self.device device self.class_names [煤, 矸石] self.transform transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]), ]) self.init_ui() def init_ui(self): self.setWindowTitle(煤矸石识别分类系统) self.resize(480, 560) self.img_label QLabel(请选择图片) self.img_label.setFixedSize(400, 400) self.img_label.setStyleSheet(border: 1px solid gray;) self.btn QPushButton(选择图片并识别) self.btn.clicked.connect(self.load_and_predict) self.result_label QLabel(结果--) layout QVBoxLayout() layout.addWidget(self.img_label) layout.addWidget(self.btn) layout.addWidget(self.result_label) self.setLayout(layout) def load_and_predict(self): path, _ QFileDialog.getOpenFileName(self, 选择图片, , Images (*.png *.jpg *.jpeg)) if not path: return pixmap QPixmap(path).scaled(400, 400) self.img_label.setPixmap(pixmap) # 推理 img Image.open(path).convert(RGB) tensor self.transform(img).unsqueeze(0).to(self.device) self.model.eval() with torch.no_grad(): out self.model(tensor) prob torch.softmax(out, dim1) conf, pred torch.max(prob, 1) self.result_label.setText( f结果{self.class_names[pred.item()]} 置信度{conf.item():.2%} )逻辑说明界面类持有模型和变换选择图片后用 PIL 读入并做和验证集一致的变换unsqueeze(0) 补上 batch 维度。softmax 在这里用于把 logits 转成概率显示置信度取 max 得到类别。class_names 的顺序必须和训练时 ImageFolder 的 class_to_idx 一致否则煤矸石会显示反。参数上预览缩放 400×400 只是显示用不影响推理输入。4.2 把训练好的模型接进界面if __name__ __main__: device torch.device(cuda if torch.cuda.is_available() else cpu) model build_model(num_classes2, pretrainedFalse) model.load_state_dict(torch.load(best_model.pth, map_locationdevice)) model.to(device) app QApplication(sys.argv) window CoalGangueApp(model, device) window.show() sys.exit(app.exec_())逻辑说明加载模型时 pretrained 要设 False因为我们要加载自己的权重而不是 ImageNet 的。map_location 保证在 CPU 机器上也能加载 GPU 训出来的权重。这一步是 GUI 和模型之间的桥桥接错了界面要么报错要么结果全错。4.3 打包成可执行文件的注意点用 PyInstaller 打包时torch 体积大打包出来几百兆很正常。关键是模型权重文件要一起打进去用--add-data指定代码里读取路径要用sys._MEIPASS兼容打包后的临时目录。这一步不做别人拿到 exe 一运行就找不到模型。5. 避坑与排查煤矸石识别系统落地时最容易翻车的五件事5.1 现象界面识别结果永远是同一个类别原因类别索引和 class_names 顺序对不上或者模型根本没加载成功输出的是随机权重。解决先打印 train_set.class_to_idx 确认顺序再单独写脚本测一张图看 logits 是否合理。加载权重时加 strictTrue让键不匹配直接报错别用 strictFalse 把问题吞掉。5.2 现象训练准确率很高实际拍图识别全错原因训练集和实际场景分布不一致比如训练图是实验室拍的实际是皮带现场光照背景差异大。解决补现场样本训练时加强 ColorJitter 和随机裁剪必要时做域适应。别迷信验证集准确率它只代表同分布下的表现。5.3 现象Windows 下 DataLoader 报 BrokenPipeError 或卡死原因num_workers 多进程在 Windows 上的兼容问题。解决把 num_workers 设成 0或者把训练代码放进if __name__ __main__:保护块里。这是最常见的翻车点很多人卡在这里以为代码有 bug。5.4 现象显存不够训练到一半 OOM原因batch_size 太大或者没冻结骨干网络导致中间激活占用高。解决先把 batch_size 降到 16 或 8再考虑冻结更多层。用 torch.cuda.empty_cache() 清理缓存但根本办法还是减小批次。5.5 现象置信度普遍偏低两个类别概率接近原因模型没训够或者学习率太大导致在最优解附近震荡。解决看训练 loss 曲线如果还在降就继续训如果震荡就把 lr 降一个数量级。另外确认 Normalize 参数没用错标准化不对会让输入分布偏移置信度自然上不去。6. 提升煤矸石识别精度的一个实用技巧分层学习率微调前面冻结骨干只训 fc 层能快速出结果但精度往往卡在 92% 到 95% 上不去。想让模型再上一个台阶我一般会做分层学习率微调解冻 ResNet 的后两个 stage给它们一个很小的学习率fc 层保持较大学习率。这样既利用了预训练特征又让深层特征向煤矸石任务靠拢。# 分层学习率骨干后两层小 lrfc 层大 lr optimizer optim.Adam([ {params: model.layer3.parameters(), lr: 1e-5}, {params: model.layer4.parameters(), lr: 1e-5}, {params: model.fc.parameters(), lr: 1e-3}, ])逻辑说明layer3 和 layer4 是 ResNet 的深层负责高层语义特征微调它们能让特征更贴合煤矸石学习率设 1e-5 是为了不破坏预训练权重。fc 层是随机初始化的需要大学习率快速收敛。这个策略比全局统一学习率稳也比只训 fc 层精度高。验证方法上别只看总体准确率要算每个类别的精确率和召回率。煤矸石识别里把矸石误判成煤的代价通常更高因为矸石混进煤里影响煤质。所以重点看矸石类的召回率如果偏低就在损失函数里给矸石类加权用nn.CrossEntropyLoss(weighttorch.tensor([1.0, 2.0]))让模型更关注矸石。微调策略学习率设置适用场景预期精度只训 fc 层fc: 1e-3样本少、快速验证90%~94%分层微调骨干: 1e-5, fc: 1e-3样本中等、追求精度94%~97%全网络微调全局: 1e-4样本充足95%~98%最后说个我自己的习惯每次改完训练配置先拿 20 张图跑一遍推理脚本肉眼看结果对不对再去看指标。指标会骗人眼睛不会。这套煤矸石识别分类系统从数据到界面最难的不是写模型是把每个环节的输入输出对齐对齐了系统就活了。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

MySQL教务系统数据库设计实战:从ER图到可执行SQL 2026/10/2 17:23:25

MySQL教务系统数据库设计实战:从ER图到可执行SQL

简介:本资源是山东科技大学计算机科学与技术专业《数据库系统概论》课程设计的完整实验报告,面向高校数据库初学者与课程实践者,聚焦DBMS核心功能——表的创建与修改,帮助学生深入理解关系型数据库底层实现原理。报告由郑通同学于…

阅读更多 →
公共资源交易数据主题库建设:数据归集、治理与共享实践 2026/10/2 17:23:25

公共资源交易数据主题库建设:数据归集、治理与共享实践

在数字政府建设全面提速、数据要素市场化改革深入推进的当下,公共资源交易领域作为政府配置公共资源、服务市场主体、保障民生工程的核心场景,沉淀了海量真实、高价值、高权威的交易数据。工程建设招投标、政府采购、土地矿业权交易、国有产权流转等各类…

阅读更多 →
二手房交易数据库设计:SQL Server 2000生产级落地实践 2026/10/2 17:23:19

二手房交易数据库设计:SQL Server 2000生产级落地实践

简介:本资源是一份面向高校数据库课程设计与信息管理类实践教学的《二手房交易管理系统数据库概论课题设计》完整文档,适用于计算机、信息管理、房地产信息化等方向的本科生课程设计参考或毕业设计前期选题支撑。文档系统阐述了二手房交易场景下的数据库…

阅读更多 →
数据库试卷PDF结构化解析与自动化验证实践 2026/10/2 17:23:19

数据库试卷PDF结构化解析与自动化验证实践

简介:本资源是一套完整的《数据库系统概论》课程期末复习资料,面向高校计算机、软件工程及相关专业本科生,助力考前系统梳理核心知识点与应试能力。试卷涵盖实体联系类型、关系模型与代数运算、SQL综合应用、数据依赖与范式转换(3…

阅读更多 →
苹果AI免费背后:端侧推理与端侧小模型的降本增效账 2026/10/2 17:23:12

苹果AI免费背后:端侧推理与端侧小模型的降本增效账

iOS 27把苹果AI推到台前后,我被问得最多的问题就是:这玩意儿到底收不收费?网上铺天盖地都在说苹果AI免费,甚至有人直接喊出“无限免费”。作为一个从iOS 10时代就开始折腾系统自动化的老玩家,又做过几年端侧推理的性能…

阅读更多 →
Wand-Enhancer 完整指南:免费本地补丁,三分钟去掉 Wand 的两小时限制 2026/10/2 17:23:12

Wand-Enhancer 完整指南:免费本地补丁,三分钟去掉 Wand 的两小时限制

Wand-Enhancer 完整指南:免费本地补丁,三分钟去掉 Wand 的两小时限制 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer Wand&…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉