前言:
近来上海开始实行垃圾分类制度后,全国舆论都在关注。大方向上,全国人民都是大力支持垃圾分类,这是因为垃圾分类后,垃圾不再是垃圾,而是资源。坚持垃圾分类,让每一种垃圾,去到合理的地方,不仅可以减少环境污染,更加可以找到能够循环利用的资源。
但其中繁复的详细类目,让垃圾分类的推行平添许多难度,有拿着手机指导扔垃圾的,还有的用无人机扔垃圾的,还有的专门请拾荒专业人士来教大家分类,扔垃圾的.....。在现在人工智能走入生活的潮流下,能不能有一款基于手机微信的,可以智能分类垃圾的小程序来解决这个问题呢?开发难度大吗?这个idea很好,确实,基于手机的垃圾智能分类微信小程序,开发起来难度没有你想象的那么难,甚至一个小时,会python的你就会Diy一个出来。下面,让我们看看这款将要诞生的应用效果吧。
初探垃圾智能分类应用
打开微信小程序,点击“智能分类”,用相机一拍要分类的垃圾,并确定上传,2秒不到,人工智能立刻提示该垃圾是哪种分类,让你不用再纠结要扔的垃圾是干垃圾,还是湿垃圾。这个功能是不是挺给力的,让困扰大家的“怎么扔垃圾?”的难题烟消云散。本文会从一个实现思路和涉及到的关键点进行一一阐述,但具体的开发,还需要小伙伴们阅读后来愉快的自行探索开发。
开发应用步骤和关键点
首先来说说实现的步骤,首先在在微信小程序里设计一个最简单的界面,开始向python服务器传图。具体界面请参考微信小程序设计指南。下面主要讲后台服务器交互,处理要点。
1.用js将图片上传到python程序。wx.requset()函数被调用后,会向后台服务器发起数据的post请求,此时小程序会把data里的数据以post形式向url对应的服务器提交,
wx.request({
url: 'https://python后台服务器网址',
data: {
............
},
method: "POST",
header: {
'content-type': 'application/x-www-form-urlencoded',
'chartset': 'utf-8'
}
wx.request({
url: 'https://python后台服务器网址',
data: {
............
},
method: "POST",
header: {
'content-type': 'application/x-www-form-urlencoded',
'chartset': 'utf-8'
}
代码具体解释:
url: url参数是数据提交的地址,微信小程序对后台接入的服务器需要支持https,而且需要具备已备案的能够解析的https域名。
data: data参数是要提交的数据,数据需要转换成json格式,使用JSON的stringify函数,可以看到data的数据类型是JavaScript的对象类型,也就是俗称的键值对。
method:是数据提交的请求方式,默认是post请求方式,后台在处理请求时会判断请求方式。
header:是数据的头文件,需要设置字符类型为utf-8,即'charset':'utf-8',防止传输中文数据时出现乱码。
2.python服务器存储图片。接收到微信端图片发送请求后,对图片进行重命名,并存储到本地,便于后续进行处理。
creat_folder(os.path.join(app.config['UPLOADS_FOLDER'], hash_openid))
pic_dir = os.path.join(app.config['UPLOADS_FOLDER'], hash_openid, fn)
new.save(pic_dir)
folder = photosSet.url(hash_openid)
img_dir= folder + '/' + fn
creat_folder(os.path.join(app.config['UPLOADS_FOLDER'], hash_openid))
pic_dir = os.path.join(app.config['UPLOADS_FOLDER'], hash_openid, fn)
new.save(pic_dir)
folder = photosSet.url(hash_openid)
img_dir= folder + '/' + fn
3.智能识别图片物体。这步是智能垃圾分类的魔法核心。原理是人工智能会根据打上标签的海量图片来识别新的图片所归属的分类标签。好奇的读者可能会问,我没学过深度学习啊?我也不会训练模型,怎么办?
python大大笑了,“没事,bat等巨头早就把这些核心人工智能能力封装成容易使用的接口了!为了快速开发,我们只要站在巨人的肩膀上就行了。“
核心技术原理
智能识别图片的所属分类。这个是用的百度的智能api,只要把图片传给百度api,API就会识别该图片,并把该图片所归属的分类返回一个数组列表。智能识别图片的分类标签效果如图,左边是图,右边是api识别后的分类标签:
有这么好的东东,让我们立刻看看如何用吧。
首先申请百度图像识别API的用户和key。请移步百度智能api中心申请。
安装百度图像识别Python :
- 如果已安装pip,执行pip install baidu-aip即可。
- 如果已安装setuptools,执行python setup.py install即可。
初始化AipImageClassify
AipImageClassify是图像识别的Python SDK客户端,为使用图像识别的开发人员提供了一系列的交互方法。
from aip import AipImageClassify
""" 你的 APPID AK SK """
APP_ID = '你的 App ID'
API_KEY = '你的 Api Key'
SECRET_KEY = '你的 Secret Key'
client = AipImageClassify(APP_ID, API_KEY, SECRET_KEY)
from aip import AipImageClassify
""" 你的 APPID AK SK """
APP_ID = '你的 App ID'
API_KEY = '你的 Api Key'
SECRET_KEY = '你的 Secret Key'
client = AipImageClassify(APP_ID, API_KEY, SECRET_KEY)
通用物体识别接口调用
该请求用于通用物体识别,即对于输入的手拍垃圾分类图片(可正常解码,且长宽比适宜),输出图片中的物体及场景标签。
""" 读取图片 """
def get_file_content(filePath):
with open(filePath, 'rb') as fp:
return fp.read()
image = get_file_content('example.jpg')
""" 调用通用物体识别 """
client.advancedGeneral(image);
""" 如果有可选参数 """
options = {}
options["baike_num"] = 5
""" 带参数调用通用物体识别 """
client.advancedGeneral(image, options)
""" 读取图片 """
def get_file_content(filePath):
with open(filePath, 'rb') as fp:
return fp.read()
image = get_file_content('example.jpg')
""" 调用通用物体识别 """
client.advancedGeneral(image);
""" 如果有可选参数 """
options = {}
options["baike_num"] = 5
""" 带参数调用通用物体识别 """
client.advancedGeneral(image, options)
调用后返回结果例子如下:
{
"log_id": 327863200205075661,
"result_num": 5,
"result": [{
"score": 0.967622,
"root": "固体",
"baike_info": {
"baike_url": ......................
{
"log_id": 327863200205075661,
"result_num": 5,
"result": [{
"score": 0.967622,
"root": "固体",
"baike_info": {
"baike_url": ......................
结果可以看到返回识别信息里包含了物体标签的信息。并且有score等字段,究竟都代表了什么涵义呢?看看下面的结果详细定义吧。
结果详细定义
4.结果和条目文本相似度匹配。有了图片所归属的分类标签后,需要根据自然语言的相似度和垃圾分类条目进行相似度匹配。计算匹配后,将匹配度最高的垃圾分类返回微信界面,提示用户该垃圾具体分类是什么,自此这个智能垃圾分类小程序就开发完毕。
涉及到的python关键点是:
需要将垃圾分类的条目结构化到python代码。在设计前,请参考下官方的垃圾分类指南图。
对应python代码为:
trash_cat={}
trash_cat['circle']=['纸张','塑料','玻璃'.........]#可回收
...................................... #有害垃圾
trash_cat={}
trash_cat['circle']=['纸张','塑料','玻璃'.........]#可回收
...................................... #有害垃圾
将图片识别的标签和垃圾分类条目进行匹配,选出最匹配的垃圾分类条目。
python关键代码,将标签分词后形成:
all_doc_list = []
for doc in all_doc:
doc_list = [word for word in jieba.cut(doc)]
all_doc_list.append(doc_list)
all_doc_list = []
for doc in all_doc:
doc_list = [word for word in jieba.cut(doc)]
all_doc_list.append(doc_list)
然后用dictionary方法获取词袋(bag-of-words)
dictionary = corpora.Dictionary(all_doc_list)
dictionary = corpora.Dictionary(all_doc_list)
使用doc2bow制作语料库
corpus = [dictionary.doc2bow(doc) for doc in all_doc_list]
corpus = [dictionary.doc2bow(doc) for doc in all_doc_list]
相似度分析
使用TF-IDF模型对语料库建模
tfidf = models.TfidfModel(corpus)
tfidf = models.TfidfModel(corpus)
获取测试文档中,每个词的TF-IDF值
tfidf[doc_test_vec]
tfidf[doc_test_vec]
然后就可以根据相似度进行匹配,并将图片识别后的标签和最相匹配的分类条目关联起来,返回给用户了。
对于一个对小程序开发有了解的python程序员来说,一个小时已经可以轻松开发出基于百度智能api的能智能识别拍图的垃圾分类程序了。神奇吧!
总结:
本文从垃圾分类的痛点谈起,通过微信小程序+智能识别api+NLP文本相似度等开发关键点的解说,给有志于利用人工智能技术的程序员,短时间高效率的开发出智能方便垃圾分类的应用指明了一条便捷的道路。
希望大家能通过python技术,让我们的生活更方便和美好。欢迎在评论区进行意见建议交流。