嗨嗨,大家好呀,我是小圆~

今天给你们分享一个有趣的东西

如何利用现有的工具来实现一个垃圾分类的应用

主要做了三个核心内容:

  • 对比现有垃圾分类服务,挑选一个合适并编码实现
  • 开发桌面版垃圾分类APP
  • 开发垃圾分类微信小程序

上面这三部分第一部分是后端的活儿,其他两部分都是前端的活儿,所以,我在这三块没有太多经验,基本上是面向搜索引擎编程。

效果图

PC版:

小程序

附上小程序连接垃圾分类小程序,大家可以体验一下。如果打开看不到效果可能审核没通过,稍微晚点再开即可。

需领取完整源码跟Python学习资料可点击这行字体

接下来进入到具体的细节是如何做的

其实垃圾分类已经开始很长一段时间了,肯定会有一些服务商把垃圾分类的能力通过API的方式开放出来,供大家调用。我找了3家简单对比下供大家参考:

聚合数据(www.juhe.cn):提供文本、图像、语音分类。免费调用20次,定价不灵活只能批量购买

天行数据(www.tianapi.com):提供文本、图像、语音分类。文本分类5000次,其他50次,定价按量计费

京东AI开放平台:提供文本、图像、语音分类。免费,每日5000次

简单对比了图像分类情况,聚合和天行数据明显更好,再综合定价因素最终我决定用天行数据。下面就来编写代码,将API接口封装成我们需要的服务,以文本(垃圾名称)分类接口为例,请求的接口如下

http://api.tianapi.com/txapi/lajifenlei/index?key=APIKEY&word=眼镜

APIKEY需要到天行网站注册来获取,返回的结果如下:

{"code":200,"msg":"success","newslist":[{"name":"隐形眼镜","type":3,"aipre":0,"explain":"干垃圾即其它垃圾,指除可回收物、有害垃圾、厨余垃圾(湿垃圾)以外的其它生活废弃物。","contain":"常见包括砖瓦陶瓷、渣土、卫生间废纸、猫砂、污损塑料、毛发、硬壳、一次性制品、灰土、瓷器碎片等难以回收的废弃物","tip":"尽量沥干水分;难以辨识类别的生活垃圾都可以投入干垃圾容器内"},{"name":"眼镜","type":3,"aipre":0,"explain":"干垃圾即其它垃圾,指除可回收物、有害垃圾、厨余垃圾(湿垃圾)以外的其它生活废弃物。","contain":"常见包括砖瓦陶瓷、渣土、卫生间废纸、猫砂、污损塑料、毛发、硬壳、一次性制品、灰土、瓷器碎片等难以回收的废弃物","tip":"尽量沥干水分;难以辨识类别的生活垃圾都可以投入干垃圾容器内"},]
}

接口的字段说明大家可以看官网文档,这里我就不再赘述了。

下面来编写请求文本分类接口的代码:

import base64
import requestsclass TxApiService:def __init__(self):self.appkey = 'xxx'  # 需要换成自己的self.text_cls_url_root = 'https://api.tianapi.com/txapi/lajifenlei/index?key=%s&word=%s'self.img_cls_url_root = 'https://api.tianapi.com/txapi/imglajifenlei/index'def get_text_cls_res(self, garbage_name):url = self.text_cls_url_root % (self.appkey, garbage_name)response = requests.get(url)res = []if response.status_code == 200:res_json = response.json()if res_json.get('newslist'):new_list_json = res_json['newslist']for item in new_list_json:name = item.get('name')cat = self.garbage_id_to_name(item.get('type'))tip = item.get('tip')ai_pre = item.get('aipre')pre_type = 'None'if ai_pre == 0:pre_type = '正常结果'if ai_pre == 1:pre_type = '预判结果'item_dict = {'name': name, 'type': cat, 'tip': tip, 'pre_type': pre_type}res.append(item_dict)return reselse:return Nonereturn Nonedef garbage_id_to_name(self, id):if id == 0:return '可回收物'if id == 1:return '有害垃圾'if id == 2:return '厨余垃圾'if id == 3:return '其他垃圾'return None

代码比较简单,用Python的requests库请求垃圾分类接口,并对返回的数据格式化。下面再来编写请求图像分类的接口

需领取完整源码跟Python学习资料可点击这行字体

def get_img_cls_res(self, img_base64):headers = {'Content-Type': 'application/x-www-form-urlencoded'}body = {'key': self.appkey,"img": img_base64,}response = requests.post(self.img_cls_url_root, headers=headers, data=body)res = []if response.status_code == 200:res_json = response.json()if res_json.get('newslist'):new_list_json = res_json['newslist']for item in new_list_json:name = item.get('name')cat = self.garbage_id_to_name(item.get('lajitype'))tip = item.get('lajitip')trust = item.get('trust')if trust <= 80:continueitem_dict = {'name': name, 'type': cat, 'tip': tip, 'pre_score': trust}python学习交流Q群:770699889 ###res.append(item_dict)return reselse:return Nonereturn None

函数的参数是图像的base64编码,请求方式是POST请求,返回值字段与文本分类略有不同,但思路是一样的。
这两部分内容其实比简单,这里我就不再过多解释了。

开发GUI

有了数据服务,下面我们就来开发GUI,这里我用的是tkinter,用它编写的APP可以运行在Linux、Windows和Mac系统,关于tkinter的使用这里我不会做过多介绍,不了解的朋友自行百度,之前我也没结果过基本上看网上的教程照猫画虎。

首选,创建GarbageClassificationApp类,来定义用到的各种组件

python学习交流Q群:770699889 ###
import base64
import tkinterfrom tkinter import *
import hashlib
import time
from tkinter import filedialogfrom TxApiService import TxApiServiceclass GarbageClassificationApp:def __init__(self, tk):"""初始化各个组件:param tk:"""self.tk = tk# 第一行定义文本分类相关的组件self.text_cls_label = Label(self.tk, text="垃圾名:")self.garbage_name_text = Entry(self.tk)self.text_cls_button = \Button(self.tk, text="垃圾名分类", bg="lightblue", width=10, height=1, command=self.garbage_name_cls)# 第二行定义图像分类相关的组件self.img_cls_label = Label(self.tk, text="垃圾图片:")self.select_file_button = Button(self.tk, text='选择图片', command=self.select_pic)self.img_cls_button = \Button(self.tk, text="图片分类", bg="lightblue", width=10, height=1, command=self.garbage_img_cls)self.img_name_text = Text(self.tk, height=2)self.img_name_text.insert(1.0, '未选择图片:')self.img_name_text['state'] = DISABLED# 第三行定义输出结果相关的组件self.cls_result_label = Label(self.tk, text="分类结果:")self.output_cls_result_list_box = Listbox(self.tk, width=100, height=30)# 初始化 api 服务self.api_service = TxApiService()self.set_init_window()

再来创建set_init_window函数对各个组件进行布局

# 各组件布局
def set_init_window(self):self.tk.title("垃圾分类")self.tk.geometry('1068x681+350+200')  # 1068x681为窗口大小,+100 +100 定义窗口弹出时的默认展示位置# 第一行文本分类各组件的布局self.text_cls_label.grid(row=0, column=0, sticky=E)self.garbage_name_text.grid(row=0, column=1)self.text_cls_button.grid(row=0, column=2, padx=10)# 第二行图像分类各组件的布局self.img_cls_label.grid(row=1, column=0, sticky=E)self.select_file_button.grid(row=1, column=1)self.img_cls_button.grid(row=1, column=2, padx=10)self.img_name_text.grid(row=1, column=3, padx=10)# 第三行输出结果各组件的布局self.cls_result_label.grid(row=2, column=0, rowspan=2, sticky=E)self.output_cls_result_list_box.grid(row=4, column=1, columnspan=10, pady=10, sticky=E)

这样,界面就完成了。

上面定义的一些组件中会有一些事件处理逻辑,比如一个按钮Button被按下时,它就会调用commond属性指定的函数。

以文本分类Button为例(text_cls_button),用户按下该按钮后,程序就会执行garbage_name_cls函数,在该函数中我们就可以请求文本分类服务,并将返回的数据显示到界面上。

代码如下:

def garbage_name_cls(self):garbage_name = self.garbage_name_text.get()cat_arr = self.api_service.get_text_cls_res(garbage_name)self.output_cls_result_list_box.delete(0, END)if cat_arr:i = 0for item in cat_arr:name = '垃圾名称: %s' % item.get('name', 'None')self.output_cls_result_list_box.insert(i, name)i += 1cat = '垃圾类别: %s' % item.get('type', 'None')self.output_cls_result_list_box.insert(i, cat)i += 1pre_type = '预判类型: %s' % item.get('pre_type', 'None')self.output_cls_result_list_box.insert(i, pre_type)i += 1tip = '投放提示: %s' % item.get('tip', 'None')self.output_cls_result_list_box.insert(i, tip)i += 1self.output_cls_result_list_box.insert(i, '')i += 1

其他事件处理逻辑类似,代码如下

python学习交流Q群:770699889 ###
def select_pic(self):"""单选图片:return:"""file_name = filedialog.askopenfilename(filetypes=[('图片', ('.png', '.jpg', '.jpeg'))])if file_name:self.img_name_text['state'] = NORMALself.img_name_text.delete(1.0, END)self.img_name_text.insert(1.0, '已选择图片:%s' % file_name)self.img_name_text['state'] = DISABLEDdef garbage_img_cls(self):img_name_text = self.img_name_text.get(1.0, END)if img_name_text.startswith('已选择图片:'):file_path = img_name_text[6:].strip()else:returnwith open(file_path, 'rb') as f:base64_data = base64.b64encode(f.read())img_base64 = base64_data.decode()cat_arr = self.api_service.get_img_cls_res(img_base64)self.output_cls_result_list_box.delete(0, END)if cat_arr:i = 0for item in cat_arr:name = '垃圾名称: %s' % item.get('name', 'None')self.output_cls_result_list_box.insert(i, name)i += 1cat = '垃圾类别: %s' % item.get('type', 'None')self.output_cls_result_list_box.insert(i, cat)i += 1pre_type = '预测得分: %s' % item.get('pre_score', 'None')self.output_cls_result_list_box.insert(i, pre_type)i += 1tip = '投放提示: %s' % item.get('tip', 'None')self.output_cls_result_list_box.insert(i, tip)i += 1self.output_cls_result_list_box.insert(i, '')i += 1

至此,PC端桌面APP就开发完成,这里我们没有实现语音分类服务,但思路是一样的,大家可以尝试一下。

好啦,今天的分享到这里就结束了 ~
对文章有问题的,或者有其他关于python的问题,可以在评论区留言或者私信我哦
觉得我分享的文章不错的话,可以关注一下我,或者给文章点赞(/≧▽≦)/

【Python案例】Python实现垃圾分类APP(附带微信小程序)相关推荐

  1. 用Python快速实现一个垃圾分类APP|附带微信小程序

    导语 今天这篇文章主要介绍如何利用现有的工具来实现一个垃圾分类的应用 主要做了三个核心内容: 对比现有垃圾分类服务,挑选一个合适并编码实现 开发桌面版垃圾分类APP 开发垃圾分类微信小程序 上面这三部 ...

  2. python人脸检测与微信小程序_python+requests对app和微信小程序进行接口测试

    对于web端和app端的接口测试来说,他们都是通过请求方法,url和传递的body参数进行接口请求,区别web和app的区别就是header请求的不同.不同的地方在于header中的User-Agen ...

  3. python+requests对app和微信小程序进行接口测试

    对于web端和app端的接口测试来说,他们都是通过请求方法,url和传递的body参数进行接口请求,区别web和app的区别就是header请求的不同.不同的地方在于header中的User-Agen ...

  4. python扫描app接口_[分享】python+requests对app和微信小程序进行接口测试

    对于web端和app端的接口测试来说,他们都是通过请求方法,url和传递的body参数进行接口请求,区别web和app的区别就是header请求的不同.不同的地方在于header中的User-Agen ...

  5. python 模拟微信浏览器请求_python+requests对app和微信小程序进行接口测试

    对于web端和app端的接口测试来说,他们都是通过请求方法,url和传递的body参数进行接口请求,区别web和app的区别就是header请求的不同.不同的地方在于header中的User-Agen ...

  6. python做app接口测试_关于python:pythonrequests对app和微信小程序进行接口测试

    对于web端和app端的接口测试来说,他们都是通过申请办法,url和传递的body参数进行接口申请,区别web和app的区别就是header申请的不同.不同的中央在于header中的User-Agen ...

  7. 对app和微信小程序进行接口测试

    对于web端和app端的接口测试来说,他们都是通过请求方法,url和传递的body参数进行接口请求,区别web和app的区别就是header请求的不同.不同的地方在于header中的User-Agen ...

  8. 开发APP、微信小程序、网页,都需要什么?

    开发APP,微信小程序,网页都需要什么? 准备工作 前端开发 后端开发 技术整合 打包上线 结语 在开始介绍之前,我先罗列一下APP,微信小程序,网页的大比较 准备工作 云服务器,域名(需备案),SS ...

  9. uniapp一套代码开发app和微信小程序

    为什么选择uniapp开发? 为什么选择uniapp进行开发? 1.uniapp对于独自开发是相当友好的,一套代码可以兼容app(安卓,ios),小程序,h5等,一定程度上降低了开发的成本,个人开发的 ...

最新文章

  1. 大数据如何有序地“变废为宝”
  2. 现代 PHP 新特性系列
  3. rest-framework url控制
  4. LDPC译码算法代码概述
  5. 服务器安装三节点RabbitMQ集群(3)
  6. word一键排版工具_超赞的Word标尺小工具,轻松帮你搞定各种「对不齐」排版问题...
  7. java提交按钮_java – 允许“Enter”键按提交按钮,而不是仅使用MouseClick
  8. L2-021 点赞狂魔-PAT团体程序设计天梯赛GPLT
  9. Bailian4106 出现两次的字符-Characters Appearing twice【计数统计】
  10. (已更新)视频app小程序模板源码
  11. 详解EMC测试国家标准GB/T 17626
  12. 解决Windows10系统更新后自带的记事本不见了
  13. Linux系统中的远程访问及控制
  14. android app被回收,Android app被回收之后会导致的问题
  15. 微信群裂变引流文案技巧,这样写文案更吸引粉丝!
  16. Visual Studio “另一个安装程序已开始运行。请先等它完成,然后再重试”和“正在进行其他安装,请稍后重试...”解决方法
  17. 通过PS制作手机图标心得总结
  18. 墨客FileStorm生态与四块科技生态联合发布会
  19. 高效的多维空间点索引算法 — Geohash 和 Google S2—绝对好文
  20. 装箱单Packing list

热门文章

  1. 行测-判断推理-图形推理-样式规律-黑白运算
  2. Springboot​ mybatis-plus
  3. APUD命令详解 3GPP USIM 卡文件
  4. php百度网盘登录,php登陆状态百度网盘获取文件下载链接【思路|部分代码】
  5. 四十多岁的男人还适合重新创业吗?
  6. 启明创投邝子平谈禾赛上市:做硬科技领域长线投资人
  7. 【计算机系统1】2 LC-3机器码编程实验
  8. 三星S6D1121主控彩屏(240*320*18bit,262K)驱动程序
  9. PTA数字金字塔(PTA怎么用以及代码怎么敲)
  10. Unity Shader 之 简单 护盾Shield 效果的实现