一种任意字符组合的OCR数据生成的方法与流程

文档序号:26749280发布日期:2021-09-25 01:56阅读:192来源:国知局
一种任意字符组合的OCR数据生成的方法与流程
一种任意字符组合的ocr数据生成的方法
技术领域
1.本发明涉及光学字符识别技术领域,具体为一种任意字符组合的ocr数据生成的方法。


背景技术:

2.目前,ocr(光学字符识别, optical character recognition)领域的主流算法分为两种,一种是两阶段算法,另一种是端到端算法。两阶段算法一般由文字检测算法和文字识别算法组成,主要思路是,先使用文字检测算法从图像中获取文本行的检测框,然后再使用文字识别算法去识别文本框中的内容。端到端算法是在一个算法中完成文字检查和文字识别。虽然端到端算法模型更小,速度更快,但是多用于固定场景的ocr,如票据类、银行卡等场景,所以对于输入较为灵活的场景,一般还是采用两阶段算法。
3.在两阶段算法中,文字检测算法相对实现更加简单,所需的数据量较少,文字识别算法则是ocr的核心模块,直接影响输出结果的准确性,往往需要上百上千万的数据进行训练,如果全用人工标注,将消耗大量的人力,所以一般需要使用数据生成的方法以达到海量数据的需求。
4.对于文字识别算法而言,输入是文字图片,输出是图片对应的文字,所以在生成此类ocr数据时,需要使用文字生成一张对应的文字图片,同时保存文字和文字图片,一般生成步骤如下:1.从各个渠道获取语料库,语料库的形式多样,可以是文章、字典也可以是短语。
5.2.根据实际语言需求和目标需求,一般会采用随机切割语料中的文章长度或者随机抽取字符组合等各种方式,从语料库中生成文本内容。
6.3.生成一张透明图片,一般为了方便更换文字背景,生成更加真实的图片,会先生成一张透明图片,在这张透明图片上生成文字,然后把透明文字图片粘贴到目标背景图片上。当然也有些方法不事先成透明图片,而是直接在一张背景图片进行裁剪等操作作为文字绘制时的背景图片。
7.4.文字的字体、字体大小、字体颜色等参数设置,为了更加接近真实图片,往往会根据实际需求,设定不同的参数。
8.5.使用字体在透明图片(背景图片)上绘制文字,这一步是文字图片生成过程中的核心环节,文字生成的好坏直接影响算法模型的准确性。
9.6.把透明文字图片进行变换,一般会进行加噪,或者变形,加背景图片等各种变换操作,这样就生成了最终的文字图片。
10.现有的ocr数据生成方法中,在以上的各个步骤中,一般都已经有了各种方法实现,而对于5这个环节,单一图片往往只用单一字体生成数据,由于字体是分语言的且单个字体支持的字符数量有限,对于不支持的字符,会用空白或者“#”之类的字符代替,所以生成的数据有很大的局限性,主要问题如下:1. 无法实现多语言混合的数据生成,一般来说,单个字体一般只支持一到两种语
言,如果给定的语料使用多种语言,则无法生成给定文本对应的图片,而实际使用时,存在多语言混用的情况。
11.2. 无法支持不常用字符的数据生成,以中文为例,中文常见汉字约3500个,但中文实际有上万的汉字,单个字体有时甚至都无法覆盖3500个汉字,更不用说其他不常用的汉字。
12.3. 无法支持特殊符号的数据生成,诸如







等特殊符号,还有一些数学符号,有的字体支持这些符号,更多的字体不支持这些符号,如果想利用指定字体生成数据时,语料库存在这些符号,则会导致生成的数据有误,文本内容无法与生成的图片一致,为模型训练带来了干扰。
13.针对上述存在的问题,目前采用的解决方案如下:1. 更改文字检测算法的实现思路。在文字检测时,分语言检测,在同一行中出现不同语言时,分类检测语言,使用多个检测框分别检测不同的语言,但是这类思路,需要细粒度的分类算法来区分不同的语言,难度较大,且对于中文简体和中文繁体这样比较相近的字符往往难以区分,且增加了处理成本。
14.2. 采用随机字符组合的方式生成数据。从需要识别的字符中,随机抽取字符进行组合以生成数据,遇到不支持字符要么跳过这个字符,要么换一个字体来生成数据。这种方法往往会造成数据的不均衡,对于常见字符,出现的频率较高,而不常见的字符,出现频率较低,且这种方法依旧无法生成指定字符组合的场景。
15.基于此,本发明设计了一种任意字符组合的ocr数据生成的方法,以解决上述问题。


技术实现要素:

16.本发明的目的在于提供一种任意字符组合的ocr数据生成的方法,以解决上述背景技术中提出的问题。
17.为实现上述目的,本发明提供如下技术方案:一种任意字符组合的ocr数据生成的方法,包括以下步骤:s1:通过字符字典、字体库和语料库生成字符

字体映射字典,得到字符和所有支持的字体之间的对应关系;s2:语料拆分;从语料库中获取待生成图片的一行文本,切分文本成多个字符串,找到各个字符串与其对应的字体;语料拆分的具体步骤如下:s21:读取待生成文本text中的第一个字符c;s22:从字符

字体映射字典取出字符c对应的所有字体列表s,返回空或返回字体;s23:根据s22中的返回值选择减少字符循环s21或将返回值记为temp_font,直到找到第一个有字体支持的字符c;s24:text为空或者字符返回的字体为空,结束所有步骤,否则遍历当前的文本text中的每一个字符c;s25:对于s24中的每一个字符c,进行迭代;s26:temp_font不为空,则得到分出的最后一段文本temp_text和对应的字体
temp_font,将两者添加到文本

字体列表text_font_list中;s3:图片生成;将找到的各个字符串对应的字体选择性按照水平和竖直两种文字方向进行排列得到文字图片,将排列后的文字图片宽记为fina_width,高记为final_height,初始化为0;s4:图片拼接;将文字图片选择性按照水平和竖直两种方向进行拼接得到最终图片。
18.优选的,s1中,所述字符字典是语料中出现的所有字符,所述字体库是所有想要使用的字体的集合,字体库需满足字符字典里的所有字符都至少有一个字体支持,所述语料库是需要生成的文本内容。
19.优选的,s1中,所述字符

字体映射字典的生成方式如下:s11:读取字符字典,初始化字符

字体映射字典为空;s12:遍历字体库中的所有字体;s13:分别读取s12的字体支持的所有字符;s14:遍历s13中的所有字符,如果字体支持的字符在字符字典中,则在该字符支持的字体列表中添加此字体对象;s15:字符

字体映射字典构建完成,得到了字符和所有支持的字体之间的对应关系。
20.优选的,s22中,所述从字符

字体映射字典取出字符c对应的所有字体列表s具体步骤如下:s221:如果字符c不在字符

字体映射字典里或者列表s为空,则返回空,s22结束;s222:如果列表s只有一个字体对象,则返回这个字体,s22结束;s223:如果列表s有多个字体对象,则从列表s中随机选取一个字体对象返回,s22结束。
21.优选的,s23中,所述找到第一个有字体支持的字符c,具体步骤如下:s231:如果s22的返回值为空,且当前文本text不为空,则当前待生成的文本变成去掉第一个字符后的文本,即text = text[1:],回到s21,直到s22的返回值不为空,或者text变为空,s23结束;s232:如果s22的返回值不为空,记s22的返回值为temp_font,该字体支持的所有字符列表记为temp_char_list,s23结束。
[0022]
优选的,s25中,所述迭代具体步骤如下:s251:如果c是text中的第一个字符,则记temp_text=c,当前使用的字体是c对应的字体temp_font,本次迭代结束;s252:如果c非第一个字符,但字符c在当前字体的字符列表temp_char_list中,代表当前字体继续支持该字符,则temp_text+=char,本次迭代结束;s253:如果c非第一个字符,字符c不在当前字体的字符列表temp_char_list中,且temp_char_list不为空,代表当前字体只支持c之前的文本内容,则得到切分出的一段文本temp_text和对应的字体temp_font,将两者记为text_font_list中,此时temp_font等于s22的返回值,如果temp_font为空,说明没有支持当前字符的字体,则temp_text和temp_char_list都为空,否则temp_text=char,temp_char_list等于temp_font支持的所有字符
列表,本次迭代结束。
[0023]
优选的,s3中,所述以水平排列方式生成文字图片主要步骤如下:s311:获得每一个切分好的文本text和对应的字体font;s312:对于s311里的文本和字体,使用字体获得文本需要的图片尺寸,记高为height,宽为width;s313:利用s312的尺寸生成一张同尺寸的透明图片;s314:在s313的透明图片上使用字体绘制文本内容;s315:将绘制好的图片加入结果列表中;s316:取图片最高的高度作为最后的高度,如果height大于final_height,则final_height=height,否则final_height保持不变;s317:图片最终的宽就是每张图片宽度的总和,所以final_width+=width。
[0024]
优选的,s3中,所述以竖直排列方式生成文字图片主要步骤如下:s321:获得每一个切分好的文本text和对应的字体font;s322:使用字体获得字符c需要的图片尺寸, ,记高为height,宽为width;s323:利用s322的尺寸生成一张同尺寸的透明图片;s324:在s323的透明图片上使用字体绘制文本内容c;s325:将绘制好的图片加入结果列表中;s326:取图片最大的宽度作为最后的宽度,如果width大于final_width,则final_width=width,否则final_width保持不变;s327:图片最终的高度为每张图片高度的总和,所以final_height+=height。
[0025]
优选的,s4中,所述以水平方向拼接图片,主要步骤如下:s411:生成一张宽为fina_width,高为final_height的透明图片;s412:初始化图片粘贴的位置x=0,y=0;s413:获取图片的尺寸,宽记为width,高记为height;s414:在透明图片的(x,y)坐标上粘贴生成的图片;s415:x+=width。
[0026]
优选的,s4中,所述以竖直方向拼接图片,主要步骤如下:s421:生成一张宽为fina_width,高为final_height的透明图片;s422:初始化图片粘贴的位置x=0,y=0;s423:获取图片的尺寸,宽记为width,高记为height;s424:在透明图片的(x,y)坐标上粘贴生成的图片;s425:y+=height。
[0027]
与现有技术相比,本发明的有益效果是:本发明改进了以往ocr数据生成时,在背景图片上绘制指定文字这一环节,不采用简单的使用单个字体绘制图片或者直接更换不支持的字符的方式,而通过切割语料,找到不同字体在语料中支持绘制的文字部分,实现了任意字符组合的ocr数据生成方式,简单高效,为构建良好的ocr数据打下坚实的基础。
附图说明
[0028]
为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0029]
图1为本发明流程示意图。
具体实施方式
[0030]
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。
[0031]
请参阅图1,本发明提供一种技术方案:一种任意字符组合的ocr数据生成的方法,包括以下步骤:s1:通过字符字典、字体库和语料库生成字符

字体映射字典,得到字符和所有支持的字体之间的对应关系;s2:语料拆分;从语料库中获取待生成图片的一行文本,切分文本成多个字符串,找到各个字符串与其对应的字体;语料拆分的具体步骤如下:s21:读取待生成文本text中的第一个字符c;s22:从字符

字体映射字典取出字符c对应的所有字体列表s,返回空或返回字体;s23:根据s22中的返回值选择减少字符循环s21或将返回值记为temp_font,直到找到第一个有字体支持的字符c;s24:text为空或者字符返回的字体为空,结束所有步骤,否则遍历当前的文本text中的每一个字符c;s25:对于s24中的每一个字符c,进行迭代;s26:temp_font不为空,则得到分出的最后一段文本temp_text和对应的字体temp_font,将两者添加到文本

字体列表text_font_list中;s3:图片生成;将找到的各个字符串对应的字体选择性按照水平和竖直两种文字方向进行排列得到文字图片,将排列后的文字图片宽记为fina_width,高记为final_height,初始化为0;s4:图片拼接;将文字图片选择性按照水平和竖直两种方向进行拼接得到最终图片。
[0032]
本发明主要针对ocr数据生成时,在背景图片上绘制指定文字这一环节而进行改进,所以省略掉ocr数据生成时其他环节,实际ocr数据生成时可根据自己选择在透明图片或者背景图片上绘制文字,本专利以在透明图片上生成数据为例,在背景图片上的操作类似。
[0033]
本发明主要分成字符

字体映射字典生成、语料拆分、图片生成和图片拼接四个模块,流程图见图1,在生成数据前,需准备好字符字典、字体库和语料库,字符字典是语料中
出现的所有字符,字体库是所有想要使用的字体的集合,字体库需满足字符字典里的所有字符都至少有一个字体支持,否则会造成部分字符无法生成。语料库是需要生成的文本内容,形式不限,可根据自己的需求选择文本内容的生成形式,如果不给定语料,选择随机组合字符生成数据,则语料库也可以是字符字典。
[0034]
字符

字体映射字典生成字符

字体映射字典是一个字符和字体对应关系的字典,字典的键是字符字典中所有的字符,字典的值是支持该字符的所有字体集合。字符

字体映射字典的生成方式如下:s11:读取字符字典,初始化字符

字体映射字典为空;s12:遍历字体库中的所有字体;s13:分别读取s12的字体支持的所有字符;s14:遍历s13中的所有字符,如果字体支持的字符在字符字典中,则在该字符支持的字体列表中添加此字体对象;s15:字符

字体映射字典构建完成,得到了字符和所有支持的字体之间的对应关系。
[0035]
语料拆分从语料库中获取待生成图片的一行文本,因为无法确定是否有字体支持文本中的每个字符,所以需要对文本进行拆分,找出有多少连续的字符可以使用同一个字体,即切分文本成多个字符串,找到各个字符串与其对应的字体,如果字体支持该行文本中的所有字符,则不需要切分文本。
[0036]
s21:读取待生成文本text中的第一个字符c;s22中,所述从字符

字体映射字典取出字符c对应的所有字体列表s具体步骤如下:s221:如果字符c不在字符

字体映射字典里或者列表s为空,则返回空,s22结束;s222:如果列表s只有一个字体对象,则返回这个字体,s22结束;s223:如果列表s有多个字体对象,则从列表s中随机选取一个字体对象返回,s22结束;s23:为了找到第一个有字体支持的字符c,步骤如下s231:如果步骤2的返回值为空,且当前文本text不为空,则当前待生成的文本变成去掉第一个字符后的文本,即text = text[1:],回到步骤1,直到步骤2的返回值不为空,或者text变为空,步骤3结束;s232:如果步骤2的返回值不为空,记步骤2的返回值为temp_font,该字体支持的所有字符列表记为temp_char_list,步骤3结束;s24:如果此时text为空或者字符返回的字体为空,则代表没有任何字体支持待生成文本中的任何一个字符,结束所有步骤,如果此时第一个字符返回的字体temp_font不为空,则遍历当前的文本text中的每一个字符cs25:对于s24中的每一个字符c,进行以下迭代s251:如果c是text中的第一个字符,则记temp_text=c,当前使用的字体是c对应的字体temp_font,本次迭代结束;
s252:如果c非第一个字符,但字符c在当前字体的字符列表temp_char_list中,代表当前字体继续支持该字符,则temp_text+=char,本次迭代结束;s253:如果c非第一个字符,字符c不在当前字体的字符列表temp_char_list中,且temp_char_list不为空,代表当前字体只支持c之前的文本内容,则得到切分出的一段文本temp_text和对应的字体temp_font,将两者添加到文本

字体列表(记为text_font_list)中。此时temp_font等于步骤2的返回值。如果temp_font为空,说明没有支持当前字符的字体,则temp_text和temp_char_list都为空,否则temp_text=char,temp_char_list等于temp_font支持的所有字符列表,本次迭代结束;s26:如果此时temp_font不为空,则得到分出的最后一段文本temp_text和对应的字体temp_font,将两者添加到文本

字体列表text_font_list中。
[0037]
本发明通过语料拆分可实现多语言混合的数据生成,支持不常用字符的数据生成,支持特殊符号的数据生成等,同时通过拆分语料降低处理难度和成本。
[0038]
图片生成图片生成的方式文字方向息息相关,可分为水平和竖直两种文字方向,水平方向是指图片中的字符是按照从左往右的方式进行排列,竖直方向是指图片中的字符是按照自上而下的方式进行排列,其中为了方便后面的图片拼接,需要获得最终拼接后图片尺寸,记宽为fina_width,高为final_height,初始化为0。
[0039]
如果选择以水平的方式生成文字图片,遍历文本

字体列表text_font_list,主要步骤如下:s311:获得每一个切分好的文本和对应的字体s312:对于步骤1里的文本和字体,使用字体获得文本需要的图片尺寸,记高为height,宽为widths313:利用s312的尺寸生成一张同尺寸的透明图片;s314:在s313的透明图片上使用字体绘制文本内容;s315:将绘制好的图片加入结果列表中;s316: 因为不同字体生成的图片可能高度不一致,所以取图片最高的高度作为最后的高度,如果height大于final_height,则final_height=height,否则final_height保持不变s317:图片最终的宽就是每张图片宽度的总和,所以final_width+=width如果选择以竖直的方式生成文字图片,遍历文本

字体列表text_font_list,主要步骤如下:s321:获得每一个切分好的文本text和对应的字体fonts322:遍历文本text中的每一个字符c;使用字体获得字符c需要的图片尺寸,记高为height,宽为widths323:利用步骤201的尺寸生成一张同尺寸的透明图片s324:在s323的透明图片上使用字体绘制文本内容c;s325:将绘制好的图片加入结果列表中;s326:因为不同字体生成的图片可能宽度不一致,所以取图片最大的宽度作为最后的宽度,如果width大于final_width,则final_width=width,否则final_width保持不
变;s327:图片最终的高度为每张图片高度的总和,所以final_height+=height。
[0040]
图片拼接要得到最终的图片,需要将生成图片进行拼接,拼接图片的方式也是与文字方向有关。
[0041]
如果选择以水平的方式拼接图片,主要步骤如下:s411:生成一张宽为fina_width,高为final_height的透明图片(尺寸来自图片生成);s412:初始化图片粘贴的位置x=0,y=0;s413:获取图片的尺寸,宽记为width,高记为height;s414:在透明图片的(x,y)坐标上粘贴生成的图片;s415:x+=width。
[0042]
如果选择以竖直的方式拼接图片,主要步骤如下:s421:生成一张宽为fina_width,高为final_height的透明图片(尺寸来自图片生成);s422:初始化图片粘贴的位置x=0,y=0;s423:获取图片的尺寸,宽记为width,高记为height;s424:在透明图片的(x,y)坐标上粘贴生成的图片;s425:y+=height。
[0043]
本实施例的一个具体应用为:本发明不采用简单的使用单个字体绘制图片或者直接更换不支持的字符的方式,而通过切割语料,找到不同字体在语料中支持绘制的文字部分,克服了需要细粒度的分类算法来区分不同的语言,难度较大,且对于中文简体和中文繁体这样比较相近的字符往往难以区分,且增加了处理成本的问题。
[0044]
通过切割语料,找到不同字体在语料中支持绘制的文字部分,克服了数据的不均衡的问题,实现了任意字符组合的ocr数据生成方式,简单高效,可以生成指定字符组合。
[0045]
在本说明书的描述中,参考术语“一个实施例”、“示例”、“具体示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不一定指的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任何的一个或多个实施例或示例中以合适的方式结合。
[0046]
以上公开的本发明优选实施例只是用于帮助阐述本发明。优选实施例并没有详尽叙述所有的细节,也不限制该发明仅为所述的具体实施方式。显然,根据本说明书的内容,可作很多的修改和变化。本说明书选取并具体描述这些实施例,是为了更好地解释本发明的原理和实际应用,从而使所属技术领域技术人员能很好地理解和利用本发明。本发明仅受权利要求书及其全部范围和等效物的限制。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1