1.本发明涉及图像合成
技术领域:
:,具体涉及一种随机版式票据图像合成的基础数据集构建方法。
背景技术:
::2.信息技术的飞快发展使得票据信息处理逐渐呈现智能化趋势,而公司业务种类日益增多,随之而来产生的票据类型也会增加。为了理解票据内容,快速便捷地汇总数据并发现其内在规律,高效、准确地提取多样化票据的关键信息变得尤为重要。因此越来越多的学者开始研究票据识别算法,但深度学习算法离不开数据驱动,有了大量的、多样的数据支撑,才能训练出更优秀的网络。目前在票据识别任务中能够获取的公开数据集较少,且存在样本稀缺、单一,采集、标注困难等突出问题,可以说票据数据的匮乏或昂贵往往是阻碍票据识别领域发展的直接原因,因此通过合成随机版式的票据图像构建票据图像数据集是非常有必要的。目前比较常用的数据集构建方法是:(1)基于原生票据图像构建数据集,该方法构建的数据集规模小、需手工标注。(2)基于爬虫技术采集图像构建数据集,该方法构建的数据集需人工剔除无关图,经筛选后的相关图像数量少、需人工标注。(3)基于票据模板合成图像构建数据集,该方法局限于模板,灵活性低。技术实现要素:3.针对现有技术的不足,本发明旨在提供一种随机版式票据图像合成的基础数据集构建方法,克服现有票据数据集构建方法中采集困难,样本稀缺、单一,依赖人工标注的不足,充分考虑了常见票据的特征、布局关系,使合成的票据样本版式布局多样、布局分布合理、票据文本多样。4.为了实现上述目的,本发明采用如下技术方案:5.一种随机版式票据图像合成的基础数据集构建方法,包括具体步骤如下:6.s1、票据表格线绘制,生成版式布局随机的票据表格:7.首先基于python的opencv库生成一张背景图片,获取图像的宽度和高度,据此绘制表格外边框,并记录表格外边框的左上角坐标和右下角坐标;然后基于表格外边框的左上角和右下角构成的y坐标值域范围,由上至下绘制表格内部的水平线,并将水平线的y坐标存放于水平线坐标队列qhorizon中;最后基于表格外边框的左上角和右下角构成的x坐标值域范围,由左至右绘制表格内部的垂直线,并将垂直线的x坐标存放于垂直线坐标队列qvertical中;8.s2、划定票据项目文本信息所在区域:9.针对步骤s1中绘制好的版式布局随机的票据表格,遍历队列qhorizon和qvertical存放的坐标数据,判定票据表格中的单元格类型,进而确定票据项目文本信息间的位置关系,最后确定票据项目文本信息所在的区域,并记录区域的位置信息和类别信息;10.s3、填充票据项目文本信息到确定区域:11.针对步骤s2中确定好的票据项目文本信息所在区域,采用python中的faker库,生成基础的票据文本信息;采用爬虫技术获得了票据中的物品信息并分类存储;最终基于python的pil库将生成的票据项目文本信息填充到区域内,并记录区域文本内容。12.进一步地,步骤s1的具体过程为:13.s1.1、绘制表格外边框:14.s1.1.1、基于python的opencv库生成一张背景图片,获取图像的宽度和高度;记背景图片宽度wblank,高度hblank;15.s1.1.2、计算表格外边框的高度hbox和宽度wbox,令hbox=t1hblank,wbox=t2wblank;t1∈[0.7,0.8],[0016]s1.1.3、计算表格外边框的左上角坐标值ltop(xltop,yltop)和右下角坐标值rbottom(xrbottom,yrbottom),xltop,xrbottom∈(0,wblank),yltop,yrbottom∈(0,hblank):令t0∈[0.7,0.8];xrbottom=xltop+wbox,yrbottom=yltop+hbox;[0017]s1.1.4、调用opencv库中的rectangle函数根据表格外边框的左上角坐标值和右下角坐标值在背景图片上绘制表格外边框;[0018]s1.2、绘制票据表格内部的水平线:[0019]s1.2.1、记第i条水平线的纵坐标为记表格外边框内部自上而下绘制的第i条水平线horizon(i)的左端点和右端点的坐标分别为和[0020]s1.2.2、构造起始水平线horizon(0),令其纵坐标为[0021]s1.2.3、将水平线的纵坐标存入水平线坐标队列qhorizon中;[0022]s1.2.4、生成相邻下一条水平线的纵坐标随机变量保证水平行样式的多样性;tsinglehorizonmin为新增的水平线与其相邻水平线之间的最小距离阈值,用于保证行高的合理性,若则否则[0023]s1.2.5、若调用opencv库中的line函数根据水平线horizon(i)左端点和右端点的坐标绘制该水平线并返回步骤s1.2.3,否则该绘制流程结束;[0024]s1.3、绘制票据表格内部的垂直线绘制:[0025]s1.3.1、记表格内第i个水平行自左向右绘制的第j条垂直线的横坐标为上端点和下端点的坐标值分别为和其中和在步骤s1.2中已经计算得到;[0026]s1.3.2、为第i个水平行构造起始垂直线vertical(i,0):令其横坐标为[0027]s1.3.3、使用垂直线坐标队列qvertical存放垂直线的横坐标;[0028]s1.3.4、若则以0.5的概率取第i-1个水平行对应的垂直线的坐标值,然后跳转至步骤s1.3.3;否则继续进行步骤s1.3.5;[0029]s1.3.5、生成相邻下一条垂直线的横坐标随机变量保证列布局样式的均衡性;tsingleverticalmin为新增的垂直线与其相邻垂直线之间的最小距离阈值,保证列宽合理性;若则否则[0030]s1.3.6、若调用opencv库中的line函数根据垂直线vertical(i,j)上端点和下端点的坐标绘制该垂直线并返回步骤s1.3.3,否则绘制流程结束。[0031]再进一步地,步骤s2的具体过程为:[0032]s2.1、单元格类型判定:[0033]s2.1.1、记票据表格内部的水平线纵坐标集合表格内水平线总数量为n+1;其中垂直线横坐标集合表格内垂直线总数量为n*(m+1);其中记第i条水平线和与之相交的第j条垂直线形成的右上侧的单元格为tablecelli(,j);[0034]记集合setcells_shorttall表示上下矮-高格集合,即项目名与项目值内容相关且项目名位于矮格,项目值位于高格;集合setcell_tall表示单高格集合,即项目名与项目值在同一单元格内,且在单元格内构成上下或左右位置关系;集合setcells_lrshort表示左右矮格集合,即项目名与项目值内容相关且项目名位于左矮格,项目值位于右矮格;集合setcell_wideshort表示宽矮格集合,即项目名与项目值位于同一单元格内;[0035]s2.1.2、根据队列qhorizon和qvertical构造集合sethorizon_y和setvertical_x;若则该水平行为矮行,否则为高行;tmultiplyhorizonmin为阈值,用于控制多行字符所需的行高极小值;若则单元格tablecelli(,j)为宽格,否则为窄格;twidemin表示阈值,用于控制宽格的宽度极小值;[0036]s2.1.3、若票据表格内所有上下相邻的单元格对(tablecell(i,j),tablecell(i+1,j)),0<i≤n,0≤j<m均满足且且且则以0.8的概率令(tablecell(i,j),tablecell(i+1,j))∈setcells_shorttall;[0037]s2.1.4、若票据表格内所有单元格tablecell(i,j),0<i≤n,0≤j<m,满足且该单元格不属于集合setcells_shorttall,则tablecell(i,j)∈setcell_tall;[0038]s2.1.5、若票据表格内所有左右相邻的单元格对(tablecell(i,j),tablecell(i+1,j)),0<i≤n,0≤j<m,满足且或(j=m-2),同时该单元格对(tablecell(i,j),tablecell(i,j+1))中任一单元格都不属于集合setcells_shorttall,且单元格对(tablecell(i,j+1),*)不属于集合setcells_lrshort,则令(tablecell(i,j),tablecell(i+1,j))∈setcells_lrshort;[0039]s2.1.6、若票据表格内所有单元格tablecell(i,j),0<i≤n,0≤j<m,满足且且该单元格不属于集合setcells_shorttall和setcells_lrshort,则tablecell(i,j)∈setcell_wideshort;[0040]s2.1.7、判定流程结束;[0041]s2.2、票据项目文本信息区域的生成:[0042]s2.2.1、记每个区域最大能容纳的字符个数为nc,一个单元格中最大能容纳的项目值区域个数为ncnt;[0043]记项目名区域左上角为ltop_itemname,并用表示,其中xitemname和yitemname分别为项目名区域左上角的横坐标和纵坐标;项目值区域左上角为ltop_itemvalue(k),并表示为其中k表示该单元格内自上到下的第k个项目值区域;表示每个项目值区域容纳的字符个数,其中0<k≤ncnt,和分别为第k个项目值区域左上角的横坐标和纵坐标;[0044]记区域与水平线的距离为dhorizonmin,区域与垂直线的距离为dverticalmin,区域之间的距离为dbbmin,字符大小为ttxtsizemin;[0045]记项目名区域的左上角坐标集合项目值区域的左上角坐标集合为[0046]s2.2.2、从集合sethorizon_y中提取从集合setvertical_x中提取[0047]s2.2.3、遍历宽矮格集合setcell_wideshort,依据计算项目名区域的左上角坐标,并将其加入setitem_name,依据计算项目值区域的左上角坐标,并将其加入setitem_value,下标(1)表示项目值区域的个数为1;[0048]s2.2.4、遍历左右矮格集合setcells_lrshort,依据,依据计算项目名区域左上角坐标,并将其加入setitem_name,依据计算项目值区域的左上角坐标,并将其加入setitem_value;[0049]s2.2.5、遍历单高格集合setcell_tall;[0050]若项目名与项目值构成上下关系,依据计算项目名区域的左上角坐标,并将其加入setitem_name,依据计算项目值区域的左上角坐标,其中并将其加入setitem_value;[0051]若项目名与项目值构成左右关系,依据项目名与项目值构成左右关系,依据计算项目名区域左上角坐标,其中0<t≤ncnt,并将其加入setitem_name,依据,依据计算项目值区域左上角坐标,其中并将其加入setitem_value;[0052]s2.2.7、遍历上下矮-高格集合setcells_shorttall,依据,依据计算项目名区域的左上角坐标,并将其加入setitem_name,依据,依据计算项目值区域的左上角坐标,其中并将其加入setitem_value。[0053]更进一步地,所述步骤s3的具体过程为:[0054]s3.1、生成票据相似文本:[0055]s3.1.1、使用命令pipinstallfaker安装faker库;[0056]s3.1.2、使用命令fromfakerimportfaker从faker模块导入faker这个类;[0057]s3.1.3、实例化faker类并保存到变量fake中;[0058]s3.1.4、按照要生成的基础票据文本信息的类别,调用对应含义的函数生成基础的票据文本信息,并对数据进行分类存储;[0059]s3.1.5、采用爬虫技术获得票据中的物品信息,并对获得的物品信息区分不同的类别并存储;[0060]s3.2、票据文本填充:[0061]s3.2.1、随机选取一个类别名信息,并从集合setitem_name中选取一个元素[0062]s3.2.2、基于python的pil库将类别名信息字段填充到项目名区域;[0063]s3.2.3、从对应类别信息的文本文档中选取一个信息字段,并从集合setitem_value中选取一个元素[0064]s3.2.4、基于python的pil库将对应信息字段填充到项目值区域。[0065]本发明的有益效果在于:利用本发明方法合成的票据样本版式布局多样、布局分布合理、票据文本多样,能有效提升文本定位网络模型的准确率。附图说明[0066]图1为本发明实施例的方法流程示意图。具体实施方式[0067]以下将结合附图对本发明作进一步的描述,需要说明的是,本实施例以本技术方案为前提,给出了详细的实施方式和具体的操作过程,但本发明的保护范围并不限于本实施例。[0068]本实施例提供一种随机版式票据图像合成的基础数据集构建方法,如图1所示,包括票据表格线绘制、划定票据项目文本信息所在区域、填充票据项目文本信息到确定区域等3个部分,基于常见票据特征和票据版面文本关系最终得以实现。票据表格线绘制部分用于生成版式布局随机的票据表格。划定票据项目文本信息所在区域用于在票据凭证中选取位置分布随机、映射关系各样的票据项目文本信息区域。填充票据文本信息到确定区域用于生成票据相似文本并将其填充到确定好的区域,最终合成了随机版式票据图像。[0069]本实施例的一种随机版式票据图像合成的基础数据集构建方法,包括具体步骤如下:[0070]s1、票据表格线绘制:生成版式布局随机的票据表格[0071]首先基于python的opencv库生成一张背景图片,获取图像的宽度和高度,据此绘制表格外边框,并记录表格外边框的左上角坐标和右下角坐标;然后基于表格外边框的左上角和右下角构成的y坐标值域范围,由上至下绘制表格内部的水平线,并将水平线的y坐标存放于水平线坐标队列qhorizon中,为绘制垂直线做准备。最后基于表格外边框的左上角和右下角构成的x坐标值域范围,由左至右绘制表格内部的垂直线,并将垂直线的x坐标存放于垂直线坐标队列qvertical中。[0072]s2、划定票据项目文本信息所在区域:[0073]针对步骤s1中绘制好的版式布局随机的票据表格,遍历队列qhorizon和qvertical存放的坐标数据,判定票据表格中的单元格类型,进而确定票据项目文本信息间的位置关系,最后确定票据项目文本信息所在的区域,并记录区域的位置信息和类别信息。[0074]s3、填充票据项目文本信息到确定区域:[0075]针对步骤s2中确定好的票据项目文本信息所在区域,采用python中的faker库,生成基础的票据文本信息,如姓名、地址、邮箱、电话、账号等;采用爬虫技术获得票据中的物品信息,如衣服、服装、家具、生活用品等。最终基于python的pil库将生成的票据项目文本信息填充到对应的区域内,并记录区域的文本内容。[0076]具体地,在本实施例中,步骤s1的具体过程为:[0077]s1.1、绘制表格外边框:[0078]s1.1.1、基于python的opencv库生成一张背景图片,获取图像的宽度和高度;记背景图片宽度wblank,高度hblank;[0079]s1.1.2、计算表格外边框的高度hbox和宽度wbox,令hbox=t1hblank,wbox=t2wblank;经证明t1∈[0.7,0.8],[0080]s1.1.3、计算表格外边框的左上角坐标值ltop(xltop,yltop)和右下角坐标值rbottom(xrbottom,yrbottom),xltop,xrbottom∈(0,wblank),yltop,yrbottom∈(0,hblank):令t0∈[0.7,0.8];xrbottom=xltop+wbox,yrbottom=yltop+hbox;[0081]s1.1.4、调用opencv库中的rectangle函数根据表格外边框的左上角坐标值和右下角坐标值在背景图片上绘制表格外边框。[0082]s1.2、绘制票据表格内部的水平线:[0083]s1.2.1、记第i条水平线的纵坐标为记表格外边框内部自上而下绘制的第i条水平线horizon(i)的左端点和右端点的坐标分别为和[0084]s1.2.2、构造起始水平线horizon(0),令其纵坐标为[0085]s1.2.3、将水平线的纵坐标存入水平线坐标队列qhorizon中;[0086]s1.2.4、生成相邻下一条水平线的纵坐标随机变量保证水平行样式的多样性;tsinglehorizonmin为新增的水平线与其相邻水平线之间的最小距离阈值,用于保证行高的合理性,若则否则[0087]s1.2.5、若调用opencv库中的line函数根据水平线horizon(i)左端点和右端点的坐标绘制该水平线并返回步骤s1.2.3,否则该绘制流程结束;[0088]s1.3、绘制票据表格内部的垂直线绘制:[0089]s1.3.1、记表格内第i个水平行自左向右绘制的第j条垂直线的横坐标为上端点和下端点的坐标值分别为和其中和在步骤s1.2中已经计算得到;[0090]s1.3.2、为第i个水平行构造起始垂直线vertical(i,0):令其横坐标为[0091]s1.3.3、使用垂直线坐标队列qvertical存放垂直线的横坐标;[0092]s1.3.4、若则以0.5的概率取第i-1个水平行对应的垂直线的坐标值,然后跳转至步骤s1.3.3;否则继续进行步骤s1.3.5;[0093]s1.3.5、生成相邻下一条垂直线的横坐标随机变量保证列布局样式的均衡性;tsingleverticalmin为新增的垂直线与其相邻垂直线之间的最小距离阈值,保证列宽合理性;若则否则[0094]s1.3.6、若调用opencv库中的line函数根据垂直线vertical(i,j)上端点和下端点的坐标绘制该垂直线并返回步骤s1.3.3,否则绘制流程结束。[0095]在本实施例中,步骤s2的具体过程为:[0096]s2.1、单元格类型判定:[0097]s2.1.1、记票据表格内部的水平线纵坐标集合表格内水平线总数量为n+1;其中垂直线横坐标集合表格内垂直线总数量为n*(m+1);其中记第i条水平线和与之相交的第j条垂直线形成的右上侧的单元格为tablecelli(,j);[0098]记集合setcells_shorttall表示上下矮-高格集合,即项目名与项目值内容相关且项目名位于矮格,项目值位于高格;集合setcell_tall表示单高格集合,即项目名与项目值在同一单元格内,且在单元格内构成上下或左右位置关系;集合setcells_lrshort表示左右矮格集合,即项目名与项目值内容相关且项目名位于左矮格,项目值位于右矮格;集合setcell_wideshort表示宽矮格集合,即项目名与项目值位于同一单元格内;[0099]s2.1.2、根据队列qhorizon和qvertical构造集合sethorizon_y和setvertical_x;若则该水平行为矮行,否则为高行;tmultiplyhorizonmin为阈值,用于控制多行字符所需的行高极小值;若则单元格为宽格,否则为窄格;twidemin表示阈值,用于控制宽格的宽度极小值;[0100]s2.1.3、若票据表格内所有上下相邻的单元格对(tablecell(i,j),tablecell(i+1,j)),0<i≤n,0≤j<m均满足且且且则以0.8的概率令(tablecell(i,j),tablecell(i+1,j))∈setcells_shorttall;[0101]s2.1.4、若票据表格内所有单元格tablecell(i,j),0<i≤n,0≤j<m,满足且该单元格不属于集合setcells_shorttall,则tablecell(i,j)∈setcell_tall;[0102]s2.1.5、若票据表格内所有左右相邻的单元格对(tablecell(i,j),tablecell(i+1,j)),0<i≤n,0≤j<m,满足且或(j=m-2),同时该单元格对(tablecell(i,j),tablecell(i,j+1))中任一单元格都不属于集合setcells_shorttall,且单元格对(tablecell(i,j+1),*)不属于集合setcells_lrshort,则令(tablecell(i,j),tablecell(i+1,j))∈setcells_lrshort;[0103]s2.1.6、若票据表格内所有单元格tablecell(i,j),0<i≤n,0≤j<m,满足且且该单元格不属于集合setcells_shorttall和setcells_lrshort,则tablecell(i,j)∈setcell_wideshort;[0104]s2.1.7、判定流程结束;[0105]s2.2、票据项目文本信息区域的生成:[0106]s2.2.1、记每个区域最大能容纳的字符个数为nc,一个单元格中最大能容纳的项目值区域个数为ncnt;[0107]记项目名区域左上角为ltop_itemname,并用表示,其中xitemname和yitemname分别为项目名区域左上角的横坐标和纵坐标;项目值区域左上角为ltop_itemvalue(k),并表示为其中k表示该单元格区域内最多容纳的项目值区域个数;表示每个项目值区域容纳的字符个数,其中0<k≤ncnt,和分别为自上而下的第k个项目值区域左上角的横坐标和纵坐标;[0108]记区域与水平线的距离为dhorizonmin,区域与垂直线的距离为dverticalmin,区域之间的距离为dbbmin,字符大小为ttxtsizemin;[0109]记项目名区域的左上角坐标集合项目值区域的左上角坐标集合为[0110]s2.2.2、从集合sethorizon_y中提取从集合setvertical_x中提取[0111]s2.2.3、遍历宽矮格集合setcell_wideshort,依据计算项目名区域的左上角坐标,并将其加入setitem_name,依据计算项目值区域的左上角坐标,并将其加入setitem_value,下标(1)表示项目值区域的个数为1;[0112]s2.2.4、遍历左右矮格集合setcells_lrshort,依据,依据计算项目名区域左上角坐标,并将其加入setitem_name,依据,依据计算项目值区域的左上角坐标,并将其加入setitem_value;[0113]s2.2.5、遍历单高格集合setcell_tall;[0114]若项目名与项目值构成上下关系,依据计算项目名区域的左上角坐标,并将其加入setitem_name,依据计算项目值区域的左上角坐标,其中并将其加入setitem_value;[0115]若项目名与项目值构成左右关系,依据项目名与项目值构成左右关系,依据计算项目名区域左上角坐标,其中0<t≤ncnt,并将其加入setitem_name,依据,依据计算项目值区域左上角坐标,其中并将其加入setitem_value;[0116]s2.2.7、遍历上下矮-高格集合setcells_shorttall,依据,依据计算项目名区域的左上角坐标,并将其加入setitem_name,依据,依据计算项目值区域的左上角坐标,其中并将其加入setitem_value。[0117]本实施例中,所述步骤s3的具体过程为:[0118]s3.1、生成票据相似文本:[0119]s3.1.1、使用命令pipinstallfaker安装faker库;[0120]s3.1.2、使用命令fromfakerimportfaker从faker模块导入faker这个类;[0121]s3.1.3、实例化faker类并保存到变量fake中;[0122]s3.1.4、按照要生成的基础票据文本信息的类别,调用对应含义的函数生成基础的票据文本信息,并对数据进行分类存储,如调用name()方法即fake.name()随机生成一个名字等。要生成的基础票据文本信息的类别可以自定义,如姓名、地址、邮箱、电话、账号等。[0123]s3.1.5、采用爬虫技术获得票据中的物品信息,并对获得的物品信息区分不同的类别并存储,如衣服、服装、家具、生活用品。[0124]s3.2、票据文本填充:[0125]s3.2.1、随机选取一个类别信息,并从集合setitem_name中选取一个元素[0126]s3.2.2、基于python的pil库将类别信息字段填充到项目名区域;[0127]s3.2.3、从对应类别信息的文本文档中选取一个信息字段,并从集合setitem_value中选取一个元素[0128]s3.2.4、基于python的pil库将对应信息字段填充到项目值区域。[0129]对于本领域的技术人员来说,可以根据以上的技术方案和构思,给出各种相应的改变和变形,而所有的这些改变和变形,都应该包括在本发明权利要求的保护范围之内。当前第1页12当前第1页12