1. 功能介紹python
百度已經推出了iOCR財會票據識別,針對財會報銷場景提出的專項解決方案,可對各種財務票據、報銷單、銀行回單、對帳單進行自動分類及結構化識別,並支持用戶爲固定版式的新票據/單據自定義結構化識別模板及分類器。百度iOCR財會票據識別功能很是的強大,我在:json
https://ai.baidu.com/forum/topic/show/955803app
這篇文章裏面已經進行了比較詳細的介紹,你們有興趣能夠看一下。測試
iOCR財會票據識別內置了7種票據格式,若是咱們要對其餘的票據識別,好比機票行程單,要怎麼辦呢? 這就是咱們今天要介紹的自定義模板功能:百度iOCR自定義模板文字識別,針對未預置且版式固定的票據單據,用戶只需上傳一張模板圖片,便可自助製做模板,創建圖片中文字的Key-Value對應關係,實現對相同版式圖片的結構化識別。url
咱們在今天的這篇文章裏會帶你們自定義一個機票行程單模板,包括相關的調用步驟、代碼及使用方案。3d
2.模板定義及平臺接入rest
自定義模板的功能地址爲: https://ai.baidu.com/iocr#/templatelistcode
進入界面後,若是之前沒有定義過模板會提示你們創建模板,界面如圖:orm
你們按照提示進行操做,首先上傳模板圖片,這裏選擇一張機票行程單上傳。blog
而後是定義參考字段,注意參考字段不是識別的內容,而是程序用來定位及判斷是否爲模板,仍是別的內容的依據。
而後是選擇識別的內容,這個是要識別的數據。本例子中選擇了姓名,總金額和機票號碼,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的識別範圍,對業務中的各類票據均可以進行識別。對各種發票、收據、銀行對帳單、承兌匯票等經常使用財務票據進行模板製做,實現自動分類和結構化識別及財稅場景的自動化,能夠有效下降企業人力成本,控制業務風險。
還有一個建議就是但願能在錄入模板的時候,提供智能選擇功能,一鍵把全部識別出來的內容都選出來,而後讓用戶在這個基礎上進行調整,加快模板的開發速度。