论文名称: Deep Splitting and Merging for Table Structure Decomposition
论文出处:2019 International Conference on Document Analysis and Recognition (ICDAR)
论文下载地址:https://ieeexplore.ieee.org/document/8977975
论文github上的实现:https://github.com/CharlesWu123/SPLERGE
表格识别是OCR识别任务的一个小众分支,表格识别的论文比较少见,讨论度也不高。今天介绍的这篇论文是2019年 icdar表格检测竞赛上表现非常优秀的一个实现。关于这个竞赛可以参考下面这两篇综述:
论文介绍
表格广泛用于展示和组织结构化数据。自动识别表格的组织结构是文档理解和信息抽取的一个重要分支。文档传播中可能出现表格的载体有图片和pdf文档,图片由像素构成,不包含任何的表格的组织信息。pdf中则会包含绘制时的矢量信息,但是表格的结构信息也不是显式的展示在pdf的绘制指令中的。
表格识别的那点在于有些表格并没显式绘制表格边框线或者表格内部线条,而是采用阴影或者不同颜色来区分表格单元。其次是跨单元的cells也增加了表格结构分析的难度。
之前的大部分工作采用基于规则的方式处理pdf文档,随着深度学习在目标检测和语义分割领域的发展,表格分析中应用深度学习也显得受益匪浅。2017年的模型deep DeSRT使用语义分割模型来处理自然场景图片,并利用图片的局部信息来判断像素是否是分隔符。但是这种局部信息通常不足以识别单元格的边框,因为单元格和单元格分隔符之间可能包含大量的空白区域。比如下面这张图,忽略其中的蓝色和红色预测线(我从论文后面的实验里面截取的,单纯用于说明存在的问题),每个表格单元存在大量空白线,且垂直单元之间没有显式的线段分隔,那么局部信息就很难判断某个像素是否属于单元格或者是分割线。而且有的两列之间都不存在分割线,需要看文字的垂直分布情况来暗示究竟有几列。
本文中采用了projection pooling来传输全局的是否分割的信息。本文的网络可以分为两个部分,split网络和merge网络。split网路用于预测表格的横竖线位置,merge网络则根据split提供的横竖线对单元格进行merge。如下图所示,split识别的横竖线会将原本应该融合的单元格进行拆分,比如最上面一行和左边的第二行。而单元格融合的部分则交给merge model或者采用基于启发式的方法实现。作者给这个两段式的网络起名为splerge(英语太弱了,不知道该怎么发音,欢迎告知)
截图 (1).png
在split阶段,作者采用了一种projection pooling的池化方法可以将行列像素信息的特征在整张图中传递。因此同一行中的像素,即使在图片的一边,也可以很方便的交换该行边界的位置信息给其他的节点。这个模型会输出表格的网格结构,但是会忽略跨单元的单元格(如上图二所示)
在merge阶段,把原图和split阶段的输出未做输入,通过深度网络预测那些单元格需要被合并。merge模型中使用了一个grid pooling网格池化的池化方法,网格池化的网格由split阶段输出的网格信息决定。这个池化方法可以讲一个网格中的像素特征信息在网格(或者理解为单元格,cells)中传递共享,并且允相邻表格之间的特征共享。
本文的模型可以实现STA的表现,从数据上看基本是目前最强的。
模型具体实现细节
从pipeline的顺序角度依次介绍这两个模型,以及在上面提到的看起来非常神奇的两个池化操作。
split model
split网络的输入是任意尺寸的输入图片H×W,输出是两个一维预测结果r,c. r表示行预测结果,长度为H,每个元素在[0,1]之间,表示该行像素是分隔符的概率。列的输出c与之类似。
模型有三个子网络构成:
- 共享的全卷积网络(SFCN)
- Row Projection Network(RPN)
- Column Projection Network(CPN)
SFCN网络对输入的图像进行局部信息的提取,一切都仿佛很平常的FCN网络(实际也是很平常的),然后将得到的feature map给RPN和CPN网络共享,RPN和CPN是两个独立的网络分支,使用共享的FCN网络的特征预测行分隔符和列分隔符。
平平无奇的SFCN网络是由3层conv结构构成,卷积核的大小为7*7,并且在最后一层上采用了膨胀卷积,膨胀卷积的膨胀因子为2.每层网络输出18个feature maps,并使用ReLU作为激活函数。膨胀卷积的作用类似与池化操作,都是扩大后面层的感受野,不过保存了输入的空间分别率信息。输入的空间分别率信息对于表格的识别很重要,因此行列线段也只占了几个像素的宽度,如果图像的分辨率降低,那么可能横竖线就因为信息太少被隐去了。而大的感受野也很重要,因此决定行列分隔符的位置需要更多的全局信息。一句话总结:膨胀卷积棒棒哒!
截图 (3).png
讲完了平平无奇的SFC网络,我们看到该层的输出会作为RPN和CPN网络的输入,这两个网络可以看做是相对独立的但是原理类似的,我们讲行分隔符分类网络来概括这两个网络的结构设计。 这个模块的输出就是split网络的输出了。在训练的时候,这三个模块是一起训练的。
RPN模块的结构如上图Figure. 2所示,这是其中一个block的结构,一个RPN网络由这样的5个block结构串联而成。为什么是5个block呢?因为作者在实验中发现,增加block的数量不会再提升网络的性能了,反而增加了网络的时间消耗。
输入首先通过三个并联互不影响的膨胀卷积层,卷积层的膨胀因子分别是2/3/4,每个卷积层产生6通道输出,然将输出简单stack成18信道输出的结构,这里使用不同膨胀因子的卷积的目的是学习不同尺寸的特征,在增加感受野的同时保持局部特征。对于行检测而言,之后会通过一个1*2的最大池化层,这一层的作用是减小特征图的宽度保持特征图的高度,保证行信息不会减少。只有最初的三个block使用了最大池化层,这样可以避免宽度上的过度下采样。
在经过最大池化层之后,按照从上到下的三层最终会stack成一个输出结果。最上面的一层首先经过一个1*1卷积层,然后通过projection pooling层,projection pooling受到投影轮廓操作的启发,在这个操作中,空间尺寸信息不变,每个像素的特征由线面的公式决定,简单来说,特征像素的值等于该行特征像素值的平均值。
截图 (4).png
i表示第i行,W表示宽度,Fij'表示ij位置上的特征值。这个操作在每张feature map上独立执行,用于获得该行的全局信息。
下面给出了一个Projection pooling的图解。最左边的是原图,原图是由左到右依次呈现紫蓝绿黄橙红粉的颜色分布。中间图是通过行Projection pooling的图片,每个元素都等于该行元素的平均值,那么因为颜色这么多所以平均色就是脏脏的灰色了。最右边是列Projection pooling,每个元素是每一列的平均值,因此基本呈现和原图类似的颜色分布,不过每列的每个元素都是相同的。
截图 (5).png
中间层之是前面一层中的是最大池化层,不做任何操作的输出。这样最终的聚合结果上又有全局信息又有局部信息。
最下面一层展示了block如何产生最终我们需要的预测结果。这一层并不是每个block都有的,首先经过一个1*1卷积得到1信道输出的特征图,然后使用Projection pooling,最后经过一个sigmoid函数,最终产生一个1维垂直向量来表示概率,第n个block的输出标记为r^n。为了在后面层中也能使用到这个概率信息,会将其扩充成二维向量叠加到输出结果中。
在作者的实际实践中,只有最后的三个block产生了这个输出结果,标记为r3,r4,r^5.在训练的过程汇总,loss函数也是针对着三个结果的加权平均结果。在实际的预测中,只会使用最后一个block的结果。可以这么理解,中间层的输出是为了在自然训练的过程中添加人工干预,让其可以更快的认识到自己的错误明确自己的学习目标。这种技术也在其他的场景中成功的应用,比如人体姿态识别。
split模型的训练
讲到这里,split的结构已经谁介绍清楚了,SFCN,RPN,CPN网络是一起训练的。
GT的标记:GT的标记是一维的结果,为了可视化,作者给出了一个二维扩展之后的图片,可能看起来有点看不懂。对于行来说,GT是最大的行分割区域:在这个区域中不会接触到上下的文字,因此如右图所示,之所以会遮住australia几个字是因为二维扩充的过程中给遮住了。右图的列也是同理。那么这些被遮住的文字区域,本质是因为跨单元的单元格,这个问题会在merge model那里被解决。
之所以要这么设计GT,是因为预测大区域比预测小区域要简单。如果按照传统的表格分隔符的尺寸,横竖线都很难预测到。另一个原因是在无线段的表格中,很难定义细的行列分隔符的具体位置在哪里。
截图 (6).png
采用交叉熵损失函数来定义loss:
截图 (7).png
为了避免过拟合,会将 image.jpeg 的预测结果的loss设置为0.
整体的loss是第3/4/5层输出概率的加权平均结果:
截图 (8).png
在训练参数如下,采用ADAM优化算法,weighted 10^6,batch size=1,初始learning rate=0.00075,,每80000个iteration的衰减因子为0.75。
预测时如何确定行分隔符的具体位置,这个问题源于我们的GT是如此的不寻常。在预测中,首先使用图分割算法将r分隔为行分隔符区域和行内容区域。然后选择行分隔符区域的中心点位置来作为行分隔符的位置。
行分割需要执行下面的操作,我没有看懂,希望有看懂的同学可以解惑一下
image.jpegmerge model
老实说,这部分我看的超级头疼,在后面的实验效果环节也很疑惑这个的作用。
merge model的作用是使输出哪些网格单元需要被合并。网络的输入由下面几个要素组成:
1. 原始表格图像
2. split model输出的一维r,c预测结果。这个一维结果需要被扩充成二维,通过简单的重复预测结果。比如对于行预测结构r而言,它有H个元素,将其扩充到H×W则是将每行的结果重复W遍。
3. 相应的行列区域,类似于上面的Figure.4的二值化mask,我的理解是在split的输出中,我们通过图分割算法得到行分隔符区域和行间区域的位置,然后类似与2中的操作,讲这个结果扩充到二维图像大小。
4. 预测的网格结构grid struture,也是一个二值化mask,在split model的输出中,我们得到行分隔符区域,然后用其中心点作为行分隔符的真实位置,然后我们将这个真实pixel扩充成7pixel的宽度,绘制表格的行列。得到预测网格结构的二值化mask.
merge model的输出是两个矩阵,D-probs 和R-probs。假设在4中的网格结构是一个M×N的结构,那么输出结构如下:
image.jpegD-prob用于预测需要从上到下的合并单元格的概率,R-probs用于预测需要从左到右合并单元格概率。Dij表示cell(i,j)需要和cell(i+1,j)合并的概率。因为对于M个单元格只需要M-1次判定,所以矩阵的大小是(M-1)×N. R-probs也是类似的理解。
因此对于如下图所示的表格,行的D-probs的第二行第一个元素为1,表示(1,0)单元格需要和(2,0)单元格合并。
image.jpegmerge model并不是直接输出这两个概率结构的,实际是输出了四个大小为M×N的矩阵,然后通过数学运算得到D-probs 和R-probs.
具体的merge model的网络结构和split model的网络结构类似。首先是一个SFCN网络,该网络由4层conv网络构成,这里没有使用膨胀卷积,并且在第二层和第四层之后有2*2平均池化层。
在split model中SFCN之后是两个分支分别预测行列信息,而在merge model中则是四个分支,每个分支产生一个M×N输出,标记为u,d,l,r,用于预测网格是否应该在指定方向(上下左右)上连接。然后通过下面的公式得到D-probs 和R-probs.
image.jpeg具体来讲讲上面公式的理解,ui+1,j表示cell(i+1,j)这个单元格需要往上合并的概率,dji表示cell(i,j)单元格需要朝下合并的概率,着两个矩阵都是单独预测的,如果这两个值都很大,那么说明这两个单元格需要合并,因此Dij=cell(i,j)要和cell(i+1,j)合并的概率,就是这样计算得到的。
讲完了SFCN以及后面四个分支的含义,我们还没有提到这四个分支具体是怎么样的结构。下面就介绍这分的结构。每个分支都由三个blocks串联而成,结构和split model的block类似,首先是三个并联的膨胀卷积,卷积的膨胀因子是1/2/3。 不使用最大池层。也不使用Projection pooling,而是使用一种成为grid pooling的池化结构,这种池化结构之后,每个像素的特征等于该像素所属网格的特征的平均值决定。
image.jpeg可视化的效果图如下,不解释了。这里提到的网格,是我们提到的预测网络结构grid struture的二值化mask,在输入的时候已经确定了尺寸为M×N,不会在merge model中发生改变。
截图 (9).png
通过grid pooling之后,每个网格中的特征值共享了。
然后通过后续的卷积操作就可以实现相邻单元格之间的特征传递。
为了得到分支的M×N矩阵输出,将每个grid cell中的预测概率取平均值,分配到M×N的grid struture结构中。
和split model中类似,第2和3个block的预测结构都会用于loss的计算。
merge model的训练过程
split model的输出会作为这个网络的输入。GT的产生如上面的Figure. 6所示。
损失函数如下:
image.jpeg因为只有15%的表格存在跨单元的单元格,因此我们采用上采样的方法,让50%的训练集都至少有一对单元格需要合并
训练的超参数和split model的超参数类似。
在预测阶段,D和R的阈值都设定为0.5,因为在网络预测阶段没有添加“合并之后的结构必须是矩形“,因此也有可能会出现L形状的预测结构,这就需要在后处理中使用额外的合并,将L形结果合并成一个矩形(也就是增加一个合并,使2*2的四个单元格合并起来)
实验效果
image.jpeg从实验结果中,我们看到单独使用split网络已经可以获得较高的FM值,如果使用split网络叠加启发式的后处理方式,那么效果可以提升到93.00,如果使用PDF中的绘制信息,可以达到95.26。可以见在不适用merge model的情况下,效果就已经很赞了。(这也是我不能理解merge model使用的的原因,不过作者提到对于他们使用的私人数据集,merge model可以提升3个点)
那么这里提到的启发式的后处理是哪些后处理手段呢?作者大概归纳了这些规则:
1. 如果预测的分隔符穿过了文字,那么就合并这些cell
2. 如果预测得到这样的相邻列,它们中的两列都是空白的,或者其中一列是空白的,那么就有内容的列和空白列合并起来。
3. 如果是第一行,则将相邻空白列和相邻的带文字的列合并起来。
4. 如果同一列的文字之间有连续一致的空白区域,那么就将其按照文字的起始位置分割开
下面是具体的对应情况,第一条规则对应b图,第二条规则对应c图,第三条规则对应a图,第四条规则对应d图
image.jpeg讲到这里就木有啦。接下来准备去git上面看看代码,希望还会继续记录代码吧~
网友评论