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


最近一直在研究光學字符識別,即OCR。最開始在谷爹那里了解到了開源的Tesseract,可以拿來識別簡單的英文和數字。但是識別中文的准確率並不高。

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

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

首先百度萬象優圖登錄吧,騰訊的。。。你們懂得。。。。進去后,創建一個bucket,然后可以選擇上傳圖片

 

 

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

首先如果是識別身份證,名片,標簽等圖片的話,強烈建議直接使用萬象優圖提供python sdk,詳情請見https://cloud.tencent.com/document/product/460/7991

 

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

 

萬象優圖OCR接口采用http協議,支持指定圖片URL和 上傳本地圖片文件兩種方式。

根據用戶提供的圖片,返回識別出的字段信息。

接口:http://recognition.image.myqcloud.com/ocr/general

 

這里有三點需要注意:

(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

 

 

 

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

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

 最后預祝各種識別成功!

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM