王德貴
踏青時(shí)看到很多美麗的花卻不知道名字……感覺很尷尬。于是我便想到用手機(jī)APP識(shí)別植物,顯示出各種花草的名字、介紹,這樣既解決了尷尬也學(xué)到了知識(shí)。
應(yīng)用主要是通過調(diào)用百度智能云的植物識(shí)別API接口,向API服務(wù)地址使用POST請(qǐng)求和GET請(qǐng)求獲取相關(guān)數(shù)據(jù),試驗(yàn)證明大多數(shù)花草都能識(shí)別(圖1)。
開發(fā)這個(gè)程序,會(huì)從簡(jiǎn)單到復(fù)雜,功能逐漸完善,后續(xù)還會(huì)在此程序基礎(chǔ)上添加更多識(shí)別種類,敬請(qǐng)關(guān)注。
1.首先要在百度智能云申請(qǐng)Apikey和Secretkey。之前的文章已經(jīng)介紹過,這里不再贅述。
2.HTTP協(xié)議與GET、POST請(qǐng)求。
HTTP:超文本傳輸協(xié)議
HTTP 的工作方式是客戶機(jī)與服務(wù)器之間的請(qǐng)求-響應(yīng)協(xié)議,通過協(xié)議保證客戶機(jī)與服務(wù)器之間的正常通信。常見的Web 瀏覽器就是客戶機(jī),而計(jì)算機(jī)上的網(wǎng)絡(luò)應(yīng)用程序也能作為服務(wù)器端。
兩種 HTTP 請(qǐng)求方法:GET 和 POST
在客戶機(jī)和服務(wù)器之間進(jìn)行請(qǐng)求-響應(yīng)時(shí),兩種最常被用到的方法是GET 和 POST:
GET - 從指定的資源請(qǐng)求數(shù)據(jù)。
POST - 向指定的資源提交要被處理的數(shù)據(jù),處理后返回對(duì)應(yīng)的數(shù)據(jù)(圖2)。
本程序使用wxbit在線版(app.wxbit.com)(圖3)。
1.變量和初始化
變量Apikey和Secretkey存儲(chǔ)申請(qǐng)獲得的兩個(gè)KEY。
初始化程序利用Apikey和Secretkey,通過HTTP客戶端1GET請(qǐng)求的實(shí)時(shí)申請(qǐng),得到JSON文本,然后將返回的JSON保存在列表Access_token_list中,再提取令牌值保存在變量Access_token中。
請(qǐng)求網(wǎng)址格式為(需要替換你的Apikey和Scretkey):
https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=【你的Apikey】&client_secret=【你的Scretkey】
請(qǐng)求頭格式如下(Header如下):
列表變量returnplant、plantlist、highscoreplant和baike分別存儲(chǔ)通過HTTP客戶端2POST請(qǐng)求返回的JSON文本、植物列表、最高置信度的植物列表和相關(guān)的百科簡(jiǎn)介。變量image存儲(chǔ)植物照片(圖4)。
2.GET請(qǐng)求文本處理
初始化GET請(qǐng)求成功后,獲得的JSON文本保存起來,并提取令牌口令,保存在變量Access_token中備用(圖5)。
3.重設(shè)圖片尺寸函數(shù)
由于照片大小不一,識(shí)別過程可能會(huì)很長(zhǎng),將圖片的最大寬度改為500像素,高度按比例調(diào)整。
這里需要導(dǎo)入一個(gè)圖像處理插件TaifunImage.aix,可以百度搜索在網(wǎng)上下載(圖6、圖7)。
4.選擇植物圖片
將需要識(shí)別的植物圖片導(dǎo)入圖像組件中,調(diào)整大小后,顯示出來,同時(shí)清空上一次識(shí)別植物的所有數(shù)據(jù)(圖8)。
5. 拍照植物圖片
通過手機(jī)的拍照功能,對(duì)植物直接拍照,注意一定盡量清晰,對(duì)比度適中,否則會(huì)影響識(shí)別。拍攝完成后,處理圖片過程與選擇圖片一樣(圖9)。
6. 開始識(shí)別
將圖片路徑中的無(wú)用字符清除,作為HTTP客戶端2的POST請(qǐng)求地址。請(qǐng)求地址有格式要求,必須有請(qǐng)求頭和令牌口令才能請(qǐng)求成功。
POST請(qǐng)求網(wǎng)址(用變量access_token替換):
https://aip.baidubce.com/rest/2.0/image-
classify/v1/plant?access_token=【access_token令牌口令(GET請(qǐng)求獲得)】
POST請(qǐng)求時(shí),必須將植物圖片轉(zhuǎn)換成BASE64編碼,存儲(chǔ)在HTTP客戶端創(chuàng)建的列表中,然后通過HTTP客戶端2獲取這些數(shù)據(jù)后,進(jìn)行處理和提取,得到我們想要的有用數(shù)據(jù)。
BASE64編碼是數(shù)據(jù)傳輸中常用的編碼,以前有相關(guān)文章介紹。SimpleImage.aix組件是BASE64編碼插件,需要去網(wǎng)上下載,導(dǎo)入后即可使用。也就是說,POST請(qǐng)求數(shù)據(jù)時(shí),是按照BASE64編碼請(qǐng)求的(如圖10)。
7.POST請(qǐng)求獲得文本
如果請(qǐng)求成功(響應(yīng)代碼為200),返回參數(shù)如圖11(3個(gè)層級(jí))。將返回的數(shù)組解碼為JSON文本,保存在列表變量returnplant中。然后將識(shí)別結(jié)果存儲(chǔ)在列表plantlist中,它包括所有置信度的植物信息,即識(shí)別的種類可能很多,但置信度(也可以理解為可信度)不同,其值從高到低排列,我們只取置信度最高的一項(xiàng),存儲(chǔ)在列表highscoreplant中。并從中提取植物的名字和置信度值,在文本中顯示出來。
在列表highscoreplant中還有相關(guān)百科知識(shí),只是列表維度太高,提取時(shí)稍有難度。百科簡(jiǎn)介顯示出來,從中也能學(xué)到很多相關(guān)知識(shí)(圖12)。
邊寫代碼邊調(diào)試,以保證每一步的正確性。最后優(yōu)化程序設(shè)計(jì)和UI設(shè)計(jì)。本例重點(diǎn)在處理數(shù)據(jù)列表時(shí),稍微復(fù)雜一點(diǎn)。檢索數(shù)據(jù)時(shí),需要一步步測(cè)試,才能了解數(shù)組(列表或字典)的意義。相關(guān)代碼和素材請(qǐng)?jiān)谝剂闵缦螺d。