1. 项目背景与意义
垃圾分类已经成为现代城市管理的重要课题。随着城市化进程加快,生活垃圾产生量呈现爆发式增长,传统的人工分类方式面临着效率低下、成本高昂等问题。计算机视觉技术的发展为解决这一难题提供了新的可能性。
我最近完成了一个基于卷积神经网络(CNN)的垃圾图像分类项目,使用Kaggle公开数据集,包含10类常见垃圾共19,762张图片。这个项目不仅具有学术研究价值,更具备实际应用潜力,可以为智能垃圾桶、垃圾分类APP等产品提供核心技术支撑。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据集详解与准备
2.1 数据集概况
本项目使用的数据集来自Kaggle,包含以下10类垃圾图像:
- 金属(Metal): 1,020张
- 玻璃(Glass): 3,061张
- 生物垃圾(Biological): 997张
- 纸张(Paper): 1,680张
- 电池(Battery): 944张
- 一般垃圾(Trash): 947张
- 纸板(Cardboard): 1,825张
- 鞋子(Shoes): 1,977张
- 衣物(Clothes): 5,327张
- 塑料(Plastic): 1,984张
从数据分布可以看出,各类别样本数量不均衡,衣物类样本最多,电池类最少。这种不平衡性需要在模型训练时特别注意。
2.2 数据可视化分析
在开始建模前,我对数据集进行了可视化分析,从每类中随机选取一张图片展示:
python复制plt.figure(figsize=(18, 7))
categorise = os.listdir(data)
for i, category in enumerate(categorise):
category_path = os.path.join(data, category)
image = os.listdir(category_path)[0]
image_path = os.path.join(category_path, image)
read_image = plt.imread(image_path)
plt.subplot(2, 5, i + 1)
plt.imshow(read_image)
plt.title(category)
plt.axis('off')
plt.show()
通过可视化发现,不同类别的垃圾在形态、颜色和背景上差异明显。例如:
- 金属物品通常有反光特性
- 玻璃物品透明或半透明
- 衣物纹理丰富且颜色多样
- 纸板和纸张类物品多为平面
这些视觉特征将成为CNN模型学习的关键依据。
2.3 数据预处理流程
为确保模型训练效果,我设计了完整的数据预处理流程:
- 数据划分:使用分层抽样将数据集按7:2:1比例划分为训练集、验证集和测试集,保持各类别比例一致。
python复制from sklearn.model_selection import train_test_split
# 构建包含所有图像路径和标签的DataFrame
image_paths = []
labels = []
for class_name in classes:
class_path = os.path.join(data, class_name)
for fname in os.listdir(class_path):
image_paths.append(os.path.join(class_path, fname))
labels.append(class_name)
df = pd.DataFrame({'filename': image_paths, 'class': labels})
# 分层划分数据集
train, temp = train_test_split(df, test_size=0.3, stratify=df['class'], random_state=42)
valid, test = train_test_split(temp, test_size=0.3, stratify=temp['class'], random_state=42)
- 数据增强:针对训练集设计多种增强策略,提高模型泛化能力。
python复制train_datagen = ImageDataGenerator(
rescale=1./255,
rotation_range=15, # 随机旋转±15度
