ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

基于深度学习的垃圾分类系统:从环境搭建到答辩的完整实战指南

基于深度学习的垃圾分类系统:从环境搭建到答辩的完整实战指南 简介这份资源是面向高校Python课程大作业与深度学习入门实践者的完整项目包主题为基于深度学习的垃圾分类系统适合需要完成课程设计、参加实践考核或自学图像分类的本科生与初学者。压缩包共134个文件约75.59MB包含20个py源码、13个ipynb实验笔记、12个vue与14个js前端文件、19个png与2张jpg图示以及8个md说明、3份pdf与3份docx报告文档、1个pptx汇报幻灯片和1个onnx模型文件覆盖数据采集与预处理、特征提取、分类输出等完整流程。项目源码均经本地编译调试可稳定运行评审分达95分以上难度适中且经助教老师审定。已有89人学习下载读者可据此获得可复用的模型代码、部署指南、实验记录与答辩材料快速搭建并理解垃圾分类系统的实现思路。1. 从一份 95 分课设拆起这套垃圾分类系统到底能跑出什么课程大作业最怕的不是不会写而是写完跑不起来、答辩被追问细节答不上。这份「基于深度学习的垃圾分类系统」资源包恰好卡在这两个痛点上源码经过本地编译验证配套部署指南、参考报告、答辩 PPT 和全部文档评审分 95 分以上。它解决的不是「从零教你深度学习」而是给你一套能直接跑通、能讲清楚、能改得动的完整工程。适合三类人赶 Python 课程设计 deadline 的本科生、想拿一个 CNN 图像分类完整案例练手的入门者、以及需要现成报告模板和 PPT 框架的答辩选手。技术栈围绕 Python 深度学习 CNN 图像分类展开目录里能看到 Dockerfile、semantic.css 这类前端资源说明它不只是个训练脚本而是带界面、带部署配置的完整项目。下面按「资源是什么 → 怎么跑起来 → 坑在哪 → 怎么改出彩」的顺序拆。2. 环境搭建与依赖安装把 Python、CUDA 和 Docker 三条路走通拿到压缩包先别急着pip install环境不对后面全是玄学报错。这一章把三条常见路线讲清楚本地裸装、虚拟环境隔离、Docker 一键起。选哪条取决于你的机器有没有 NVIDIA 显卡、以及答辩现场要不要现场演示。2.1 先判断你的硬件该走哪条路打开命令行敲nvidia-smi能输出显卡型号和 CUDA 版本说明你有独显可以走 GPU 训练路线训练速度快答辩演示也流畅。如果报「不是内部或外部命令」说明没装驱动或没配环境变量那就走 CPU 路线训练慢但能跑通课设演示够用。判断完硬件再定 Python 版本。深度学习项目对版本敏感常见做法是锁 Python 3.8 到 3.10 之间太新3.12容易遇到 PyTorch 轮子还没适配的问题太旧3.6很多新库装不上。资源包里的.browserslistrc、.editorconfig这些配置文件说明作者对工程规范有要求你装环境时也照着这个思路来别随手pip install一堆全局包。我一般会先建虚拟环境把项目依赖和系统 Python 隔开避免污染。命令如下# 创建虚拟环境python3.9 换成你本机实际版本 python -m venv venv # 激活Windows venv\Scripts\activate # 激活macOS / Linux source venv/bin/activate # 升级 pip避免装包时版本协商失败 python -m pip install --upgrade pip # 安装依赖requirements.txt 在项目根目录 pip install -r requirements.txt逻辑说明venv建独立环境激活后所有pip install只影响当前项目。--upgrade pip这步别省老版本 pip 解析依赖树经常卡住或装错版本。requirements.txt里通常锁了 torch、torchvision、numpy、Pillow、flask 这类包如果文件里没锁版本装完记得pip freeze requirements.txt固化一份方便换机器复现。参数说明如果你有 GPU装 PyTorch 时要去官网查对应 CUDA 版本的安装命令别直接pip install torch那样装的是 CPU 版。常见做法是pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118cu118 对应 CUDA 11.8按你nvidia-smi显示的版本改。2.2 Docker 路线Dockerfile 已经写好了别浪费资源包里带了Dockerfile这是很多人会忽略的宝藏。如果你不想折腾 Python 版本和 CUDA 驱动直接用它构建镜像最省事。先确认本机装了 Docker Desktop然后# 在项目根目录构建镜像-t 后面是镜像名按需改 docker build -t garbage-classify:latest . # 运行容器把项目端口映射出来-p 主机端口:容器端口 docker run -it --rm -p 5000:5000 garbage-classify:latest # 如果要用 GPU需要 nvidia-container-toolkit加 --gpus all docker run -it --rm --gpus all -p 5000:5000 garbage-classify:latest逻辑说明docker build会按 Dockerfile 里的指令逐层构建通常包括拉基础镜像、复制代码、装依赖、暴露端口。-p 5000:5000把容器内服务端口映射到本机浏览器访问localhost:5000就能看到界面。--rm表示容器退出后自动删除避免占磁盘。参数说明Dockerfile 里如果写了FROM pytorch/pytorch:xxx说明基础镜像已经带了 PyTorch你不需要再装。如果写的是FROM python:3.9那构建时会跑pip install第一次构建慢是正常的。GPU 支持需要宿主机装好驱动和 nvidia-container-toolkit否则--gpus all会报错这时候退回 CPU 模式也能演示。提示Docker 构建时如果卡在pip install多半是网络问题可以在 Dockerfile 里换国内源或者构建时加--build-arg传代理参数注意这里说的是 pip 源不是别的。2.3 验证环境是否真的通了装完别急着跑训练先用几行代码验证核心库能不能正常导入、GPU 是否可用import torch import torchvision import numpy as np from PIL import Image # 打印版本确认和 requirements 一致 print(torch:, torch.__version__) print(torchvision:, torchvision.__version__) print(numpy:, np.__version__) # 检查 GPU 是否可用 print(cuda available:, torch.cuda.is_available()) if torch.cuda.is_available(): print(device name:, torch.cuda.get_device_name(0)) # 造一个随机张量跑一次前向确认计算图能走通 x torch.randn(1, 3, 224, 224) conv torch.nn.Conv2d(3, 16, kernel_size3, padding1) out conv(x) print(output shape:, out.shape)逻辑说明前几行打印版本方便和文档对照。torch.cuda.is_available()返回 False 就说明 GPU 没配上要么驱动问题要么装的是 CPU 版 torch。最后造个随机张量过一层卷积确认基本计算没问题输出 shape 应该是[1, 16, 224, 224]。参数说明torch.randn(1, 3, 224, 224)里四个维度分别是 batch、channel、height、width224 是常见输入尺寸和多数预训练模型匹配。如果你的项目输入尺寸不是 224按实际改但卷积层输出尺寸会跟着变验证时看 shape 对不对就行。3. 数据准备与模型训练从图片目录到可用的分类权重环境通了下一步是把数据喂进去、把模型训出来。这一章讲数据怎么组织、训练脚本怎么读、关键参数怎么调。垃圾分类本质是图像分类数据组织方式直接决定你能不能复用现成代码。3.1 数据目录结构ImageFolder 认的就是这个格式深度学习图像分类最常见的数据组织方式是「一个类别一个文件夹」PyTorch 的ImageFolder就是按这个规则读的。资源包里如果有data或dataset目录先看它的结构dataset/ ├── train/ │ ├── recyclable/ # 可回收物 │ ├── kitchen_waste/ # 厨余垃圾 │ ├── hazardous/ # 有害垃圾 │ └── other/ # 其他垃圾 └── val/ ├── recyclable/ ├── kitchen_waste/ ├── hazardous/ └── other/逻辑说明train和val分开每个子文件夹名就是类别标签。ImageFolder会自动扫描子文件夹名作为类别图片按文件名排序读入。这种结构的好处是你加类别只要新建文件夹不用改代码。参数说明类别数量决定模型最后一层输出维度。四分类就是 4如果你自己扩到六类记得改全连接层输出。训练集和验证集比例常见 8:2 或 7:3数据少的时候用交叉验证更稳。如果资源包里数据是打包的压缩文件先解压到对应目录别直接在压缩包里读那样路径会乱。解压后统计一下每个类别的图片数量import os data_dir dataset/train for cls in os.listdir(data_dir): cls_path os.path.join(data_dir, cls) if os.path.isdir(cls_path): count len([f for f in os.listdir(cls_path) if f.lower().endswith((.jpg, .jpeg, .png))]) print(f{cls}: {count} images)逻辑说明遍历训练集下每个类别文件夹统计图片数量。类别不均衡时比如某一类只有几十张其他类上千张训练时要做重采样或加权损失否则模型会偏向多数类。参数说明endswith里列了常见图片后缀如果你的数据是.bmp或.webp加进去。统计结果如果发现某类为 0说明文件夹是空的或者后缀不匹配先排查再训练。3.2 训练脚本关键参数epoch、batch size、学习率怎么定训练脚本通常长这样核心是数据加载、模型定义、损失函数、优化器、训练循环五块import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms, models from torch.utils.data import DataLoader # 数据增强训练集做随机裁剪翻转验证集只做缩放和归一化 train_tf transforms.Compose([ transforms.RandomResizedCrop(224), transforms.RandomHorizontalFlip(), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) val_tf transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) train_ds datasets.ImageFolder(dataset/train, transformtrain_tf) val_ds datasets.ImageFolder(dataset/val, transformval_tf) train_loader DataLoader(train_ds, batch_size32, shuffleTrue, num_workers4) val_loader DataLoader(val_ds, batch_size32, shuffleFalse, num_workers4) # 用预训练 ResNet18改最后一层适配类别数 model models.resnet18(weightsmodels.ResNet18_Weights.DEFAULT) num_classes len(train_ds.classes) model.fc nn.Linear(model.fc.in_features, num_classes) device torch.device(cuda if torch.cuda.is_available() else cpu) model model.to(device) criterion nn.CrossEntropyLoss() optimizer optim.Adam(model.parameters(), lr1e-3) for epoch in range(10): 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() print(fepoch {epoch1}, loss {running_loss/len(train_loader):.4f})逻辑说明数据增强只在训练集做验证集保持稳定这样验证指标才有可比性。Normalize里的均值方差是 ImageNet 的统计值用预训练模型就得用这套。ResNet18轻量课设够用最后一层换成你的类别数。训练循环里zero_grad清梯度、backward反传、step更新顺序别乱。参数说明batch_size32是常见起点显存不够就降到 16 或 8显存富裕可以加到 64。lr1e-3是 Adam 的常用学习率如果 loss 震荡厉害降到 1e-4。epoch10是演示值实际看验证集准确率什么时候不再涨就停通常 20 到 50 轮。num_workers在 Windows 上如果报错就设 0Linux 上设 4 或 8 加速数据加载。3.3 训练过程怎么盯loss 和准确率看什么训练时别只盯着 loss 降没降要同时看验证集准确率。常见做法是每个 epoch 结束后在验证集上跑一遍def evaluate(model, loader, device): model.eval() correct, total 0, 0 with torch.no_grad(): for imgs, labels in loader: imgs, labels imgs.to(device), labels.to(device) outputs model(imgs) preds outputs.argmax(dim1) correct (preds labels).sum().item() total labels.size(0) return correct / total acc evaluate(model, val_loader, device) print(fval acc: {acc:.4f})逻辑说明model.eval()切换推理模式关掉 dropout 和 batchnorm 的训练行为。torch.no_grad()省显存加速。argmax(dim1)取每个样本最大 logit 对应的类别。准确率是正确数除以总数。参数说明如果训练 loss 一直降但验证准确率不涨甚至下降说明过拟合了常见做法是加数据增强、加 dropout、减小模型或早停。如果训练 loss 就不降检查学习率是不是太大、数据标签是不是对、归一化是不是漏了。4. 避坑与排查训练跑不通时先查这五条这一章是血泪经验合集每条按「现象 → 原因 → 解决」写遇到问题按顺序排查能省大量时间。4.1 现象CUDA out of memory训练刚开始就崩原因batch size 太大或者模型太大显存装不下。也可能是前面有残留进程占着显存没释放。解决先把 batch size 减半从 32 降到 16 或 8。如果还崩换更小的模型比如 ResNet18 换 MobileNet。检查残留进程用nvidia-smi看有没有僵尸进程有就kill -9掉。另外torch.no_grad()在验证时别忘了加不然验证也会占显存。4.2 现象ImageFolder报FileNotFoundError或类别数为 0原因路径写错了或者数据目录结构和ImageFolder要求的不一致。常见的是多了一层嵌套比如dataset/train/train/recyclable。解决先print(os.listdir(dataset/train))看实际结构确认子文件夹直接就是类别名。如果多了一层把路径改到正确层级或者把数据挪一层。类别数为 0 通常是图片后缀不匹配ImageFolder默认认.jpg、.jpeg、.png、.bmp等如果你的图是.webp或.tif要么转格式要么自定义loader。4.3 现象训练 loss 是nan几轮后模型输出全一样原因学习率太大导致梯度爆炸或者数据里有脏数据损坏图片、标签越界也可能是归一化没做导致输入数值范围太大。解决先把学习率降到 1e-4 甚至 1e-5 试。然后检查数据写个脚本遍历所有图片用PIL.Image.open打开一遍报错的图片删掉或修复。确认transforms.ToTensor()和Normalize都加了ToTensor 会把像素从 0-255 转到 0-1Normalize 再标准化这两步缺一不可。4.4 现象验证准确率卡在 25% 不动四分类等于瞎猜原因标签和输出对不上或者模型最后一层没改输出维度还是 1000ImageNet 类别数但损失函数按 4 类算梯度全乱。解决检查model.fc是不是换成了nn.Linear(in_features, num_classes)num_classes是不是等于len(train_ds.classes)。再检查train_ds.classes打印出来是不是你预期的四个类别名。如果用了预训练权重但没改最后一层输出 1000 维CrossEntropyLoss会报维度不匹配或者算出离谱的 loss。4.5 现象Docker 容器里跑训练报Permission denied或找不到文件原因Dockerfile 里COPY的路径和实际不一致或者容器内工作目录没设对。也可能是挂载卷的时候宿主机路径写错。解决先docker run -it --rm garbage-classify:latest /bin/bash进容器看文件在不在ls一下工作目录。如果文件不在检查 Dockerfile 的COPY . /app这类指令确认构建上下文对。挂载卷用-v $(pwd):/app把当前目录挂进去注意 Windows 下路径写法不同用绝对路径。5. 从能跑到能讲报告、PPT 和答辩追问的应对技巧资源包里带了参考报告和 PPT这是很多人忽略的加分项。课设评分不只看代码跑没跑通还看你能不能把原理讲清楚、把实验设计说明白。这一章讲怎么把现成材料改成自己的以及答辩时被追问怎么答。5.1 报告和 PPT 怎么改成自己的参考报告深度学习实践大作业-黄海广.docx和温州大学课程实践(模板).docx是结构模板别直接交查重和答辩都会翻车。常见做法是保留章节框架背景、数据、方法、实验、结论把内容换成你自己的。具体改这几处章节改什么怎么改背景垃圾分类的政策和现状换成你所在城市的数据或最新新闻数据集类别数、图片数、来源按你实际用的数据写别抄模板里的数字模型网络结构、参数量写你实际用的模型ResNet18 就写 ResNet18实验准确率、loss 曲线跑你自己的训练截图放进去结论改进方向写你实际遇到的不足比如数据不均衡PPT 同理模板里的图换成你自己的训练曲线和混淆矩阵。混淆矩阵用 sklearn 的confusion_matrix画能直观看出哪类容易混。答辩时老师最爱问「为什么选这个模型」「准确率怎么算的」「过拟合怎么处理的」提前把这三个问题的答案准备好。5.2 答辩追问的常见套路和答法老师追问通常围绕三点选型理由、实验细节、改进空间。选型理由别只说「因为 ResNet 好用」要说「ResNet 的残差连接缓解了深层网络梯度消失18 层参数量适中适合课设规模的数据集」。实验细节要能说出 batch size、学习率、epoch 数、训练集验证集划分比例。改进空间可以提数据增强、迁移学习、模型集成但别吹太大说「目前数据量有限后续可以扩充数据并尝试更深的网络」就够了。如果老师问「你这个和网上开源的区别在哪」别慌说清楚你做了哪些调整改了类别数、换了数据集、调了超参、加了界面或部署。资源包里有semantic.css和semantic.min.css说明前端用了 Semantic UI如果老师问界面怎么做的你能说出用了什么框架就加分。5.3 一个具体技巧用混淆矩阵定位模型弱点训练完别只看一个准确率数字画混淆矩阵能看出模型在哪类上翻车。代码from sklearn.metrics import confusion_matrix import seaborn as sns import matplotlib.pyplot as plt model.eval() all_preds, all_labels [], [] with torch.no_grad(): for imgs, labels in val_loader: imgs imgs.to(device) outputs model(imgs) preds outputs.argmax(dim1).cpu().numpy() all_preds.extend(preds) all_labels.extend(labels.numpy()) cm confusion_matrix(all_labels, all_preds) sns.heatmap(cm, annotTrue, fmtd, xticklabelsval_ds.classes, yticklabelsval_ds.classes) plt.xlabel(Predicted) plt.ylabel(True) plt.savefig(confusion_matrix.png, dpi150)逻辑说明遍历验证集收集所有预测和真实标签confusion_matrix算出矩阵行是真实类别列是预测类别对角线是分对的非对角线是分错的。sns.heatmap画热力图颜色越深数量越多。参数说明fmtd表示显示整数dpi150控制图片清晰度报告里用 150 到 300 都行。看矩阵时重点看哪两类互相混得多比如「厨余垃圾」和「其他垃圾」容易混说明这两类特征相似后续可以针对性加数据或调整增强策略。从那以后我每次交课设前都会强制走一遍「环境验证 → 小批量过拟合 → 全量训练 → 混淆矩阵 → 报告截图」这个流程确保代码能跑、指标能讲、图能放。希望帮到你。本文还有配套的精品资源点击获取
返回列表