【征稿计划第三期】报账票据快速录入
wangwei8638 发布于2019-08 浏览:1956 回复:6
1
收藏
最后编辑于2022-04

【使用攻略】+【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元”,建议统一转成数字格式输出,且作为数组的第一个元素返回,方便取回计算总额。

收藏
点赞
1
个赞
共6条回复 最后由用户已被禁言回复于2022-04
#7用户已被禁言回复于2020-06

欢迎扫描体验

0
#6用户已被禁言回复于2020-06

0
#5用户已被禁言回复于2019-09

汽车票、住宿票的模板还没有加入

0
#4用户已被禁言回复于2019-09

已更新

0
#3用户已被禁言回复于2019-08

再更新吧

0
#2用户已被禁言回复于2019-08

一拍即录

0
TOP
切换版块