基于 YOLO11 的六类生活垃圾视觉分类系统 | 用于社区投放点智能督导、分拣线品类分流、投错率统计分析 | 附完整源码与效果演示

基于 YOLO11 的六类生活垃圾 视觉 分类系统:从模型到 Streamlit 全流程实战

关键词:YOLO11、生活垃圾分类、智能督导、社区投放点、Streamlit、目标检测、Ultralytics

一、背景

1.1 行业痛点

「生活垃圾分类」推行多年,落到社区投放点、智能督导亭、中型分拣线上的真实痛点其实非常工程化:

  • 居民投错率高:纸箱、玻璃、金属、厨余、纸张、塑料这 6 类相互混淆,靠人眼贴标签管理,错投比例长期在 25% 以上;

  • 督导员效率低:一个投放点配 1~2 个督导员,每人每天面对几百次投放,眼到嘴到,疲劳即漏判;

  • 分拣线分流难:中型分拣线如果只能识别"干 / 湿"两类,后续机械臂或人工二次分拣的成本依然居高不下;

  • 运营缺数据:哪类垃圾投放最多、哪个时段、哪个点位投错率最高?没有视觉感知,运营完全是黑盒。

    把"6 类生活垃圾识别"做成一个轻量级目标检测任务,让模型在投放点顶视相机、督导亭 IPC、中型分拣线相机这些低算力设备上实时跑起来,就能让社区运营、督导考评、分拣调度同时受益。本项目就是这条路线下的完整落点:基于 YOLO11n + Streamlit,识别纸箱、玻璃、金属、厨余有机物、纸张、塑料这 6 大类生活垃圾。

视频演示与 源码 下载

www.bilibili.com/video/BV125...

包含: 📦完整项目源码

📦 预训练 模型权重

🗂️数据集

1.2 项目运行效果

1.3 项目介绍

核心创新点:

维度 设计
类目设计 6 类生活垃圾全覆盖,含厨余有机物等湿垃圾,干湿混合场景适配
模型选型 YOLO11n,参数量约 2.6 M,CPU 实时、督导亭 IPC / 边缘盒子友好
部署形态 Streamlit 单页应用 + 本地 best.pt,零数据库、零中间件
输入兼容 图片 / 批量图片(含 zip)/ 视频 / 摄像头 4 种输入复用同一推理引擎
主题封装 深绿 + 橙黄主色调(#166534 + #f97316),呼应"环保 / 督导"行业感

功能概览:

  • 🗑️ 单图检测:拖拽上传 → 实时返回带框图 + 类别 / 置信度 / 坐标明细
  • 📚 批量检测:单次最多 200 张,输出汇总表 + 类别分布柱状图 + zip 打包下载
  • 🎬 视频检测:mp4 / avi / mov / mkv,逐帧推理后落盘新视频,便于督导回看
  • 📷 摄像头实时检测:可对接投放点顶视相机 / 督导亭 IPC / 分拣线相机

6 类生活垃圾:纸箱 📦、玻璃 🍾、金属 🥫、厨余有机物 🥦、纸张 📄、塑料 🧴。

技术栈:

层 选型
模型框架 Ultralytics 8.3 + PyTorch
视觉算法 YOLO11n(Anchor-Free,C2f Backbone,Decoupled Head + DFL)
Web 前端 Streamlit 1.35 + 自定义 HTML 主题
视频 / 图像 OpenCV、imageio-ffmpeg
数据可视化 Plotly / Streamlit 原生 chart
配置管理 单一 configs/project.yaml,行业话术 / UI / 推理阈值统一收口

二、设计框架

2.1 系统架构

scss 复制代码
            ┌──────────────────────────────────────────┐
            │      Streamlit Web 前端(单页 SPA)       │
            │  · 6 类图鉴 / 单图 / 批量 / 视频 / 摄像头   │
            │  · 侧栏 · 阈值 · 类别筛选 · 模型缓存       │
            └────────────────────┬─────────────────────┘
                                 │ Python 调用
                                 ▼
            ┌──────────────────────────────────────────┐
            │   推理服务层(infer_image_path 等)       │
            │  · bytes / Path / frame → tensor          │
            │  · 推理结果 → 标注图 + DataFrame          │
            └────────────────────┬─────────────────────┘
                                 │
                                 ▼
            ┌──────────────────────────────────────────┐
            │    YOLO11n 推理引擎(model/best.pt)      │
            │  Backbone (C2f+SPPF) → Neck (FPN/PAN)     │
            │   → Decoupled Head(DFL + cls × 6)       │
            └──────────────────────────────────────────┘

2.2 YOLO11 网络结构

ini 复制代码
输入 640×640×3
   │
   ▼
[Backbone]
  Conv → C2f → Conv → C2f → Conv → C2f → Conv → C2f → SPPF
   │
   ▼
[Neck]   FPN 上采样 + PAN 下采样:P3 / P4 / P5 三级金字塔
   │
   ▼
[Head]  Decoupled Head(cls 头 / reg 头解耦)
        回归头采用 DFL(Distribution Focal Loss)
        Anchor-Free,输出 (cx, cy, w, h, cls × 6)
   │
   ▼
[NMS]    iou=0.7, conf=0.25  → 最终检测框

2.3 检测流程

scss 复制代码
投放点 / 督导亭相机帧
        │
        ▼
   Letterbox 640×640 + RGB
        │
        ▼
    YOLO11n forward
        │
        ▼
   Detect Head 输出 (cls × 6)
        │
        ▼
   conf 过滤 + NMS
        │
        ▼
result.plot() 画框 + 类别 + 置信度
        │
        ▼
Streamlit 双列展示 + DataFrame + 类别分布图

三、代码结构(核心 50 行 + 解析)

项目目录:

bash 复制代码
六类生活垃圾分类/
├── app/streamlit_app.py        # Web 入口
├── configs/project.yaml         # 行业话术 / UI / 训练 / 推理参数
├── model/best.pt                # 训练好的 YOLO11n 权重
├── scripts/                     # train / validate / export 等
├── data/dataset/                # 训练 / 验证 / 测试集
└── 六类生活垃圾检测数据集/      # 原始数据集(含训练 / 验证 / 测试切分)

最核心的 50 行------模型加载 + 单图推理 + Streamlit 单图 Tab:

python 复制代码
# === 1. 模型加载(带 streamlit 资源缓存,避免每次刷新重载)=============
@st.cache_resource(show_spinner=False)
def load_model(model_path: str) -> YOLO:
    return YOLO(model_path)

# === 2. 单图推理:路径 → 标注图 + 检测明细 DataFrame ===================
def infer_image_path(model: YOLO, image_path: Path, conf: float):
    result = model.predict(str(image_path), conf=conf, verbose=False)[0]
    annotated = result.plot()                         # BGR ndarray,已画框
    rows = []
    if result.boxes is not None:
        for box in result.boxes:
            cls_id = int(box.cls.item())
            x1, y1, x2, y2 = [float(v) for v in box.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),
            })
    return annotated[:, :, ::-1], pd.DataFrame(rows)

# === 3. bytes → 临时文件 → 复用同一函数 ================================
def run_image_inference(model: YOLO, image_bytes: bytes, conf: float, suffix=".jpg"):
    with tempfile.NamedTemporaryFile(delete=False, suffix=suffix) as f:
        f.write(image_bytes); tmp = Path(f.name)
    try:
        return infer_image_path(model, tmp, conf)
    finally:
        tmp.unlink(missing_ok=True)

# === 4. Streamlit 单图 Tab:上传 → 推理 → 双列展示 =====================
model = load_model(str(MODEL_PATH))
uploaded = st.file_uploader("上传一张待识别的生活垃圾图片", type=IMAGE_UPLOAD_TYPES)
conf = st.sidebar.slider("置信度阈值", 0.05, 0.95, DEFAULT_CONF, 0.01)

if uploaded is not None:
    annotated, df = run_image_inference(model, uploaded.getvalue(), conf,
                                        suffix=Path(uploaded.name).suffix)
    col1, col2 = st.columns(2)
    col1.image(uploaded, caption="原图")
    col2.image(annotated, caption="检测结果(带垃圾类别标签)")
    st.dataframe(detections_to_display(df))
    render_detection_analysis(df)

5 段解析:

  1. @st.cache_resource 把 YOLO(model_path) 的耗时锁在第一次访问,督导亭多终端 session 共享同一份模型实例,避免每次切换 Tab 都重载。
  2. result.plot() 直接返回带颜色框 + 类别 + 置信度的 BGR ndarray,6 类垃圾自动 6 种颜色,便于在投放点屏幕上直接展示给居民。
  3. 把每个 box 的 cls / conf / xyxy 拍成 dict 再拼成 DataFrame------后续表格、CSV 下载、类别分布柱状图、视频时间线全部复用同一份结构,运营拉数据时直接 to_csv。
  4. bytes → tempfile → infer_image_path 这层薄壳让"前端上传 / 批量解 zip / 视频抽帧 / 摄像头帧"四种来源都复用同一个推理函数,新接 RTSP 督导亭流时不用重写推理逻辑。
  5. 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 落地的样板。

相关推荐
EAIReport1 小时前
SpringBoot 与 SpringCloud 深度解析:核心特点、差异与协同关系
spring boot·后端·spring cloud
梦里寻码2 小时前
从 0 到 1 用 NestJS + LangChain 搭一套可售卖的 SaaS AI 客服:挂件一行代码接入,知识库秒变 SEO 帮助中心
前端·后端·github
imDwAaY2 小时前
程序为什么会卡在死锁里?从四个必要条件到预防与解除
后端·操作系统
Bazingga2 小时前
知识注入的两条路:RAG知识库与Skills蒸馏
后端
QQ14220784492 小时前
基于 Flask 的「自动任务控制台」设计与踩坑实录
后端·python·flask
Bazingga2 小时前
中文提问,能检到英文文档吗?——一次跨语言RAG检索五语种实测
后端
对象存储与RustFS2 小时前
用 warp 压测 S3 兼容存储,十分钟跑出一份可复现的基准报告
后端·云原生·性能优化
用户298698530142 小时前
Python 实现 Word 转 XPS、PostScript 与 OFD 格式
后端·python·api
武子康2 小时前
PUBACK 已到,灯还没亮:Agent 设备指令何时算完成?
人工智能·后端·agent