与从文本中度量文档相比,从图像度量文档的相似性比较复杂,原因有两个。在这些图像可能在亮度、文本背景、图表或符号方面具有相似性。在
与文本信息相比,从文档包含的图像中找到文档的表示形式通常比较困难。在
解决方案
我的解决方案是使用机器学习来查找文档的表示形式,并使用此表示对文档进行分类。
在这里,我将给Keras实现我提出的解决方案。在
网络类型
我建议使用卷积层进行特征提取,然后使用递归层进行序列分类。我选择keras是因为我很熟悉,它有简单的API来定义一个结合了卷积层和递归层的网络。但代码可以很容易地更改为其他库,如Pytorch、Tensorflow等
图像预处理
神经网络对文档图像进行预处理的方法很多。我在做假设。在图像包含水平文本而不是垂直文本。在
文档图像大小是固定的。如果图像大小不固定,可以使用opencv's resize方法调整大小。在
垂直拆分图像,以便将行作为序列进行馈送(如果可以在空行上生成拆分行,则效率更高)。我将在单个文档中使用Numpy来显示这个。在下面的实现中,我假设单个文档的图像形状是(100,100,3)。
首先,让我们定义图像形状文档图像的形状import numpy as np
image_shape = (100, 100, 3)
split_size = 25 # this should be factor of the image_shape[0]
doc_images = [] #
doc_image = np.zeros(image_shape)
splitted_images = np.split(doc_image,[split_size], axis=0)
doc_images.extend(splitted_images)
doc_images = np.array(doc_images)
网络实现
Keras有ConvLSTM2D层来处理序列图像。网络的输入是通过分割文档图像而产生的图像序列的列表。在
^{pr2}$
理想情况下,这个模型可以工作,因为模型可以从图像中学习文档的层次表示(字符、单词、句子、上下文、符号)。在