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

温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 :) 

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 = 112train_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*3layers.MaxPooling2D((2, 2)),               # 池化层2,2*2采样layers.Conv2D(64, (3, 3), activation='relu'),  # 卷积层3,卷积核3*3layers.Dropout(0.2),  layers.Flatten(),                       # Flatten层,连接卷积层与全连接层layers.Dense(128, activation='relu'),   # 全连接层,特征进一步提取layers.Dense(len(class_names))               # 输出层,输出预期结果
])model.summary()  # 打印网络结构

        模型训练:

from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStoppingepochs = 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界面,为用户提供准确可靠的垃圾分类服务。

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。技术交流、源码获取认准下方 CSDN 官方提供的学长 QQ 名片 :)

精彩专栏推荐订阅:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/314031.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用html,js和layui写一个简单的点击打怪小游戏

介绍&#xff1a; 一个简单的打怪小游戏&#xff0c;点击开始游戏后&#xff0c;出现攻击按钮&#xff0c;击败怪物后可以选择继续下一关和结束游戏。 继续下一个怪兽的血量会增加5点&#xff0c;攻击按钮会随机变色。 效果图&#xff1a; html代码&#xff1a; <!DOCTYPE…

小兔鲜儿 uniapp - SKU 模块

目录 存货单位&#xff08;SKU&#xff09;​ 插件市场​ 下载 SKU 插件​ 使用 SKU 插件​ 插件类型问题​ 核心业务​ 渲染商品规格​ 打开弹窗交互​ 渲染被选中的值​ 存货单位&#xff08;SKU&#xff09;​ SKU 概念 存货单位&#xff08;Stock Keeping Unit&a…

使用docker轻量化部署snmp agent(SNMPv2访问)

文章目录 服务器环境说明单机部署&#xff08;非挂载conf文件版&#xff09;debian:buster-slim容器简介实现步骤创建Dockerfile创建SNMP配置文件 (snmpd.conf)构建Docker镜像运行Docker容器 注意补充复制容器文件到本地容器、镜像操作 单机部署&#xff08;挂载conf文件版&…

会员案例库 | 零赛云:一站式工业数字化转型解决方案提供商

1.案例应用领域及行业 能源行业、机械设备等离散制造业 2.案例描述 新奥动力是新奥集团旗下专注于微、小型燃气轮机研发及产业化的高科技创新型企业&#xff0c;是专业的分布式能源系统核心能源装备供应商和解决方案提供商。通过多年累积&#xff0c;已建立从市场到研发&…

Python+Django 构建实验室药品管理和预警系统【源码】

人生苦短&#xff0c;我用 Python。 今天给大家分享一个完整的实战案例&#xff1a;Python实现实验室药品管理和预警系统&#xff0c;文末附完整代码! 在线演示环境 项目演示地址&#xff1a;http://101.34.18.118:8002/ &#xff08;图片未压缩&#xff0c;所以加载有点慢&…

PS制作淘宝主图

PS制作淘宝主图 1.制作主图主页1.1新建800x800画板1.2填充前景色&#xff1a;altdel1.3选择圆角矩形&#xff0c;半径501.4按住ALT&#xff0c;往下投复制 2.调色 1.制作主图主页 1.1新建800x800画板 1.2填充前景色&#xff1a;altdel 1.3选择圆角矩形&#xff0c;半径50 居中对…

力扣刷题记录(21)LeetCode:121、123、188、309

目录 121. 买卖股票的最佳时机 123. 买卖股票的最佳时机 III 188. 买卖股票的最佳时机 IV 309. 买卖股票的最佳时机含冷冻期 如果某一天出售股票可以得到最大利润&#xff0c;那么股票买入的价格一定是这天之前股票的最低价格。 所以我们可以在遍历股票价格的时候不断更新股…

[嵌入式AI从0开始到入土]9_yolov5在昇腾上推理

[嵌入式AI从0开始到入土]嵌入式AI系列教程 注&#xff1a;等我摸完鱼再把链接补上 可以关注我的B站号工具人呵呵的个人空间&#xff0c;后期会考虑出视频教程&#xff0c;务必催更&#xff0c;以防我变身鸽王。 第一章 昇腾Altas 200 DK上手 第二章 下载昇腾案例并运行 第三章…

性能优化(CPU优化技术)-ARM Neon详细介绍

本文主要介绍ARM Neon技术&#xff0c;包括SIMD技术、SIMT、ARM Neon的指令、寄存器、意图为读者提供对ARM Neon的一个整体理解。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#xff08;HPC&#xff09…

自定义html5中日期选取器的样式

自定义html5中日期选取器的样式 1. 前言1.1 关于 h5 的新特性1.2 使用浏览器 2. html5中日期选取器默认样式3. 自定义日期样式3.1 简单定义3.2 花式样式定义 4. 改变日期格式5. 参考6. 关于低版本浏览器隐藏小三角 1. 前言 1.1 关于 h5 的新特性 可看下面的文章 HTML5 新特性之…

【AIGC-图片生成视频系列-5】I2V-Adapter:一种用于视频扩散模型的通用图像生成视频适配器

目录 一. 项目与贡献概述 二. 方法详解 a. 整体框架图 b. 帧相似性先验 三. 一般化图像生成动画结果 四. 基于个性化 T2I 模型的动画结果 五. 结合ControlNet动画结果 六. 项目论文和代码 七. 个人思考与总结 在快速发展的数字内容生成领域&#xff0c;焦点已从文本到…

Linux系统安装DockerDocker-Compose

1、Docker安装 下载Docker依赖的组件 yum -y install yum-utils device-mapper-persistent-data lvm2 设置下载Docker服务的镜像源&#xff0c;设置为阿里云 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 安装Docker服务 …