您的位置:首頁>正文

python基於萬象優圖識別圖片中的中文

最近一直在研究光學字元辨識, 即OCR。 最開始瞭解到開源的Tesseract, 可以拿來識別簡單的英文和數位。 但是識別中文的準確率並不高。

然後從Tesseract到Tesseract.js, 經過多次嘗試研究, 最後發現騰訊爹的萬象優圖識別率是最高的。 趁現在是公測免費期, 趕緊嘗試了一把。

下面來說一說怎麼用python實現中文識別的。

首先創建一個bucket, 然後可以選擇上傳圖片

這些準備工作做好以後, 就開始寫代碼吧

我們這裡,

是做圖片通用印刷體識別, 所以就只有被迫用萬象優圖提供的API:(原本我是更喜歡用SDK的, 因為簡單, 但是目前SDK不支持)

萬象優圖OCR介面採用http協定, 支援指定圖片URL和 上傳本地圖片檔兩種方式。

根據使用者提供的圖片, 返回識別出的欄位資訊。

這裡有三點需要注意:

(1) 每個請求的包體大小限制為6MB。

(2) 所有介面都為POST方法。

(3) 不支持 .gif這類的多幀動圖。

然後我用可以使用requests模組來發http請求。

這裡最麻煩的就是要定制請求頭, 不然騰訊雲是解析不到的, 筆者才疏學淺在這裡研究了一下午才正確定制出了請求頭。 。 。 。

先來看看請求頭的規則:

參數名值描述Hostrecognition.image.myqcloud.com伺服器功能變數名稱Content-Length包體總長度整個請求包體內容的總長度, 單位:位元組(Byte)Content-TypeApplication/json或者Multipart/form-data根據不同介面選擇Authorization鑒權簽名用於鑒權的簽名,
使用多次有效簽名。 詳情

這裡的難點就是這個鑒權簽名, 直接點擊表格裡面的詳情去看吧, 我這裡不做複製粘貼。

關於請求參數:

使用image則使用 multipart/form-data格式

不使用image則使用 application/json格式

參數名是否必須類型參數說明appid必須string專案IDbucket必須string空間名稱image可選binary圖片內容url可選string圖片的url,image和url只提供一個即可, 如果都提供, 只使用url

好了, 現在開始正式開始吧

先寫一下請求頭涉及到的變數

然後依次把他們拼接起來

我這裡採用的是單次

然後再根據要求進行 HMAC-SHA1加密

這裡強調一下, 官方的說法是

根據我的研究, 轉換出來的不是二進位, 然後我還特意去轉成了二進位。 。 。 。 。 。 發現其實根本不用, 轉出來的在pycharm裡面是個亂碼, 可以直接用的

最後, 加密的資料和之前的拼接資料再拼在一起做base64轉碼

這樣簽名就完成了, 後面的基本不難, 主要就是簽名這裡有坑, 下面直接上代碼:

# coding=utf-8# /usr/bin/python# coding=utf-8# create by 15025463191 2017/10/11import requestsimport hmacimport hashlibimport base64import timeimport randomimport reappid = "1254602529"bucket = "imgregnise"secret_id = "AKIDZx72kFVBPRF4324234234o8C1auynPezyl" #我更改了, 不要複製我的secret_key = "h9NUN1RbZIm11mJbUt2v32432Zx" #我更改了, 不要複製我的expired = time.time() + 2592000onceExpired = 0current = time.time()rdm = ''.join(random.choice("0123456789") for i in range(10))userid = "0"fileid = "tencentyunSignTest"info = "a=" + appid + "&b=" + bucket + "&k=" + secret_id + "&e=" + str(expired) + "&t=" + str(current) + "&r=" + str( rdm) + "&u=0&f=" signindex = hmac.new(secret_key, info, hashlib.sha1).digest() # HMAC-SHA1加密sign = base64.b64encode(signindex + info) # base64轉碼url = "http://recognition.image.myqcloud.com/ocr/general"headers = {'Host': 'recognition.image.myqcloud.com', "Content-Length": "187", "Content-Type": "application/json", "Authorization": sign }payload = { "appid": appid, "bucket": bucket, "url": "http://imgregnise-1254602529.picsh.myqcloud.com/123456.png"}r = requests.post(url, json=payload, headers=headers)responseinfo = r.contentr_index = r'itemstring":"(.*?)"' # 做一個正則匹配result = re.findall(r_index, responseinfo)for i in result: print i

我這裡用圖片試驗了一次, 準備率還是很高的, 就是中間少了一個“餐。 ”

但是這樣的識別率已經是很高了

最後預祝各種識別成功!(轉自博客園)

· 學IT, 就來中公優就業:http://www.ujiuye.com/

· 2017年【中公教育】特別推出2017年就業促進計畫, 500萬就業基金助你成為IT達人

詳情請戳http://www.ujiuye.com/zt/jycj/?wt.bd=bgz

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示