还在被大妈灵魂拷问?使用Python轻松完成垃圾分类!

目录
0 环境
1 引言
2 思路
3 图像分类
4 总结

0 环境

Python版本:3.6.8

系统版本:macOS Mojave

Python Jupyter Notebook

1 引言

七月了,大家最近一定被一项新的政策给折磨的焦头烂额,那就是垃圾分类。《上海市生活垃圾管理条例》已经正式实施了,相信还是有很多的小伙伴和我一样,还没有完全搞清楚哪些应该扔在哪个类别里。感觉每天都在学习一遍垃圾分类,真令人头大。

听说一杯没有喝完的珍珠奶茶应该这么扔
1、首先,没喝完的奶茶水要倒在水池里
2、珍珠,水果肉等残渣放进湿垃圾
3、把杯子要丢入干垃圾
4、接下来是盖子,如果是带盖子带热饮(比如大部分的热饮),塑料盖是可以归到可回收垃圾的嗷

看到这里,是不是大家突然都不想喝奶茶了呢,哈哈。不过不要紧,垃圾分类虽然要执行,但是奶茶也可以照喝。

那么,这里我们想讨论一下,人工智能和数据科学的方法能不能帮助我们进行更好的垃圾分类?这样我们不用为了不知道要扔哪个垃圾箱而烦恼。

2 思路

这问题的解决思路或许不止一条。这里只是抛砖引玉一下,提供一些浅显的见解。

第一种方案,可以把垃圾的信息制成表格化数据,然后用传统的机器学习方法。

第二种方案,把所有的垃圾分类信息做成知识图谱,每一次的查询就好像是在翻字典一样查阅信息。

第三种方案,可以借助现在的深度学习方法,来对垃圾进行识别和分类。每次我们给一张垃圾的图片,让模型识别出这是属于哪一种类别的:干垃圾,湿垃圾,有害垃圾还是可回收垃圾。

3 图像分类

图像分类是深度学习的一个经典应用。它的输入是一张图片, 然后经过一些处理,进入一个深度学习的模型,该模型会返回这个图片里垃圾的类别。这里我们考虑四个类别:干垃圾,湿垃圾,有害垃圾还是可回收垃圾。

<center>(报纸 :可回收垃圾 )</center>


<center>(电池 :有害垃圾 )</center>


<center>(一次性餐盒 :干垃圾 )</center>

我们对图片里的物品进行分类,这是图像处理和识别的领域。人工智能里提出了使用卷积神经网络(Convolutional Neural Network, CNN)来解决这一类问题。

我会用keras包和Tensorflow后端来建立模型。 由于训练集的样本暂时比较缺乏,所以这里只能先给一套思路和代码。训练模型的工作之前还得进行一波数据收集。

我们就先来看看代码大致长什么样吧

先导入一些必要的包。

再做一下准备工作。

在上面,我们初始化了一些变量,batch size是128; num_classes = 4,因为需要分类的数量是4,有干垃圾,湿垃圾,有害垃圾和可回收垃圾这四个种类。epochs 是我们要训练的次数。接下来,img_rows, img_cols = 28, 28 我们给了图片的纬度大小。

在 .reshape(60000,28,28,1)中 , 60000 是图片的数量(可变), 28是图片的大小(可调),并且1是channel的意思,channel = 1 是指黑白照片。 .reshape(10000,28,28,1)也是同理,只是图片数量是10000。

到了最后两行,我们是把我们目标变量的值转化成一个二分类, 是用一个向量(矩阵)来表示。比如 [1,0,0,0] 是指干垃圾,[0,1,0,0]是指湿垃圾等等。

接下来是建模的部分。

我们加了卷积层和池化层进入模型。激活函数是 relu,relu函数几乎被广泛地使用在了卷积神经网络和深度学习。我们在层与层之间也加了dropout来减少过拟合。Dense layer是用来做类别预测的。

建完模型后,我们要进行模型的验证,保证准确性在线。

到这里,我们的建模预测已经大概完成了。一个好的模型,要不断地去优化它,提高精确度等指标要求,直到达到可以接受的程度。

这优化的过程,我们在这里就先不深入讨论了,以后继续。

4 总结

值得一提的是,尽管方法上是有实现的可能,但是实际操作中肯定要更复杂的多,尤其是对精度有着很高的要求。

而且当一个图片里面包含着好几种垃圾种类,这也会让我们的分类模型开发变得很复杂,增加了难度。

比如,我们想要对一杯奶茶进行垃圾分类,照片里面是包含了多个垃圾的种类,这就比较头大了,因为这并不是属于单一的类别。

前路的困难肯定是有的,不过就当这里的分享是个抛砖引玉的起点吧。

毕竟李白也说了,“长风破浪会有时,直挂云帆济沧海”。

关注公众号「Python专栏」,后台回复「垃圾分类2」获取本文全套代码。更多有意思的python等着你

原文地址:https://blog.51cto.com/miracleyoung/2417322

时间: 2024-08-30 03:59:27

还在被大妈灵魂拷问?使用Python轻松完成垃圾分类!的相关文章

灵魂拷问:如何检查Java数组中是否包含某个值 ?

摘自:https://www.cnblogs.com/qing-gee/p/12053156.html 在逛 programcreek 的时候,我发现了一些专注细节但价值连城的主题.比如说:如何检查Java数组中是否包含某个值 ?像这类灵魂拷问的主题,非常值得深入地研究一下. 另外,我想要告诉大家的是,作为程序员,我们千万不要轻视这些基础的知识点.因为基础的知识点是各种上层技术共同的基础,只有彻底地掌握了这些基础知识点,才能更好地理解程序的运行原理,做出更优化的产品. 我曾在某个技术论坛上分享过

灵魂拷问:Java如何获取数组和字符串的长度?length还是length()?

限时 1 秒钟给出答案,来来来,听我口令:"Java 如何获取数组和字符串的长度?length 还是 length()?" 在逛 programcreek 的时候,我发现了上面这个主题.说实话,我当时脑海中浮现出了这样一副惊心动魄的画面: 面试官老马坐在我的对面,地中海式的发型令我敬佩有加.尽管略显疲惫,但他仍然自信地向我抛出了上面这个问题.稍稍迟疑了一下,我回答说:"数组用 length,字符串用 length 跟上小括号".老马不愧是面试中的高手,一瞬间就从我的

[灵魂拷问♂]系列

[灵魂拷问♂]系列 SP1043 GSS1 - Can you answer these queries I 题目:链接 大致题意:求区间最大子段和,不带修改. 题解: 对于每个线段树节点.维护以下几个值: l, r:左右端点 sum:区间和 val:区间最大子段和 lv:一定包括区间左端点的最大子段和 rv:一定包括区间右端点的最大子段和 lv转移:lv = max(左儿子的lv, 左儿子的sum + 右儿子的lv) rv转移:rv = max(右儿子的rv,右儿子的sum + 左儿子的rv)

工厂设计模式灵魂拷问-Java实现

show me the code and take to me,做的出来更要说的明白 GitHub项目JavaHouse同步收录 喜欢就点个赞呗! 你的支持是我分享的动力! 引入 我们经常听到工厂模式,比如说 Spring 用了工厂模式啦,面试也会被问到工厂模式等等,这见工厂模式是日常开发中比较重要的一种设计模式.其实工厂模式也是比较简单的一种设计模式,这年头似乎不了解工厂模式,你都不好意思说你学过 编程一样(手动狗头).那么,允许我灵魂拷问一下,你真的了解工厂模式吗. UML类图 不急,我们先

洗礼灵魂,修炼python(3)--从一个简单的print代码揭露编码问题,运行原理和语法习惯

前期工作已经准备好后,可以打开IDE编辑器了,你可以选择python自带的IDLE,也可以选择第三方的,这里我使用pycharm--一个专门为python而生的编译器 第一个python代码当然是所有开发语言里入门必学"hello,world",no,你错了,我偏不 第一行是编码,utf-8这是国际使用标准,如果我不加的话,很容易出错 第二行print(打印的意思)语句,是python的关键词语句,可以打印一个字符,可以打印一个数字,可以打印任何你想打印的东西,只要你想让它显示出来,你

洗礼灵魂,修炼python(7)--元组,集合,不可变集合

前面已经把列表的基本用法讲解完 接着讲python的几大核心之--元组(tuple) 1.什么是元组? 类似列表,但为不可变对象,之前提到列表是可变对象,所谓可变对象就是支持原处修改,并且在修改前后对应的内存空间里的id依然不变,而不可变对象就是不支持原处修改,得重新赋值才行,但在重新赋值的时候,内存ID已经发生改变. 元组的特征是什么呢?下面会解释! 2.创建元组的两种方式: 注意:元组的特征是()没错,但是光有小括号是不行的 比如创建一个空的元组: 没有问题是吧,创建一个只有一个元素的元组呢

还在纠结基金怎么买?Python手把手教你爬取2000多支优选基金!

人不理财,财不理你,码农每个月辛辛苦苦的加班熬夜,为了就是那一点加班费,没办法谁叫现在的房价高的离谱呢,手里捧着窝窝头,菜里没有一滴油!有一天在咖啡店遇到了一个叫彼得高手,聊了一些理财的观念,听完之后茅塞顿开,投资有道!比如70%来定存,30%的钱来买一些基金定投,长期坚持下去,收益会不错! 码农听完,两眼冒光,爬虫数据分析,这些对我是小菜一碟啊,说干就干!立马熬夜写了一个爬虫,把7000多支基金爬个遍.下面我们就爬取一批较好的基金,为下步投资分析做好准备. 01.页面分析 我们的数据来源是东方

面试灵魂拷问之JS,请问你头皮发麻没有?

JS数据类型之问-概念篇 1.JS原始数据类型有哪些?引用数据类型有哪些?在 JS 中,存在着 7 种原始值,分别是: boolean null undefined number string symbol bigint引用数据类型:对象Object(包含普通对象-Object,数组对象-Array,正则对象-RegExp,日期对象-Date,数学函数-Math)函数Function2.说出下面运行的结果,解释原因. function test(person) { person.age = 26

灵魂拷问第1篇:能不能说一说浏览器缓存?

缓存是性能优化中非常重要的一环,浏览器的缓存机制对开发也是非常重要的知识点.接下来以三个部分来把浏览器的缓存机制说清楚: 强缓存 协商缓存 缓存位置 强缓存 浏览器中的缓存作用分为两种情况,一种是需要发送HTTP请求,一种是不需要发送. 首先是检查强缓存,这个阶段不需要发送HTTP请求. 如何来检查呢?通过相应的字段来进行,但是说起这个字段就有点门道了. 在HTTP/1.0和HTTP/1.1当中,这个字段是不一样的.在早期,也就是HTTP/1.0时期,使用的是Expires,而HTTP/1.1使