【使用攻略】+【iOCR】
iOCR财会版能对各类财务票据、报销单、银行回单、对账单进行自动分类及结构化识别,并支持用户为新票据/单据创建结构化模板和调整分类器。针对黏贴在一张纸上的多张票据自动查找边缘,切割后自动分类到对应垂类模板并依次输出结构化识别结果,方便财务信息录入。
一.自定义模板示例
1.打开iOCR财会票据识别首页: https://ai.baidu.com/tech/ocr/iocr_finance
点击“立即使用”
2.按图示流程说明,点击“创建票据模板”
3.以制作汽车票识别模板为例,首先上传一张汽车票图片
4.框选参照字段
5.框选识别区
6.点击“试一试”,上传一张汽车票图片测试效果
7.测试没有问题,即可发布,整个过程很简单,也很快捷。发布完成可在自己的程序中调用。
二.平台接入
此步骤比较简单,不多阐述。可参照之前文档:
https://ai.baidu.com/forum/topic/show/943162
三.分析接口文档
1.打开API文档页面,分析接口要求
https://ai.baidu.com/docs#/OCR-iOCR-caikuaiban-API/top
(1)接口描述
iOCR财会票据识别是一款针对各类财务票据,如报销单、银行回单、对账单进行自动分类及结构化识别,并支持用户为特殊票据/单据创建结构化模板或分类器的自定义OCR平台。
(2)请求说明
需要用到的信息有:
请求URL:https://aip.baidubce.com/rest/2.0/solution/v1/iocr/recognise/finance
Header格式:Content-Type:application/x-www-form-urlencoded
Body中放置请求参数,参数详情如下:
(3)返回参数
返回示例
{
"data": {
"ret": [{
"ret": [{
"word_name": "invoice_code",
"word": "113001851019"
}, {
"word_name": "invoice_rate",
"word": "拾元整"
}, {
"word_name": "invoice_number",
"word": "25018254"
}],
"templateSign": "quota_invoice",
"scores": 0.95463621616364,
"isStructured": true
}, {
"ret": [{
"word_name": "invoice_code",
"word": "113001751019"
}, {
"word_name": "invoice_rate",
"word": "拾元整"
}, {
"word_name": "invoice_number",
"word": "25018226"
}],
"templateSign": "quota_invoice",
"scores": 0.95132255554199,
"isStructured": true
}, {
"ret": [{
"word_name": "invoice_code",
"word": "113001851019"
}, {
"word_name": "invoice_rate",
"word": "拾元整"
}, {
"word_name": "invoice_number",
"word": "25018273"
}],
"templateSign": "quota_invoice",
"scores": 0.95567744970322,
"isStructured": true
}, {
"ret": [{
"word_name": "invoice_code",
"word": "113001851019"
}, {
"word_name": "invoice_rate",
"word": "拾元整"
}, {
"word_name": "invoice_number",
"word": "25018272"
}],
"templateSign": "quota_invoice",
"scores": 0.9886274933815,
"isStructured": true
}],
"logid": "155601882921432"
},
"error_code": 0,
"error_msg": ""
}
2.获取access_token
# encoding:utf-8
import base64
import urllib
import urllib2
request_url = " https://aip.baidubce.com/rest/2.0/solution/v1/iocr/recognise/finance "
f = open('[本地文件]', 'rb')
img = base64.b64encode(f.read())
params = {"data": data }
params = urllib.urlencode(params)
access_token = '[调用鉴权接口获取的token]'
request_url = request_url + "?access_token=" + access_token
request = urllib2.Request(url=request_url, data=params)
request.add_header('Content-Type', 'application/x-www-form-urlencoded')
response = urllib2.urlopen(request)
content = response.read()
if content:
print content
四.识别结果
1.定额出租票据
识别结果:
第1张
发票类型: quota_invoice
invoice_code : 113001851019
invoice_rate : 拾元整
invoice_number : 25018254
avg_score : 0.998114
第2张
发票类型: quota_invoice
invoice_code : 113001851019
invoice_rate : 拾元整
invoice_number : 25018273
avg_score : 0.999849
第3张
发票类型: quota_invoice
invoice_code : 113001851019
invoice_rate : 拾元整
invoice_number : 25018272
avg_score : 0.999621
第4张
发票类型: quota_invoice
invoice_code : 113001851019
invoice_rate : 拾元整
invoice_number : 25018226
avg_score : 0.948864
处理时长: 8.08 s
2.行程单
识别结果:
第1张
发票类型: travel_itinerary
date : 2017-10-20
flight : CA1330
starting_station : 广州
ticket_rates : 2920.00
name : 田祥祥
destination_station : 北京首都
ticket_number : 9995350649648
avg_score : 0.52351
第2张
发票类型: travel_itinerary
date : 2018-01-20
flight : CA1311
starting_station : 北京首都
ticket_rates : 2280.00
name : 田祥
destination_station : 广州
ticket_number : 9995300619647
avg_score : 0.567168
处理时长: 5.20 s
3.不同票据
识别结果:
第1张
发票类型: taxi
TaxiNum : A2A7X3
InvoiceCode : 144011870374
Time : 07:07-07:15
FuelOilSurcharge : ??0.00
Date : 2019-03-01
Fare : ??16.00元
InvoiceNum : 13896497
CallServiceSurcharge : ??2.73
第2张
发票类型: taxi
TaxiNum : 00271519
InvoiceCode : 144131770155
Time : 16:48-16:54
FuelOilSurcharge : ??0.00
Date : 2019-03-02
Fare : ??9.00元
InvoiceNum : 00271519
CallServiceSurcharge : ??0.00
第3张
发票类型: taxi
TaxiNum : 00059622
InvoiceCode : 144131970169
Time :
FuelOilSurcharge : ??0.00
Date :
Fare : ??.2100
InvoiceNum : 00059622
CallServiceSurcharge : ??0.00
第4张
发票类型: taxi
TaxiNum : RD02494
InvoiceCode : 144011870349
Time : 19:32-19:50
FuelOilSurcharge : ??0.00
Date : 2019-03-02
Fare : ??31.00元
InvoiceNum : 06562694
CallServiceSurcharge : ??0.00
第5张
发票类型: train_ticket
date : 2019年03801日
seat_category : 新空调硬座
starting_station : 广州东站
ticket_num : G041515
train_num : K675
ticket_rates : ¥39.5元
name : 邓爽
destination_station : 惠州站
处理时长: 5.53 s
结论:
识别结果方面:能够识别票据张数,识别结果比较准确,能够大大减少信息录入工作。
处理速度方面:每张图片处理时间在4-10s,时间稍长。
五.源码共享
# -*- coding: utf-8 -*-
#!/usr/bin/env python
import urllib
import urllib.parse
import urllib.request
import base64
import json
import time
import re
import string
#client_id 为官网获取的AK, client_secret 为官网获取的SK
client_id = '************************'
client_secret = '************************'
#获取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()
if token_content:
token_info = json.loads(token_content.decode("utf-8"))
token_key = token_info['access_token']
return token_key
# 读取图片
def get_file_content(filePath):
with open(filePath, 'rb') as fp:
return fp.read()
#获取票据信息
def get_license_plate(path):
request_url = "https://aip.baidubce.com/rest/2.0/solution/v1/iocr/recognise/finance"
f = get_file_content(path)
access_token=get_token()
img = base64.b64encode(f)
params = {"image": img,"detectorId":0}
params = urllib.parse.urlencode(params).encode('utf-8')
request_url = request_url + "?access_token=" + access_token
tic = time.clock()
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()
toc = time.clock()
print('处理时长: '+'%.2f' %(toc - tic) +' s')
if content:
datas = json.loads(content.decode("utf-8"))
ticket = datas['data']['ret']
i=1
for ret in ticket:
print ("第"+str(i)+"张")
print ("发票类型:",ret["templateSign"])
for k in ret['ret']:
print(k['word_name'],":",k['word'])
print ("\n")
i=i+1
print('处理时长: '+'%.2f' %(toc - tic) +' s')
return content
else:
return ''
image_path='F:\paddle\iocr\p2.png'
get_license_plate(image_path)
六.意见建议
1.整体识别效果还是不错的,特别是能够适应复杂场景,不同类型票据放在一起,识别统计无压力,建议根据一张A4纸一般能够容纳几张票据,做成标准模板。
2.建议返回值增加票据张数(num)值,比较直观明了。
3. 不同票据金额格式差别大,如'伍拾元整'、“39.00”、“¥39.00元”,建议统一转成数字格式输出,且作为数组的第一个元素返回,方便取回计算总额。
欢迎扫描体验
汽车票、住宿票的模板还没有加入
已更新
再更新吧
一拍即录