大模型赋能智能垃圾分类,听起来像是一个很“未来”的命题,但当我真正把多模态大模型塞进垃圾桶后端的识别系统里,才发现这件事的难点不在模型本身,而在工程化落地的一堆细节里。大模型确实能看懂“沾了油的纸盒不该扔进可回收物”这种上下文,但要让它在摄像头视角、强反光、脏污遮挡的真实环境里稳定输出,需要靠数据、推理加速和硬件联动的组合拳。这篇文章就是我做完一整套软硬件联调后的经验记录,适合正在做智能垃圾分类、智能硬件识别或边缘AI落地的人参考。
我去年在某园区做了一套智能分类垃圾桶试点,核心逻辑并不复杂:垃圾桶上方装摄像头,用户投放垃圾时自动拍一张照片,系统识别出垃圾类别后控制桶门打开,同时通过屏幕和语音告诉用户应该扔进哪个桶。看起来就是一个“图像识别+控制”的小项目,但真正把传统视觉方案换成大模型之后,整个系统的容错能力、可解释性和可迭代性都有了本质变化。下面把从数据准备、模型微调到现场部署的完整过程拆开讲,重点说那些文档里不会写、但实际一定会踩的坑。
1. 项目背景与整体思路
1.1 为什么想到用大模型做垃圾分类
在做这套系统之前,我们用的是传统卷积神经网络做分类,准确率在干净的摆拍图上还行,一放到真实垃圾桶的投放口就露馅:光照一变、角度一偏、垃圾袋半遮住物品,结果就乱跳。最头疼的是垃圾分类本身带有强烈的“规则感”,比如牛奶盒要压扁、易拉罐要清洗、碎玻璃要包裹后才能投放,这些规则不是单纯的视觉特征,而是需要“看图后做出判断”的推理。传统分类模型只能回答“这是什么”,回答不了“这个能不能回收、该走哪个流程”。
大模型的优势恰好在这里。以视觉语言模型为例,它既能看图片,也能理解文字规则,可以把《垃圾分类管理条例》里的那些“例外情况”直接写进提示词里,让模型在识别的同时完成规则判断。这么做有一个直接好处:规则变了不需要重新训练模型,改提示词就行。比如某地突然规定“外卖盒必须清洗后回收”,只需要更新系统提示词,不需要重新采集数据。对垃圾分类这种政策频繁调整的场景来说,这个灵活性太值钱了。
1.2 这个项目要解决的核心问题
我们去园区调研时,用户反馈最多的不是“不知道垃圾该扔哪”,而是“知道规则但不想花时间分辨”。所以这套系统的第一目标不是单纯识别,而是降低投放门槛:用户只要把垃圾拿到摄像头下方,系统自动识别、自动开桶、自动播报。传统刷卡开门或者按键开门模式,都需要用户主动选择桶,识别错了还得重新投放,体验很差。
另一个核心问题在于有害垃圾的误判。园区里有一个专门的红色有害垃圾桶,但以往经常被扔进普通垃圾,因为大家不知道纽扣电池、过期药品、废灯管属于有害垃圾。传统模型对这些长尾品类召回率非常低,原因很简单:训练数据里少,而且外观差异大。大模型靠着在海量通用数据上学到的世界知识,能够把“一个没见过牌子的纽扣电池”和“有害垃圾”关联起来。这点让我决定不用传统方案作为主识别链路,而是把它降级成前置过滤,防止漏掉真正需要兜底的场景。
1.3 技术选型时的关键判断
第一关是选大模型架构。我们的输入是摄像头拍的静态图,输出需要是“类别+置信度+投放建议”,这种场景最合适的是多模态视觉语言模型,而不是纯文本大模型。考虑到部署成本和端侧算力,我一开始就放弃了API调用方案,原因有两个:一是园区网络不稳定,识别请求延迟不可控;二是每月的调用量会非常大,按次计费不划算。所以选了开源的可商用多模态模型,参数规模控制在10B以内,方便做量化部署。
第二关是识别链路设计。大模型不是万能的,如果直接把整张画面丢给它,让它做目标检测再加分类,延迟会高到没法用。我们的做法是先用轻量目标检测模型从摄像头画面里裁剪出垃圾区域,再把裁好的小图交给大模型做细粒度分类。这个“检测+分类”的两级结构,既保留了检测模型的实时性,又用大模型解决了传统分类模型搞不定的语义问题,是整个系统的核心思路。
2. 数据是第一关:垃圾图片数据集的采集与标注
2.1 垃圾分类数据集的特殊之处
做过分类任务的人都知道,垃圾数据集是个标准的长尾分布。塑料瓶、易拉罐、废纸这些常见物品,随便拍拍就有几千张;但纽扣电池、温度计、X光片这种有害垃圾,能凑满100张都费劲。更麻烦的是同一类垃圾在不同状态下外观差异极大:一个压扁的易拉罐和一个完好的易拉罐,传统模型可能把它们当成两类;一张脏兮兮的餐巾纸和一张干净的白纸,在视觉上接近,但在垃圾分类规则里一个属于厨余垃圾,一个属于可回收物。数据里必须涵盖这些“状态差异”,否则模型永远学不会。
除了状态,还有环境。垃圾桶的摄像头通常是斜向下安装的,视角不是平视,而是俯视加顶光,塑料袋反光、灯光频闪、手的遮挡都是常态。如果只用干净的实拍图训练,部署后会发现模型在真实投放时频繁抖动。我后来统计了一下,现场误判案例里大概有四成是“环境干扰导致的识别漂移”,而不是垃圾本身长得多像。所以数据采集策略必须围绕“现场长什么样”来设计,而不是围绕“网上图长什么样”。
2.2 数据采集、清洗与增强的实操记录
我们第一批数据来自三块:园区之前积累的投放点历史截图、开源垃圾数据集、自己组织拍摄的模拟投放视频。历史截图最真实,但隐私合规要处理好,所有人脸和快递单信息必须脱敏后再进训练集;开源数据质量参差不齐,有大量网上找来的“白底商品图”,和现场俯拍视角差距很大,筛选时直接丢掉;自己拍的模拟数据又太像“摆拍”,干净、完整、光线均匀,能补足物体细节,但对环境鲁棒性帮助有限。
清洗流程比采集还耗时。我会写一个简单的去重脚本,先按感知哈希把重复图去掉,再过滤掉分辨率低于640x640的图,最后人工扫一遍明显错图。特别注意一个问题:很多人会用纸箱、饮料瓶、“垃圾”关键词去网上抓图,但抓回来的图里有很多不是垃圾投放场景,而是产品展示图。这类图比例一旦过高,模型会把“干净整齐的商品展示”和垃圾混淆,部署时会倾向于把现场垃圾识别成商品。所以清洗时除了去掉低质量图片,每一类还要控制“商品图”的占比,最好不超过20%。
数据增强方面,除了常规的旋转、缩放、色彩抖动,我强烈建议加三类专用增强:随机加入暗角模拟垃圾桶内光线不均、随机模拟塑料反光条、随机叠加半透明薄膜模拟垃圾袋遮挡。这三种增强对提升现场通过率的效果肉眼可见。关键逻辑是:让模型见过“看不清的垃圾”,它才敢于在真实看不清楚时给出合理判断,而不是死磕一个错误的低置信度结果。
2.3 标注规范制定与质量检查
垃圾分类标注的核心是类别体系怎么定。我们没有直接按“可回收/有害/厨余/其他”四级去标,因为某些物体跨类别特性很强:沾了油的纸盒算其他垃圾,但干净纸盒是可回收物。如果标签体系里没有“受污染的纸盒”这一条,标注员就会产生分歧。所以我们把标签拆成两级:一级是投放类别,二级是物品细类加“状态描述”,比如“可回收物-纸盒-干净”,“其他垃圾-纸盒-有油污”。模型输出时同时带细类和状态,后续控制逻辑就能根据状态判断是否开门。
标注工作我们采用“大模型预标注+人工校对”的方式:先用训练好的旧版大模型对图片做一轮预测,标注员只需要确认或修改,速度能提升三倍。但质检才是重点,每个批次抽20%的图,重点看容易混淆的组合,例如陶瓷碗和玻璃碗、塑料膜和纸张、厨余垃圾中的骨头和贝壳。如果发现抽检一致率低于95%,整批退回重新标。不要只看总体准确率,一定要看混淆矩阵。一开始我们的误标集中在“外卖盒”上,有人按“纸类可回收”标,有人按“受污染其他垃圾”标,就是因为规则没有提前讲清楚。后来在规则里加上“未清洗含有食物残渣的餐盒一律标其他垃圾”,分歧立刻降下来了。
3. 大模型微调:从“什么都能答”变成“懂垃圾分类”
3.1 直接拿通用大模型用,效果行不行
我先做了零样本测试:不微调,直接让开源视觉语言模型看垃圾图片,写一个很详细的提示词,包括各类垃圾的定义、例子和判断规则。测试结果很意外,常见垃圾类别比如塑料瓶、易拉罐、废纸,识别准确率能达到85%以上,对规则的理解也比预期好。但它有两个致命问题:第一,对“易混淆物品”的边界把握不稳,同一张碎玻璃图片,换一种灯光拍就能从可回收物跳到有害垃圾;第二,输出格式特别不稳定,有时候给大段文字,有时候给一段JSON,还有时候答非所问。生产环境里没法接受这种不确定性。
所以结论是:通用模型必须微调,但不是为了让它“懂分类”——它本身已经懂分类了,微调是为了让输出变得可控、稳定、贴合我们的分类体系。换句话说,我们不是在教模型认垃圾,而是在教模型“用我们规定的格式、我们定义的类别来回答”。
3.2 微调方案:LoRA、数据配比与训练参数
我们选择了参数高效的LoRA方案。视觉语言模型太大,全参数微调需要八张卡跑好几个小时,而且很容易过拟合到训练集。LoRA相当于在模型原本的权重旁边加了一个小规模的“旋钮矩阵”,只训练这个旋钮,原始权重不动。这样训练速度快、显存占用低,还能在多个细分任务之间切换模型头,不用重复存储完整模型。
参数配置可以参考我的实际设置:秩(rank)选择16,缩放系数(alpha)选择32,量化后基础模型以4bit加载,这样单张专业显卡就能训练。学习率从1e-4开始,用一个带预热和余弦衰减的调度器,批次大小设为8,梯度累积到等效32的批次规模。训练轮数不能太多,3轮左右就够,多了模型会把通用知识忘掉。关键技巧是在数据集里掺入约5%的通用对话数据,像语文作业里的“复习题”一样,防止模型只记得垃圾而忘了怎么说话。这个配比我们试过直接不掺,结果微调后模型对正常的用户问候都开始胡言乱语,把它修回来费了不少功夫。
训练样本量方面,常见类别每类准备800到1000张图,长尾的有害垃圾品类至少准备200到300张,然后用增强扩到600张。整体样本量控制在2万到3万条“图文样本”比较合适。这里的图文样本不是一张图配一句话,而是“图+用户问题+标准回答”的三元组,比如图是一张叠好的纸箱,问题是“这是什么垃圾”,回答是“可回收物-纸类-干净,可以直接投放”。
3.3 提示词设计:让模型输出稳定、可解析的结果
微调只是第一步,部署时的提示词还要仔细设计。我们的做法是把垃圾分类规则、桶号、输出JSON格式定义全部塞进系统提示词,温度参数设为0,关闭随机性。用户侧提示词就用固定的一句话,比如“请识别图中物品,并按给定格式输出分类结果”。这样做的目的是让推理过程尽量确定,不搞“创作”式回答。
为了让结果可直接驱动硬件,我们要求模型只输出一个JSON对象,不要输出任何解释。格式大致是这样的:
{ "category": "可回收物", "subcategory": "纸箱", "status": "干净", "confidence": 0.96, "action": "green", "reason": "瓦楞纸箱,表面无明显油污和胶带残留" }如果模型输出的JSON解析失败,我们有一个重试机制:把解析失败的回话拼进下一轮对话,提醒“你刚才的输出不是合法JSON,请重新输出严格JSON格式”,一般最多重试两次就能恢复。注意不要在提示词里写“如果无法判断就回答不知道”,因为大模型在低置信度时倾向“蒙一个”,我们改成另一种策略:允许输出“类别不可判定”,但必须同时给出置信度低于0.6。系统看到这种结果就走“人工复核”流程,而不是让桶门随机开一个。这个机制大大降低了有害垃圾被误放进普通垃圾桶的概率。
4. 系统实现与部署:识别逻辑、加速与硬件联动
4.1 端侧和云侧的职责划分
系统部署分为三层。第一层是摄像头和边缘盒子,负责抓拍、人脸脱敏、目标检测和初级分类;第二层是中心服务器,部署微调后的大模型;第三层是垃圾桶单机控制器,接受识别结果并执行开锁。这样做的好处是:简单物品在边缘直接出结果,延迟可以压到300毫秒内;疑难物品才把图片传到中心大模型,延迟一两秒用户也能接受。
边缘盒子上跑的目标检测模型负责把垃圾从画面里抠出来。检测模型只做“框出垃圾区域”这件事,不做分类,分类交给大模型。这样设计的一个隐藏好处是:边缘检测模型可以持续收集大模型标好的结果作为新训练数据,定期蒸馏更新,让边缘侧承担越来越多的简单分类任务。实际运行一个月后,边缘侧直接处置的比例从60%上升到了80%,中心服务压力大幅降低。
4.2 推理加速与模型压缩
大模型部署最怕延迟。我们的服务器上没有特别顶级的显卡,所以必须把模型压缩到4bit量化。量化会把模型的权重从16位浮点数压成4位整数,显存占用直接降低75%,推理速度也快了不少。代价是精度会掉一点,不过垃圾分类场景里1%到2%的精度损失可以接受,而且我们微调时已经做了量化感知相关处理,最终效果损失很小。
推理服务端还要做两件容易被忽略的事:动态批处理和结果缓存。动态批处理是指多个识别请求同时到达时,把它们的图片打包成一个批次送入模型,显卡一次推理处理多张图,吞吐量提升非常明显。结果缓存则是针对重复投放场景——同一个用户短时间内反复扔同一种垃圾,摄像头拍出来的图高度相似。我们把图文特征做简单哈希,设置五分钟内相同哈希直接返回上次结果,高峰期省了大约15%的推理量。
4.3 垃圾分类桶的硬件联动与多模态交互
识别结果确定后,控制器根据“action”字段里的桶号打开对应的舱门。这里有一个必须注意的点:硬件一定要等识别结果稳定再动作,不要图片一进就立刻开。我们在最早的原型机上踩过坑,模型已经输出“其他垃圾”了,控制板却因为之前的一帧空画面提前开了可回收桶。后来加了状态锁,在识别完成前按住所有执行器,并且在摄像头前加了一段约半秒的“投放稳定等待”,用连续两帧检测结果一致才触发识别,效果直接稳定了很多。
语音交互也很有意思。除了视觉识别,我们还接入了简单的语音输入,用户可以直接说“电池扔哪个”,语音转文字后,文本和摄像头图片一起送入大模型,模型输出结果并驱动语音播报。这种多模态交互在老年人使用场景下非常受欢迎,因为不用纠结屏幕上的一堆按钮,直接说就行。注意语音输入和图片输入不是简单的拼接,需要在微调样本里加入“文本+图片”的配对数据,模型才学得会同时参考两种信息。
5. 实测效果与问题排查实录
5.1 现场测试效果:指标比传统方案好多少
我们选了园区三个垃圾投放点,连续跑了两周,统计了四类指标的对比:粗分类准确率、细分类准确率、有害垃圾召回率、端到端投放通过率。粗分类指的是分对“可回收/厨余/有害/其他”四大类,细分类指的是正确识别出具体物品名称。
| 指标 | 传统CNN方案 | 大模型方案 |
|---|---|---|
| 粗分类准确率 | 87.2% | 94.1% |
| 细分类准确率 | 71.5% | 88.3% |
| 有害垃圾召回率 | 62.4% | 93.6% |
| 端到端通过率 | 76.8% | 89.5% |
大模型方案提升最大的是有害垃圾召回率,从六成出头拉到九成以上。这说明模型在海量预训练中积累的“世界知识”确实发挥了作用,哪怕没见过某种新牌子的充电宝,也能根据“电池”“锂电池”这些视觉特征判断出危险性。但细分类准确率并没有想象中那么高,88.3%说明还有不少误判,主要集中在玻璃瓶和陶瓷碗、塑料盒和纸质盒这种“材质近似”的品类上。
另一个客观现象是,大模型方案在“拒答”上表现得更好。传统模型哪怕很犹豫,也会硬给一个类别,而大模型在训练引导下学会了输出“无法判定”,相当于主动把控制权交还给系统。实际数据里,约有6%的请求被判定为低置信度,其中三分之一由人工复查确认,另外三分之二其实可以正确识别,这说明阈值还有调优空间。
5.2 高频问题的排查过程与解决办法
第一个高频问题是“油污纸盒被分到可回收物”。用户拿外卖纸盒来丢时,模型总是自信地把纸盒归为可回收物,但按照当地条例,粘了食物残渣的纸盒要算其他垃圾。我们排查后发现问题不在模型,而在数据里“干净纸盒”和“脏纸盒”的数量差距太大,模型把“纸盒”这个视觉特征优先于“油污”学习。解决办法是专门扩充了2000张带油污、带残渣的纸盒图片,并且在标注体系中把“受污染纸盒”单列为一类,训练时明确让模型关注表面光泽和残渣信息。
第二个高频问题是夜间识别效果差。投放点到了晚上八九点,灯光偏黄且闪烁,图片整体偏暗,识别置信度普遍下滑。一开始以为是模型问题,后来发现是摄像头自动增益在作怪,画面整体过曝或拖影。我们给摄像机设置了固定曝光时间,加了一个近红外补光灯,并在训练集里混合了30%的暗光和低色温图片,夜间准确率才回到正常水平。
第三个问题是推理延迟不稳定。中心服务器空闲时单图识别大约1.2秒,并发一上来却能飙到4秒,用户会明显感觉“桶门反应慢”。排查下来是推理框架的显存碎片和批处理策略没配合好:并发请求没有等够一个批次就挨个推理,导致效率极低。后来我们设置了一个小等待窗口,让50毫秒内积压的请求一起进入动态批次,同时开了显存池化,延迟中位数直接降到了900毫秒左右。
5.3 部署过程中必须注意的避坑清单
- 摄像头安装角度一定要模拟真实投放视角。很多原型机用平视图训练模型,上线后才发现垃圾桶的摄像头是俯视的,识别效果打对折。
- 识别结果必须和硬件动作加互锁。如果桶门控制信号和识别逻辑没有状态同步,空手晃动、风吹垃圾都会误触发开门,一定要做“连续有效帧”确认。
- 定期抓取新数据回流训练。垃圾种类跟着季节变,端午前后粽叶粽盒多、春节后礼盒多、秋季落叶多,模型需要持续增量训练才能保持效果。
- 注意隐私遮挡。摄像头会拍到人脸、快递单、药品包装等敏感信息,图像必须在上传前完成脱敏,否则数据合规上会出大问题。
- 别把所有类别交给大模型。像可回收物里的金属罐,传统检测模型已经很准了,没必要让大模型处理,反而增加延迟和成本。按类别分流,性价比更高。
6. 我踩过的坑和后续可以扩展的方向
6.1 上线后准确率下降的教训
我们踩得最深的一个坑是“上线第一周效果很好,第二周开始明显变差”。起初以为是模型不稳定,后来调了日志才发现,投放行为变了:第一周大多是园区物业人员试用,投放物相对规范;第二周居民开始使用,经常整袋垃圾直接丢进投放口,摄像头拍到的不再是单一物品,而是复杂的混合垃圾堆。我们训练的模型从没见过“一堆混合垃圾”,只能硬从里面找一个最显眼的物品来识别,结果自然一塌糊涂。
解决方法是专门采集混合垃圾和高遮挡场景的数据,并把识别策略从“识别一个物品”改成“识别主体物品+次要物品列表”。大模型特别适合这个改动,因为可以把图里所有可疑物品都列出来,然后由控制逻辑决定按哪个类别执行。这相当于把“单选题”改成“多选题再求并集”,对用户的误投放容忍度高了很多。经过这个教训,我养成了一个习惯:任何识别系统上线前,都要准备一套“现场开放环境”测试数据,不要只用干净的标准样本验收。
6.2 比分类更远的应用:识别之外的价值
大模型在垃圾分类项目里真正的价值不是分类,而是把垃圾这个“低价值物品”变成了“可交互的数据入口”。后面我打算把识别系统升级成一个“可回收物价值评估器”,通过大模型识别材质、品牌、破损程度,甚至用手持摄像头扫一下饮料瓶,直接估算回收价格,引导用户主动分类投放。
另外,大模型也适合做垃圾分类的知识问答助手。社区里经常有阿姨问“过期口红是什么垃圾”“龙虾壳是不是厨余”,这些东西长得像、类别冷门,纯靠视觉识别很容易翻车。如果能接一个本地知识库,把条文和常见问题存进去,大模型结合视觉和检索生成准确回答,投放点可以彻底摆脱贴纸质指南的尴尬。大模型赋能的智能垃圾分类,现在只是开了个头,后续把识别结果和回收体系打通才是更大的金矿。