1. 垃圾分类背景
2019 年 7 月 1 日,我国垃圾分类管理办法正式实施。垃圾分类、垃圾处理成为社会关注的热点问题。根据国家标准,垃圾可以分为:可回收物、有害垃圾、湿垃圾和干垃圾四类。但实际在处置垃圾时,经常会出现垃圾分类不规范,进而造成对大气、水体、土地的污染,并给人类带来健康隐患。
为了更好地推广垃圾分类,近年来深度学习领域涌现出了许多智能垃圾分类算法。本文将介绍使用 Python、TensorFlow 和 Keras 对垃圾进行分类的操作方法和相关代码。
2. 数据集介绍
本文使用的垃圾分类数据集是 Kaggle 上一个名为 Garbage classification 的数据集,该数据集共有 2 万多张图片,包括: glass、paper、cardboard、plastic、metal、trash 六类垃圾。在本文中,我们将使用一部分数据集进行模型的训练和预测。
2.1 数据集处理
首先,我们需要安装并导入必要的 Python 包,如:NumPy、Matplotlib、PIL 和 tensorflow。
import os
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator
接下来,我们需要进行数据的预处理操作。首先,将图像数据转换为模型可以输入的数组数据。我们定义了一个函数 load_image(img_path) 用于将图片数据转化为数组信息。
def load_image(img_path):
img = Image.open(img_path)
img = img.resize((224, 224))
img_array = np.array(img)
return img_array
接下来,我们加载数据集。由于该数据集包含六类垃圾,我们使用 Keras 提供的数据增强技术 ImageDataGenerator 生成增强数据集。
batch_size = 16
train_datagen = ImageDataGenerator(
rescale=1./255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
validation_split=0.2)
train_generator = train_datagen.flow_from_directory(
'garbage_classification/train',
target_size=(224, 224),
batch_size=batch_size,
class_mode='categorical',
subset='training')
validation_generator = train_datagen.flow_from_directory(
'garbage_classification/train',
target_size=(224, 224),
batch_size=batch_size,
class_mode='categorical',
subset='validation')
3. 模型构建
我们使用卷积神经网络模型进行训练,该模型由一些卷积层、池化层、全连接层和 Dropout 函数层组成。以下是一个卷积神经网络模型的示例代码。
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(64, (3, 3), activation='relu', input_shape=(224, 224, 3)),
tf.keras.layers.MaxPooling2D(2, 2),
tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),
tf.keras.layers.MaxPooling2D(2, 2),
tf.keras.layers.Conv2D(128, (3, 3), activation='relu'),
tf.keras.layers.MaxPooling2D(2, 2),
tf.keras.layers.Conv2D(128, (3, 3), activation='relu'),
tf.keras.layers.MaxPooling2D(2, 2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(256, activation='relu'),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.Dense(6, activation='softmax')
])
model.summary()
4. 模型训练及评估
在进行模型训练时,我们选择 Adam 作为优化器,使用 categorical_crossentropy 作为损失函数。以下是一个训练模型的示例代码。
model.compile(optimizer=tf.keras.optimizers.Adam(),
loss='categorical_crossentropy',
metrics=['accuracy'])
epochs = 50
history = model.fit(
train_generator,
validation_data=validation_generator,
epochs=epochs,
verbose=1)
训练完成后,我们可以使用训练好的模型进行预测操作。以下是预测模型的代码。
test_img = load_image('garbage_classification/test/glass/glass1.jpg')
print(test_img.shape)
test_img = np.expand_dims(test_img, axis=0)
print(test_img.shape)
prediction = model.predict(test_img)
print(prediction)
categories = ['cardboard', 'glass', 'metal', 'paper', 'plastic', 'trash']
print("Predicted Category: ", categories[np.argmax(prediction)])
运行以上代码,输出结果如下:
(224, 224, 3)
(1, 224, 224, 3)
[[0. 0. 1. 0. 0. 0.]]
Predicted Category: metal
5. 结论
通过本文,我们了解了如何使用 Python、TensorFlow 和 Keras 对垃圾进行分类。我们对数据集进行了预处理操作,并使用卷积神经网络模型进行训练和评估。我们也学习了如何使用训练好的模型进行预测操作。下一步,我们可以尝试更换不同的模型和参数,以进一步提高分类的准确度。