基于卷积神经网络(CNN)的垃圾分类模型研究

摘要:
随着城市化进程的加快,垃圾问题日益严重。传统的垃圾分类方法存在效率低下、准确率不高等问题。本文提出了一种基于卷积神经网络(CNN)的垃圾分类模型,该模型能够自动识别并分类不同类型的垃圾。实验表明,该模型在垃圾分类任务中取得了较高的准确率,为垃圾处理提供了有效的技术支持。

关键词:卷积神经网络;垃圾分类;深度学习;图像识别

一、引言

(一)背景

随着人们生活水平的提高,城市垃圾产生量不断增加,垃圾分类已成为城市管理的重要任务。然而,传统的垃圾分类方法主要依赖于人工操作,存在劳动强度大、分类效率低、易受主观因素影响等问题。近年来,深度学习技术的快速发展为垃圾分类提供了新的解决方案。其中,卷积神经网络(CNN)因其强大的图像处理能力在图像识别领域取得了显著成果[1]。因此,本文提出了一种基于CNN的垃圾分类模型,旨在提高垃圾分类的效率和准确率。

(二)框架选取

本文将采用由百度飞桨研发的PaddlePaddle深度学习框架(下文简称Paddle框架)。该框架支持传统深度学习框架的基本功能,如模型组网、显卡训练等。此外,该框架提供了高级API,可以更加方便快捷地完成训练脚本的编写。

二、数据集选取

本文选取了飞桨AI Studio的“垃圾分类40种”数据集,如图2.1、图2.2所示。该数据集的截取对象更偏向于“垃圾”而非“生活物品”,更符合垃圾分类模型的应用场景:

图2.1 该数据集的“一次性快餐盒”数据

图2.2 该数据集的“食用油桶”数据

并且,该数据集基本覆盖了常见的生活垃圾,其40个类别如表2.1所示。

表2.1 该数据集的分类

类别
其他垃圾/一次性快餐盒
其他垃圾/污损塑料
厨余垃圾/茶叶渣
厨余垃圾/菜叶菜根
厨余垃圾/蛋壳
厨余垃圾/鱼骨
可回收物/充电宝
可回收物/包
可回收物/化妆品瓶
可回收物/塑料玩具
可回收物/塑料碗盆
可回收物/塑料衣架
其他垃圾/烟蒂
可回收物/快递纸袋
可回收物/插头电线
可回收物/旧衣服
可回收物/易拉罐
可回收物/枕头
可回收物/毛绒玩具
可回收物/洗发水瓶
可回收物/玻璃杯
可回收物/皮鞋
可回收物/砧板
其他垃圾/牙签
可回收物/纸板箱
可回收物/调料瓶
可回收物/酒瓶
可回收物/金属食品罐
可回收物/锅
可回收物/食用油桶
可回收物/饮料瓶
有害垃圾/干电池
有害垃圾/软膏
有害垃圾/过期药物
其他垃圾/破碎花盆及碟碗
其他垃圾/竹筷
厨余垃圾/剩饭剩菜
厨余垃圾/大骨头
厨余垃圾/水果果皮
厨余垃圾/水果果肉

 其数据总量较多,每个类别分配较平均,其每个类别的数量如表2.2所示。

表2.2 该数据集的分类数量情况

三、数据集处理

本文采用Paddle框架搭建数据集。在数据集初始化时,程序会顺序执行以下操作:

  1. 获取数据集文件夹下的所有子文件夹
  2. 对每个子文件夹,遍历每个图片,顺序进行如下操作:
    1. 使用PIL打开图片
    2. 重设图片大小为256x256
    3. 将通道维度置于最前,以适应Paddle框架。即将图片维度从(256, 256, 3)转为(3, 256, 256)
    4. 将图片和标签存入对应列表

当外界需要获取指定索引的数据时,程序会按照对应索引,从列表中读取并返回数据。

数据集脚本的具体代码如下:

import paddle
import numpy as np
from PIL import Image
import osdef getAllPath(path):return [os.path.join(path, f) for f in os.listdir(path)]class Dataset(paddle.io.Dataset):def __init__(self, mode='train'):super().__init__()self.data = []self.label = []for type_dir in getAllPath(f'./dataset/{mode}'):print('正在读取:', os.path.basename(type_dir))for path in getAllPath(type_dir):img = Image.open(path)img = img.resize((256, 256))img = np.array(img, dtype=np.float32).transpose((2, 0, 1))self.data.append(img)self.label.append(int(os.path.basename(type_dir)))self.data = np.array(self.data, dtype=np.float32)def __getitem__(self, idx):return self.data[idx], self.label[idx]def __len__(self):return len(self.data)

四、模型训练

(一)模型选取

本文采用ResNet(Residual Neural Network)作为分类模型。ResNet是深度学习中一种非常有效的卷积神经网络(CNN)结构,通过引入残差块(Residual Block)解决了深度神经网络训练中的梯度消失和模型退化问题。ResNet的提出使得训练深度达到几百甚至上千层的神经网络成为可能,提高了模型的准确性,并在多项计算机视觉任务中取得了显著的性能提升。[2]

由于垃圾分类的任务相对简单,不需要过于复杂的模型,因此本文采用ResNet-18(18层的ResNet模型)进行分类任务,达到较号的性能与准确的平衡。

(二)优化器选取

在训练神经网络时,优化器的选择对模型的性能具有重要影响。优化器用于更新和计算影响模型训练和模型参数的梯度,以最小化损失函数。本文采用Adam(Adaptive Moment Estimation)作为优化器。

Adam优化器将在梯度大时加速训练,梯度小时减速训练,而不是以固定的学习率训练。这将会大大加速训练过程,并且减少因训练集梯度问题而产生的训练问题,增加准确率。[3]

(三)损失函数选取

在机器学习和深度学习中,损失函数用于量化模型预测与真实标签之间的差异。选择一个合适的损失函数对于训练一个高效且准确的模型至关重要。本文采用交叉熵损失函数(Cross-Entropy Loss Function)进行训练。

在多分类问题中,通常有多个类别(假设为C个),模型的输出是一个C维的向量,每个元素表示样本属于对应类别的概率,其表达式为:

L = -\sum_{i=1}^{C} y_i \log(p_i)

其中,C表示样本个数,y是标签(0或1),p是模型的输出。

交叉熵损失函数常用于分类问题,衡量预测概率分布与真实概率分布之间的差异。而垃圾分类是典型的分类问题,适用于交叉熵损失函数。

使用交叉熵损失函数的好处之一是它能够有效地处理类别不平衡的问题,因为它关心的是预测概率与真实概率之间的差异,而不是仅仅关注是否预测正确。此外,交叉熵损失函数在梯度下降过程中表现良好,能够提供稳定的梯度更新,有助于模型的快速收敛。[4]

(四)训练脚本编写

Paddle框架提供的高级API极大简化了训练脚本的编写。因此,该脚本只需要设置优化器、损失函数和评价指标(准确率)并调用model.fit方法即可进行训练。另外,该脚本还通过回调函数,实现损失和准确率的记录,并写到一个csv文件中。

该脚本的代码如下:

import paddle
import csv
from paddle.metric import Accuracy
from paddle.callbacks import ProgBarLogger, Callback
from dataset import Datasettrain_dataset = Dataset()net = paddle.vision.models.resnet18(num_classes=40)
model = paddle.Model(net)# 自定义一个回调函数来记录loss和acc
class CSVLogger(Callback):def __init__(self, csv_file):super().__init__()self.csv_file = csv_fileself.file = Noneself.csv_writer = Nonedef on_train_begin(self, logs=None):self.file = open(self.csv_file, 'w', newline='')fieldnames = ['epoch', 'loss', 'acc']self.csv_writer = csv.DictWriter(self.file, fieldnames=fieldnames)self.csv_writer.writeheader()def on_epoch_end(self, epoch, logs=None):row_dict = {'epoch': epoch + 1, 'loss': logs.get('loss')[0], 'acc': logs.get('acc')}self.csv_writer.writerow(row_dict)def on_train_end(self, logs=None):self.file.close()# 实例化CSVLogger
csv_logger = CSVLogger('training_history.csv')# 准备模型训练
model.prepare(paddle.optimizer.Adam(parameters=model.parameters()),paddle.nn.CrossEntropyLoss(),Accuracy())# 使用fit方法并传入自定义的CSVLogger
model.fit(train_dataset, epochs=50, batch_size=64, callbacks=[ProgBarLogger(verbose=1), csv_logger])# 模型保存
model.save('./output/model')

(五)训练结果

经过50个epoch的训练后,模型的准确率稳定在97%左右,损失也逐渐趋于平稳,如图4.1和图4.2所示。

图4.1 模型准确率随epoch的变化图
图4.2 模型损失随epoch的变化图

 (六)模型测试

该模型的测试结果也非常好,其损失达到了9.6559^-6,准确率达到99.25%。可以看到,这个模型的分类是比较准确的,拟合性较高。

五、模型使用

本文提供了简单的模型使用程序,将会读取指定文件,并输出分类结果。其代码如下所示。

import paddle
from PIL import Image
import numpy as np
import json# 初始化模型
net = paddle.vision.models.resnet18(num_classes=40)
model = paddle.Model(net)# 加载模型
model.load('output/model')# 加载键值对
with open('dataset/garbage_dict.json', 'r', encoding='utf-8') as f:mapping = json.load(f)# 加载图片
path = 't3.jpeg'
img = Image.open(path)
img = img.resize((256, 256))
img = np.array(img, dtype=np.float32).transpose((2, 0, 1))[np.newaxis, :]# 预测
pred = model.predict_batch(img)[0]
label = int(pred.argmax())
print(mapping[str(label)])

本文使用模型给出了三个网络图片的分类,如图5.1、图5.2、图5.3所示

图5.1 预测结果:厨余垃圾/水果果皮
图5.2 预测结果:有害垃圾/过期药物
图5.3 预测结果:其他垃圾/竹筷

可以看到,本模型准确地给出了这些图片所对应的垃圾分类。 

六、结论与展望

本文提出了一种基于CNN的垃圾分类模型,并通过实验验证了其有效性。该模型能够自动识别并分类不同类型的垃圾,为垃圾处理提供了有效的技术支持。实验表明,该模型在垃圾分类任务中取得了较高的准确率,为垃圾处理提供了有效的技术支持。在应用方向上,可以将此模型应用于智能分类垃圾桶、垃圾分拣装置等,实现准确高效的垃圾分类。

参考文献

[1]黄琳轩.基于卷积神经网络的垃圾自动分类算法[J].科技与创新,2024,(10):70-72.DOI:10.15913/j.cnki.kjycx.2024.10.016.

[2]孙毅,吴斯曼,方伟,等.基于ResNet的安全监控目标检测[J/OL].集成技术:1-10[2024-06-06].http://kns.cnki.net/kcms/detail/44.1691.t.20240527.1512.004.html.

[3]张波,肖杰.深度学习模型训练的优化器实验设计[J].电子制作,2024,32(02):114-117.DOI:10.16589/j.cnki.cn11-3571/tn.2024.02.023.

[4]黄辉城,李建新.基于深度视觉的智能卸垛机快递箱边界检测系统[J].光学技术,2024,50(02):220-227.DOI:10.13741/j.cnki.11-1879/o4.2024.02.018.

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

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

相关文章

Kruskal算法求最小生成树

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #define MAX 100 #define NO INT_MAX//NO表示没有边&#xff0c;相当于INFtypedef struct Graph {int arcnum;int vexnum;char vextex[MAX][20];int martrix[MAX][MA…

什么无线领夹麦克风音质最好?领夹麦克风品牌排行榜前十名推荐

​在当今的数字化浪潮中&#xff0c;个人声音的传播和记录变得尤为重要。无论是会议中心、教室讲台还是户外探险&#xff0c;无线领夹麦克风以其卓越的便携性和连接稳定性&#xff0c;成为了人们沟通和表达的首选工具。面对市场上琳琅满目的无线麦克风选择&#xff0c;为了帮助…

Doris insert into 插入语句执行成功,且select查询成功,返回结果不报错,但查不到该插入数据

问题&#xff1a;Doris insert into 正常执行成功&#xff0c;select 查询也执行成功&#xff0c;但查不到该写入数据 原因&#xff1a;由于有其他 insert commit 事务待提交且该任务处于锁的状态&#xff0c;导致不断在回滚&#xff0c;进而造成其他的insert into 语句也执行成…

26 - 超过5名学生的课(高频 SQL 50 题基础版)

26 - 超过5名学生的课 select class fromCourses group byclass havingcount(*)>5;

Seed-TTS语音编辑有多强?对比实测结果让你惊叹!

GLM-4-9B 开源系列模型 前言 就在最近&#xff0c;ByteDance的研究人员最近推出了一系列名为Seed-TTS的大规模自回归文本转语音(TTS)模型,能够合成几乎与人类语音无法区分的高质量语音。那么Seed-TTS的表现究竟有多强呢?让我们一起来感受下Seed-TTS带来的惊喜吧! 介绍Seed-TTS…

组装服务器重装linux系统【idrac集成戴尔远程控制卡】

&#x1f341;博主简介&#xff1a; &#x1f3c5;云计算领域优质创作者 &#x1f3c5;2022年CSDN新星计划python赛道第一名 &#x1f3c5;2022年CSDN原力计划优质作者 &#x1f3c5;阿里云ACE认证高级工程师 &#x1f3c5;阿里云开发者社区专…

数据结构 | 超详细讲解七大排序(C语言实现,含动图,多方法!)

目录 ​编辑 排序的概念 常见排序算法 ​编辑 1.冒泡排序 &#x1f379;图解 &#x1f973;代码实现 &#x1f914;时间复杂度 2.插入排序 &#x1f379;图解 &#x1f334;深度剖析 &#x1f34e;代码思路 &#x1f973;代码实现 &#x1f914;时间复杂度 3.希尔…

2024 年适用于 Linux 的 5 个微软 Word 替代品

对于那些最近由于隐私问题或其他原因而转向 Linux 的用户来说&#xff0c;可能很难替换他们最喜欢的、不在 Linux 操作系统上运行的应用程序。 寻找流行程序的合适替代品可能会成为一项挑战&#xff0c;而且并不是每个人都准备好花费大量时间来尝试弄清楚什么可以与他们在 Win…

读书笔记|《把自己变成稀缺资产》:我们都拥有100分的欲望,却只有1分的耐心。

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 最近在读一本书《把自己变成稀缺资产》&#xff0c;其中一章讲到耐心的重要性&#xff0c;很有共鸣。 当今社会&#xff0c;生活节奏越来越快&#xff0c;我们都在急于求成的追求结果&#xff0c;对过程越来越缺乏耐…

2024050402-重学 Java 设计模式《实战责任链模式》

重学 Java 设计模式&#xff1a;实战责任链模式「模拟618电商大促期间&#xff0c;项目上线流程多级负责人审批场景」 一、前言 场地和场景的重要性 射击&#x1f3f9;需要去靶场学习、滑雪&#x1f3c2;需要去雪场体验、开车&#x1f697;需要能上路实践&#xff0c;而编程…

Scanpy(4)用与数据整合和批次处理

Scanpy包,用与数据整合和批次处理,包含批次效应的BBKNN算法和用于对比的ingest基础算法比较,及其原理简介。 1. 依赖: (1)数据集(全部需要挂VPN): PBMC:pbmc3k_processed()(需要下载);pbmc68k_reduced()(scanpy自带)Pancreas(需要下载)(2)Python包:Scanp…

【Python】把xmind转换为指定格式txt文本

人工智能训练通常需要使用文本格式&#xff0c;xmind作为一种常规格式不好进行解析&#xff0c;那如何把xmind转换为txt格式呢&#xff1f; 软件信息 python python -v Python 3.9.13 (tags/v3.9.13:6de2ca5, May 17 2022, 16:36:42) [MSC v.1929 64 bit (AMD64)] on win32…

Python 包安装及常用命令【python 入门】

背景&#xff1a; 近期看到一个项目&#xff0c;做微信只能机器人&#xff0c;服务是使用python搭建的&#xff0c;于是拷贝下来自己打算跑一跑&#xff0c;部署一下&#xff0c;可是自己又没有python的经验&#xff0c;于是各种查资料学习&#xff0c;跟着敲一敲&#xff0c;顺…

Go 1.19.4 切片与子切片-Day 05

1. 切片 1.1 介绍 切片在Go中是一个引用类型&#xff0c;它包含三个组成部分&#xff1a;指向底层数组的指针&#xff08;pointer&#xff09;、切片的长度&#xff08;length&#xff09;以及切片的容量&#xff08;capacity&#xff09;&#xff0c;这些信息共同构成了切片的…

JavaWeb_SpringBootWeb案例

环境搭建&#xff1a; 开发规范 接口风格-Restful&#xff1a; 统一响应结果-Result&#xff1a; 开发流程&#xff1a; 第一步应该根据需求定义表结构和定义接口文档 注意&#xff1a; 本文代码从上往下一直添加功能&#xff0c;后面的模块下的代码包括前面的模块&#xff0c…

Xmind Pro 2024 专业版激活码(附下载链接)

说到思维导图&#xff0c;就不能不提 Xmind。这是一款优秀的思维导图工具&#xff0c;拥有着丰富的导图模板&#xff0c;漂亮的界面和配色&#xff0c;以及各种各样的创意工具。 新架构速度更快 采用全新 Snowdancer 引擎&#xff0c;一种堪称「黑科技」的先进图形渲染技术。…

翘首以盼的抗锯齿

Antialiasing 实际的图形学中是怎么实现反走样的呢&#xff1f; 我们不希望实际产出的图形有锯齿效果&#xff0c;那怎么办呢&#xff1f; 从采样的理论开始谈起吧 Simpling theory 照片也是一种采样&#xff0c;把景象打散成像素放到屏幕上的过程&#xff1a; 还可以在不…

21 - 即时食物配送 II(高频 SQL 50 题基础版)

21 - 即时食物配送 II -- sum(if(order_datecustomer_pref_delivery_date,1,0))/count(*)sum(order_datecustomer_pref_delivery_date)/count(*) -- count(*),表示数据的行数&#xff0c;如果有分组&#xff0c;为分组后数据的行数select round(100*sum(if(order_datecustomer_…

原来Stable Diffusion是这样工作的

stable diffusion是一种潜在扩散模型&#xff0c;可以从文本生成人工智能图像。为什么叫做潜在扩散模型呢&#xff1f;这是因为与在高维图像空间中操作不同&#xff0c;它首先将图像压缩到潜在空间中&#xff0c;然后再进行操作。 在这篇文章中&#xff0c;我们将深入了解它到…

达摩院重大“遗产”!fluxonium量子比特初始化300纳秒且保真度超过99%

通用量子计算机开发的主要挑战之一是制备量子比特。十多年来&#xff0c;研究人员在构建量子计算机的过程中主要使用了transmon量子比特&#xff0c;这也是迄今为止商业上最成功的超导量子比特。 但与业界多数选择transmon量子比特不同&#xff0c;&#xff08;前&#xff09;…