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

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

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

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

主要做了三个核心内容:

  • 对比现有垃圾分类服务,挑选一个合适并编码实现
  • 开发桌面版垃圾分类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的问题,可以在评论区留言或者私信我哦
觉得我分享的文章不错的话,可以关注一下我,或者给文章点赞(/≧▽≦)/

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/51496.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【python】制作李峋同款爱心代码,也不是很难嘛~

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 最近&#xff0c;一部名叫《点燃我&#xff0c;温暖你》得电视剧冲进了大家得视野~ 其中李峋用代码做出的红色跳动的爱心&#xff0c;一下子跳到朱韵的心坎里&#xff0c;同样也跳到我们的心坎 今天&#xff0c;我们就用py…

太棒了 | 手把手教你用Python做一个 “举牌小人” 生成器!

教你如何使用Selenium库 本文禁止转载&#xff0c;如有违反&#xff0c;严肃处理&#xff01; 前几天写了一个婴儿级别的爬虫图文教程&#xff0c;大家很喜欢。戳我查看&#xff1a;3000字 “婴儿级” 爬虫图文教学 | 手把手教你用Python爬取 “实习网”&#xff01; 趁热打铁…

李峋的跳动爱心代码(python)

运行效果 代码&#xff1a; """ author:Athena Geng """ import random from math import sin, cos, pi, log from tkinter import *CANVAS_WIDTH 640 # 画布的宽 CANVAS_HEIGHT 480 # 画布的高 CANVAS_CENTER_X CANVAS_WIDTH / 2 # 画布中…

李峋爱心Python代码

李峋爱心Python代码&#xff1a; # codinggbk import random from math import sin, cos, pi, log from tkinter import * CANVAS_WIDTH 640 CANVAS_HEIGHT 480 CANVAS_CENTER_X CANVAS_WIDTH / 2 CANVAS_CENTER_Y CANVAS_HEIGHT / 2 IMAGE_ENLARGE 11 HEART_COLOR "…

李峋同款爱心python实现

爱心运行结果截图&#xff1a; import random from math import sin, cos, pi, log from tkinter import *CANVAS_WIDTH 840 # 画布的宽 CANVAS_HEIGHT 680 # 画布的高 CANVAS_CENTER_X CANVAS_WIDTH / 2 # 画布中心的X轴坐标 CANVAS_CENTER_Y CANVAS_HEIGHT / 2 # 画…

OpenAI CEO创建的Worldcoin正式推出「世界币」:AI 时代的数字通行证?

编辑&#xff1a;秦晋 据外媒Semafor独家报道&#xff0c;知情人士透露&#xff0c;由 OpenAI 首席执行官 Sam Altman 创建的Worldcoin 代币将于今日推出。 在硅谷引发争议的Worldcoin 代币试图解决两个棘手问题&#xff1a;在线身份认证与收入不平等问题。 据知情人士透露&…

华为鸿蒙HarmonyOS 4定档8月;ChatGPT之父的加密货币正式上线;微软必应聊天将推出重新生成答案功能|极客头条...

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&#…

数据分析实战(六):英国电商用户行为分析

案例&#xff1a;英国电商用户行为数据分析 Part 1. 数据获取 1.1 数据集简介 https://archive.ics.uci.edu/ml/datasets/onlineretail# 该数据集为英国在线零售商在2010年12月1日至2011年12月9日间发生的所有网络交易订单信息。 1.2 数据集内容 数据集为xlsx格式&#xff0c…

亚马逊跟卖分析与经验分享

亚马逊设置跟卖机制&#xff0c;也是给了卖家一个机会&#xff0c;对于新手来说自己制作产品的listing花费大量的时间与精力大多数出单效果很不理想&#xff0c;这个时候把握得当跟卖就会取得很大的优势。 首先它能快速的获得流量 亚马逊的跟卖就是产品的listing共享&#xff…

Lazada和Shopee选品分析之马来西亚电商市场详解-海鲸跨境

马来西亚基础信息: 马来西亚是东南亚第三大经济体,国民富足;并且年轻人众多,对中国的产品非常喜爱。 国民经济:2019你那GDP 3543亿美元,增长4.7% 人均收入:10460美元,仅次于新加坡 年龄结构:30岁以下年轻人占人口53% 电商市场规模与潜力: 马来西亚电商用户数量…

为Lazada商家量身定做的精细化运营数据分析软件,Ushop BI

跨境电商数据可视化BI系统现在在市面上也是比较普遍&#xff0c;但是针对Lazada平台的目前只有一个Ushop BI系统&#xff0c;Ushop BI系统能够把Lazada平台数据可视化做的非常好&#xff0c;其功能覆盖面广&#xff0c;操作简单&#xff0c;是Lazada商家不可多得的好帮手&#…

亚马逊商品销售数据爬虫分析报告

家电产业和消费者升级悄然地展开。 市场的这种变化使消费者对家用电器的期望不再仅仅是一个简单的功能满足&#xff0c;而是更多的细节体验和技术创新。 通过洞察家用电器的消费特点&#xff0c;有利于确定市场的未来趋势&#xff0c;从而积极应对市场变化。 ▼ 我们围绕亚马逊…

Lazada数据大分析:帮你正确解析Lazada市场!

Lazada数据大分析&#xff1a;帮你正确解析Lazada市场&#xff01; 2021年是跨境电商飞速发展的一年&#xff0c;各行各业都选择了加入跨境电商这个行业&#xff0c;而如今在互联网的大趋势下国内电商行业的发展已经非常成熟&#xff0c;而跨境电商行业就后来居上&#xff0c;…

解决TimeWait过多的问题

原文链接&#xff1a;https://www.tiejiang.org/27040.html 服务端客户端通信连接示意图 1、 time_wait的作用&#xff1a; TIME_WAIT状态存在的理由&#xff1a; 1&#xff09;可靠地实现TCP全双工连接的终止 在进行关闭连接四次挥手协议时&#xff0c;最后的ACK是由主动关闭…

Confluence 调整会话超时(session timeout)

文章目录 前言一、概括二、实际场景应用1.更改空闲超时2.更改记住我 cookie 的生命周期3.在用户通过身份验证后的某个时间强制注销用户 总结 前言 在 Confluence 中有两个会话 Cookie&#xff1a; JSESSIONID: 由 Tomcat 使用和管理。 默认情况下&#xff0c;这被视为会话 co…

微信智能机器人助手,基于hook技术,自动聊天机器人

微信智能助手说明文档 资料获取方式&#xff0c;关注公总号RaoRao1994&#xff0c;查看往期精彩-所有文章&#xff0c;即可获取资源下载链接 更多资源获取&#xff0c;请关注公总号RaoRao1994 简介 微信智能助手是一款基于PC微信研发的微信助手类软件&#xff0c;能帮助大家…

如何监测高价值货物在物流运输过程中受到的振动和冲击?全面保障货物安全

引言 不同种类的货物对运输的要求不同&#xff0c;钢铁、煤炭、矿石等大宗物资通常对运输要求较低&#xff0c;而电子产品、IT 产品、家电等高价值敏感类货物则更强调运输的安全性&#xff0c;时效性&#xff0c;往往希望能尽可能安全和快速送达这类货物&#xff0c;使之尽快进…

2022卡塔尔世界杯赛程直播北京时间_足球世界杯对阵表图完整全部

2022卡塔尔世界杯赛程直播北京时间 足球世界杯对阵表图完整全部 2022卡塔尔世界杯今晚就要开幕了&#xff0c;21日0点卡塔尔世界杯揭幕战卡塔尔队VS厄瓜多尔队就要开打了。下面小编分享2022卡塔尔世界杯完整赛程时间对阵图表&#xff0c;有需要的朋友们可以收藏&#xff0c;到…

2022卡塔尔世界杯。CSDN世界杯勋章来啦

卡塔尔世界杯正在如火如茶的举办着&#xff0c;在比赛场上&#xff0c;我看到了来自世界各地的球队&#xff0c;他们都充满活力&#xff0c;充满激情&#xff0c;每一支球队都在努力的拼搏&#xff0c;无论是为了胜利&#xff0c;还是为了荣誉。我看到了一支支优秀的球队&#…

TCGA下载基因表达矩阵、可视化分析

方法1&#xff1a; https://portal.gdc.cancer.gov/https://portal.gdc.cancer.gov/ 选择RNA-Seq 找TSV格式open的文件加入购物车 进入到购物车点download --cart 打开下载后的tsv格式文件 方法2&#xff1a; (9条消息) 基于TCGA数据库的差异基因分析实现_学习的派大星的博客…