基于TensorFlow的简单的垃圾分类系统.docx

上传人:b****2 文档编号:12662675 上传时间:2023-04-21 格式:DOCX 页数:30 大小:3.07MB
下载 相关 举报
基于TensorFlow的简单的垃圾分类系统.docx_第1页
第1页 / 共30页
基于TensorFlow的简单的垃圾分类系统.docx_第2页
第2页 / 共30页
基于TensorFlow的简单的垃圾分类系统.docx_第3页
第3页 / 共30页
基于TensorFlow的简单的垃圾分类系统.docx_第4页
第4页 / 共30页
基于TensorFlow的简单的垃圾分类系统.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

基于TensorFlow的简单的垃圾分类系统.docx

《基于TensorFlow的简单的垃圾分类系统.docx》由会员分享,可在线阅读,更多相关《基于TensorFlow的简单的垃圾分类系统.docx(30页珍藏版)》请在冰豆网上搜索。

基于TensorFlow的简单的垃圾分类系统.docx

基于TensorFlow的简单的垃圾分类系统

内容摘要

内容摘要:

垃圾分类是近段时间来,全国范围内的热点问题,它是需要落实到我们每一个人身上来。

但是由于范围太广且是最近才开展的工作,所以还是有“混合垃圾”出现。

人工智能机器学习也是今年来快速发展的技术,那么利用TensorFlow去简单进行垃圾分类其实也是非常不错的选择。

本文就使用TensorFlow中比较常见且使用非常广泛的卷积神经网络来实现智能垃圾分类的目标,卷积神经网络是现今图像分类的比较好的解决方案。

TensorFlow扎根于Python中,并且还是跨平台的,兼容性方面自然不必多讲,主要是其整个的生态是十分健全的,在Python当中的不少库如keras,pytorch,random,OpenCV等,都能够对TensorFlow有着不小的助力。

本文主要通过卷积神经网络去训练处能够识别分为四大类垃圾:

“可回收的垃圾,有害的垃圾,厨余的垃圾,其他的垃圾”的模型,然后通过该模型来完成对垃圾图像的识别和分类,帮助我们去完成垃圾分类这个主要的任务。

关键词:

TensorFlow垃圾分类图像识别ResNet模型机器学习

卷积神经网络Python

 

第一章绪论

1.1选题背景、目的及意义

1.1.1选题背景

于2015年11月,大名鼎鼎的Google发布了TensorFlow的白皮书,并在很多人的关注与见证下将TensorFlow开源,从那时到2019年6月,Google再次发布更加强大与更加丰富TensorFlow2.0Beta版本。

在这几年间给我们带来很多新奇,并且具体的体验。

在各行各业中TensorFlow都可以帮助他们,比如科技研究者、工程师、医生、学生、艺术家们,都能通过它帮助到自己的工作与生活,从语言翻译、皮肤癌症早期诊断、预防糖尿病等。

可能更加直观的就是2016年3月AlpahaGOVSLee以4:

1战胜韩国棋手李世石,并且在不久后AlphahaGoMaster以3:

0横扫中国棋手柯洁,正式证明了机器在围棋这个领域霸权,而这一切都离不开TensorFlow的推动。

而我国于2019年开始的垃圾分类也是一大实事热点,对于垃圾分类来说我国只能说处于起始阶段,关于垃圾分类迎来“扫盲”式的知识普及,但是仍然让很多人非常困扰头疼,容易犯错。

于是我萌生利用TensorFlow去简单进行垃圾分类的想法,这是一个系统,目前先想要在电脑端上进行实现,再然后可以在移动端有移植,能够帮助人们在大多数情况下进行垃圾类别的识别。

1.1.2选题目的与意义

本课题旨在利用强大的机器学习及深度学习框架——TesnsorFlow对我国现在正在逐步推进垃圾分类进行一定帮助,实际就是TensorFlow更多应用的一些实现。

TensorFlow得益于在这几年间一步步布局的庞大的生态与巨大的影响力,它可以提供整个生命周期中的深度学习与人工智能服务,其中包括了数据的预处理、训练、可视化、分布式训练、模型部署到移动端等。

但是用去实现垃圾分类的方法,这方面算是比较空缺的阶段,实际上通过一段的学习是能够自主完成垃圾分类的,但是这对于一个城市完全适应或者说一个国家去普及相关知识的过程来说,需要一定时间,所以,有该系统的帮助是能够加快并且舒适的去度过这个过程的。

1.2国内外相关研究及概况

因为国内垃圾分类正处于整个的开始阶段,所以先把目光放于已经垃圾分类基本已经成为人民意识的国家。

美国纽约,提到这个被誉为世界之都的城市,现在的人很难将这座高楼密布拥有最庞大的CBD群的大都市与满是污水、臭气蔓延的垃圾城市联系在一起。

但事实是,在19世纪末时,纽约的确是世界上最杂乱、肮脏的城市之一,一直到1895年纽约史上第一个垃圾回收和分类系统被那时街道卫生的指挥官韦林创建,才好转起来。

作为日本最大的城市东京,同样是人山人海的大都市也曾深受垃圾围城和环境污染困扰。

于1970年底,日本国会全面去修改《清扫法》[1],制定《废弃物处理法》,以遏制废弃物排放,对废弃物进行适当的分类、保管、收集、运输、再生和处理,终于东京城市环境大幅改善[2]。

在国内来说,垃圾分类是垃圾处理流程中的基础环节,但由于配套设施的不完善与人们的垃圾分类意识和能力有所不足,目前来说开展的并不理想,收集到不少的“分类好的垃圾”仍然是混合垃圾[2]。

也就是说,垃圾分类必须基于科学化与精细化治理。

科学化,指宏观上的合理设计;精细化,指因地制宜,简便易行。

所以即使是现在垃圾分类实行的很好的国家城市,当年进行进行垃圾分类推行的时候也花费了大量的时间人力物力。

时代的发展给了我们另外的视野和条件,可以利用现代更新的科技与知识去解决同样的问题,会更快,更好。

利用TensorFlow在图像识别系统中的应用[,打造一个帮助我们分类的方便的系统能够给垃圾分类工作的普及提供不小的助力,这也是本系统设计的初衷。

1.3本文主要工作内容

主要内容包括以下:

第一章:

简单地介绍了使用TensorFlow实现垃圾分类的需求与垃圾分类推行使用TensorFlow的原因和国内外垃圾分类的背景与趋势。

第二章:

主要关于本文中使用的关键技术(TensorFlow)以及相关的知识,以及如何使用这个技术去实现目的即垃圾分类。

第三章:

主要介绍了系统的需求分析与系统功能的划分。

第四章:

详细的介绍整个系统实现的流程和所需要用到的技术,用到的知识点,并且如何去实现这个系统

第五章:

主要测试了该系统对于识别的精度,广度方面是如何的。

第六章:

对于本文的一个大总结。

 

第二章关键技术与工具介绍

2.1TensorFlow

2.1.1TensorFlow基本介绍

TensorFlow™是一个采用数据流图(dataflowgraphs),用于数值计算的开源软件库。

这是它的官方的描述,也可以的理解为,这是一个开源工具主要用于人工智能相关方面的研究工作。

它是由大名鼎鼎的Google大脑小组[3]研发,并用于深度神经网络,机器学习及其相关方面的研究,但是它具有强大的系统通用性,所以它甚至可以被广泛应用于其他计算领域。

2.1.2TensorFlow的应用

实际上现在TensorFlow的应用可以说是已经深入到你的生活中的每一处角落。

它支持多种硬件平台:

它可以支持CPU、GPU混合搭建的数据中心的训练平台,它也可以支持将数据中心训练好的模型,相对可以方便简易的部署到不同的移动端应用上,可以支持类似Google自主研发的TPU处理器;支持多种的开发环境;并且在Google的支持下它也能深入到移动端。

它很早就帮助Google的核心服务(搜索和广告)

它训练出来的模型可以用于邮件的过滤,自动回复。

可以用于机器翻译。

甚至是安卓手机的自拍功能,我们看到的摄像头中圈出人脸的方框,就是人脸识别的最基础的功能之一。

更比如近几年十分火热的AlphaGo,汽车的自动驾驶,甚至是智能医疗等。

2.2CNN(卷积神经网络)

我们可以将卷积神经网络粗浅的解释为传统神经网络的一个改进版,神经网络的结构如图2-1所示,分别有三层分别对应了:

输入层,隐藏层,输出层。

(隐藏层并不一定只有一层,图中就是两层)

图2-1人工神经网络结构

卷积神经网络与传统的神经网络类似,它依旧还是层级网络,不过层的形式与功能都变化了,如图2-2所示,这是一个积神经网络结构图当中的一个卷主要用于图像分类问题,如图中对应分为:

输入层、卷积层、池化层、全连接层、softmax层(其中softmax层是主要用于分类问题)

图2-2卷积神经网络结构

如上图所示,卷积神经网络架构与传统的常规人工网络架构非常相似[4],但是其相对于传统神经网络而言,优点却十分明显,比如有共享卷积核,相对于传统的神经网络对高维数据处理起来没有压力,也可以做到无需去手动选取图中特征,只要训练好权重,可以得到的特征分类效果比较好。

2.3CNN卷积神经网络模型

卷积神经网络当中有下面几种经典的卷积模型:

·LeNet:

最早是用于数字识别的CNN模型。

·AlexNet:

在2012ILSVRC夺得比赛中第一名的CNN模型。

·VGGNet:

它的论文是CNN领域最有影响力的论文之一。

·GoogLeNet:

2014ILSVRC比赛中第一名的CNN模型。

·MicrosoftResNet:

它在2015ILSVRC的错误仅仅为3.6%,

已经高于人类肉眼识别的错误率。

2.4Python

Python是一种高级设计语言,它是解释型、面向对象、动态数据类型的[5]。

由GuidovanRossum发行于1991年的第一个公开版本已经面世就广受相关研究者的青睐。

它的应用很广泛在:

科学计算和统计、人工智能、软件开发、网络爬虫,web和Internet开发、等领域都承担了很重要的角色。

2.5如何应用于垃圾分类

怎样将上面的技术应用于垃圾分类,是本文的主要内容。

基础的流程是:

用输入设备输入图片,使用TensorFlow中卷积神经网络训练好的模型对图片进行识别,输出分类。

详情可见下文系统设计中详细解释,在此不多赘述。

关于TensorFlow与Python的关系。

TensorFlow是Python的一个库,但与别的库不同,TensorFlow是一个用于表示抽象计算的框架,当用Python去使用TensorFlow时,代码做的事是组装计算图,然后和计算图交互(即seesions)。

当然不可能完全靠一个TensorFlow的,实际上我们还用了Python中的Pandas,Keras,Numpy等,很多的库,结合一起去完成工作。

 

第三章需求分析与系统功能分析

3.1系统需求分析

3.1.1功能需求

(1)输入图片:

①摄像头拍照

②通过文件载入图片

(2)识别垃圾:

①当识别为蓝色的垃圾时即可回收物

②当识别为绿色的垃圾时即餐厨垃圾

③当识别为红色的垃圾即有害垃圾

④当识别为灰色的垃圾时即其他垃圾

(3)输出结果

3.1.2性能需求

(1)识别时间:

在95%的情况下,一般的识别时间不超过2秒。

(2)识别广度:

需要对大部分物品识别出是那一类垃圾。

(3)识别精度:

对大部分物品识别的准确率要超过90%。

(4)输入图片:

对jpg,与png格式图片需要都支持。

3.1.3兼容性需求

系统支持Windows10操作系统;

系统支持Python3.6

3.1.4易用性需求

简易式操作方式,仅仅需要导入图片即可进行识别,不需要

登录,注册等即可。

3.1.5硬件约束

推荐配置:

Cpu:

intelcorei7-7700k4.4G

内存:

至少1x8G

GPU显存:

4G以上

硬盘:

HDD一个,SSD一个

3.2系统主要功能

系统的主要功能总结十分简单明确,通过拍照或者文件载入

图片输入到已经使用训练好的模型当中去识别,将其识别的结果

输出。

详细由见以下流程图3-1:

图3-1基本流程图

开始,进入输入图片,输入图片有格式的要求,如果符合需求则进行下一步识别,如果不符合需求则输出不符合需求,并且回到输入图片这一步。

进行识别,识别有正确错误之分,但是都会输出结果,但是有可能会出现无法识别,如果无法识别则回到输入图片,可以识别即输出结果。

3.3系统的功能模块划分

系统的功能模块分为以下:

(1)输入图片功能

(2)识别分类功能

(3)输出识别结果功能

3.4本章小结

本章主要将系统的需求和功能进行详细的解释,系统的需求很明显,就是要将输入的图片去识别出划分好的几种垃圾中的哪一种,这种需求概括来讲其实比较少,需求分析也有提到有硬件约束的条件,要知道要去使用代码去训练出自己想要的模型以供识别,是比较吃硬件的,总的来说电脑配置越好迭代速度会越快。

第四章基于TensorFlow的简单的垃圾分类系统的实现

4.1系统架构

整个系统的架构有以下组成,输入设备,输入到电脑终端,电脑终端对图像进行图像分类,图像处理,图像识别,识别后的图像再分类的工作,然后输出结果如图4-1所示:

图4-1架构图

此系统基于TensorFlow设计的分类大脑,对图像的处理大致分为这两步:

(1)使用OpenCV对输入的图片进行预处理

(2)使用基于TensorFlow的卷积神经网络模型的实现图像的分类[6]

4.2TensorFlow进行模型训练

4.2.1收集获取数据集

通过网络和自己拍的方式,去收集各类的数据集,验证集总共收集13000多张。

如下图4-1是一部分的收据集,其中txt是标签。

图4-1收集的数据集

将其划分为四大类:

可回收物、有害垃圾、厨余垃圾、其他垃圾。

数据具体划分情况即数据集的分布是图4-2这样的

图4-2数据分布图

4.2.2对数据集进行预处理

在Keras中会用到一个被称为数据生成器(data-generator)的东西,对神经网络输入数据,这样可以使得它会在整个数据上进行不断的循环。

这时候会创建一个小型训练集通过对图像进行处理,图像会经过人为的各种变换来增加它的数量,它是使用了内置的数据生成器,来进行一些数据的随机转换,也被成为数据增强,之后为了增加数据样本各方面的丰富度。

通过旋转(Flips)、移位(TransLations)、CoarseDropout等方法进行数据加强部分代码如图4-3,详情请见附录。

图4-3预处理代码

增强之后的效果是图4-4这样的,这样可以方便CNN的模型去对它进行学习和分类。

图4-4预处理增强之后

4.2.3搭建CNN网络

接下来就是网络的搭建了,我这里使用的ResNet18是ResNet(又称为深度残差网络)结构的变种。

与传统的网络结构不同,在残差网络结构中,通过“shortcutconnecttions(捷径连接)”的方式,因此传统网络中层次越深越容易出现错误的弊端得到解决,这是ResNet34有34层的结构。

其基本结构如图4-5

图4-5基础的深度残差网络结构图

如图所示为了使得能使模型中网络的层数能够比较大的加深,它学习与形成残差的函数,实际上的操作是它对每层的输入做一个reference。

这时候残差函数[7]可以比较容易的优化。

在计算机视觉当中,我们所谓的特征“等级”会因为网络层数的深度的加深导致变高,从而梯度弥散也就是所谓的梯度爆炸会变成训练一个比较深层次的网络模型的严重问题,也即是深到一定地步的时候会导致误差率上升,这是层数越深就无法收敛导致。

为解决这一问题,何凯明等[8]人提出了一种具有残差连接的网络结构。

如图4-6所示。

图4-6残差连接结构

具体的ResNet还有更多的解释,详情这里就不多赘述回到本文的主要完成内容中来。

根据实际情况,我选用的是ResNet18的结构。

首先要知道,ResNet的组成是基础模块Bottleneck/Basicblock,通过make_layer生成四个的大的layer,然后在forward中排序。

__init__的两个重要参数,block和layers,block有两种(Bottleneck/basicblock),不同模型调用的类不同,在ResNet中调用的是Basicblock类。

如图4-7所示:

图4-7ResNet网络结构图

ResNet18是有带有权重的18层,包括卷积层和全连接层,不包括池化层和BN层,18=17个卷积层+1全连接层而Basicblock的resdual包含两个卷积层,第一层卷积层的kernel=3。

代码如图4-8所示:

图4-8Basicblock代码图

根据ResNet18网络结构,本设计使用了如图4-9所示代码构建本次使用的网络。

图4-9构建网络代码

构建网络之后就是将预处理之后数据放进ResNet18的网络中进行初步特征提取。

但是由于自身数据集参差不齐的质量,光线明暗,甚至因为是垃圾,“垃圾图片”本身的脏乱的特点,和过拟合的问题,最终使用ResNet的效果并不太理想。

训练代码如图4-10所示:

图4-10训练代码

训练结果的可视化进行如图4-11和4-12所示:

图4-11可视化

图4-12可视化

4.2.4迁移学习

经过一系列调参的操作之后,实际得到的如上两图仍旧是准确率无法得到再次的提升了,于是我通过别的方法让准确率再一次的提升。

这里所用到的方法:

迁移学习,即Transfer-learning,它是一种机器学习方法,用不太恰当的言语来描述的话就是:

温故而知新。

它的目标是将从一个环境A所学到的知识,用于学习另一个环境B的任务。

迁移学习通过已学习的相关任务A转移来改进学习的新任务B。

迁移学习对人类来说很常见,比如,现实生活中会发现,学习认识狗能够帮助你认识猫,学习拉小提琴能够帮你学习拉二胡,这是因为人具有迁移知识帮助自己学习的能力,对于电脑来讲,通过一些方法也是可以达成同样的目标。

对于迁移学习的定义[9]:

给出一个源域Ds={Xs,Fs(X)},再给出一个学习任务Ts,然后是一个目标域DT={Xt,Ft(X)}再是学习任务Tt,迁移学习的目标就是在源域与目标域不同或者是学习任务Tt与学习任务Ts不同的条件下通过使用学习任务Ts和源域Ds={Xs,Fs(X)}得到的相关知识帮学习目标的在目标域Dt的预测函数Ft(.)。

关于迁移学习的一些研究:

比如基于模型生成的迁移学习方法,当前很多的迁移学习算法都是基于如何判别模型的学习算法[10],判别算法根据给定的一个源域的数据A,通过直接的训练能够获得的判别模型P(B|A),但是因为源域和目标域数据分布是不一样的,又因为判别模型没有考虑有关联合概率的情况P(A,B),所以在某些时候就不能够得到比较好的预测函数。

不同于这个判别模型,生成模型是通过计算得出联合概率P(A,B),再去计算P(B|A),生成模型也因此提供了一个相对较好的机制,对源域和目标域的数据不相同,分布不相同,进行生成建模,达到一个比较好的知识迁移提高预测函数准确度。

在本文主要的方向,图像处理方面有一种[11]翻译迁移学习方法,通过使用文本的数据,来帮助图像聚类、也有一种[12]从无标签数据进行迁移学习的方法,这个方法使用了系数编码的技术从无标签的数据中上构造出高层的特征,从而能够提高图像的分类性能。

我们结合图来看,如下图4-13,传统的器学习在同的学习任务时需要建立不同的模型,去学习不同的参数,而对于迁移学习(图4-14),只需要利用源域中的数据将知识迁移到目标域,就能完成模型建立。

图4-13

图4-14

不难发现,迁移学习适用于知识点存在重合的情况,这样的时候可以通过学习A的知识达到也了解B的知识,那么对于本文来讲,收集到的垃圾数据集,也并不是独立存在的样本,它同其他数据集存在分布重合的情况。

因此将通过初步特征提取后的模型参数迁移到ResNet的模型上,通过ResNet的知识迁移学习,系统的准确率能够得到提升。

下图4-15是迁移学习的部分代码

图4-15

经过加上了迁移学习的步骤之后,本系统的整个流程步骤也发生了一些改变,具体改变的流程如图4-16所示:

图4--16流程图

详细实现流程:

数据的采集,数据预处理,初步提取数据特征,迁移学习,识别测试。

其中迁移学习之后的的可视化准确率如图4-17所示:

图4-17测试准确率可视化图

4.2.5ResNet参数

在上面ResNet18的结构[13]的时候我们提到了两个重要参数,block和layers,block有两种(Bottleneck/basicblock)。

在较为浅层的ResNet中(大部分指ResNet34以下),用到的基础模块是BasicBlock,它由两个(3,3,out_plane)的conv2d[]堆叠而成。

在使用这个BasicBlock的时候,需要根据堆叠具体的参数:

输入输出通道数目,堆叠几个BasicBlock,就能确定每个stage中basicblock的基本使用情况。

那么BasicBlock是如何运作的呢?

resnet18()函数调用ResNet()类,通过输入初始化参数:

BasicBlock,[2,2,2,2],实例化一个resnet18model:

如图4-18所示,ResNet()大类(代码使用的rensent的pytorch源码),输入哪些初始化话参数就可以实例化为resnet18模型:

BasicBlock

图4--18

下面加上基础模块BasicBlock也是残差块residualblock的图解

4-19

图4-19

BasicBlock要解决的一个重要问题就是,identitymapping这个直连的维度和F(x)输出的维度不一样无法直接相加的问题:

采用一个kernel=1的conv2d卷积核融合并降低通道信息,如果H/W尺度也不一样就设计stride。

只要stride>1或者输入和输出通道数目不同都可以断定residulF(x)部分产生的featuremaps相对于原来的featuremaps的分辨率降低了,此时的identitymap都要进行下采样。

也就是identitymap部分要和residual部分进行相同的尺寸变换(包括H/W和channel),这两部分的输入输出通道(planes)要相同,stride(H/W)也相同[14]。

之后是做stage的函数_make_layer(),如图4-20注意在resnet18()函数中,直接调用了BasicBlock类作为实参,并没有使用BasicBlock实例:

图4-20

如上就是ResNet[14]的一些重要的参数以及它的一些构成,相比于其他的网络结构,它的残差结构主要就是针对层次越深就有可能导致梯度爆炸等问题的解决方案,同时残差结果对于数据的变化/波动会更加的敏感也对于网络权重的波动更加的铭感,所以对于更加多的数据它能够更好的处理,其次相比较传统的VGG网络,它的复杂度降低许多,所需要的的参数量也下降了不少,能够用到的网络层数也更深,同时不会出现梯度爆炸,也因此分类的准确度会得到很大程度的提升。

虽然相对于AlexNetVGG等经典的网络结构来说它的训练和推理速度肯定是比较慢的,其次在硬件配置不够的情况下速度问题就会突出,但是最重要的一点在于根据自己需要项目的目标去分析,根据我的项目要求如果使用AlexNet等经典但比较旧的网络结构的话,很可能因为数据量的问题和分类过多导致其过拟合,实际实践与操作中直接使用AlexNet模型的情况下准确率只有70%就不能够再提高了(本项目)所以ResNet无疑是更好的选择

4.2.6识别测试

在通过了数据预处理,搭建网络,进行训练,提取特征,迁移学习,调整ResNet18的参数之后开始了对ResNet进行不断的迭代训练,然后将迭代过程效果最好的进行标记如图4-21,

图4-21

然后使用训练好的模型,与我分类的测试集进行测试,得出的测试混准确率还不错,达到了90%如下图4-22

图4-22

4.3运行效果

运行效果基本能够对大部分的测试集图片进行比较准确的识别,下面图4-23为一些中间段实时效果展示,图4-24和图4-25运行最终界面结果展示:

图4-23中间时段

图4-24

图4-25

 

4.4本章总结

本章主要从几个部分描述了这个如何去实现的,通过收集到数据集,分类,到数据的预处理,再到搭建整个ResNet网络,然后怎样去用到迁移学习,调整ResNet的参数的几大重要内容,这些是

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 销售营销

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1