基于 YOLO11 的六类生活垃圾视觉分类系统 | 用于社区投放点智能督导、分拣线品类分流、投错率统计分析 | 附完整源码与效果演示
基于 YOLO11 的六类生活垃圾视觉分类系统从模型到 Streamlit 全流程实战关键词YOLO11、生活垃圾分类、智能督导、社区投放点、Streamlit、目标检测、Ultralytics一、背景1.1 行业痛点「生活垃圾分类」推行多年落到社区投放点、智能督导亭、中型分拣线上的真实痛点其实非常工程化居民投错率高纸箱、玻璃、金属、厨余、纸张、塑料这 6 类相互混淆靠人眼贴标签管理错投比例长期在 25% 以上督导员效率低一个投放点配 1~2 个督导员每人每天面对几百次投放眼到嘴到疲劳即漏判分拣线分流难中型分拣线如果只能识别干 / 湿两类后续机械臂或人工二次分拣的成本依然居高不下运营缺数据哪类垃圾投放最多、哪个时段、哪个点位投错率最高没有视觉感知运营完全是黑盒。把6 类生活垃圾识别做成一个轻量级目标检测任务让模型在投放点顶视相机、督导亭 IPC、中型分拣线相机这些低算力设备上实时跑起来就能让社区运营、督导考评、分拣调度同时受益。本项目就是这条路线下的完整落点基于 YOLO11n Streamlit识别纸箱、玻璃、金属、厨余有机物、纸张、塑料这 6 大类生活垃圾。视频演示与源码下载https://www.bilibili.com/video/BV125EA6NEnP包含完整项目源码预训练模型权重️数据集1.2 项目运行效果1.3 项目介绍核心创新点维度设计类目设计6 类生活垃圾全覆盖含厨余有机物等湿垃圾干湿混合场景适配模型选型YOLO11n参数量约 2.6 MCPU 实时、督导亭 IPC / 边缘盒子友好部署形态Streamlit 单页应用 本地 best.pt零数据库、零中间件输入兼容图片 / 批量图片含 zip/ 视频 / 摄像头 4 种输入复用同一推理引擎主题封装深绿 橙黄主色调#166534 #f97316呼应环保 / 督导行业感功能概览️单图检测拖拽上传 → 实时返回带框图 类别 / 置信度 / 坐标明细批量检测单次最多 200 张输出汇总表 类别分布柱状图 zip 打包下载视频检测mp4 / avi / mov / mkv逐帧推理后落盘新视频便于督导回看摄像头实时检测可对接投放点顶视相机 / 督导亭 IPC / 分拣线相机6 类生活垃圾纸箱 、玻璃 、金属 、厨余有机物 、纸张 、塑料 。技术栈层选型模型框架Ultralytics 8.3 PyTorch视觉算法YOLO11nAnchor-FreeC2f BackboneDecoupled Head DFLWeb 前端Streamlit 1.35 自定义 HTML 主题视频 / 图像OpenCV、imageio-ffmpeg数据可视化Plotly / Streamlit 原生 chart配置管理单一configs/project.yaml行业话术 / UI / 推理阈值统一收口二、设计框架2.1 系统架构┌──────────────────────────────────────────┐ │ Streamlit Web 前端单页 SPA │ │ · 6 类图鉴 / 单图 / 批量 / 视频 / 摄像头 │ │ · 侧栏 · 阈值 · 类别筛选 · 模型缓存 │ └────────────────────┬─────────────────────┘ │ Python 调用 ▼ ┌──────────────────────────────────────────┐ │ 推理服务层infer_image_path 等 │ │ · bytes / Path / frame → tensor │ │ · 推理结果 → 标注图 DataFrame │ └────────────────────┬─────────────────────┘ │ ▼ ┌──────────────────────────────────────────┐ │ YOLO11n 推理引擎model/best.pt │ │ Backbone (C2fSPPF) → Neck (FPN/PAN) │ │ → Decoupled HeadDFL cls × 6 │ └──────────────────────────────────────────┘2.2 YOLO11 网络结构输入 640×640×3 │ ▼ [Backbone] Conv → C2f → Conv → C2f → Conv → C2f → Conv → C2f → SPPF │ ▼ [Neck] FPN 上采样 PAN 下采样P3 / P4 / P5 三级金字塔 │ ▼ [Head] Decoupled Headcls 头 / reg 头解耦 回归头采用 DFLDistribution Focal Loss Anchor-Free输出 (cx, cy, w, h, cls × 6) │ ▼ [NMS] iou0.7, conf0.25 → 最终检测框2.3 检测流程投放点 / 督导亭相机帧 │ ▼ Letterbox 640×640 RGB │ ▼ YOLO11n forward │ ▼ Detect Head 输出 (cls × 6) │ ▼ conf 过滤 NMS │ ▼ result.plot() 画框 类别 置信度 │ ▼ Streamlit 双列展示 DataFrame 类别分布图三、代码结构核心 50 行 解析项目目录六类生活垃圾分类/ ├── app/streamlit_app.py # Web 入口 ├── configs/project.yaml # 行业话术 / UI / 训练 / 推理参数 ├── model/best.pt # 训练好的 YOLO11n 权重 ├── scripts/ # train / validate / export 等 ├── data/dataset/ # 训练 / 验证 / 测试集 └── 六类生活垃圾检测数据集/ # 原始数据集含训练 / 验证 / 测试切分最核心的 50 行——模型加载 单图推理 Streamlit 单图 Tab# 1. 模型加载带 streamlit 资源缓存避免每次刷新重载st.cache_resource(show_spinnerFalse)defload_model(model_path:str)-YOLO:returnYOLO(model_path)# 2. 单图推理路径 → 标注图 检测明细 DataFrame definfer_image_path(model:YOLO,image_path:Path,conf:float):resultmodel.predict(str(image_path),confconf,verboseFalse)[0]annotatedresult.plot()# BGR ndarray已画框rows[]ifresult.boxesisnotNone:forboxinresult.boxes:cls_idint(box.cls.item())x1,y1,x2,y2[float(v)forvinbox.xyxy[0].tolist()]rows.append({class_id:cls_id,class_name:result.names[cls_id],# eg. 厨余有机物confidence:round(float(box.conf.item()),4),x1:round(x1,1),y1:round(y1,1),x2:round(x2,1),y2:round(y2,1),})returnannotated[:,:,::-1],pd.DataFrame(rows)# 3. bytes → 临时文件 → 复用同一函数 defrun_image_inference(model:YOLO,image_bytes:bytes,conf:float,suffix.jpg):withtempfile.NamedTemporaryFile(deleteFalse,suffixsuffix)asf:f.write(image_bytes);tmpPath(f.name)try:returninfer_image_path(model,tmp,conf)finally:tmp.unlink(missing_okTrue)# 4. Streamlit 单图 Tab上传 → 推理 → 双列展示 modelload_model(str(MODEL_PATH))uploadedst.file_uploader(上传一张待识别的生活垃圾图片,typeIMAGE_UPLOAD_TYPES)confst.sidebar.slider(置信度阈值,0.05,0.95,DEFAULT_CONF,0.01)ifuploadedisnotNone:annotated,dfrun_image_inference(model,uploaded.getvalue(),conf,suffixPath(uploaded.name).suffix)col1,col2st.columns(2)col1.image(uploaded,caption原图)col2.image(annotated,caption检测结果带垃圾类别标签)st.dataframe(detections_to_display(df))render_detection_analysis(df)5 段解析st.cache_resource把YOLO(model_path)的耗时锁在第一次访问督导亭多终端 session 共享同一份模型实例避免每次切换 Tab 都重载。result.plot()直接返回带颜色框 类别 置信度的BGR ndarray6 类垃圾自动 6 种颜色便于在投放点屏幕上直接展示给居民。把每个box的cls / conf / xyxy拍成dict再拼成DataFrame——后续表格、CSV 下载、类别分布柱状图、视频时间线全部复用同一份结构运营拉数据时直接to_csv。bytes → tempfile → infer_image_path这层薄壳让前端上传 / 批量解 zip / 视频抽帧 / 摄像头帧四种来源都复用同一个推理函数新接 RTSP 督导亭流时不用重写推理逻辑。Streamlit 的cache_resource file_uploader dataframe组合让一个产品级垃圾分类页面只需 11 行代码——非常适合给环卫公司做督导大屏或运营后台。四、训练效果模型在自建的「六类生活垃圾检测数据集」约 2500 张实拍图像6 类生活垃圾上完成 YOLO11n 训练并保存best.pt。在测试集上检测效果良好可稳定识别纸箱、玻璃、金属、厨余有机物、纸张、塑料这六类典型生活垃圾已能满足社区投放点、智能督导亭、中型分拣线等场景的初筛 / 督导考评 / 类别统计使用需要。从单图检测样例上文「项目运行效果」截图可以看到在不同光照、不同摆放姿态、不同混合堆叠程度下模型都能给出框 类别 置信度配合 Streamlit 前端实时呈现给居民和督导员。五、项目总结做对了什么把垃圾分类收敛到 6 大类覆盖可回收物 厨余湿垃圾比四分法更细但又比几十个子类更易标注与训练用 YOLO11n 轻量底座督导亭 IPC、ARM 边缘盒子也能实时跑不需要 GPU一份project.yaml把行业话术 / UI 主题色 / 类别映射 / 推理阈值全部收口迁移到「四分类 / 八分类」等地方标准只需替换数据集单图、批量、视频、摄像头四种输入复用同一个infer_image_path后期接 RTSP 投放点摄像头流时只需把摄像头帧喂进来即可。还能怎么做在数据集层面持续补充强光 / 逆光 / 厨余湿料堆叠 / 透明塑料等难样本把湿厨余 vs 纸张、玻璃瓶 vs 透明塑料瓶这类高度相似样本的判别力进一步拉开接入重量传感器 视觉双路投票督导亭场景中能显著降低单路视觉的误判视觉判塑料 称重判玻璃 → 触发督导员复核把检测结果 时间戳 点位 ID 推送到运营后台做「点位画像 / 时段画像 / 投错率排行榜」让垃圾分类督导从靠人监督变成数据驱动。一句话总结YOLO11 Streamlit 让社区生活垃圾视觉分类从一个研究课题变成了一份 yaml 一份 best.pt 一份 streamlit_app.py的工程化标准动作本文给出了一份可以直接 fork 落地的样板。