ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

垃圾分类系统:Python机器学习课设高分落地指南

垃圾分类系统:Python机器学习课设高分落地指南 简介这是一份面向机器学习课程设计场景的Python垃圾分类系统源码包全部代码与数据压缩为2.26MB的zip文件共32个文件涵盖4个Python脚本如模型训练、测试、界面运行脚本、9张jpg和8张jpeg图片样本、4个xml标注文件、4张png图表、1个xls数据表及项目配置信息目录结构清晰便于按模块研读。项目覆盖监督学习完整流程借助scikit-learn、numpy、pandas等库完成图像预处理、特征提取与降维并支持SVM、KNN、CNN等模型训练与评估同时提供基于Flask/Django的部署思路。资源特别适合课程设计、毕业设计或机器学习入门实践可直接运行训练MobileNet模型结合混淆矩阵、准确率等指标优化分类效果。目前已有772人学习下载是理解垃圾分类智能化落地的实用参考。1. 机器学习课程设计选垃圾分类为什么说是性价比最高的选择每年到了课程设计季总有人卡在选题上做过电商评论情感分析的答辩时被评委一句“你这个本质是词频统计机器学习体现在哪”问得哑火做房价预测的跑完线性回归发现准确率还不如直接取均值。如果你正在找Python机器学习课设题目我的建议很直接——做垃圾分类系统。这个题目数据集公开、模型路线成熟、效果可展示而且天然自带“环保AI”的加分叙事答辩时老师很难挑出硬伤。所谓Python垃圾分类系统源码通俗讲就是用卷积神经网络训练一个图像分类模型让它看到一张垃圾照片能告诉你这是可回收物、厨余垃圾、有害垃圾还是其他垃圾。课程设计的完整交付物通常包含三块可复现的训练代码、训练好的模型文件、一个能拍照上传的交互界面。这套东西做完机器学习课设的核心知识点——数据预处理、模型搭建、训练调参、模型部署——全部覆盖而且每块都能单独拎出来写进报告。这个方向适合什么人只要你有Python基础语法能力哪怕没系统学过深度学习照着下面这条路线走也能交出一份能跑、能答辩、能拿高分的设计。整套方案的开发周期大约一周前三天处理数据加跑通训练第四天做界面剩下时间写报告和准备答辩演示。下面我把整个落地路径拆开讲。2. 方案选型与项目结构先想清楚再做省一半返工时间2.1 模型选型为什么不用自己搭CNN而是迁移学习很多初学者一开始就想自己写一个卷积神经网络从Conv2d开始堆最后堆出一个精度60%的模型然后在报告里写“由于数据集复杂模型准确率有待提高”——这套说辞我见得太多了。垃圾分类的难点在于玻璃、塑料、纸张在视觉上有大量相似纹理厨余垃圾更是形态千变万化自己搭的浅层网络很难学到足够有区分力的特征。常见的做法是采用迁移学习。拿ImageNet预训练好的ResNet18或ResNet34做特征提取只替换最后的全连接层在自己的垃圾分类数据上微调。这样做有三个实际好处一是收敛快通常15个epoch就能达到90%以上的准确率课设时间完全够用二是对显卡要求低ResNet18在6GB显存上就能跑没有独显的CPU机器也能在半小时内完成一个epoch三是答辩时有得讲——你可以讲讲为什么冻结底层、微调上层这本身就是机器学习课程的核心考点。选择PyTorch还是TensorFlow我建议PyTorch。原因是这个项目需要改模型结构、自定义数据加载PyTorch的动态图机制调试起来更顺手print一个tensor的shape直接看报错信息也直观得多。而且PyTorch的torchvision库里直接内置了ResNet的预训练权重少写一大堆加载代码。2.2 项目目录规划按这个结构组织文件后面少踩坑拿到一份源码先看目录结构这决定了你后续改代码的心智负担。我一般会这样组织一个垃圾分类课设项目garbage_classification/ ├── data/ │ ├── train/ # 训练集按类别分子文件夹 │ │ ├── recyclable/ │ │ ├── kitchen/ │ │ ├── hazardous/ │ │ └── other/ │ └── val/ # 验证集同样按类别分子文件夹 ├── checkpoints/ # 模型权重保存位置 ├── utils/ │ ├── dataset.py # 自定义Dataset与数据增强 │ └── train.py # 训练循环 ├── app/ │ ├── main.py # Flask后端接口 │ └── templates/ │ └── index.html # 前端上传页面 ├── train.py # 入口脚本 └── requirements.txt # 依赖清单这个结构的核心逻辑是数据、训练代码、部署代码三者隔离。训练代码只管吃数据出权重app目录下的代码只管加载权重做推理二者通过checkpoints目录下的.pth文件对接。这样你在调模型时不用碰Web代码改完模型也只需要替换权重文件就能更新线上效果。requirements.txt别漏了里面锁定核心依赖版本。课设环境最常见的翻车现场就是代码用了新版API而环境里装的是旧版库。给一份我常用的torch1.10.0 torchvision0.11.0 flask2.0.0 pillow8.0.0 numpy1.19.0安装直接用pip install -r requirements.txt就行。需要注意torch的CPU版本和GPU版本安装命令不同纯CPU机器装GPU版会直接报错这一步的排查放后面避坑章节细说。3. 数据集准备与训练脚本把核心代码跑通拿到权重文件3.1 数据集来源与整理imageFolder让数据加载变得极其简单垃圾分类课设最常见的数据集是华为云开源的垃圾分类数据集包含四大类四十小类的常见垃圾图片总量约两万张。这个数据集的优点是真实验收标准够用缺点是原始标注格式是按细分类组织的需要手动映射成四分类。如果你的压缩包里已经带了一份整理好的train和val目录直接跳到下一节如果只有原始图片花十分钟跑一个脚本归类。把细分类映射到四分类的逻辑是这样报纸、塑料瓶、玻璃杯归为可回收物剩菜、果皮归为厨余垃圾电池、过期药品归为有害垃圾陶瓷碎片、烟蒂归为其他垃圾。写脚本时注意保持文件扩展名一致图片统一用jpg格式避免后续读取报错。整理完以后在终端里跑一下python -c from torchvision.datasets import ImageFolder; d ImageFolder(./data/train); print(len(d), d.classes)如果输出里能看到样本数量和类别列表说明数据目录结构没问题。这里最关键的一点ImageFolder要求每个类别的图片放在以类别名命名的子文件夹里类别名字不要用中文用英文或者拼音后续序列化和读取都省心。3.2 训练代码全解从数据增强到训练循环训练脚本是整个课设的核心也是报告里篇幅最重的一章。先看完整代码再逐段解释关键参数# train.py import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms, models from torch.utils.data import DataLoader import os import time # 1. 数据增强训练集和验证集用不同的策略 train_transform transforms.Compose([ transforms.Resize((224, 224)), transforms.RandomHorizontalFlip(p0.5), # 随机水平翻转 transforms.RandomRotation(15), # 随机旋转±15度 transforms.ColorJitter(brightness0.2, contrast0.2), # 颜色扰动 transforms.ToTensor(), transforms.Normalize(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]) ]) # 2. 加载数据并创建数据加载器 train_dataset datasets.ImageFolder(./data/train, transformtrain_transform) val_dataset datasets.ImageFolder(./data/val, transformval_transform) train_loader DataLoader(train_dataset, batch_size32, shuffleTrue, num_workers2) val_loader DataLoader(val_dataset, batch_size32, shuffleFalse, num_workers2) # 3. 迁移学习加载预训练ResNet18替换最后一层 model models.resnet18(pretrainedTrue) num_features model.fc.in_features model.fc nn.Linear(num_features, 4) # 四分类 device torch.device(cuda if torch.cuda.is_available() else cpu) model model.to(device) # 4. 冻结底层参数只微调最后一层 for param in model.parameters(): param.requires_grad False for param in model.fc.parameters(): param.requires_grad True criterion nn.CrossEntropyLoss() optimizer optim.Adam(model.fc.parameters(), lr0.001) # 5. 训练循环 epochs 15 best_acc 0.0 for epoch in range(epochs): model.train() running_loss 0.0 for inputs, labels in train_loader: inputs, labels inputs.to(device), labels.to(device) optimizer.zero_grad() outputs model(inputs) loss criterion(outputs, labels) loss.backward() optimizer.step() running_loss loss.item() # 验证 model.eval() correct 0 total 0 with torch.no_grad(): for inputs, labels in val_loader: inputs, labels inputs.to(device), labels.to(device) outputs model(inputs) _, predicted torch.max(outputs, 1) total labels.size(0) correct (predicted labels).sum().item() val_acc correct / total print(fEpoch {epoch1}/{epochs}, Loss: {running_loss/len(train_loader):.4f}, Val Acc: {val_acc:.4f}) # 保存最优模型 if val_acc best_acc: best_acc val_acc torch.save(model.state_dict(), ./checkpoints/best_model.pth) print(fModel saved with val_acc {val_acc:.4f})这段代码的逻辑在课设答辩时会被反复追问有几个参数你必须能讲明白。batch_size设为32是显存和收敛速度的折中太大模型收敛慢且容易显存溢出OOM太小梯度噪声大。Resize到224x224是因为ResNet18的输入层就是224的标准尺寸ImageNet预训练权重也是在这个尺寸下学出来的。requires_grad的设置是迁移学习的精髓把前面所有层的参数冻结只训练自己加的全连接层这样训练速度快、不易过拟合。数据增强里的RandomHorizontalFlip和RandomRotation是什么意思本质是在训练时对原始图片做随机变换让模型每次看到的都是略有差异的版本相当于变相扩充了数据集能明显改善过拟合——尤其是你的训练集只有两万张图片时这个操作几乎能白捡三五个点的准确率提升。3.3 训练效果判断看到这几种输出代表可以停了训练过程会在终端打印每个epoch的损失值和验证集准确率。正常情况是训练损失从高位快速下降验证准确率从20%多一路爬升到85%以上最后十个epoch缓慢涨到90%左右同时训练损失稳定在0.2以下。如果验证准确率在某个epoch后开始掉头向下而训练准确率还在涨这就是过拟合信号。应对策略有三种早停——直接采用验证准确率最高时保存的模型上面代码里best_acc的机制就是干这个的增强数据增强的强度——把随机旋转从15度加到30度加Dropout——在fc层前插入nn.Dropout(p0.5)。这三种做法里最偷懒且有效的就是早停因为你的课设只需要一个能用的权重文件不需要追求理论上的极限精度。训练完成后checkpoints/best_model.pth就是你的核心交付物大概45MB左右包含整个模型的权重。保存这个文件后面部署推理全靠它。4. 部署与交互界面用Flask把模型变成可展示的网页应用4.1 为什么课设要做Web界面而不是学完就停很多人在训练完模型后就收手了报告里贴几个训练曲线写一段分析就交了。但实际情况是课程设计答辩现场评委更愿意看一个能互动演示的东西。你一打开浏览器上传一张塑料瓶的照片页面直接返回“可回收物置信度97.3%”——这个演示效果顶得上报告里十张图表。用Flask做的Web界面也是机器学习课设里最经典的交付物形态工作量不大但演示效果好。Flask的推理接口核心逻辑是接收前端上传的图片保存到临时文件加载模型权重对图片做和训练时相同的数据预处理前向传播得到预测结果返回JSON给前端。这个过程中最容易出错的点是预处理流程必须和训练时完全一致包括尺寸、归一化均值标准差。很多人部署时翻车就是因为推理时忘了做Normalize输入像素值范围都不对预测结果完全随机。4.2 完整的Flask推理代码直接能跑# app/main.py from flask import Flask, request, jsonify, render_template from PIL import Image import torch import torch.nn as nn from torchvision import transforms, models import os app Flask(__name__) # 类别映射顺序必须与训练时ImageFolder的类别顺序一致 CLASS_NAMES [hazardous, kitchen, other, recyclable] # 推理时用的预处理和训练验证集保持一致 infer_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]) ]) # 加载模型结构 def load_model(model_path): model models.resnet18(pretrainedFalse) model.fc nn.Linear(model.fc.in_features, 4) model.load_state_dict(torch.load(model_path, map_locationcpu)) model.eval() return model model load_model(../checkpoints/best_model.pth) app.route(/) def index(): return render_template(index.html) app.route(/predict, methods[POST]) def predict(): if file not in request.files: return jsonify({error: 没有文件上传}), 400 file request.files[file] img Image.open(file.stream).convert(RGB) # 预处理并推理 tensor infer_transform(img).unsqueeze(0) with torch.no_grad(): outputs model(tensor) _, predicted torch.max(outputs, 1) confidence torch.softmax(outputs, dim1)[0][predicted].item() # 返回结果 result { class: CLASS_NAMES[predicted.item()], confidence: round(confidence, 4) } return jsonify(result) if __name__ __main__: app.run(host0.0.0.0, port5000, debugTrue)这个推理代码里有几个细节值得说。convert(RGB)这步是必需的有些用户上传的图片是PNG格式带透明通道直接转成RGB三通道保证输入张量形状是[1, 3, 224, 224]否则模型推理时会直接报维度错误。model.eval()切换推理模式禁用Dropout和BatchNorm的训练行为这一步漏了会导致同一个输入每次预测结果都不同。map_locationcpu指定权重加载到CPU这样没有CUDA的机器也能运行。前端页面用一个最简单的HTML表单就能实现不需要框架。写一个index.html放在templates目录下包含一个文件选择框和一个上传按钮再用十几行JavaScript发一个POST请求把图片传给后端把返回结果显示在页面上。这里不用给完整前端代码课设级别的交互能跑通上传和显示就足够了。4.3 启动和联调跑通最小闭环验证启动命令极其简单cd app python main.py浏览器打开http://127.0.0.1:5000上传一张测试图片返回JSON里能看到预测类别和置信度就说明整条链路通了。联调阶段可以把test图片多准备几张覆盖四个类别每个类别都验证一遍预测是否准确。这个操作建议在答辩前一天做因为联调完代码的置信度就是答辩演示时用的素材。如果上传后报错优先看终端打印的报错堆栈。500错误通常是后端的Pillow读取图片失败400错误是前端没把文件传过来——检查HTML里input typefile namefile的name属性是不是和后端request.files[file]里的键一致。5. 训练与部署避坑五条血泪经验帮你少走三天弯路5.1 现象训练时报错Expected 3D or 4D tensor模型卡在forward原因输入图片通道数不是3比如有的图片是灰度图单通道直接Resize后进模型就炸了。解决Dataset类里统一做通道转换在数据读取函数中强制加一行image image.convert(RGB)位置放在transform之前就可以把灰度图、RGBA图全部统一成三通道。这是一个典型的坑因为公开数据集里难免混入几张灰度扫描图你的训练集规模越大越容易踩到。5.2 现象训练了一个小时验证准确率一直徘徊在25%左右四分类随机水平原因类别标签映射错位。比如ImageFolder自动生成的类别顺序是按文件夹名字母序排列的你手动标注的类别索引如果没按这个顺序来模型学习的标签和真实标签对不上根本学不会。解决训练前先打印train_dataset.class_to_idx人工确认映射关系。部署阶段也一样CLASS_NAMES列表的顺序必须和训练时一致否则推理阶段会把A类预测成B类——直接全错。5.3 现象训练时GPU显存溢出OOM第一次迭代就挂原因batch_size设太大或者训练图片分辨率高于224。解决把batch_size从32降到8如果还报错就降到2。这里有个血泪经验说给你听PyTorch里的OOM报错信息喜欢误导人它经常在torch.backends.cudnn.benchmark附近报错让人以为是CuDNN的问题其实是显存不够。把batch_size调小问题立刻消失。没有GPU的机器直接在代码里设device cpu把epoch数减半训练时间预计会慢十倍左右但能跑完。5.4 现象模型训练完验证集精度90%以上但网页上传真实照片识别结果很不稳定原因真实场景的拍摄照片和训练集里裁剪好的垃圾特写差异太大——背景杂乱、光线不均、物体占比太小。解决这是几乎所有课设都会面临的问题本质是训练数据和部署数据分布不一致。有两个思路改善一是推理前把图片做中心裁剪只保留中间70%区域降低背景干扰二是给前端加一句提示“请将垃圾放在画面中央”。这个现象本身可以写进报告的“不足与改进”章节反而是加分项。5.5 现象pip install -r requirements.txt装完以后import torch直接报错找不到DLL原因操作系统缺少PyTorch依赖的Visual C运行库Windows平台常见。解决到这里你需要安装Visual C Redistributable安装完成后重启终端再试。如果是说CUDA版本的torch库文件缺失安装CPU版本可解pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu注意这个命令仅限无独显或驱动不兼容的机器有NVIDIA显卡但版本旧也建议先用CPU版把代码流程跑通模型能跑再考虑换GPU版提速。6. 进阶技巧从“能跑”到“高分”靠这三点拉开差距课程设计拿到良好不难难在怎么够到优秀的门槛。如果你还有三到五天的余量我建议往下面三个方向做深化每个方向投入产出比都极高。第一个方向是模型可视化分析。用Grad-CAM生成注意力热力图把“模型为什么把这张图片分类为厨余垃圾”用热力图展示出来——红色区域是模型决策时关注的位置。答辩时投影这张图比任何文字都更有说服力。核心实现是注册ResNet最后一个残差块的forward hook拿到梯度后做全局平均池化生成热力图叠加到原图上。这段代码大约四十行网上有大量现成实现可以改。第二个方向是模型对比实验。把ResNet18换成MobileNetV3并重新训练记录两个模型的参数量、推理时间、准确率报告里做一张对比表格。这样你的报告就从“实现了一个系统”升维到“做了实验对比选型”这是机器学习课设拿到高分最直接的标准写法。MobileNet在CPU上的推理速度比ResNet快三倍以上而准确率只低一到两个点这个结论本身就有讨论价值。第三个方向是类激活图错误分析。找几个预测失败的样本观察模型错在哪里——是玻璃瓶被分到其他垃圾还是果皮被分到可回收物。分析为什么会产生这种混淆并在报告里提出改进思路比如对容易混淆的细分类增加训练样本。这种“发现问题→分析问题→提出方案”的闭环是评委最愿意看到的研究素养比堆砌十个性能指标都有用。最后提醒一个几乎所有课设都会遇到的问题答辩前一晚把代码从头到尾跑一遍流程重点检查权重文件路径、Flask端口是否被占用。我当年就是答辩当天才发现端口被后台进程占用手忙脚乱地杀掉重开那段经历至今难忘。提前跑通就能把精力留在讲解和演示上希望帮到你。本文还有配套的精品资源点击获取
返回列表