【使用攻略】+【iOCR财会票据】
1.功能描述:
对各类财务票据、报销单、银行回单、对账单进行自动分类及结构化识别,并支持用户为新票据/单据创建结构化模板和调整分类器。具体包括:
票据、单据识别:结构化识别增值税发票、行程单、出租车票、火车票、定额发票等报销类票据,关键字段准确率达99%,银行回单、对账单,字段准确率达95%
报销单识别:针对黏贴在一张纸上的多张票据自动查找边缘,切割后自动分类到对应垂类模板并依次输出结构化识别结果。
票据、单据自动分类:预置分类器可以对各类报销票据、四大行主流的银行单据进行自动分类并输出识别结果,同时用户可以自助上传新票单的训练集对分类器进行个性化定制
自定义模板文字识别:针对未预置且版式固定的票据单据,用户只需上传一张模板图片,即可自助制作模板,建立图片中文字的Key-Value对应关系,实现对相同版式图片的结构化识别
2.平台接入
具体接入方式比较简单,可以参考我的另一个帖子,这里就不重复了:
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#/OCR-iOCR-caikuaiban-API/top
调用地址:https://aip.baidubce.com/rest/2.0/solution/v1/iocr/recognise/finance
请求参数:
返回参数:
Python3调用代码如下:
#财会票据
#filename:图片名(本地存储包括路径),
def finance(filename):
request_url = "https://aip.baidubce.com/rest/2.0/solution/v1/iocr/recognise/finance"
# 二进制方式打开图片文件
f = open(filename, 'rb')
img = base64.b64encode(f.read())
params = dict()
params['image'] = img
params['detectorId'] = 0
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)
result=data['data']['ret']
i=1
print ("共有发票:"+str(len(result))+"张")
for ret in result:
print ("发票No."+str(i))
print ("模板:",ret["templateSign"])
print ("置信度:",ret["scores"])
for detail in ret['ret']:
print(detail['word_name'],":",detail['word'])
print ("\n")
i=i+1
finance('../img/finance4.jpg')
4.功能评测:
选用不同的数据对效果进行测试,具体效果如下(以下例子均来自网上):
案例1,同种多张票据
处理时长:5.96秒
共有发票:6张
发票No.1
模板: quota_invoice
置信度: 0.78680795431137
invoice_code : 151191856001
invoice_rate : 伍拾元整
invoice_number : 01317497
发票No.2
模板: quota_invoice
置信度: 0.7889256477356
invoice_code : 151191856001
invoice_rate : 伍拾元整
invoice_number : 01317496
发票No.3
模板: quota_invoice
置信度: 0.78182858228683
invoice_code : 151191856001
invoice_rate : 伍拾元整
invoice_number : 01317499
发票No.4
模板: quota_invoice
置信度: 0.79168099164963
invoice_code : 151191856001
invoice_rate : 伍拾元整
invoice_number : 01317495
发票No.5
模板: quota_invoice
置信度: 0.79618501663208
invoice_code : 151191857001
invoice_rate : 壹佰元整
invoice_number : 00868805
发票No.6
模板: quota_invoice
置信度: 0.79390239715576
invoice_code : 151191856001
invoice_rate : 伍拾元整
invoice_number : 01317498
案例2:不同类型票据:
处理时长:17.81秒
共有发票:5张
发票No.1
模板: taxi
置信度: 0.77734917402267
TaxiNum : 00000000
InvoiceCode : 144131770155
Time : 16:48-16:54
FuelOilSurcharge : ¥0.00
Date : 2019-03-02
Fare : ¥9.00元
InvoiceNum : 00271519
CallServiceSurcharge : ¥0.00
发票No.2
模板: taxi
置信度: 0.75509601831436
TaxiNum : 代码144131970169
InvoiceCode : 144131970169
Time :
FuelOilSurcharge : ¥0.00
Date :
Fare : ¥2.40元
InvoiceNum : 00059622
CallServiceSurcharge : ¥0.00
发票No.3
模板: train_ticket
置信度: 0.78016191720963
date : 2019年03月01日
seat_category : 新空调硬座
starting_station : 广州东站
ticket_num : G041515
train_num : K675
ticket_rates : ¥395元
name : 邓爽
destination_station : 惠州站
发票No.4
模板: taxi
置信度: 0.78751403093338
TaxiNum : A2A7X3
InvoiceCode : 144011870374
Time : 07:07-07:15
FuelOilSurcharge : ¥0.00
Date : 2019-03-01
Fare : ¥16.00元
InvoiceNum : 13896497
CallServiceSurcharge : ¥2.73
发票No.5
模板: taxi
置信度: 0.77666300535202
TaxiNum : B002494
InvoiceCode : 144011870349
Time : 19:32-19:50
FuelOilSurcharge : ¥0.00
Date : 2019-03-02
Fare : ¥31.00元
InvoiceNum : 06562694
CallServiceSurcharge : ¥0.00
测试下来,整体识别效果不错。对于财会票据有较强的识别能力,效果很好,速度也很快,准确率非常高。
4.竞品对照分析
现在也有一些其他企业提供财会票据识别功能,这里也与竞品进行了简单的对比分析。薪火科技也提供票据识别,并且支持线上测试,它对案例2的识别效果如下:
具体识别内容如下:
识别结果
序号 内容
1单据:共(肆)张 金额:¥19元
2GD.IDANGZHOUTAREDTP
3D002449
4检票:二层2B
5发画
6厂州南站D7269坏海站 144011921qo
7661A73
82019年01月31日10:22开10车01C号
9UU
10¥70.0元 网一寺住
11限乘当日当次车
12限限
135101066983****6229邓晓
14S20140105190974023)
15票有到12306发真有到95306
16
17658483305701月1D002449广州南售
18此发票手写无效
19电话号阳958018
2017:41
21单价2.60元
22田尘11.1Rm
2339.00元
2421439
25税元车筑票
26GD:UANEAITAREIPT
27久州新联
2801085099
29州通用机打发票
30广州市作糖高速公略有限公司
31监督电话:86231800
32发发票务联
33国天有公限四
34发票代码144011871314
35914010172900203
36发票专用章
37发票号码19846221
38入口4A车型限重-.
39出口8收费员十204
40
41时间19181131092:44
42
43本发票手写及涂改无效)
44(超万元无效)
4513打
46候时
47批接号:税云税自组102015106号13118人印X288
481元行
对比可以发现百度票据识别将的更加准确,而且将不同的票据内容很准确的识别为一张票据。显然百度票据识别的功能更加准确、强大。
5.测试结论和建议
测试下来,整体识别效果不错。对于财会票据有较强的识别能力,效果很好,速度也很快,准确率非常高。同时支持票单自动分类,预置报销票据票据、银行单据分类器,针对不支持的分类仅需提供30张相同版式图片,即可自助定制分类器,节省人工分类的成本。支持报销单自动切分,针对单张纸上多张票据的情况,可以实现自动票据定位裁切,自动匹配模板进行识别并输出结构化结果。综上所述我认为该功能对于提高财会工作效率会有很大的帮助。
建议在返回内容上增加每一张票据的bounding box便于进行验证。