叮咚~你被福利砸中了!
现在起,「2020 AI开拓者万人大会」299门票免费送!
进入报名页面【2020 AI 开拓者万人大会(线上直播门票)-IT培训直播-CSDN学院】,点击“立即报名”,结算时利用优惠码“AIP1410”,价格就会变为“0"元!

高朋 | 向宇波

编辑 | suiling

来源 | AI科技大本营在线公开课

基于模板的文字识别结果结构化处理技能  百万人学AI

出品 | AI科技大本营(ID:rgznai100)

随着行业的发展和技能的成熟,笔墨识别(OCR)目前已经运用到了多个行业中,比如物盛行业快递包裹的分拣,金融行业的支票单据识别输入,交通领域中的车牌识别,以及日常生活中的卡证、票据识别等等。
OCR(笔墨识别)技能是目前常用的一种AI能力。
但一样平常OCR的识别结果是一种按行输出的半构造化输出。

本次公开课我们约请到了百度高等研发工程师向宇波老师,他将在12月20日(周四)带来一场主题为《基于模板的笔墨识别结果构造化处理技能》的分享。
本课程从百度自定义模板笔墨识别展开,从理论到案例,详细先容OCR构造化的干系技能,并理清OCR和构造化之间的关系和适用场景。

向宇波:大家好,我是来自百度AI技能生态部的研发工程师,我叫向宇波,本日给大家带来的分享是基于模板的笔墨识别结果构造化处理技能,我们紧张讲的是笔墨处理结果的构造化。

笔墨识别行业现状

我们从一个财税案例的角度出发。
大家在公司里肯定都做过报销,报销的时候我们都会有出租车票、定额发票等,我们须要将各种发票贴到纸上然后提交上去,由财务来做后面的事情。
常日来说,他们实在做的都非常辛劳,要耗费大量的人力来进行人工录入。
这样的话,不仅本钱很高,而且耗时也很长,人工录入的话还有可能会出错。
我们能不能够通过用笔墨识别的办法来办理这个问题呢?比如把这个流程变成这样,我们在中间加一层,不是人工录入,而是通过一个识别系统,首先我们把这些票据通过图像采集设备,例如高分辨率扫描、拍照这种办法转换成图像,然后通过笔墨识别技能把图像上的笔墨识别出来,再经由一个数据的构造化,末了输入到财务系统。
这样能节约大量的人力物力,也能够提高效率及准确率。
其关键部分是在识别之后做一个构造化处理。

我们来看一下多模板的构造化识别。
首先来说,我们从刚刚的例子也能看得到,哪怕是一个很大略的报销过程,也涉及到很多种票据,例如火车票、定额发票等等。
现实生活中这种票据非常多。
以是,我们的构造化方案要能够支持多种模板。

一样平常来讲,OCR识别出来的结果是纯挚的一行一行笔墨,这样业务处理起来会比较困难,key value形式的构造会比较好处理。
我们用一个例子来阐明,比如我们识别一张火车票,这个火车票上面有一行笔墨是始发站,然后是车次、到达站。
如果直接处理识别出来的那一行笔墨相对麻烦,由于须要去切分出各个字段。
但是,如果我们的识别结果有构造,那边那里理起来就会随意马虎很多。
通过key value的形式检索,我就能够知道我的始发站(北京南),然后到达站(天津)、车次。
以是构造化给业务处理带来了极大的便利。

接下来我们看一下笔墨识别分类。
常日来说笔墨识别分为两个大类,一种是通用笔墨识别,另一种便是专用垂类识别。
通用笔墨识别就像刚刚提到的,对一个图片来说,识别结果会以行的形式输出,同时会有比较准确的笔墨坐标,这种按行输出的构造可以称之为半构造化,它只能见告你在这一行,在这一行,从上到下罗列,没有真正意义上的key value构造。

专用垂类识别的结果有构造,比如说对付身份证,实在我们知道所有身份证都长的一样,我们能够知道身份证上这个地方是姓名,这个地方是性别,这个地方是民族,以是我们能够返回的时候就见告你姓名是什么,性别是什么,生日是什么。
常见的专用垂类还覆盖几类常见卡证,像身份证、银行卡、增值税发票这些。
但是开拓一个专用垂类识别,常日来说须要花比较多的人力物力,才能够达到一个比较高的准确度,以是它的开拓周期和人力本钱都比较高。

全体看来,业务处理须要不同板式的笔墨识别,并且希望能够构造化,但是如果把它们变成专用的垂类模板来,就会面临本钱很高,周期很长的情形。

基于这些抵牾,我们推出了一个基于模板的笔墨识别结果的构造化方案。
给大家做一个例子来演示,比如用火车票。
我有一个火车票的模板,便是就拿我自己的火车票举例,大家可以看到我的始发站、终点站都有了。
然后我们可以再做一个模板,这次可以换一个增值税发票的。
首先我们上传一张模板的底图,所有的增值税发票都长的差不多。
然后我现在来选一些参照字段,选这个纳税人、开票日期、税率、开票人、小写、收款人、价税,这样就差不多了。
比如说我想要识别这个,大写的金额,保存。
就可以选择其余一张,这两张显然是不一样的。
我们来看一下,该当是这张,可以看到这里写的是1000元整,这样的话我们也可以多框选一些别的字段,就可以像刚刚火车票一样,在这边,在页面上就可以测试出来我们想要的字段都能够给它构造化,按key value的形式找到。

基于模板的笔墨识别构造化流程

刚刚说的看起来操作很大略,但其实在它的背后我们做了一系列的操作。
这个便是我们对全体笔墨识别构造化的流程,它经历了4个大的步骤(4大流程)。
首先是图片摆正,然后是模板匹配、多次摆正,末了是构造化。

对付图片的摆正来说,首先我们会进行一次笔墨识别,然后基于笔墨来探求参照字段。
我们通过参照字段来选择参照字段能够围成的最大面积的四边形,根据这个四边形来打算透视投影矩阵,并做一系列的图像变换,然后再打算所匹配的程度。
如果足够匹配了,OK,那我们构造化;如果没有匹配,并且没有达到我们的匹配次数上限,我们是可以再来一次,考试测验多次摆正,摆得更好一点。

基于深度学习的笔墨识别

我们来讲一讲基于深度学习的笔墨识别。
首先大体上来说有两种办法,一种是单字检测加上单字识别,另一种是行检测加上行识别。
单字检测便是把笔墨当做一样平常的物体检测任务,例如可以用faster-rcnn这个网络去做,每一个字都可以当做一个小物体。
检测出来的单字再用单字识别处理,实质上是个多分类任务。
行识别就不再是检测一个一个字,而是一个文本行。
一样平常来说文本行的特色有:高度不是很高,但是可能一行字会比较长,它实在是类似于小竖条,然后横着摆过来一个很长条的。
对常日的物体检测模型做改造,然后去检测,个中一个好的例子便是cptn。
然后把一行笔墨导出来之后再来识别,就可以当做是一个序列标注的问题了。
当然现在也有这种端到真个,是大家正在做的一些方向。

基于模板的图片摆正

我们再回到刚刚的模板。
模板可以认为是一个标准的底版定义的构造,比如这个定额发票,实在我们一开始就知道我们须要识别的部分在模板上的位置,在这个票据上,我就知道这个发票代码它实在就在这儿,发票号码在这儿,金额在这儿。
如果每张图都长这样,实在就很大略。
但实际上来识别的图都不像模板一样摆的那么正,识别的区域在图片上的位置不是固定的,比如有可能我上传的图是这样,如果按照固定位置扣取,很可能什么都扣不到。
以是我们须要有一种方案,也便是刚刚说的摆正那套流程,希望把所有待识别图都摆的跟模板一样正。
我们选用的是透视投影方法来做图片的摆正,尽可能的把待识别的图跟模板图对齐,这样比较方便后面提取字。

透视投影变换的时候,须要4组从待识别图到模板图对应的点对。
也便是说像这样,比如这个发票的票字它在这儿,但是识别图上在这儿,模板上在这儿,这边一个发票号码,然后各种类似这样的对应起来的点对。
通过这4组点对可以打算一个透视投影矩阵,做透视投影变换。
我们通过框选模板上固定字段来做参照字段,进而通过笔墨匹配办法探求对应点对。
常日一个票据它的板式固定,那么它就符合我们刚刚说的那种条件,是对应的点对。

如果参照字段有多个,这个时候可能就会碰着一个问题了。
比如说对付这个票据来说,它虽然很大略,在上面可以提取的字也只有1、2、3、4、5,比如说我只提取了5个字段作为参照字段,但是打算索引的时候只须要4个点,此时须要取舍。
比如这儿虽然只有5个字段,但实际组成的点对个数实在是比较多的,比如这个蓝线的可以算一个,这个红线这一圈也可以算一个。
我们经由一些实验,当然从主不雅观上看也能够想到,参照字段越分散它摆正的效果越好。
可以这么理解,越分散的时候每一个点它能够统领的区域就越存在这个票面的四周,那么它摆的时候,相称于说你从一个更高的维度或者一个更大的范围去摆,那么摆完的效果肯定比在一个小范围内去拉动其他地方来摆的偏差小。

然后怎么样来衡量这个分散的程度?我们选用面积作为衡量四边形分散程度的指标。
我们选面积的一个缘故原由是好打算,四边形可以当做是两个三角形,只要有坐标,那么两个三角形的面积很好打算。
另一个,实在说分散是很难衡量的,如果转化成面积的话实在面积便是一个数,比较好度量比较。

模板匹配

我们把待识别图做了透视投影之后,接下来要打算它和模板匹配的程度。
由于有的时候,比如说这个时候识别的笔墨并不是太好,我摆了一下,然后这个时候我创造我可以识别的字更多了,而且第一次摆的时候我能识别得更多,但是创造这个时候摆的还不足,那我怎么能知道它摆得不足好?就须要来打算和模板的匹配程度。
我们在这个地方选择的是用新的透视投影矩阵来打算摆正的程度。
用新的透视投影矩阵打算摆正图片四顶点和模板,四顶点的间隔来判断匹配程度。
比如刚刚我们摆正之后,这个图的四个顶点和模板底图的四个顶点,有三个点都是比较近的,然后这个点相对来说远一点,就可以通过这种间隔的办法来判断它的匹配程度。
如果这个点通过摆正之后,打算出来它到了这个位置,那么间隔的差实在就很小了,就可以认为它已经摆的非常好了,以是我们选择的是用这种策略来判断它匹配的程度。
当然如果摆得很歪,这儿离得也很远,全体是这样一个倾斜的角度,如果和模板原图的四个点实在间隔比较远,是能够判断出去这个时候匹配得不足好,可能还要再去做一次。

刚刚说到了多次摆正,也便是说我可能司帐算多个透视投影矩阵。
这个时候我们用到了一种技巧,便是透视投影矩阵的一个栈来操作。
如果对级联透视矩阵有理解的同学就知道,我们常日来说透视投影的乘法是倒着乘的。
比如这里的一个公式,M1代表的是透视投影之后的一个结果,M_origin表示是原图的矩阵,然后乘透视投影矩阵。
如果它只有一次摆正的时候,只有一个透视投影矩阵,这个时候它就等价于那个结果便是用原图乘以这个透视投影矩阵。
但有可能中间我们在处理的时候创造没有摆正,可能这个时候就司帐算出很多个透视投影矩阵,我们就会把它们都重复地往透视投影矩阵的栈里面压入。
这个时候,我们乘以透视投影矩阵栈就等价于原图逆序乘以矩阵栈中每个元素。

为什么一定要费劲来用这个透视投影矩阵栈?我倒着乘它,从origin倒着乘M2,再乘M1,和乘M2、M1,它俩的解读要加一个括号,实在是一样的,从矩阵上是这样。
但是由于我们实在还是对图片做透视投影,如果纯挚的类似括号的办法处理的话,它先乘以M2,它可能会把这个角扭到这儿,这个角往里收,可能会有一些图超出了图片原来的大小。
那么在末了的一步处理的时候会进行一个裁剪,如果它有超出的部分,那么这个部分实在就已经被抛弃了。
纵然我后面希望再把它扭回来,实在那部分的信息已经永久丢失。
以是我们在这个时候有一个透视投影矩阵栈,虽然它是逆着出来的,但实在打算的时候是先把这个矩阵栈里边做了一个相称于加括号的优先打算,以保留原图的全部信息。

多类型构造化

我们经由一系列的摆正操作之后,图片就跟模板比较靠近了,可以对它进行一个识别结果的构造化处理。
从刚刚我们的演示操作能看得到,我们的处理常日来说是有一个固定的识别区,就像刚刚火车票的这种始发站、车次号、终点站,我们识别出来是每个字有个小方框。
我们对付这种固定识别区来说操作相比拟较大略,可以根据单字矩形框的待识别区矩形框的交并最近判断是否属于某个字段。
就像这样,比如说我们框的北京框是这儿,对付北京南这三个字完备处在出发点站这个待识别区的内部。
OK,那就可以确定它俩肯定是出发点站这个识别区的内容。
对付站这个字,虽然它也沾了一点,但是这个字的矩形框和全体待识别区矩形框的交并比并不多,以是我们就把它抛弃掉。
对付车次来说,我们恰好把这个全部框住,以是它们都是。
对天津两个字跟北京南的情形类似。
对付这种大略的情形可能就结束了。

对付更繁芜的,比如说成段落的,比如说我框了全体这一片的时候,我们就须要做纵横双向排序来自动处理跨行笔墨的拼接。
什么意思?比如这两行,我会先对笔墨做一个高下的排序,以是第一行的字肯定拿出来会在第二行的前面,以是须要先对纵向每一个字做比较,然后把它们先分成高下两行。
然后再看那两行之后,按照旁边来排序,这样排完之后出来的结果才是顺序的从左到右,第一行然后第二行这样的关系。

还有一种表格识别区。
比如这个地方,这个识别区便是某一种体检的结果,可以很明显地看到它是一种表格,而且它没有线,它既没有横线,也没有竖线。
我们须要把全体表格的构造从笔墨重新构建出来,我们在这个地方采取的是一种自底向上的表格构建办法,用先列后行的办法来减少非刚性形变的影响。
比如说我们识别完了之后,现有单字的位置(比如前白蛋白4个字)的坐标,我们先从单字的坐标开始来构建组成一个字段关系。
比如我们现在有4个字,我们根据位置关系把它组合成一个字段,这样的话我们就知道它们是一个整体,不可拆分。
常日来说表格的这种一个单格的内容确实是不可拆分的。
然后我们根据它的横向的位置关系来串成列,实在就有点像串冰糖葫芦一样。
比如这个,我们知道实在所有的字段它的横向位置都在这个区域,我们就可以把它们都这样串起来,像串糖葫芦一样,串成一列。
其余的两列也可以做类似的操作,但末了读的时候是一行一行读,比如糖、5.04。
按列之后,再每次取列的头部字段,来根据高度信息组装成行。
比如在这儿便是糖,这一列取第一个便是糖,第二列取第一个便是5.04,第三个便是取这个。

这种办法能够一定程度上地减少对付非刚性形变的影响。
比如说什么叫刚性形变,什么叫非刚性形变?比如像现在是个平铺的,便是一个很薄的很平整的一个面片,把它做仿射变换,都是刚性的,但如果曲直折这种,扭过来,折痕这种,实在就称为非刚性形变。
那么它们的相对位置可能会有一些波纹型的变革,这种会比较难以处理。

我们现在就把构造化的两个办法讲完了,总结一下,还是对应到刚刚的4个大的流程,一个是图片摆正,一个是模板匹配,打算和模板匹配的程度,如果匹配的还不错,匹配上了,OK,那我们就进行构造化,去提取我们事先定义好的待识别区和表格识别区。
但如果很不幸我们摆的还不足正,那可能就会须要去做多次摆正这样一个操作,力求把它跟模板匹配得比较好,末了再做构造化。

迁移学习与图像分类

下面给大家先容一下我们这个产品的分类器。
为什么须要分类?实在根据第一个财税的例子来看,可能我们会报很多种票据,比如说出租车票、增值税发票。
一样平常来说我们传的时候,是一张一张传,但汇聚到财务的时候,那便是一堆了,财务实在对不同的票据处理办法都不一样,以是非常须要把它们区分出来。
比如说对增值税发票,有可能你报了那个发票多会对公司有什么减税,别的人只是纯挚的报销。

最近,我们也提出了对模板进行分类。
实在最大略的一个想法是,如果我们是按图片,它便是一个大略的图像分类。
我们可以采取的方案是基于迁移学习的一个图像分类,所谓迁移学习便是在已有的分类任务上效果比较好的CNN的模型在别的分类任务上面也有不错的效果,大家都知道比如ImageNet比赛有很弘大的数据,如果在那上面运行的预演习模型的结果不错,那么用它提取出来的特色在别的分类上效果也不错。
第二便是迁移学习能够极大地减少演习数据需求的量,还有演习时长。

我们的分类除了基于图像,还有关注到它基本都是票据类的图像,它实在是包括笔墨的,以是我们也结合了笔墨的特色来进行一个分类。
首先是把整张图过一遍CNN的模型,提取出它的图像的特色,然后还要结合它的OCR出来的笔墨,提取它的笔墨特色。
末了把两种特色进行一个领悟,然后再去演习终极的分类器。

可以给大家看一个例子。
比如在这里有一个分类器管理,我们可以看到我现在已经有的三个分类器,点编辑进去看一看。
我现在能分的便是车牌跟火车票,可以在这儿试一试。
火车票,它就分类到我的火车票了,就像刚刚我定的那个模板一样,就把那些数据都给构造化出来。
便是说刚刚在这个地方的时候,相称于是指定了某一个模板。
但是在分类器的时候实在就不须要了,随便扔,随便把图扔进去,然后它就能自动地帮我们分类,并且做我们须要的构造化。
基于分类的事理便是这样。

末了给大家带来一个财税场景上的例子,便是木牛盒子这个产品,它首先通过批量的票据扫描,实在便是这种扫描仪,能够把图像比较清晰地扫描出来,然后利用我们刚刚自定义模板的票据分类,然后构造化的功能加各种票据进行分类出来,就做到了智能识别。
然后再把它构造化出来,再天生凭据,进行输出。