基于深度卷积神经网络的垃圾分类识别系统


orchid
电梯物联网专家 2024-01-03 22:52:12 68723 赞同 0 反对 0
分类: 资源
基于深度卷积神经网络的垃圾分类识别系统

1. 项目简介
        本文详细介绍了一基于深度卷积神经网络的垃圾分类识别系统。采用TensorFlow和Keras框架,通过卷积神经网络(CNN)进行模型训练和预测。引入迁移学习中的VGG16模型,取得95%的分类准确率。系统基于Web平台,实现用户上传垃圾图片进行在线测试,系统即时预测并展示垃圾类别。此系统不仅展示了深度学习在垃圾分类中的应用,也提供了专业而高效的Web界面,为用户提供准确可靠的垃圾分类服务。


2. 卷积神经网络基本原理
        深度卷积神经网络(DCNN)是一种人工神经网络,特别适用于处理具有空间结构的数据,如图像和视频。它通过多层卷积和池化层来逐渐提取输入数据的特征,并通过全连接层进行分类或回归任务。DCNN 在计算机视觉和模式识别领域取得了巨大成功,被广泛应用于图像识别、物体检测、人脸识别等任务中。

 

        卷积神经网络的构造包括:

        (1)输入层
        输入层接收原始图像数据。图像通常由三个颜色通道(红、绿、蓝)组成,形成一个二维矩阵,表示像素的强度值。

        (2)卷积和激活
        卷积层将输入图像与卷积核进行卷积操作。然后,通过应用激活函数(如ReLU)来引入非线性。这一步使网络能够学习复杂的特征。

        (3)池化层
        池化层通过减小特征图的大小来减少计算复杂性。它通过选择池化窗口内的最大值或平均值来实现。这有助于提取最重要的特征。

        (4)多层堆叠
        CNN通常由多个卷积和池化层的堆叠组成,以逐渐提取更高级别的特征。深层次的特征可以表示更复杂的模式。

        (5)全连接和输出
        最后,全连接层将提取的特征映射转化为网络的最终输出。这可以是一个分类标签、回归值或其他任务的结果。

        经典VGG16、VGG19卷积神经网络模型架构如下图所示:

 

3.  数据集读取与预处理
该数据集包含了2527个生活垃圾图片。数据集的创建者将垃圾分为了6个类别,分别是:

玻璃(glass)共501个图片
纸(paper)共594个图片
硬纸板(cardboard)共403个图片
塑料(plastic)共482个图片
金属(metal)共410个图片
一般垃圾(trash)共137个图片

 物品都是放在白板上在日光/室内光源下拍摄的,压缩后的尺寸为512 * 384。

data_dir = "./dataset-resized/"
data_dir = pathlib.Path(data_dir)
 
img_height = 112
img_width = 112
 
train_ds = tf.keras.preprocessing.image_dataset_from_directory(
    "./dataset-resized/",  #数据集目录
    label_mode="categorical",  #标签模式,根据目录生成
    validation_split=0.2,  # 验证集比例为20%
    subset="training",   #这是个训练集
    seed=42 ,     #随机种子,保证划分一致  
    image_size=(img_height, img_width),  #图像大小
    batch_size=batch_size
)
        垃圾分类数据集可视化:

plt.figure(figsize=(20, 10))
 
for images, labels in train_ds.take(1):
    labels = [tf.argmax(i) for i in labels]  
    for i in range(20):
        ax = plt.subplot(5, 10, i + 1)
        plt.imshow(images[i].numpy().astype("uint8"))
        plt.title(class_names[labels[i]])
        plt.axis("off")


4. 卷积神经网络模型构建
model = models.Sequential([
    layers.experimental.preprocessing.Rescaling(1./255, input_shape=(img_height, img_width, 3)),
    layers.Conv2D(16, (3, 3), activation='relu', input_shape=(img_height, img_width, 3)), # 卷积层1,卷积核3*3  
    layers.MaxPooling2D((2, 2)),               # 池化层1,2*2采样
    layers.Conv2D(32, (3, 3), activation='relu'),  # 卷积层2,卷积核3*3
    layers.MaxPooling2D((2, 2)),               # 池化层2,2*2采样
    layers.Conv2D(64, (3, 3), activation='relu'),  # 卷积层3,卷积核3*3
    layers.Dropout(0.2),  
    
    layers.Flatten(),                       # Flatten层,连接卷积层与全连接层
    layers.Dense(128, activation='relu'),   # 全连接层,特征进一步提取
    layers.Dense(len(class_names))               # 输出层,输出预期结果
])
 
model.summary()  # 打印网络结构


        模型训练:

from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping
 
epochs = 20
 
# 保存最佳模型参数
checkpointer = ModelCheckpoint('best_model.h5',
                                monitor='val_accuracy',
......
 
# 设置早停
......
 
history = model.fit(train_ds,
                    validation_data=val_ds,
                    epochs=epochs,
                    callbacks=[checkpointer, earlystopper]
)

        训练日志:

Epoch 1/20
64/64 [==============================] - ETA: 0s - loss: 1.7266 - accuracy: 0.3042
Epoch 1: val_accuracy improved from -inf to 0.43762, saving model to best_model.h5
64/64 [==============================] - 6s 59ms/step - loss: 1.7266 - accuracy: 0.3042 - val_loss: 1.3680 - val_accuracy: 0.4376
Epoch 3/20
......
64/64 [==============================] - ETA: 0s - loss: 0.0248 - accuracy: 0.9965
Epoch 20: val_accuracy did not improve from 0.91485
64/64 [==============================] - 4s 64ms/step - loss: 0.0248 - accuracy: 0.9965 - val_loss: 0.4591 - val_accuracy: 0.9109
5. 基于迁移学习的模型优化
        构造 VGG 16模型,加载预训练模型权重,并定制化模型预测输出部分的结构:

VGG16_model_con = models.Sequential([
#两次使用64个3*3的卷积核,池化后维度(112,112,64)
    layers.Conv2D(64, (3, 3),padding='same', activation='relu',name='block1_conv1', input_shape=(img_height, img_width, 3)), 
    layers.Conv2D(64, (3, 3), padding='same',activation='relu',name='block1_conv2'),     
    layers.AveragePooling2D(pool_size=(2,2),strides=(2,2), name = 'block1_pool'),  
#两次使用128个3*3的卷积核,池化后维度(56,56,128)   
    
    ......
       
    layers.Conv2D(512, (3, 3),padding='same',activation='relu',name='block5_conv2'),   
    layers.Conv2D(512, (3, 3),padding='same',activation='relu',name='block5_conv3'),     
    layers.AveragePooling2D(pool_size=(2,2),strides=(2,2), name = 'block5_pool'),    
])
# 加载模型参数
VGG16_model_con.load_weights('./vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5')
# 冻结前13层网络参数  保证加载的预训练参数不被改变
......
 
# 添加模型分类层(顶层)
VGG16_model_all = models.Sequential([
    VGG16_model_con,
    layers.Flatten(),                       
    layers.Dense(256, activation='relu'), 
    layers.Dense(128, activation='relu'),
    layers.Dense(len(class_names), activation="softmax")               
])   
VGG16_model_all.summary()  # 打印网络结构

        模型训练损失函数和准确率变化曲线:

 

6. 垃圾分类识别系统
6.1 首页与注册登陆


6.2 垃圾分类实时预测
        利用Flask + Bootstrap 等框架,搭建垃圾分类识别系统,加载训练好的模型权重,通过上传测试图片,预测所属垃圾的类别:

def submit_and_predict():
    """
    自动l垃圾分类
    """
    test_file = request.files['file']
    filename = test_file.filename
 
    # 保存上传的文件
    test_file_path = './static/img/predict_test/{}'.format(filename)
    test_file.save(test_file_path)
 
    img = Image.open(test_file_path)
    img = np.array(img)
 
    # 模型预测
    image = tf.image.resize(img, [img_height, img_width])
    img_array = tf.expand_dims(image, 0)
 
    predictions = VGG16_model_all.predict(img_array)
    predict_class = class_names[np.argmax(predictions)]
    print("预测结果为:", predict_class)
 
    result = {
        "upload_image": test_file_path,
        "predict": predict_class
    }
    return jsonify(result)

 

        可以看出,模型预测效果非常好,测试集分类准确率高达95%以上。 

7. 结论
        本文详细介绍了一基于深度卷积神经网络的垃圾分类识别系统。采用TensorFlow和Keras框架,通过卷积神经网络(CNN)进行模型训练和预测。引入迁移学习中的VGG16模型,取得95%的分类准确率。系统基于Web平台,实现用户上传垃圾图片进行在线测试,系统即时预测并展示垃圾类别。此系统不仅展示了深度学习在垃圾分类中的应用,也提供了专业而高效的Web界面,为用户提供准确可靠的垃圾分类服务。

如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!

评价 0 条
电梯物联网专家L2
粉丝 1 资源 185 + 关注 私信
最近热门资源
麒麟系统版本介绍白皮书  516
MiSans 阿拉伯语字体文件  458
解决新版本麒麟系统中微信打开白屏显示  400
麒麟系统进行系统监控,查看进程的运行时间来优化性能  332
临时关闭swap分区与永久关闭swap分区(注意必须确保系统有足够内存运行!)  224
统信桌面专业版添加字体  217
统信uos单一程序黑屏,任务栏正常显示解决办法  216
统信uos快捷键文档  187
统信系统双无线网卡设置关闭开启单一网卡  145
分享一个磁盘恢复工具,适用于多平台(包括统信)  122
最近下载排行榜
麒麟系统版本介绍白皮书 0
MiSans 阿拉伯语字体文件 0
解决新版本麒麟系统中微信打开白屏显示 0
麒麟系统进行系统监控,查看进程的运行时间来优化性能 0
临时关闭swap分区与永久关闭swap分区(注意必须确保系统有足够内存运行!) 0
统信桌面专业版添加字体 0
统信uos单一程序黑屏,任务栏正常显示解决办法 0
统信uos快捷键文档 0
统信系统双无线网卡设置关闭开启单一网卡 0
分享一个磁盘恢复工具,适用于多平台(包括统信) 0
作者收入月榜
1

prtyaa 收益399.62元

2

zlj141319 收益236.11元

3

IT-feng 收益219.61元

4

1843880570 收益214.2元

5

风晓 收益208.24元

6

哆啦漫漫喵 收益204.5元

7

777 收益173.07元

8

Fhawking 收益106.6元

9

信创来了 收益106.03元

10

克里斯蒂亚诺诺 收益91.08元

请使用微信扫码

添加我为好友,拉您入交流群!

请使用微信扫一扫!