最近一直在研究光學字符識別,即OCR。最開始在谷爹那裏瞭解到了開源的Tesseract,能夠拿來識別簡單的英文和數字。可是識別中文的準確率並不高。python
而後從Tesseract到Tesseract.js,通過屢次嘗試研究,最後發現騰訊爹的萬象優圖識別率是最高的。趁如今是公測免費期,趕忙嘗試了一把。json
下面來講一說我是怎麼用python實現中文識別的。服務器
首先百度萬象優圖登陸吧,騰訊的。。。大家懂得。。。。進去後,建立一個bucket,而後能夠選擇上傳圖片app
這些準備工做作好之後,就開始寫代碼吧dom
首先若是是識別身份證,名片,標籤等圖片的話,強烈建議直接使用萬象優圖提供python sdk,詳情請見https://cloud.tencent.com/document/product/460/7991post
咱們這裏,是作圖片通用印刷體識別,因此就只有被迫用萬象優圖提供的API:(本來我是更喜歡用SDK的,由於簡單,可是目前SDK不支持)加密
萬象優圖OCR接口採用http協議,支持指定圖片URL和 上傳本地圖片文件兩種方式。url
根據用戶提供的圖片,返回識別出的字段信息。spa
接口:http://recognition.image.myqcloud.com/ocr/general3d
這裏有三點須要注意:
(1) 每一個請求的包體大小限制爲6MB。
(2) 全部接口都爲POST方法。
(3) 不支持 .gif這類的多幀動圖。
而後我用能夠使用requests模塊來發http請求。
這裏最麻煩的就是要定製請求頭,否則騰訊雲是解析不到的,筆者才疏學淺在這裏研究了一下午才正肯定製出了請求頭。。。。
先來看看請求頭的規則:
參數名 | 值 | 描述 |
---|---|---|
Host | recognition.image.myqcloud.com | 服務器域名 |
Content-Length | 包體總長度 | 整個請求包體內容的總長度,單位:字節(Byte) |
Content-Type | Application/json或者Multipart/form-data | 根據不一樣接口選擇 |
Authorization | 鑑權簽名 | 用於鑑權的簽名,使用屢次有效簽名。詳情 |
這裏的難點就是這個鑑權簽名,直接點擊表格裏面的詳情去看吧,我這裏不作複製粘貼。
關於請求參數:
使用image則使用 multipart/form-data格式
不使用image則使用 application/json格式
參數名 | 是否必須 | 類型 | 參數說明 |
---|---|---|---|
appid | 必須 | string | 項目ID |
bucket | 必須 | 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/11 import requests import hmac import hashlib import base64 import time import random import re appid = "1254602529" bucket = "imgregnise" secret_id = "AKIDZx72kFVBPRF4324234234o8C1auynPezyl" #我更改了,不要複製個人 secret_key = "h9NUN1RbZIm11mJbUt2v32432Zx" #我更改了,不要複製個人 expired = time.time() + 2592000 onceExpired = 0 current = 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.content r_index = r'itemstring":"(.*?)"' # 作一個正則匹配 result = re.findall(r_index, responseinfo) for i in result: print i
我這裏用圖片試驗了一次,準備率仍是很高的,就是中間少了一個「餐。」
可是這樣的識別率已是很高了
最後預祝各類識別成功!