简介这是一份面向计算机、人工智能相关专业学生及课程实践者的智能垃圾分类系统项目资料可作为毕业设计或课程作业的完整参考。项目围绕计算机视觉与机器学习展开涵盖图像预处理、特征提取、CNN分类模型训练及大数据分析等环节帮助读者理解AI技术在环保场景中的落地思路。压缩包共20个文件以Python源码、数据集压缩包、UI界面文件和说明文档为主另含少量C与图片素材整体约35.12MB目录结构清晰便于按模块查阅。已有121人学习下载。资源包含系统设计文档、可运行代码、分类数据集与测试报告读者可据此复现垃圾分类识别流程掌握模型训练、超参数调优与界面交互的实现细节巩固计算机视觉与数据分析的实践能力。1. 智能垃圾分类系统从一份课程作业到能跑通的原型中间隔着什么智能垃圾分类系统这个题目几乎每年毕业季都会在毕设选题里出现一次。很多人第一反应是「不就是个图像分类吗拿 ResNet 跑一遍完事」真动手才发现事情没那么简单数据集从哪来、类别怎么定、模型在手机端跑不动、摄像头拍出来的图和训练集分布完全对不上。我带过几届学生的课程设计也帮朋友改过几版这类系统最常见的翻车点从来不是模型精度不够而是整条链路没打通——训练时准确率 95%一接摄像头就变成瞎猜。这份「毕设课程作业_一个智能垃圾分类系统.zip」从命名看是一个完整的工程打包通常包含数据集、训练脚本、推理代码和一份说明文档。它要解决的问题很具体让一个没有服务器、没有标注团队的学生用一台普通笔记本做出一个能识别常见垃圾类别、能演示、能写进论文的系统。适合的人群是本科高年级做毕设的学生、需要交课程大作业的初学者以及想快速搭一个分类 demo 的开发者。下面我按实际落地的顺序把这条链路拆开讲清楚。2. 先定类别再谈模型垃圾分类的标签体系怎么设计2.1 四分类还是细分类直接决定后面所有工作量国内大部分城市的垃圾分类标准是四分类可回收物、有害垃圾、厨余垃圾湿垃圾、其他垃圾干垃圾。这是最稳妥的起点因为公开数据集多、标注成本低、模型容易收敛。但很多学校的要求会写「识别具体物品」比如塑料瓶、纸箱、电池、果皮这就变成了细分类问题类别数从 4 涨到 20 甚至 40数据量和训练难度是数量级的差别。我的建议是如果只是课程作业先做四分类把整条链路跑通再在论文里讨论细分类的扩展方案。如果毕设明确要求细分类那就把类别控制在 10 到 15 个之间选那些外观差异大、容易采集的类别比如塑料瓶、易拉罐、纸盒、玻璃瓶、电池、果皮、烟头、一次性餐具。类别太多、外观太像的比如各种塑料袋新手很难做出能看的指标。标签体系还有一个容易被忽略的点类别互斥性。现实里一个物品可能同时属于多个类别比如一个带电池的玩具。工程上的做法是定义主类别在标注规范里写清楚判定优先级否则标注员之间的一致性会很低模型学出来的边界也是糊的。2.2 数据集从哪来三条可落地的采集路径公开数据集方面常见的有 TrashNet约 2500 张6 类、TACO约 1500 张60 类标注质量参差、以及一些国内高校整理的四分类数据集。TrashNet 的问题是背景太干净全是白底摆拍直接拿来训练模型学到的是背景而不是物体一换真实场景就崩。这是最典型的翻车场景。所以我的做法是公开数据集只用来做预训练或者补充主力数据自己采。采集路径有三条第一条手机拍摄。找一块纯色背景板白纸、灰布都行把物品放上去从不同角度拍每个类别 200 到 300 张。关键是变换光照和角度别一个姿势拍到底。第二条网络爬取。用关键词搜图但一定要人工过一遍去掉水印重、分辨率低、类别错误的图。爬取的数据分布和真实场景更接近但噪声大。第三条视频抽帧。录一段往垃圾桶扔垃圾的视频按每秒 2 到 5 帧抽这样得到的图天然带真实背景和运动模糊最接近部署场景。三条路径混用最终每个类别凑到 300 到 500 张四分类总共 1500 到 2000 张对课程作业足够了。数据划分按 7:2:1 分训练、验证、测试注意同一个物品的不同角度照片要分到同一集合否则测试集指标会虚高。2.3 标注工具与格式LabelImg 到 YOLO 格式的转换如果只做分类标注就是按文件夹分好类别目录结构如下dataset/ ├── train/ │ ├── recyclable/ │ ├── hazardous/ │ ├── kitchen/ │ └── other/ ├── val/ │ └── ...同上 └── test/ └── ...同上如果要做检测框出物体再分类就需要标注框。常用工具是 LabelImg导出 Pascal VOC 格式的 XML再转成 YOLO 的 txt 格式。转换脚本很多人写过核心逻辑就是读 XML 里的 bndbox除以图像宽高做归一化import os import xml.etree.ElementTree as ET def voc_to_yolo(xml_path, img_w, img_h, class_map, out_path): tree ET.parse(xml_path) root tree.getroot() lines [] for obj in root.iter(object): cls obj.find(name).text if cls not in class_map: continue cls_id class_map[cls] bbox obj.find(bndbox) x1 float(bbox.find(xmin).text) y1 float(bbox.find(ymin).text) x2 float(bbox.find(xmax).text) y2 float(bbox.find(ymax).text) # YOLO 格式要求中心点坐标和宽高全部归一化到 0-1 cx (x1 x2) / 2.0 / img_w cy (y1 y2) / 2.0 / img_h w (x2 - x1) / img_w h (y2 - y1) / img_h lines.append(f{cls_id} {cx:.6f} {cy:.6f} {w:.6f} {h:.6f}) with open(out_path, w) as f: f.write(\n.join(lines))这段代码里class_map是类别名到数字 ID 的映射必须和训练时的类别顺序一致否则模型学出来的类别是错位的。img_w和img_h要从对应图像读取不能写死。归一化后的坐标保留 6 位小数足够YOLO 官方推荐格式就是这样。转换完一定要抽查几张用可视化脚本把框画回图上确认没偏移。3. 模型选型与训练在笔记本上跑出能用的精度3.1 MobileNetV3 还是 ResNet18参数量和精度的取舍课程作业的算力通常是一台笔记本可能带一块入门级显卡比如 GTX 1650也可能只有 CPU。这种情况下模型选型的第一约束是参数量和推理速度不是精度上限。ResNet18 参数量约 11M输入 224x224在 GTX 1650 上训练 2000 张图、30 个 epoch大概十几分钟。MobileNetV3-Small 参数量约 2.5M速度快一倍以上精度在四分类任务上通常只低 1 到 2 个百分点。如果最终要部署到手机或者树莓派MobileNetV3 是更合理的选择。如果只在电脑上演示ResNet18 更省心因为预训练权重好找、社区示例多。我的习惯是先用 ResNet18 跑一版基线确认数据和流程没问题再换 MobileNetV3 做轻量化对比论文里正好有一组消融实验可写。迁移学习是必须的ImageNet 预训练权重能让你在 2000 张图上就收敛从零训练基本没戏。3.2 训练脚本的关键参数学习率、batch size 和冻结策略下面是一个基于 PyTorch 的最小训练脚本骨架覆盖了最关键的几个参数import torch import torch.nn as nn from torchvision import models, datasets, transforms from torch.utils.data import DataLoader # 数据增强训练集用随机裁剪和翻转验证集只做 resize 和归一化 train_tf transforms.Compose([ transforms.RandomResizedCrop(224, scale(0.7, 1.0)), transforms.RandomHorizontalFlip(), transforms.ColorJitter(0.2, 0.2, 0.2), 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) model models.resnet18(weightsmodels.ResNet18_Weights.IMAGENET1K_V1) # 冻结主干前几层只训练后面的层小数据集上更稳 for name, param in model.named_parameters(): if layer1 in name or layer2 in name: param.requires_grad False model.fc nn.Linear(model.fc.in_features, 4) device torch.device(cuda if torch.cuda.is_available() else cpu) model model.to(device) criterion nn.CrossEntropyLoss() # 只优化需要梯度的参数学习率 1e-3配合 StepLR 衰减 optimizer torch.optim.Adam(filter(lambda p: p.requires_grad, model.parameters()), lr1e-3) scheduler torch.optim.lr_scheduler.StepLR(optimizer, step_size10, gamma0.1) for epoch in range(30): model.train() for imgs, labels in train_loader: imgs, labels imgs.to(device), labels.to(device) optimizer.zero_grad() loss criterion(model(imgs), labels) loss.backward() optimizer.step() scheduler.step() # 每个 epoch 后在验证集上评估保存最优权重 model.eval() correct total 0 with torch.no_grad(): for imgs, labels in val_loader: imgs, labels imgs.to(device), labels.to(device) pred model(imgs).argmax(1) correct (pred labels).sum().item() total labels.size(0) print(fepoch {epoch}, val acc {correct/total:.4f})几个参数说明batch_size32是入门显卡的稳妥值显存不够就降到 16但太小会让 BatchNorm 统计不稳。学习率1e-3配合 Adam 是迁移学习的常用起点如果 loss 震荡就降到1e-4。冻结layer1和layer2是因为这两层学的是通用纹理特征小数据集上微调反而容易过拟合。StepLR每 10 个 epoch 衰减一次让后期收敛更细。数据增强里的RandomResizedCrop的scale(0.7, 1.0)是防止裁得太狠把物体裁没ColorJitter模拟不同光照。归一化用的均值方差是 ImageNet 的标准值必须和预训练权重匹配写错会让精度掉一大截。3.3 训练过程怎么判断有没有问题看三条曲线训练 loss、验证 loss、验证准确率。正常情况是训练 loss 稳定下降验证 loss 先降后平验证准确率跟着涨。如果训练 loss 降但验证 loss 涨是过拟合加数据增强或者加 dropout。如果两个 loss 都不降是学习率太大或者数据标签有问题。如果验证准确率卡在 25% 左右四分类的随机水平大概率是标签和文件夹没对上或者归一化参数写错了。还有一个玄学现象验证准确率波动很大一会儿 80% 一会儿 60%。这通常是验证集太小几百张图里错几张就掉几个点。解决办法是把验证集扩到 300 张以上或者用 k 折交叉验证取平均。4. 从模型到能演示的系统推理、界面和部署4.1 单张图片推理脚本与置信度阈值训练完保存的权重要能加载回来做推理。下面是一个最小推理脚本import torch from torchvision import models, transforms from PIL import Image CLASSES [recyclable, hazardous, kitchen, other] def load_model(weight_path): model models.resnet18(weightsNone) model.fc torch.nn.Linear(model.fc.in_features, len(CLASSES)) model.load_state_dict(torch.load(weight_path, map_locationcpu)) model.eval() return model def predict(model, img_path): 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]) ]) img Image.open(img_path).convert(RGB) tensor tf(img).unsqueeze(0) with torch.no_grad(): logits model(tensor) probs torch.softmax(logits, dim1)[0] conf, idx probs.max(0) # 置信度低于 0.6 时给出「不确定」提示避免强行分类 if conf.item() 0.6: return uncertain, conf.item() return CLASSES[idx.item()], conf.item()置信度阈值是工程上很重要的一环。模型对每一张图都会输出一个类别哪怕这张图是一张白纸。设一个阈值我一般用 0.6低于它就返回「不确定」让用户重新拍。这比强行给一个错误答案体验好得多也是答辩时能加分的细节。4.2 用 Gradio 搭一个能演示的界面答辩现场需要的是一个能点、能传图、能出结果的界面。Gradio 是最省事的方案十几行代码就能跑起来import gradio as gr model load_model(best.pth) def classify(img): img Image.fromarray(img).convert(RGB) 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]) ]) tensor tf(img).unsqueeze(0) with torch.no_grad(): probs torch.softmax(model(tensor), dim1)[0] return {CLASSES[i]: float(probs[i]) for i in range(len(CLASSES))} gr.Interface(fnclassify, inputsgr.Image(), outputsgr.Label(num_top_classes4)).launch()gr.Image()接收上传的图片或摄像头拍照gr.Label输出每个类别的概率条。num_top_classes4让四个类别都显示出来答辩时能直观看到模型的判断依据。这个界面在本地跑浏览器打开就能用不需要部署到服务器。4.3 部署到树莓派或手机端的现实约束如果毕设要求「嵌入式部署」树莓派 4B 是常见选择。把 PyTorch 模型转成 ONNX 或者 TFLite推理速度能提升不少。但要注意树莓派上跑 ResNet18 大概每张图 200 到 400 毫秒MobileNetV3 能压到 100 毫秒以内。摄像头用 Picamera配合 OpenCV 读帧做一个简单的循环推理。手机端的话Android 可以用 TFLiteiOS 用 Core ML。但转换过程坑很多尤其是算子不支持的问题。我的建议是如果时间紧演示环节用笔记本加 Gradio论文里讨论移动端部署方案即可不必真机跑通。把精力花在数据质量和模型对比上性价比更高。5. 避坑指南那些让答辩翻车的细节5.1 现象训练集准确率 99%测试集只有 60%原因数据泄漏。同一个物品的多张照片被分到了训练集和测试集模型记住了这个物品而不是类别特征。或者数据增强用在了验证集上导致验证指标虚高。解决按物品 ID 划分数据集同一个物品的所有照片只进一个集合。验证集和测试集只做 resize 和归一化不做随机裁剪和翻转。划分完检查一遍文件名确认没有重复。5.2 现象模型把所有的图都预测成同一个类别原因类别不平衡。如果「其他垃圾」占了 70% 的样本模型只要全猜这一类就能拿到 70% 准确率loss 也会降。这是最隐蔽的坑因为指标看起来还行。解决统计每个类别的样本数对少的类别做过采样或者加类别权重。CrossEntropyLoss(weight...)可以传入每个类别的权重权重设为样本数的倒数。或者用 WeightedRandomSampler 在 DataLoader 层面做平衡。5.3 现象换一张自己拍的照片模型完全不认识原因训练数据和真实场景的分布差异。公开数据集是白底摆拍你自己拍的是桌面背景模型学到的是背景相关性。解决训练时就混入真实背景的图。如果已经训练完了做一次测试时增强TTA把图做几种变换后取平均预测。更彻底的办法是重新采集一批真实场景的图微调最后几层。5.4 现象推理时显存溢出或者速度极慢原因没有用torch.no_grad()推理时还在建计算图。或者 batch size 设太大或者模型没设eval()导致 BatchNorm 用训练模式。解决推理代码必须包在with torch.no_grad():里模型加载后立刻model.eval()。单张推理时unsqueeze(0)加一个 batch 维度就行不要一次传太多图。5.5 现象Gradio 界面在答辩现场打不开原因端口被占用或者防火墙拦截或者launch()默认只监听本地。解决launch(server_name0.0.0.0, server_port7860)指定端口和监听地址。提前在答辩教室的电脑上试跑一遍确认网络环境没问题。最保险的是准备一个录屏万一现场出问题可以放视频。6. 把四分类做到 90% 以上几个我反复验证过的技巧第一个技巧是渐进式解冻。一开始冻结主干只训练分类头等验证准确率稳定后解冻最后两个 stage用更小的学习率比如 1e-4继续训练。这样比一上来就全量微调更稳尤其在小数据集上。我一般分三段前 10 个 epoch 只训 fc 层中间 10 个 epoch 解冻 layer4最后 10 个 epoch 解冻 layer3 和 layer4。第二个技巧是测试时增强。推理时把同一张图做原图、水平翻转、轻微缩放三个版本分别预测后取平均概率。这个操作不增加训练成本通常能涨 1 到 2 个百分点。代码上就是把推理循环跑三遍概率相加再除以三。第三个技巧是混淆矩阵分析。训练完不要只看准确率画一个混淆矩阵看哪两个类别最容易混。我做过的一次实验里「厨余垃圾」和「其他垃圾」混淆严重因为剩饭和用过的纸巾外观接近。针对这种情况专门补采这两个类别的边界样本比盲目加数据有效得多。技巧预期收益额外成本适用阶段渐进式解冻2~4%训练时间增加 50%数据量小于 3000 张测试时增强1~2%推理时间增加 2 倍推理阶段混淆矩阵定向补数据3~5%采集和标注成本已有基线后类别权重平衡2~3%几乎为零类别不平衡时最后说一个习惯每次实验都记录配置。学习率、batch size、数据增强参数、随机种子全部写进一个 config 文件或者实验日志。我吃过亏有一次调出一个 92% 的模型过了一周想复现发现忘了当时用的学习率是多少只能重跑。现在我用一个简单的 YAML 文件存所有参数训练脚本读这个文件实验名带上时间戳。这个习惯看起来麻烦但能省下大量重复劳动。希望帮到你。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
vim配置文件从零到一:用 TaoToken 统一 Key 打通 AI 补全与代码诊断 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 11:29:29
电梯智慧监管系统源码包:毕设级全栈项目实战与避坑指南 简介:这份资源是电梯智慧监管系统的完整项目源码包,面向计算机、物联网、自动化等相关专业的在校学生、教师及企业开发人员,可用于毕业设计、课程设计、项目立项演示或技术学习进阶。项目已通过导师评审,答辩成绩达95分࿰… · 2026/9/26 11:29:29
SSL证书与Nginx配置全指南:从自签、免费证书到浏览器信任 先说一件我今年已经碰到好几次的事:同事搭了个内部系统,Nginx、域名、端口全配好了,结果浏览器一打开就是红色警告。检查了半天,问题要么出在证书链没配全,要么出在自签证书压根没被系统信任。SSL证书这个东西… · 2026/9/26 11:29:29
Jev 超快决策大脑:让网页 Agent 告别大模型延迟 1. 先搞清楚 Jev 到底在解决什么问题
1.1 网页 Agent 的“决策瓶颈”在哪里 聊 Jev 之前,得先把网页 Agent 的运作方式捋一遍。一个典型的网页 Agent,比如基于 Browser Use 这类方案构建的智能体,它的工作循环大致是这样的:观察当… · 2026/9/26 12:02:14
RK3588交叉编译实战:从hello world到YOLOv5s环境搭建 1. 为什么"交叉编译hello"是RK3588开发绕不开的第一道坎很多人拿到香橙派5之后,第一反应是插电、烧系统、接屏幕,然后在板子上直接写代码编译。这么做在PC上没问题,放到嵌入式板子上就是另一回事了。香橙派5搭载的RK3588是一颗8核A… · 2026/9/26 12:02:08
STM32最小系统四大核心设计原理与实战避坑指南 1. 什么是STM32最小系统?它到底“最小”在哪儿?你拆开一块淘宝上卖9.9包邮的“STM32F103C8T6最小系统板”,看到那块巴掌大的蓝色PCB,上面只有芯片、几个电容、一个晶振、两颗电阻和一个USB转串口芯片——这玩意儿真能跑起来&#… · 2026/9/26 12:02:08
Cursor安全插件链配置指南:用TaoToken统一Key打通代码审计工作流 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 12:02:08
Linux下使用Docker官方二进制包安装与运维实战 1. 对比包管理器与二进制通用包:什么环境才值得选后者
1.1 两种安装方式的分水岭 大多数人在 Linux 上装 Docker,第一反应就是 apt 或 yum 一把梭。这个思路本身没错, apt install docker.io 或者 yum install docker-ce 在普通场景里确… · 2026/9/26 12:02:01
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍 简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践 一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46