【六期】识别火车票的多种方法
才能我浪费99 发布于2019-11 浏览:7021 回复:50
1
收藏
最后编辑于2022-04

1. 简介

百度OCR提供多种场景下精准的图像文字识别技术服务,让您的应用看图识字,提升输入效率,优化用户体验。现在百度OCR的全系列39款产品,开放使用!希望大家能一起来测试,使用。本篇评测介绍了通过百度ORC识别火车票的多中方法。


2.功能描述:

火车票识别: 支持对红、蓝火车票的8个关键字段进行结构化识别,包括车票号码、始发站、目的站、车次、日期、票价、席别、姓名

iOCR财会版: 针对财会报销场景提出的专项解决方案,可对各类财务票据、报销单、银行回单、对账单进行自动分类及结构化识别,并支持用户为固定版式的新票据/单据自定义结构化识别模板及分类器

iOCR通用版: 基于业界领先的图像处理和文字识别技术,针对固定版式的卡证票据可由用户自助创建识别模板和分类器,实现图片自动分类并结构化输出识别结果

通用文字识别: 百度通用文字识别基于业界领先的深度学习技术,提供多场景、多语种、高精度的整图文字检测和识别服务,印刷体文字识别准确率高达99%,多项ICDAR指标居世界第一。

2.调用攻略(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-API-TrainTicket/top

说明的比较清晰,这里就不重复了。

大家需要注意的是:
API访问URL:https://aip.baidubce.com/rest/2.0/ocr/v1/train_ticket
图像数据,base64编码后进行urlencode,要求base64编码和urlencode后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/jpeg/png/bmp格式

返回示例:
{
{
"errno":"0",
"logid":"55481588484",
"date":"2017年12月11日",
"destination_station":"嘉善南站",
"name":"刘虎",
"seat_category":"二等座",
"starting_station":"上海虹桥站",
"ticket_num":"Z13N025800",
"ticket_rates":"¥24.0元",
"train_num":"D3125"
}
}

Python3调用代码如下:

#火车票
#filename:图片名(本地存储包括路径)
def train_ticket(filename):
    request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/train_ticket"
    
    # 二进制方式打开图片文件
    f = open(filename, 'rb')
    img = base64.b64encode(f.read())
    
    params = dict()
    params['image'] = img
    params['show'] = 'true'
    params = urllib.parse.urlencode(params).encode("utf-8")
    #params = json.dumps(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)
        words_result=data['words_result']
        print ('车票号:',words_result['ticket_num'])
        print ('始发站:',words_result['starting_station'])
        print ('车次号:',words_result['train_num'])
        print ('到达站:',words_result['destination_station'])
        print ('出发日期:',words_result['date'])
        print ('车票金额:',words_result['ticket_rates'])
        print ('席别:',words_result['seat_category'])
        print ('乘客姓名:',words_result['name'])



3.3 iOCR财会版接口调用:

详细说明请参考: https://ai.baidu.com/docs#/iOCR-Finance-API/top

说明的比较清晰,这里就不重复了。

大家需要注意的是:
API访问URL:https://aip.baidubce.com/rest/2.0/solution/v1/iocr/recognise/finance
图像数据,base64编码后进行urlencode,要求base64编码和urlencode后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/jpeg/png/bmp格式

Python3调用代码如下:

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




3.4 iOCR自定义模板:

3.4.1 模板定义

详细说明请参考:
模板定义:https://ai.baidu.com/docs#/iOCR-General-Step/top

首先需要定义自定义模板,

具体可以参考我的另一篇文章: https://ai.baidu.com/forum/topic/show/956078

那篇文章自定义的是机票行程单,照着哪个例子定义火车票模板,即可。具体如下图所示:

先选择参照字段

然后选择识别字段

编辑完成后保存即可。

3.4.2 API调用

详细说明请参考:

API调用: https://ai.baidu.com/docs#/iOCR-General-API/top

大家需要注意的是:
API访问URL:https://aip.baidubce.com/rest/2.0/solution/v1/iocr/recognise
请求参数


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)
        words_result=data['data']['ret']
        print ("识别结果")
        for item in words_result:
            print (item['word_name'],":",item['word'])  

 

3.5百度通用文字:

详细说明请参考: https://ai.baidu.com/docs#/OCR-API-GeneralBasic/db0895e7

说明的比较清晰,这里就不重复了。

大家需要注意的是:
API访问URL:https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic
图像数据,base64编码后进行urlencode,要求base64编码和urlencode后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/jpeg/png/bmp格式

返回示例:
{
"log_id": 2471272194,
"words_result_num": 2,
"words_result":
[
{"words": " TSINGTAO"},
{"words": "青島睥酒"}
]
}

Python3调用代码如下:

def general_basic(filename):
    request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic"
    
    # 二进制方式打开图片文件
    f = open(filename, 'rb')
    img = base64.b64encode(f.read())
    
    params = dict()
    params['image'] = img
    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)
        words_result=data['words_result']
        print ("识别结果:")
        for item in words_result:
            print (item['words'])  


4.功能评测(所有图片均来自网上):


火车票识别:
处理时长:2.08秒
车票号: Z31G052971
始发站: 杭州东站
车次号: D3233
到达站: 宁波站
出发日期: 2017年06月24日
车票金额: ¥54.0元
席别: 二等座
乘客姓名: 林璐

iOCR财会版
处理时长:2.85秒
共有发票:1张
发票No.1
模板: train_ticket
置信度: 0.823882520198822
date : 2017年06月24日
seat_category : 二等座
starting_station : 杭州东站
ticket_num : Z31G052971
train_num : D3233
ticket_rates : ¥54.0元
name : 林璐
destination_station : 宁波站
seat_num : 04车12D号

iOCR自定义模板
处理时长:1.95秒
识别结果
level : 二等座
price : ¥54.0元
endstation : 宁波站
starttime : 2017年06月24日14:37开
startstation : 杭州东站

通用文字识别:

处理时长:3.57秒
识别结果:
231G052971
检票:5A
杭州东站D3233宁波站
Hangzhoudong
Ningbo
2017年06月24日14:37开04车12D号
¥54.0元
文折
二等座
限乘当日当次车
3302061987***4682林璐
回版回
威能
世热,制冷新风空净水处理系
9004130310625G052971杭州东售


5.测试结论

百度OCR的多种功能都能快速准确的识别火车票,这多种功能分别对应不同的应用场景。

火车票识别,可以快速、准确的识别火车票的信息,主要用于针对性的场景。如日程记录,使用火车票识别技术,实现对车次、日期等信息的识别和录入,可应用于个人行程规划与记录类移动应用,高效准确的识别服务可以满足用户快速录入行程信息的需求,有效降低用户输入成本,提升用户使用体验。或者单一的报销场景等。

iOCR财会版,实现图片自动分类并结构化输出识别结果,可以针对混贴的各种票据进行识别,可以对各类发票、收据、银行对账单、承兑汇票等常用财务票据进行模板制作,实现自动分类和结构化识别,并预置多种常用发票模板供直接使用,可应用于企业财务报销、核算、记录等场景,实现财税场景的自动化,有效降低企业人力成本,控制业务风险。

iOCR通用版,其实主要针对于没有预制模板的特殊的单据来进行处理的,提供了无限的扩展可能。其实现实应用中,对于火车票这种已经有现成识别功能和模板的票据是不需要使用定制模板的。

通用文字识别,使用通用文字识别技术,主要是对文字内容进行识别。在对火车票识别的过程中,返回的就是不同位置的文字内容,并不能如前面几种功能那样返回结构化的结果。它主要特点是“通用”,比如在不能确定图片一定是火车票的情况下、或者除了火车票还有别的内容的时候,使用通用文字识别,方便用户进行文本的提取或录入数据,有效提升产品易用性和用户使用体验。

通过测试发现百度OCR的功能非常的强大,充分考虑了各种应用场景,提供不同的功能组合。

收藏
点赞
1
个赞
共50条回复 最后由用户已被禁言回复于2022-04
#31才能我浪费99回复于2020-01
#30 ooliuyuanoo回复
想起那些辛苦标数据的日夜  

所有的AI都是从标注开始的

0
O
#30ooliuyuanoo回复于2020-01

想起那些辛苦标数据的日夜

 

0
#29大手拉小手0123回复于2019-12
#28 才能我浪费99回复
人的创造力是无限的

这个我是相信的,聪明的人太多了

0
#28才能我浪费99回复于2019-12
#26 风搅火回复
再强大还是人创造出来的

人的创造力是无限的

0
#27才能我浪费99回复于2019-12
#25 风搅火回复
简便快捷,让人们减少好多焦虑

的确是方便了大家

0
#26风搅火回复于2019-12
#13 worddict回复
不过也很强大

再强大还是人创造出来的

0
#25风搅火回复于2019-12
#22 才能我浪费99回复
人工智能可不止这点好处

简便快捷,让人们减少好多焦虑

0
#24风搅火回复于2019-12
#23 才能我浪费99回复
现在已经实现了

而且比以前更有秩序了

0
#23才能我浪费99回复于2019-12
#19 小雨青青润无声回复
现在都是电子客票,用身份证进站、出站

现在已经实现了

0
#22才能我浪费99回复于2019-12
#20 小雨青青润无声回复
这就是人工智能的最大好处

人工智能可不止这点好处

0
#21才能我浪费99回复于2019-12
#18 小雨青青润无声回复
不断完善自己,就会更强大

不断完善,不断进步

0
#20小雨青青润无声回复于2019-12
#17 才能我浪费99回复
用起来很方便的

这就是人工智能的最大好处

0
#19小雨青青润无声回复于2019-12
#12 何必固執回复
这个是不是火车站早都已经用起来了?

现在都是电子客票,用身份证进站、出站

0
#18小雨青青润无声回复于2019-12
#9 才能我浪费99回复
百度AI的确是厉害

不断完善自己,就会更强大

0
#17才能我浪费99回复于2019-12
#14 钢铁长城637回复
感觉对我这种小白一点友好

用起来很方便的

0
#16才能我浪费99回复于2019-12
#12 何必固執回复
这个是不是火车站早都已经用起来了?

感觉现在自动验票应该是用类似的方法

0
#15才能我浪费99回复于2019-12
#12 何必固執回复
这个是不是火车站早都已经用起来了?

这个也说不定啊

0
#14钢铁长城637回复于2019-12

感觉对我这种小白一点友好

1
#13worddict回复于2019-12
#3 大手拉小手0123回复
感觉非常难的样子

不过也很强大

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

这个是不是火车站早都已经用起来了?

0
TOP
切换版块