日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

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

發(fā)布時間:2024/3/13 python 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Python案例】Python实现垃圾分类APP(附带微信小程序) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

今天給你們分享一個有趣的東西

如何利用現(xiàn)有的工具來實現(xiàn)一個垃圾分類的應(yīng)用

主要做了三個核心內(nèi)容:

  • 對比現(xiàn)有垃圾分類服務(wù),挑選一個合適并編碼實現(xiàn)
  • 開發(fā)桌面版垃圾分類APP
  • 開發(fā)垃圾分類微信小程序

上面這三部分第一部分是后端的活兒,其他兩部分都是前端的活兒,所以,我在這三塊沒有太多經(jīng)驗,基本上是面向搜索引擎編程。

效果圖

PC版:

小程序

附上小程序連接垃圾分類小程序,大家可以體驗一下。如果打開看不到效果可能審核沒通過,稍微晚點再開即可。

需領(lǐng)取完整源碼跟Python學(xué)習(xí)資料可點擊這行字體

接下來進入到具體的細(xì)節(jié)是如何做的

其實垃圾分類已經(jīng)開始很長一段時間了,肯定會有一些服務(wù)商把垃圾分類的能力通過API的方式開放出來,供大家調(diào)用。我找了3家簡單對比下供大家參考:

聚合數(shù)據(jù)(www.juhe.cn):提供文本、圖像、語音分類。免費調(diào)用20次,定價不靈活只能批量購買

天行數(shù)據(jù)(www.tianapi.com):提供文本、圖像、語音分類。文本分類5000次,其他50次,定價按量計費

京東AI開放平臺:提供文本、圖像、語音分類。免費,每日5000次

簡單對比了圖像分類情況,聚合和天行數(shù)據(jù)明顯更好,再綜合定價因素最終我決定用天行數(shù)據(jù)。下面就來編寫代碼,將API接口封裝成我們需要的服務(wù),以文本(垃圾名稱)分類接口為例,請求的接口如下

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

APIKEY需要到天行網(wǎng)站注冊來獲取,返回的結(jié)果如下:

{"code":200,"msg":"success","newslist":[{"name":"隱形眼鏡","type":3,"aipre":0,"explain":"干垃圾即其它垃圾,指除可回收物、有害垃圾、廚余垃圾(濕垃圾)以外的其它生活廢棄物。","contain":"常見包括磚瓦陶瓷、渣土、衛(wèi)生間廢紙、貓砂、污損塑料、毛發(fā)、硬殼、一次性制品、灰土、瓷器碎片等難以回收的廢棄物","tip":"盡量瀝干水分;難以辨識類別的生活垃圾都可以投入干垃圾容器內(nèi)"},{"name":"眼鏡","type":3,"aipre":0,"explain":"干垃圾即其它垃圾,指除可回收物、有害垃圾、廚余垃圾(濕垃圾)以外的其它生活廢棄物。","contain":"常見包括磚瓦陶瓷、渣土、衛(wèi)生間廢紙、貓砂、污損塑料、毛發(fā)、硬殼、一次性制品、灰土、瓷器碎片等難以回收的廢棄物","tip":"盡量瀝干水分;難以辨識類別的生活垃圾都可以投入干垃圾容器內(nèi)"},] }

接口的字段說明大家可以看官網(wǎng)文檔,這里我就不再贅述了。

下面來編寫請求文本分類接口的代碼:

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 = '正常結(jié)果'if ai_pre == 1:pre_type = '預(yù)判結(jié)果'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庫請求垃圾分類接口,并對返回的數(shù)據(jù)格式化。下面再來編寫請求圖像分類的接口

需領(lǐng)取完整源碼跟Python學(xué)習(xí)資料可點擊這行字體

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學(xué)習(xí)交流Q群:770699889 ###res.append(item_dict)return reselse:return Nonereturn None

函數(shù)的參數(shù)是圖像的base64編碼,請求方式是POST請求,返回值字段與文本分類略有不同,但思路是一樣的。
這兩部分內(nèi)容其實比簡單,這里我就不再過多解釋了。

開發(fā)GUI

有了數(shù)據(jù)服務(wù),下面我們就來開發(fā)GUI,這里我用的是tkinter,用它編寫的APP可以運行在Linux、Windows和Mac系統(tǒng),關(guān)于tkinter的使用這里我不會做過多介紹,不了解的朋友自行百度,之前我也沒結(jié)果過基本上看網(wǎng)上的教程照貓畫虎。

首選,創(chuàng)建GarbageClassificationApp類,來定義用到的各種組件

python學(xué)習(xí)交流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# 第一行定義文本分類相關(guān)的組件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)# 第二行定義圖像分類相關(guān)的組件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# 第三行定義輸出結(jié)果相關(guān)的組件self.cls_result_label = Label(self.tk, text="分類結(jié)果:")self.output_cls_result_list_box = Listbox(self.tk, width=100, height=30)# 初始化 api 服務(wù)self.api_service = TxApiService()self.set_init_window()

再來創(chuàng)建set_init_window函數(shù)對各個組件進行布局

# 各組件布局 def set_init_window(self):self.tk.title("垃圾分類")self.tk.geometry('1068x681+350+200') # 1068x681為窗口大小,+100 +100 定義窗口彈出時的默認(rèn)展示位置# 第一行文本分類各組件的布局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)# 第三行輸出結(jié)果各組件的布局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被按下時,它就會調(diào)用commond屬性指定的函數(shù)。

以文本分類Button為例(text_cls_button),用戶按下該按鈕后,程序就會執(zhí)行g(shù)arbage_name_cls函數(shù),在該函數(shù)中我們就可以請求文本分類服務(wù),并將返回的數(shù)據(jù)顯示到界面上。

代碼如下:

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 = '預(yù)判類型: %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學(xué)習(xí)交流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 = '預(yù)測得分: %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就開發(fā)完成,這里我們沒有實現(xiàn)語音分類服務(wù),但思路是一樣的,大家可以嘗試一下。

好啦,今天的分享到這里就結(jié)束了 ~
對文章有問題的,或者有其他關(guān)于python的問題,可以在評論區(qū)留言或者私信我哦
覺得我分享的文章不錯的話,可以關(guān)注一下我,或者給文章點贊(/≧▽≦)/

總結(jié)

以上是生活随笔為你收集整理的【Python案例】Python实现垃圾分类APP(附带微信小程序)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。