准备识别数据
对于识别任务,我们必须提供文本图像作为输入,以及编码的文本序列(在该图像中)。在给出图像作为输入之前,我们将调整所有图像的高度和宽度。在我的例子中,我将所有图像的大小调整为(15,64,3)。我对所有与图像对应的文本进行了编码,并在Keras预处理库的帮助下依次进行了转换。因此,在编码之后,我们的输出将是(1,15)的形状,这15从哪里来,我将所有编码的文本填充为15个长度。
如果批大小为32,则输入形状为(32,15,64,3),输出形状为(32,1,15)。
训练检测与识别模型
检测模型-
第一篇研究论文是https://arxiv.org/pdf/1801.01671.pdf,它解释了整个工作。在本文“FOTS”中,他们同时进行了检测和识别,这是端到端系统,意思是如果我们给出一个有文本的场景,那么它将返回检测到的文本区域,并对文本进行识别。首先,他们提取特征图,用一些CNN检测文本区域,然后,他们在检测区域的序列解码的帮助下进行识别部分。
首先,他们从图像中提取特征的帮助下共享层的卷积,然后这些特征在文本检测分支(这又是一堆褶积层)然后文本检测分支预测b框(边界框)和边界框的方向,本预测输出和ROI旋转使面向文本区域固定高度和长宽比不变,然后这个转到文本识别分支(也就是RNN)和CTC解码器,它给出预测的文本。
但我已经实现了两部分,首先我有一个训练过检测模型,然后我有一个训练过的识别模型。因为我们有这两个任务的数据。
所以我们的检测部分是受East 论文的启发,https://arxiv.org/abs/1704.03155。本文介绍了一种从不同背景的场景中检测文本的方法。该网络使用的架构由卷积层、池化层和规范化层组成。
这个网络的灵感来自于u形网络,正如你所看到的,从特征提取器的中层,我们将信息提取到特征合并分支。
这里我们使用了预先训练的resnet50模型,该模型在imagenet数据集上进行了训练,用于提取特征并将其用于特征合并分支。你可以看到前50个训练时代的检测模型-
识别模型
对于识别模型,我们使用了一些初始的Conv层、批处理归一化层和max-pooling层从图像中提取信息,之后我们必须使用一个双向LSTM层。
对于如何构建数据的识别模型,我已经在上面的准备数据一节中解释过了。
你可以在这里看到识别模型的训练时代
训练代码整合
现在我们需要创建一个管道或者说是python函数,它可以获取图像并返回带有高亮文本区域和文本的图像。
为了编写这个函数,我们将使用NMS(Non-Max suppression)技术和一个ROI-ROTATE方法。问题是什么是NMS, NMS是一种选择与文本区域相交较高的边框的技术。在预测之后我们将得到shape的输出(512,512,6)。geo-map,score-map和angle的帮助下,我们将首先制作很多边界框要。假设图像中已有文本,现在将该图像提供给检测模型,我们将获得6个通道的结果图,现在我们将只提取所有6个通道中的像素,这些像素在预测得分图中的值为1,这样我们就拥有了文本区域像素的位置及其与像素顶部,右侧,底部和左侧的预测距离矩形。每个像素都有它自己的边界框(我们知道区域的面积,像素和距离两边的像素),所以最后得分图和距离的帮助下,我们将得到一个为每个像素边界框。此后,NMS的工作就开始了,NMS选择其中包含大部分文本的最佳边界框。然后,我们用ROI旋转技术旋转这些边界框中的区域。现在我们在边界框的帮助下裁剪文本图像,并将其发送到识别模型,识别模型给出文本输出。现在我们将在TensorFlow ctc_decoder方法的帮助下解码这个输出。在这之后,我们可以很容易地得到我们的文本。
显示结果
我已将此图片提供给我的管道
得到如下结果:
正如我们在此处看到的那样,它正在检测“ fendi”和更多的单词,并且可以正确识别“ fendi”单词。
现在我们可以看到更多示例
我们可以在上图中看到该模型的检测和识别能力还是可以的
但是,有些图像在模型上表现不佳,例如,如果图像中的单词很大或单词的角度一定,则无法正确检测到它们,也无法正确识别它们。查看一些示例-
因此,要解决此问题,首先,我们可以使用更多数据,我们仅在1300张图像上训练了我的检测模型,并且您也可以在识别模型的训练中获取更多数据。因此,如果我们训练更多的数据,则该模型可能会为包含文本的每个像素预测更准确的标注。
完整代码:https://github.com/vishwas-upadhyaya/mercari_price_suggestion