1. 功能介紹
百度已經推出了iOCR财會票據識别,針對财會報帳場景提出的專項解決方案,可對各類财務票據、報帳單、銀行回單、對賬單進行自動分類及結構化識别,并支援使用者為固定版式的新票據/單據自定義結構化識别模闆及分類器。百度iOCR财會票據識别功能非常的強大,我在:
https://ai.baidu.com/forum/topic/show/955803
這篇文章裡面已經進行了比較詳細的介紹,大家有興趣可以看一下。
iOCR财會票據識别内置了7種票據格式,如果我們要對其他的票據識别,比如機票行程單,要怎麼辦呢? 這就是我們今天要介紹的自定義模闆功能:百度iOCR自定義模闆文字識别,針對未預置且版式固定的票據單據,使用者隻需上傳一張模闆圖檔,即可自助制作模闆,建立圖檔中文字的Key-Value對應關系,實作對相同版式圖檔的結構化識别。
我們在今天的這篇文章裡會帶大家自定義一個機票行程單模闆,包括相關的調用步驟、代碼及使用方案。
2.模闆定義及平台接入
自定義模闆的功能位址為: https://ai.baidu.com/iocr#/templatelist
進入界面後,如果以前沒有定義過模闆會提示大家建立模闆,界面如圖:
大家按照提示進行操作,首先上傳模闆圖檔,這裡選擇一張機票行程單上傳。
然後是定義參考字段,注意參考字段不是識别的内容,而是程式用來定位及判斷是否為模闆,還是别的内容的依據。
然後是選擇識别的内容,這個是要識别的資料。本例子中選擇了姓名,總金額和機票号碼,3個字段。
選擇後可以點選“試一試”看一下模闆的效果
如果滿意,可以點選釋出,将模闆釋出出去。要記錄提示資訊裡面的模闆ID,這個在下一步調用的時候要使用。
具體接入方式比較簡單,可以參考我的另一個文章,這裡就不重複了:
http://ai.baidu.com/forum/topic/show/943327
3.自定義模闆調用攻略(Python3)及評測
3.1首先認證授權:
在開始調用任何API之前需要先進行認證授權,具體的說明請參考:
http://ai.baidu.com/docs#/Auth/top
具體Python3代碼如下:
# -*- coding: utf-8 -*-
#!/usr/bin/env python
import urllib
import base64
import json
#client_id 為官網擷取的AK, client_secret 為官網擷取的SK
client_id =【百度雲應用的AK】
client_secret =【百度雲應用的SK】
#擷取token
def get_token():
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + client_id + '&client_secret=' + client_secret
request = urllib.request.Request(host)
request.add_header('Content-Type', 'application/json; charset=UTF-8')
response = urllib.request.urlopen(request)
token_content = response.read()
#print (token_content)
if token_content:
token_info = json.loads(token_content)
token_key = token_info['access_token']
return token_key
3.2财會票據識别分析接口調用:
詳細說明請參考: https://ai.baidu.com/docs#/iOCR-General-API/top
調用位址:https://aip.baidubce.com/rest/2.0/solution/v1/iocr/recognise
請求參數:
大家注意templateSign就是我們在送出定義模闆的時候傳回的ID。
傳回參數:
Python3調用代碼如下:
#财會票據
#filename:圖檔名(本地存儲包括路徑),template模闆号
def recognise(filename,template):
request_url = "https://aip.baidubce.com/rest/2.0/solution/v1/iocr/recognise"
print(filename)
# 二進制方式打開圖檔檔案
f = open(filename, 'rb')
img = base64.b64encode(f.read())
params = dict()
params['image'] = img
params['templateSign'] = template
params = urllib.parse.urlencode(params).encode("utf-8")
access_token = get_token()
begin = time.perf_counter()
request_url = request_url + "?access_token=" + access_token
request = urllib.request.Request(url=request_url, data=params)
request.add_header('Content-Type', 'application/x-www-form-urlencoded')
response = urllib.request.urlopen(request)
content = response.read()
end = time.perf_counter()
print('處理時長:'+'%.2f'%(end-begin)+'秒')
if content:
#print(content)
content=content.decode('utf-8')
#print(content)
data = json.loads(content)
print(data)
4.功能評測:
選一張機票對效果進行測試,具體效果如下(以下例子均來自網上):
處理時長:5.03秒
傳回JSON為
{'data': {'ret': [{'probability': {'average': 0.952863, 'min': 0.495304, 'variance': 0.01743}, 'location': {'height': 13, 'left': 88, 'top': 332, 'width': 127}, 'word_name': 'Number', 'word': '8472412222853'}, {'probability': {'average': 0.903623, 'min': 0.725142, 'variance': 0.012429}, 'location': {'height': 13, 'left': 821, 'top': 303, 'width': 87}, 'word_name': 'Total', 'word': 'cNY320.0'}, {'probability': {'average': 0.991988, 'min': 0.976156, 'variance': 0.000125}, 'location': {'height': 16, 'left': 26, 'top': 112, 'width': 45}, 'word_name': 'Name', 'word': '劉凱敏'}], 'templateSign': '6def20f811df8072292e39aa2ea382cb', 'templateName': 'airticket', 'scores': 1.0, 'isStructured': True, 'logId': '156862155738090', 'clockwiseAngle': 0.0}, 'error_code': 0, 'error_msg': ''}
提取内容為:
Name:劉凱敏
Total: cNY320.0
Number: 8472412222853
測試下來,整體識别效果不錯。
5.測試結論和建議
經過測試發現,整體識别效果很好。對于自定義票據有很強的識别能力。該功能大大的擴充了iOCR的識别範圍,對業務中的各種票據都可以進行識别。對各類發票、收據、銀行對賬單、承兌彙票等常用财務票據進行模闆制作,實作自動分類和結構化識别及财稅場景的自動化,可以有效降低企業人力成本,控制業務風險。
還有一個建議就是希望能在錄入模闆的時候,提供智能選擇功能,一鍵把所有識别出來的内容都選出來,然後讓使用者在這個基礎上進行調整,加快模闆的開發速度。