基于模板的文字识别结果结构化处理技术 | 公开课速记

640?wx_fmt=jpeg


嘉宾 | 向宇波
程序员

编辑 | suiling算法

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

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


随着行业的发展和技术的成熟,文字识别(OCR)目前已经应用到了多个行业中,好比物流行业快递包裹的分拣,金融行业的支票单据识别输入,交通领域中的车牌识别,以及平常生活中的卡证、票据识别等等。OCR(文字识别)技术是目前经常使用的一种AI能力。但通常OCR的识别结果是一种按行输出的半结构化输出。机器学习


本次公开课咱们邀请到了百度高级研发工程师向宇波老师,他将在12月20日(周四)带来一场主题为《基于模板的文字识别结果结构化处理技术》的分享。本课程从百度自定义模板文字识别展开,从理论到案例,详细介绍OCR结构化的相关技术,并理清OCR和结构化之间的关系和适用场景。学习



向宇波:你们好,我是来自百度AI技术生态部的研发工程师,我叫向宇波,今天给你们带来的分享是基于模板的文字识别结果结构化处理技术,咱们主要讲的是文字处理结果的结构化。
测试


640?wx_fmt=jpeg


文字识别行业现状优化


咱们从一个财税案例的角度出发。你们在公司里确定都作过报销,报销的时候咱们都会有出租车票、定额发票等,咱们须要将各类发票贴到纸上而后提交上去,由财务来作后面的事情。一般来讲,他们其实作的都很是辛苦,要耗费大量的人力来进行人工录入。这样的话,不只成本很高,并且耗时也很长,人工录入的话还有可能会出错。咱们能不可以经过用文字识别的方式来解决这个问题呢?好比把这个流程变成这样,咱们在中间加一层,不是人工录入,而是经过一个识别系统,首先咱们把这些票据经过图像采集设备,例如高分辨率扫描、拍照这种方式转换成图像,而后经过文字识别技术把图像上的文字识别出来,再通过一个数据的结构化,最后输入到财务系统。这样能节约大量的人力物力,也可以提升效率及准确率。其关键部分是在识别以后作一个结构化处理。ui


640?wx_fmt=jpeg


咱们来看一下多模板的结构化识别。首先来讲,咱们从刚刚的例子也能看获得,哪怕是一个很简单的报销过程,也涉及到不少种票据,例如火车票、定额发票等等。现实生活中这种票据很是多。因此,咱们的结构化方案要可以支持多种模板。人工智能


640?wx_fmt=jpeg


通常来说,OCR识别出来的结果是单纯的一行一行文字,这样业务处理起来会比较困难,key value形式的结构会比较好处理。咱们用一个例子来解释,好比咱们识别一张火车票,这个火车票上面有一行文字是始发站,而后是车次、到达站。若是直接处理识别出来的那一行文字相对麻烦,由于须要去切分出各个字段。可是,若是咱们的识别结果有结构,那处理起来就会容易不少。经过key value的形式检索,我就可以知道个人始发站(北京南),而后到达站(天津)、车次。因此结构化给业务处理带来了极大的便利。


640?wx_fmt=jpeg


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


专用垂类识别的结果有结构,好比说对于身份证,其实咱们知道全部身份证都长的同样,咱们可以知道身份证上这个地方是姓名,这个地方是性别,这个地方是民族,因此咱们可以返回的时候就告诉你姓名是什么,性别是什么,生日是什么。常见的专用垂类还覆盖几类常见卡证,像身份证、银行卡、增值税发票这些。可是开发一个专用垂类识别,一般来讲须要花比较多的人力物力,才可以达到一个比较高的准确度,因此它的开发周期和人力成本都比较高。


640?wx_fmt=jpeg      

整个看来,业务处理须要不一样板式的文字识别,而且但愿可以结构化,可是若是把它们变成专用的垂类模板来,就会面临成本很高,周期很长的状况。


基于这些矛盾,咱们推出了一个基于模板的文字识别结果的结构化方案。给你们作一个例子来演示,好比用火车票。我有一个火车票的模板,就是就拿我本身的火车票举例,你们能够看到个人始发站、终点站都有了。而后咱们能够再作一个模板,此次能够换一个增值税发票的。首先咱们上传一张模板的底图,全部的增值税发票都长的差很少。而后我如今来选一些参照字段,选这个纳税人、开票日期、税率、开票人、小写、收款人、价税,这样就差很少了。好比说我想要识别这个,大写的金额,保存。就能够选择另一张,这两张显然是不同的。咱们来看一下,应该是这张,能够看到这里写的是1000元整,这样的话咱们也能够多框选一些别的字段,就能够像刚刚火车票同样,在这边,在页面上就能够测试出来咱们想要的字段都可以给它结构化,按key value的形式找到。


基于模板的文字识别结构化流程


刚刚说的看起来操做很简单,但其实在它的背后咱们作了一系列的操做。这个就是咱们对整个文字识别结构化的流程,它经历了4个大的步骤(4大流程)。首先是图片摆正而后是模板匹配屡次摆正最后是结构化


640?wx_fmt=jpeg       

对于图片的摆正来讲,首先咱们会进行一次文字识别,而后基于文字来寻找参照字段。咱们经过参照字段来选择参照字段可以围成的最大面积的四边形,根据这个四边形来计算透视投影矩阵,并作一系列的图像变换,而后再计算所匹配的程度。若是足够匹配了,OK,那咱们结构化;若是没有匹配,而且没有达到咱们的匹配次数上限,咱们是能够再来一次,尝试屡次摆正,摆得更好一点。

基于深度学习的文字识别


640?wx_fmt=jpeg       

咱们来说一讲基于深度学习的文字识别。首先大致上来讲有两种方式,一种是单字检测加上单字识别,另外一种是行检测加上行识别。单字检测就是把文字当作通常的物体检测任务,例如能够用faster-rcnn这个网络去作,每个字均可以当作一个小物体。检测出来的单字再用单字识别处理,本质上是个多分类任务行识别就再也不是检测一个一个字,而是一个文本行。通常来讲文本行的特征有:高度不是很高,可是可能一行字会比较长,它实际上是相似于小竖条,而后横着摆过来一个很长条的。对一般的物体检测模型作改造,而后去检测,其中一个好的例子就是cptn。而后把一行文字导出来以后再来识别,就能够当作是一个序列标注的问题了。固然如今也有这种端到端的,是你们正在作的一些方向。


基于模板的图片摆正


640?wx_fmt=jpeg       

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


640?wx_fmt=jpeg      

透视投影变换的时候,须要4组从待识别图到模板图对应的点对。也就是说像这样,好比这个发票的票字它在这儿,可是识别图上在这儿,模板上在这儿,这边一个发票号码,而后各类相似这样的对应起来的点对。经过这4组点对能够计算一个透视投影矩阵,作透视投影变换。咱们经过框选模板上固定字段来作参照字段,进而经过文字匹配方式寻找对应点对。一般一个票据它的板式固定,那么它就符合咱们刚刚说的那种条件,是对应的点对。


640?wx_fmt=jpeg      

若是参照字段有多个,这个时候可能就会遇到一个问题了。好比说对于这个票据来讲,它虽然很简单,在上面能够提取的字也只有一、二、三、四、5,好比说我只提取了5个字段做为参照字段,可是计算索引的时候只须要4个点,此时须要取舍。好比这儿虽然只有5个字段,但实际组成的点对个数实际上是比较多的,好比这个蓝线的能够算一个,这个红线这一圈也能够算一个。咱们通过一些实验,固然从主观上看也可以想到,参照字段越分散它摆正的效果越好。能够这么理解,越分散的时候每个点它可以管辖的区域就越存在这个票面的四周,那么它摆的时候,至关于说你从一个更高的维度或者一个更大的范围去摆,那么摆完的效果确定比在一个小范围内去拉动其余地方来摆的偏差小。


而后怎么样来衡量这个分散的程度?咱们选用面积做为衡量四边形分散程度的指标。咱们选面积的一个缘由是好计算,四边形能够当作是两个三角形,只要有坐标,那么两个三角形的面积很好计算。另外一个,其实说分散是很难衡量的,若是转化成面积的话其实面积就是一个数,比较好度量比较。


模板匹配


640?wx_fmt=jpeg


咱们把待识别图作了透视投影以后,接下来要计算它和模板匹配的程度。由于有的时候,好比说这个时候识别的文字并非太好,我摆了一下,而后这个时候我发现我能够识别的字更多了,并且第一次摆的时候我能识别得更多,可是发现这个时候摆的还不够,那我怎么能知道它摆得不够好?就须要来计算和模板的匹配程度。咱们在这个地方选择的是用新的透视投影矩阵来计算摆正的程度。用新的透视投影矩阵计算摆正图片四顶点和模板,四顶点的距离来判断匹配程度。好比刚刚咱们摆正以后,这个图的四个顶点和模板底图的四个顶点,有三个点都是比较近的,而后这个点相对来讲远一点,就能够经过这种距离的方式来判断它的匹配程度。若是这个点经过摆正以后,计算出来它到了这个位置,那么距离的差其实就很小了,就能够认为它已经摆的很是好了,因此咱们选择的是用这种策略来判断它匹配的程度。固然若是摆得很歪,这儿离得也很远,整个是这样一个倾斜的角度,若是和模板原图的四个点其实距离比较远,是可以判断出去这个时候匹配得不够好,可能还要再去作一次。


640?wx_fmt=jpeg


刚刚说到了屡次摆正,也就是说我可能会计算多个透视投影矩阵。这个时候咱们用到了一种技巧,就是透视投影矩阵的一个栈来操做。若是对级联透视矩阵有了解的同窗就知道,咱们一般来讲透视投影的乘法是倒着乘的。好比这里的一个公式,M1表明的是透视投影以后的一个结果,M_origin表示是原图的矩阵,而后乘透视投影矩阵。若是它只有一次摆正的时候,只有一个透视投影矩阵,这个时候它就等价于那个结果就是用原图乘以这个透视投影矩阵。但有可能中间咱们在处理的时候发现没有摆正,可能这个时候就会计算出不少个透视投影矩阵,咱们就会把它们都重复地往透视投影矩阵的栈里面压入。这个时候,咱们乘以透视投影矩阵栈就等价于原图逆序乘以矩阵栈中每一个元素。


为何必定要费劲来用这个透视投影矩阵栈?我倒着乘它,从origin倒着乘M2,再乘M1,和乘M二、M1,它俩的解读要加一个括号,实际上是同样的,从矩阵上是这样。可是由于咱们其实仍是对图片作透视投影,若是单纯的相似括号的方式处理的话,它先乘以M2,它可能会把这个角扭到这儿,这个角往里收,可能会有一些图超出了图片本来的大小。那么在最后的一步处理的时候会进行一个裁剪,若是它有超出的部分,那么这个部分其实就已经被抛弃了。即便我后面但愿再把它扭回来,其实那部分的信息已经永远丢失。因此咱们在这个时候有一个透视投影矩阵栈,虽然它是逆着出来的,但其实计算的时候是先把这个矩阵栈里边作了一个至关于加括号的优先计算,以保留原图的所有信息。


多类型结构化


咱们通过一系列的摆正操做以后,图片就跟模板比较接近了,能够对它进行一个识别结果的结构化处理。从刚刚咱们的演示操做能看获得,咱们的处理一般来讲是有一个固定的识别区,就像刚刚火车票的这种始发站、车次号、终点站,咱们识别出来是每一个字有个小方框。咱们对于这种固定识别区来讲操做相对比较简单,能够根据单字矩形框的待识别区矩形框的交并比来判断是否属于某个字段。就像这样,好比说咱们框的北京框是这儿,对于北京南这三个字彻底处在起点站这个待识别区的内部。OK,那就能够肯定它俩确定是起点站这个识别区的内容。对于站这个字,虽然它也沾了一点,可是这个字的矩形框和整个待识别区矩形框的交并比并很少,因此咱们就把它抛弃掉。对于车次来讲,咱们正好把这个所有框住,因此它们都是。对天津两个字跟北京南的状况相似。对于这种简单的状况可能就结束了。


640?wx_fmt=jpeg       

对于更复杂的,好比说成段落的,好比说我框了整个这一片的时候,咱们就须要作纵横双向排序来自动处理跨行文字的拼接。什么意思?好比这两行,我会先对文字作一个上下的排序,因此第一行的字确定拿出来会在第二行的前面,因此须要先对纵向每个字作比较,而后把它们先分红上下两行。而后再看那两行以后,按照左右来排序,这样排完以后出来的结果才是顺序的从左到右,第一行而后第二行这样的关系。


640?wx_fmt=jpeg      

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


这种方式可以必定程度上地减小对于非刚性形变的影响。好比说什么叫刚性形变,什么叫非刚性形变?好比像如今是个平铺的,就是一个很薄的很平整的一个面片,把它作仿射变换,都是刚性的,但若是是弯曲这种,扭过来,折痕这种,其实就称为非刚性形变。那么它们的相对位置可能会有一些波纹型的变化,这种会比较难以处理。


640?wx_fmt=jpeg      

咱们如今就把结构化的两个方式讲完了,总结一下,仍是对应到刚刚的4个大的流程,一个是图片摆正,一个是模板匹配,计算和模板匹配的程度,若是匹配的还不错,匹配上了,OK,那咱们就进行结构化,去提取咱们事先定义好的待识别区和表格识别区。但若是很不幸咱们摆的还不够正,那可能就会须要去作屡次摆正这样一个操做,力求把它跟模板匹配得比较好,最后再作结构化。


迁移学习与图像分类


下面给你们介绍一下咱们这个产品的分类器。为何须要分类?其实根据第一个财税的例子来看,可能咱们会报不少种票据,好比说出租车票、增值税发票。通常来讲咱们传的时候,是一张一张传,但汇聚到财务的时候,那就是一堆了,财务其实对不一样的票据处理方式都不同,因此很是须要把它们区分出来。好比说对增值税发票,有可能你报了那个发票多会对公司有什么减税,别的人只是单纯的报销。


640?wx_fmt=jpeg      

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


640?wx_fmt=jpeg      

咱们的分类除了基于图像,还有关注到它基本都是票据类的图像,它实际上是包括文字的,因此咱们也结合了文字的特征来进行一个分类。首先是把整张图过一遍CNN的模型,提取出它的图像的特征,而后还要结合它的OCR出来的文字,提取它的文字特征。最后把两种特征进行一个融合,而后再去训练最终的分类器。


能够给你们看一个例子。好比在这里有一个分类器管理,咱们能够看到我如今已经有的三个分类器,点编辑进去看一看。我如今能分的就是车牌跟火车票,能够在这儿试一试。火车票,它就分类到个人火车票了,就像刚刚我定的那个模板同样,就把那些数据都给结构化出来。就是说刚刚在这个地方的时候,至关因而指定了某一个模板。可是在分类器的时候其实就不须要了,随便扔,随便把图扔进去,而后它就能自动地帮咱们分类,而且作咱们须要的结构化。基于分类的原理就是这样。


640?wx_fmt=jpeg      

最后给你们带来一个财税场景上的例子,就是木牛盒子这个产品,它首先经过批量的票据扫描,其实就是这种扫描仪,可以把图像比较清晰地扫描出来,而后使用咱们刚刚自定义模板的票据分类,而后结构化的功能加各类票据进行分类出来,就作到了智能识别。而后再把它结构化出来,再生成凭证,进行输出。


以上就是今天我给你们分享的内容,谢谢你们。


关注AI科技大本营微信公众号,回复:OCR,获取本次公开课演讲PPT。公开课讲师申请,请联系微信1092722531


(本文为 AI科技大本营公开课速记,转载请微信联系 1092722531)


CTA核心技术及应用峰会

5月25-27日,由中国IT社区CSDN与数字经济人才发展中心联合主办的第一届CTA核心技术及应用峰会将在杭州国际博览中心隆重召开,峰会将围绕人工智能领域,邀请技术领航者,与开发者共同探讨机器学习和知识图谱的前沿研究及应用。


更多重磅嘉宾请识别海报二维码查看,目前会议早鸟票发售中(原票价1099元),点击阅读原文即刻抢购。添加小助手微信15101014297,备注“CTA”,了解票务以及会务详情。


640?wx_fmt=jpeg

推荐阅读

640?wx_fmt=png