使用Python轻松完成垃圾分类(基于图像识别)
作者:上海小胖 发布时间:2023-06-24 06:06:47
0 环境
Python版本:3.6.8
系统版本:macOS Mojave
Python Jupyter Notebook
1 引言
七月了,大家最近一定被一项新的政策给折磨的焦头烂额,那就是垃圾分类。《上海市生活垃圾管理条例》已经正式实施了,相信还是有很多的小伙伴和我一样,还没有完全搞清楚哪些应该扔在哪个类别里。感觉每天都在学习一遍垃圾分类,真令人头大。
听说一杯没有喝完的珍珠奶茶应该这么扔
首先,没喝完的奶茶水要倒在水池里
珍珠,水果肉等残渣放进湿垃圾
把杯子要丢入干垃圾
接下来是盖子,如果是带盖子带热饮(比如大部分的热饮),塑料盖是可以归到可回收垃圾的嗷
看到这里,是不是大家突然都不想喝奶茶了呢,哈哈。不过不要紧,垃圾分类虽然要执行,但是奶茶也可以照喝。
那么,这里我们想讨论一下,人工智能和数据科学的方法能不能帮助我们进行更好的垃圾分类?这样我们不用为了不知道要扔哪个垃圾箱而烦恼。
2 思路
这问题的解决思路或许不止一条。这里只是抛砖引玉一下,提供一些浅显的见解。
第一种方案,可以把垃圾的信息制成表格化数据,然后用传统的机器学习方法。
第二种方案,把所有的垃圾分类信息做成知识图谱,每一次的查询就好像是在翻字典一样查阅信息。
第三种方案,可以借助现在的深度学习方法,来对垃圾进行识别和分类。每次我们给一张垃圾的图片,让模型识别出这是属于哪一种类别的:干垃圾,湿垃圾,有害垃圾还是可回收垃圾。
3 图像分类
图像分类是深度学习的一个经典应用。它的输入是一张图片, 然后经过一些处理,进入一个深度学习的模型,该模型会返回这个图片里垃圾的类别。这里我们考虑四个类别:干垃圾,湿垃圾,有害垃圾还是可回收垃圾。
报纸 :可回收垃圾
电池 :有害垃圾
一次性餐盒 :干垃圾
我们对图片里的物品进行分类,这是图像处理和识别的领域。人工智能里提出了使用卷积神经网络(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 总结
值得一提的是,尽管方法上是有实现的可能,但是实际操作中肯定要更复杂的多,尤其是对精度有着很高的要求。
而且当一个图片里面包含着好几种垃圾种类,这也会让我们的分类模型开发变得很复杂,增加了难度。
比如,我们想要对一杯奶茶进行垃圾分类,照片里面是包含了多个垃圾的种类,这就比较头大了,因为这并不是属于单一的类别。
前路的困难肯定是有的,不过就当这里的分享是个抛砖引玉的起点吧。
毕竟李白也说了,“长风破浪会有时,直挂云帆济沧海”。
来源:https://www.cnblogs.com/moonhmily/p/11136483.html


猜你喜欢
- 计算分页,嘿嘿一次搞定不用判断intNumPage = Abs(Int(-(intNumRecord/intPerPage)))
- 准备篇:1、配置防火墙,开启80端口、3306端口说明:Ubuntu默认安装是没有开启任何防火墙的,为了服务器的安全,建议大家安装启用防火墙
- 如果只是因为浏览者改变了浏览器的设置,或者因为浏览器不兼容,使自己精心制作的网页变得“面目全非”,那多令人沮丧!下面我们以网页爱好者的常用工
- Powerdesigner界面-tools-Resources-DBMS,点击左上角的New,选择copy from templete,如果
- 现在,ORM框架、Web框架和配置都已就绪,我们可以开始编写一个最简单的MVC,把它们全部启动起来。通过Web框架的@decorator和O
- 关于NaN值-在能够使用大型数据集训练学习算法之前,我们通常需要先清理数据, 也就是说,我们需要通过某个方法检测并更正数据中的错误。 - 任
- 他们都可以把 x 变成一个布尔类型的值:>>> x = 123>>> not not xTrue>
- 实际开发中,有时候系统提供的异常类型不能满足开发的需求。这时候你可以通过创建一个新的异常类来拥有自己的异常。异常类继承自 Exception
- 本文通过Python3+pyqt5实现了python Qt GUI 快速编程的19章的页面索引器应用程序例子。/home/yrd/eric_
- Golang的接口是什么在 Golang 中,接口是一种类型,它是由一组方法签名组成的抽象集合。接口定义了对象应该具有的行为,而不关心对象的
- MySQL死锁问题是很多程序员在项目开发中常遇到的问题,现就MySQL死锁及解决方法详解如下:1、MySQL常用存储引擎的锁机制MyISAM
- 本次薯片会一改以往低调、沉稳之作风,先瑜伽团美女show上阵,再是以臭为首的吃喝团上阵,两轮下来大家情绪Hight到了极点,自然讨论的时候思
- 本文实例讲述了基于pako.js实现gzip的压缩和解压功能。分享给大家供大家参考,具体如下:<!DOCTYPE html>&l
- request post 列表的方法今天拿着已经写好的服务接口, 尝试传送一些列表, 发现传送的结果跟实际传送的数据并不一致,然后又开始了漫
- 1、创建存储过程 create or replace procedure test(var_name_1 in type,var_name_
- 近日,小米正式宣布开源 SOAR。截至今日,该项目已经获得了 350 个「star」以及 44 个「fork」(GitHub项目地址:htt
- 一、什么是域名系统DNS 计算机域名系统 (DNS) 是由解析器以及域名服务器组成的。当我们在上网的时候,通常输入的是网址,其实这就是一个域
- 如下所示:# 访问百度,模拟自动输入搜索# 代码中引入selenium版本为:3.4.3# 通过Chrom浏览器访问发起请求# Chrom版
- Flask是一个Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务。本文参考自Flask官方文档,
- 前言最近在学习python-igraph,发现其实学习一种全新的语言看官方的文档是真的很有帮助,这次我的大部分python代码的完成都是靠着