Python實(shí)戰(zhàn)之實(shí)現(xiàn)百度智能圖片識別
這是我們最終的效果,那么我們一起來看一看如何實(shí)現(xiàn)吧!超簡單易上手哦!
首先我們需要先配置pyqt5的資源,這里就不說關(guān)于安裝包的問題了(pip或者pycharm可以直接添加解決的問題,不一一贅述),我們直接說環(huán)境配置和路徑的問題(所有的配置都在FILE -> setting -> Tools -> External Tools里):
1、配置designer.exe
之前沒安裝過的需要點(diǎn)擊加號添加,這里只要注意Working directory和Program的配置正確即可(務(wù)必正確,不然后期使用designer需要自己手動導(dǎo)入,比較麻煩),點(diǎn)擊加之后,會出現(xiàn)這個界面,再把下面的數(shù)據(jù)輸入就可以了。
Working directory除了前面的存在哪一個盤里不確定,后面的路徑都一樣
Program Files\PycharmProjects\pythonProject\Lib\site-packages\qt5_applications\Qt\bin\designer.exe
Program不需要更改
$ProjectFileDir$
2、之后我們需要配置pyuic,這一步也很關(guān)鍵,它保證了把我們做出來的窗口界面翻譯成python語言。沒有這一步,就只能手碼(自己敲代碼實(shí)現(xiàn)窗口涉及)。同樣的,點(diǎn)擊加號
再把下面的內(nèi)容輸入就可以:
Program(也是一樣,存在哪個盤可能不確定,是自己設(shè)置,但是后面的路徑都一樣)
Program Files\PycharmProjects\pythonProject\Scripts\pyuic5.exe
Arguments(參數(shù)也不能有問題):
$FileName$ -o $FileNameWithoutExtension$.py
Working directory(這個務(wù)必不能出錯)
$FileDir$
3、那么,我們現(xiàn)在也可以添加一個pyrcc.exe(主要是把圖像轉(zhuǎn)化為可使用的文件,比如導(dǎo)入圖標(biāo)之類)
Program
Program Files\PycharmProjects\pythonProject\Scripts\pyrcc5.exe
Arguments
$FileName$ -o $FileNameWithoutExtension$_rc.py
Working directory
$FileDir$
那么到現(xiàn)在,我們以及配置完成了,之后就是代碼的問題了。
首先我們打開我們導(dǎo)入的外界工具Qt designer
進(jìn)去之后,頁面如此:
我們直接創(chuàng)建一個main window就可以了
我們要實(shí)現(xiàn)的窗口大致如下:
那么我們現(xiàn)在需要開始放東西了:
首先選中PushButton,之后可以任意更改它的大小和字體。
而后我們編輯第一個信號與槽函數(shù):按下F4按鍵,點(diǎn)擊pushbutton,拖拽出一個紅色的線,放在喜歡的位置后,選擇“顯示從 QWidget 繼承的信號和槽”,我們再點(diǎn)擊clicked()(意思就是被點(diǎn)擊),然后選擇close()(意思就是關(guān)閉)。即被點(diǎn)擊就關(guān)閉。
那么Ctrl+R可以測試一下功能,就是點(diǎn)擊一下就退出了。
像這個請選擇圖片,就需要我們在python的代碼里手動添加信號和槽了。但是我們?yōu)榱藢懯执a方便,最好雙擊更改一下它的備注。(如下)
那么之后先添加我們所需要的部件
雙擊combox就可以添加了
之后是文本和放圖片的位置,我們統(tǒng)一使用Label(所以記得改名,防止記混了)
當(dāng)添加到圖片和路徑的顯示時,我們可以更改他們的背景色,如下:
那么它就變白了。
到這里,我們已經(jīng)把窗口的工作做完了,當(dāng)然我們也可以添加一個窗口小圖標(biāo),讓它打開的時候有圖標(biāo):(同時注意combox的新建項目改名)
之后我們點(diǎn)擊文件,保存即可:
現(xiàn)在我們返回pycharm,就能看到我們的文件了:
使用Py uic,把它轉(zhuǎn)譯成python代碼,因?yàn)閡i文件python是打不開的。
這個時候就會生成一個AIrecognition.py文件
在這里,我們就可以導(dǎo)入一些必要的包(模塊了),如下:我們一會兒再講講這些包都是干啥的。
import json,sys from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtWidgets import QGraphicsWidget,QApplication,QFileDialog from PyQt5.QtGui import * from PyQt5.QtCore import * import simplejson,requests import test_rc import urllib,urllib.request import base64,ssl
可以看到,我們命名之后,更容易找到對應(yīng)的槽來書寫信號:
下一步,我們來書寫一個打開圖片的信號和槽函數(shù)(在py文件的最下面),這里要注意打開的窗口是主窗口,必須要存在,不然會報錯:
self.choosepicture.clicked.connect(self.openfile) def openfile(self): self.download_path = QFileDialog.getOpenFileName(self.centralwidget, "請選擇需要識別的圖片", "/", "Image File(*.jpg *.gif *.png *.jpeg)") if not self.download_path[0].strip(): pass else: print(self.download_path[0]) self.filedirectory.setText(self.download_path[0]) pixmap = QPixmap(self.download_path[0]) scarePixmap = pixmap.scaled(QSize(421, 281), aspectRatioMode=Qt.KeepAspectRatio) self.picturedisplay.setPixmap(scarePixmap) self.typeTp()
由于我們把選擇圖片的那個Button改名成了choosepicture,所以這時候直接使用這個來做信號發(fā)生就好。
那么我們還有編寫槽函數(shù),在打開圖片之后,要顯示圖片的路徑以及圖片的樣子。所以這些功能在槽函數(shù)實(shí)現(xiàn):
顯示圖片路徑的label我們使用的名字是filedirectory,展示圖片的label的名字是picturedisplay,所以我們在setText和setPixmap的時候,直接使用這兩個名字就好。這樣就實(shí)現(xiàn)了文本的展示和圖片的展示(具體的代碼以及函數(shù),如QPixmap,就不再贅述,因?yàn)樯婕暗闹R點(diǎn)會更多,所以只能委屈大大自己上網(wǎng)查一下啦?。?/p>
那么現(xiàn)在,我們把這一個信號和槽搞定了,就差接入百度識別的系統(tǒng)了。
就讓我們來看一看吧:
點(diǎn)擊搜索百度ai,進(jìn)入之后選擇圖像識別,打開技術(shù)文檔:
就可以看到python語言如何接入API,以及它的返回示例(我們展示圖片信息就需要關(guān)注這個返回示例)
當(dāng)然,之后需要注冊一個屬于自己的百度AI的賬號,找到自己的API_Key和Secret_Key
注冊之后點(diǎn)擊左上角的三條橫杠,然后選擇圖像識別。
而后創(chuàng)建一個應(yīng)用(我這里以及創(chuàng)建好了,簡要的隨便寫寫信息就行)
之后點(diǎn)進(jìn)去就可以查看自己的API_Key和Secret_Key了
然后選擇一些我們需要的識別項目(不用擔(dān)心,免費(fèi)使用的次數(shù)是足夠的)
之后再進(jìn)入剛才的接入和返回的示例,將其復(fù)制到python代碼中(導(dǎo)入的模塊寫在上面)
注意上面書寫槽函數(shù)實(shí)現(xiàn)打開圖片代碼中的typeTP,我們要靠這個接入網(wǎng)絡(luò),所以還要寫函數(shù),由于在設(shè)計窗口界面的時候,就已經(jīng)將combox改名為choices,所以這里使用choices就可以。
并且這里我們書寫了一個接受token值的函數(shù),我們也需要完善它的功能,一遍正常接入API和返回token值。
def typeTp(self): # 植物識別 if self.choices.currentIndex() == 0: self.get_token() self.get_plants(self.get_token()) # 動物識別 if self.choices.currentIndex() == 1: self.get_token() self.get_animals(self.get_token()) # logo識別 if self.choices.currentIndex() == 2: self.get_token() self.get_logo(self.get_token())
在這里就需要我們導(dǎo)入一些新的包了,不過所有需要導(dǎo)入的包,我已經(jīng)在開頭給出,所以這里也不一一介紹了(比如simplejson,request)。
def get_token(self): host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + API_Key + '&client_secret=' +Secret_Key request = urllib.request.Request(host) request.add_header('Content-Type', 'application/json; charset=UTF-8') response = urllib.request.urlopen(request) token_content = response.read() if token_content: token_info = simplejson.loads(token_content.decode("utf-8")) token_key = token_info['access_token'] print(token_key) print(token_content) return token_key
那么我們只演示其中的幾個案例,植物和動物和logo,其他的接入都一樣,在此之前,我們書寫一個函數(shù)來處理冗余的代碼問題(因?yàn)榫拖衲茉诎俣忍峁┑慕涌诖a一樣,很多都是一樣的,除了接受返回值):
# 為了解決代碼的冗余問題,使用函數(shù)來接入網(wǎng)站,而后再在子函數(shù)里實(shí)現(xiàn)獲取value def get_website(self,token_key,k): websitelist=["https://aip.baidubce.com/rest/2.0/image-classify/v1/plant", "https://aip.baidubce.com/rest/2.0/image-classify/v1/animal", "https://aip.baidubce.com/rest/2.0/image-classify/v2/logo"] request_url = websitelist[k] f = open(self.download_path[0], 'rb') img = base64.b64encode(f.read()) params = {"image": img} access_token = token_key request_url = request_url + "?access_token=" + access_token headers = {"content-type": "application/x-www-form-urlencoded"} response = requests.post(request_url, data=params, headers=headers) if response: return response.json()
可以看到,這里return的是一個response,也就是我們需要的一些內(nèi)容(token_key的值),
def get_plants(self, token_key): plants = self.get_website(token_key, 0) strover = '識別結(jié)果如下:\n' strover += '辨認(rèn)種類:{}\n辨認(rèn)置信度:{}\n' \ .format(plants["result"][0]["name"], plants["result"][0]["score"]) + \ '\n其他可能植物:\n1.{}\n2.{}\n' \ .format(plants["result"][1]["name"], plants["result"][2]["name"]) self.pictureinfo.setText(strover) def get_animals(self, token_key): animals = self.get_website(token_key, 1) strover = '識別結(jié)果如下:\n' strover += '辨認(rèn)種類:{}\n辨認(rèn)置信度:{}\n' \ .format(animals["result"][0]["name"], animals["result"][0]["score"]) + \ '\n其他可能動物:\n1.{}\n2.{}\n' \ .format(animals["result"][1]["name"], animals["result"][2]["name"]) self.pictureinfo.setText(strover) def get_logo(self, token_key): logos = self.get_website(token_key, 2) strover = '識別結(jié)果如下:\n' strover += '辨認(rèn)種類:{}\n辨認(rèn)置信度:{}\n' \ .format(logos["result"][0]["name"], logos["result"][0]["probability"]) self.pictureinfo.setText(strover)
我們使用strover來接受返回的內(nèi)容,這時候我們需要查看返回的示例了(以植物為例):
可以看到,它返回了一個字典,那么我們就需要提取字典里的信息,也就是上面的代碼所給出的:
def get_plants(self, token_key): plants = self.get_website(token_key, 0) strover = '識別結(jié)果如下:\n' strover += '辨認(rèn)種類:{}\n辨認(rèn)置信度:{}\n' \ .format(plants["result"][0]["name"], plants["result"][0]["score"]) + \ '\n其他可能植物:\n1.{}\n2.{}\n' \ .format(plants["result"][1]["name"], plants["result"][2]["name"]) self.pictureinfo.setText(strover)
字典的一些基本操作就不多解釋了,所以,我們就這樣成功的獲取了信息。
其他的識別也可以以此類推,所以,我們就實(shí)現(xiàn)了智能識別(基于百度AI)。當(dāng)然,要記得寫入自己的AK和SK,不然也無法識別。
當(dāng)然了,只是這樣是無法運(yùn)行這個代碼的,我們還需要一個測試文件:
from AIrecognition import * if __name__ == '__main__': app = QApplication(sys.argv) main = QtWidgets.QMainWindow() ui = Ui_MainWindow() ui.setupUi(main) main.show() sys.exit(app.exec_())
那就讓我們看看效果吧:
效果非常好。當(dāng)然,我們看這個表頭啥也沒有,很難看,我們可以手碼寫入:
import test_rc 不能少
icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(":/new/Lib/schoolbus.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off) MainWindow.setWindowIcon(icon)
同時,我們也可以設(shè)置一些標(biāo)題文字,來改掉MainWindow:
就把這個地方改成我們想要的就可以了:
以上就是Python實(shí)戰(zhàn)之實(shí)現(xiàn)百度智能圖片識別的詳細(xì)內(nèi)容,更多關(guān)于Python圖片識別的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python基于QRCode實(shí)現(xiàn)生成二維碼的方法【下載,安裝,調(diào)用等】
這篇文章主要介紹了Python基于QRCode實(shí)現(xiàn)生成二維碼的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Python下載,安裝與調(diào)用QRCode實(shí)現(xiàn)生成二維碼功能的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-07-07基于python實(shí)現(xiàn)判斷字符串是否數(shù)字算法
這篇文章主要介紹了基于python實(shí)現(xiàn)判斷字符串是否數(shù)字算法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-07-07Python中選擇排序的實(shí)現(xiàn)與優(yōu)化
選擇排序(Selection?Sort)是一種簡單但有效的排序算法,本文將詳細(xì)介紹選擇排序算法的原理和實(shí)現(xiàn),并提供相關(guān)的Python代碼示例,需要的可以參考一下2023-06-06Pytorch使用shuffle打亂數(shù)據(jù)的操作
這篇文章主要介紹了Pytorch使用shuffle打亂數(shù)據(jù)的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-05-05python實(shí)現(xiàn)scrapy爬蟲每天定時抓取數(shù)據(jù)的示例代碼
這篇文章主要介紹了python實(shí)現(xiàn)scrapy爬蟲每天定時抓取數(shù)據(jù)的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01