大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。
图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:华为HDE/HDG
我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。
展菲:您的前沿技术领航员
👋 大家好,我是展菲!
📱 全网搜索“展菲”,即可纵览我在各大平台的知识足迹。
📣 公众号“Swift社区”,每周定时推送干货满满的技术长文,从新兴框架的剖析到运维实战的复盘,助您技术进阶之路畅通无阻。
💬 微信端添加好友“fzhanfei”,与我直接交流,不管是项目瓶颈的求助,还是行业趋势的探讨,随时畅所欲言。
📅 最新动态:2025 年 3 月 17 日
快来加入技术社区,一起挖掘技术的无限潜能,携手迈向数字化新征程!
文章目录
摘要
垃圾分类不是新鲜事儿了,但很多人还是搞不清楚什么是“干的”“湿的”“可回收的”。如果有一个小程序或 Web 工具,拍张照就能告诉你这是什么垃圾,是不是就方便多了?这篇文章就带你从零搭建一个图像识别辅助的垃圾分类系统,覆盖模型选择、训练技巧、部署方式和简单 UI 演示,适合做公益项目或技术实践练手!
引言
我们都知道垃圾分类好,但做起来总是各种疑问:外卖盒到底是湿垃圾还是干垃圾?奶茶杯算可回收吗?这些问题,机器视觉其实可以帮上大忙。
图像识别在 AI 公益场景里最典型的应用就是“看图识物”。对开发者来说,实现一个垃圾识别工具门槛并不高,核心是选好轻量模型 + 搭个界面,让普通用户能快速用起来。
项目拆解:垃圾识别工具怎么做?
项目目标
-
用户上传垃圾照片
-
系统识别垃圾种类(可回收、厨余、有害、其他)
-
返回分类建议
-
支持本地 or 云端部署
所需组件
-
前端界面(小程序或 Web)
-
图像识别模型(建议 MobileNet 或 EfficientNet-lite)
-
模型训练数据集(可使用垃圾图片公开数据)
-
推理服务(Flask/FastAPI/Node.js)
-
可选:本地离线部署 / 云端部署(腾讯云函数、vercel、huggingface space)
模型选型和训练过程
模型推荐:MobileNetV2
-
优点:轻量、适合移动端、本地部署没压力
-
训练框架:PyTorch or TensorFlow 都可
-
输出层:4分类(可回收、湿垃圾、干垃圾、有害垃圾)
数据集推荐
模型训练代码(PyTorch)
import torchvision.transforms as transforms
from torchvision.datasets import ImageFolder
from torch.utils.data import DataLoader
import torch.nn as nn
import torch.optim as optim
from torchvision.models import mobilenet_v2
# 数据预处理
transform = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor()
])
dataset = ImageFolder(root='data/train', transform=transform)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)
# 模型准备
model = mobilenet_v2(pretrained=True)
model.classifier[1] = nn.Linear(model.last_channel, 4)
# 训练配置
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=1e-4)
# 简单训练过程
for epoch in range(5):
for inputs, labels in dataloader:
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
如何部署?
本地运行(离线)
可保存为 .pt
模型,用 PyTorch 加载推理
model.eval()
img = Image.open("test.jpg").convert("RGB")
input_tensor = transform(img).unsqueeze(0)
output = model(input_tensor)
pred = torch.argmax(output, dim=1)
Web API 推理接口(FastAPI)
from fastapi import FastAPI, File, UploadFile
from PIL import Image
import io
app = FastAPI()
@app.post("/predict/")
async def predict(file: UploadFile = File(...)):
image = Image.open(io.BytesIO(await file.read())).convert("RGB")
input_tensor = transform(image).unsqueeze(0)
with torch.no_grad():
output = model(input_tensor)
pred = torch.argmax(output, dim=1).item()
return {"class": label_map[pred]}
简单前端 UI 示例
Web 页面上传图片识别
<input type="file" id="fileInput" />
<button onclick="upload()">识别垃圾类别</button>
<script>
async function upload() {
const file = document.getElementById('fileInput').files[0]
const formData = new FormData()
formData.append('file', file)
const res = await fetch('/predict/', {
method: 'POST',
body: formData
})
const result = await res.json()
alert("识别结果:" + result.class)
}
</script>
QA 环节
Q: 没有 GPU 怎么训练模型?
A: 可以用 Google Colab 免费训练,节省成本。
Q: 图片拍得不清楚会影响识别吗?
A: 会,一定程度上可通过数据增强方式提升模型鲁棒性。
Q: 想嵌入到小程序中怎么做?
A: 可将后端 API 部署到云函数,再通过小程序调用识别接口。
总结
这个垃圾识别工具是一个典型的“技术 + 公益”的结合。虽然模型简单、界面也不复杂,但对于帮助普通人养成垃圾分类习惯,还是挺有意义的。如果是公益团队或学生组织,也可以把这个项目作为校园 AI 实践项目落地。
未来展望
-
加入语音识别功能,辅助视障人群
-
联动地图或社区管理系统,实现智能投放建议
-
进一步训练模型识别更复杂的垃圾类型