DB文本检测模型和CRNN文本识别模型的推理
CTPN讲解
本网络也分为三部分,允许任意大小的图像输入。它通过密集地滑动小窗口在卷积特征图上检测文本行,输入一个固定大小的文本建议序列。我们采用VGG16卷积神经网络来提取特征图,用3x3的小窗口在卷积最后一层上进行滑动。卷积最后一层conv5的结果大小显然已经由输入图像大小,卷积层参数确定了。
和传统目标检测不同,文本区域容易无法检测出全部文本,只得到部分区域,因为文本包含很多特征,比如笔画,字符,单词,文本行。因为单词有分开的特点,所以不容易预测文本的开始与结束。所以我们可以将文本行看成一个固定大小文本建议序列,比如每个文本建议为16像素宽,所以每个建议区域都包含文字的一部分。提高了准确率因为固定了很难检测的横向坐标。相比于以前的预测4个坐标,现在我们只需要预测纵向坐标。
对于每一个文本区域,预测两个结果,一个是竖直坐标,另一个是文本/非文本分数。
我们的文本建议是被定义为16像素宽的区域,其实就是移动检测器(检测器测量conv5中每一个空间位置)让步长为16即可。我们对于每个文本区域,用k个相同水平位置的框(纵坐标不同)来预测。
这k个框,每个的高度和中心坐标都可以通过输入图像直接计算。
检测过程总结如下:给定图片,生成特征图,通过CNN网络。然后当检测器滑动一个3x3窗口通过conv5时,每次窗口都会产生一个3x3xc的卷积特征,用来生成预测。对于每个预测,水平坐标x和k个框的位置是固定的,可以预先通过映射在conv5上的空间窗口坐标到输入图片。检测器输出文本/非文本比值和对于k个框的最终预测纵坐标。文本/非文本比值要大于0.7。我们的竖直框预测方法和固定建议区域宽度方法可以处理更大规模的文本行和不同高宽比的文本区域。和以前的Faster R-CNN和RPN相比,我们的精细尺度检测提供了更加详细的监督信息,并且给我们更准确的检测。
由于考虑单一孤立文本并不可靠,文本有很强的顺序特征,其中序列的上下文特征对于可靠决策非常重要。所以我们的检测器应该有能力来探索上下文信息以给出更可靠决定。所以我们在conv5的上一层加入了RNN。这里采用的是BLSTM。
对于引入LSTM的原因:为了解决梯度消失问题。
比如RNN中,有两层,每一层权重矩阵W和偏置b。我们知道在反向传播的过程中,梯度更新可以表示为:
而我们知道其中$\frac{\partial h_t}{\partial W}$会存在$\sigma$的导数,而sigma激活函数都是值小于1的,比如tanh和ReLU。因为每个激活函数的导数都小于1,所以随着时间步长增加,不断相乘会越来越小。LSTM引入三个门,遗忘门决定哪些信息重要,保留防止消失。输入门引入新的信息,输出门决定哪些信息输出。
最后在侧边调整方面,有一些边界处文本/非文本分数算出来较低的被丢弃掉但实际上存在文本,这样就会使得预测框要在真实框内部,会有一些空余量,不应该被我们忽视。我们通过计算 预测边界 相对 边界预测框中心 的偏移量,与,真实边界 相对 边界预测框中心的偏移量。对预测边界进行学习和调整。
DB算法详解
可微二值化有助于提高文本检测的准确性,因为它允许网络学习如何更好地处理二值化过程。
基于分割的场景文本检测在像素级的预测结果中,可以描述各种形状的文本,因此引起了人们的广泛关注。但是大多数基于分割的方法都需要后处理以将像素级别的预测结果归类成检测到的文本对象,耗费时间巨大。
本文主要贡献为提出了可微分二值化的近似函数,让二值化过程在CNN网络中变得可训练。通过结合简单的语义分割网络和DB模块,我们提出了鲁棒性和快速文本检测器,非常快,并且在轻量级骨干网络比如resnet18上表现优异。
过程,输入图片到特征金字塔网络中,特征金字塔的每一层都会被上采样并级联得到特征F,特征F被用来预测出概率图P和阈值图T。之后根据F和P计算出近似二值图B’。训练过程中,监督被用在P,T和B。
二值化
标准二值化
给出一个概率图$P \in R^{H\times W}$,由一个分割网络生成,然后将其转换成二进制概率图。(1表示有效文本区域,0表示非文本)比如这里可以看成传统阈值图,概率大于多少可以看做有效文本区域。通常这个二值化过程由以下表示
其中t为事先安排好的阈值。
可微分二值化
和CTPN的默认文本特征横向自左向右不同,DB方法直接对整个文本区域进行特征学习和文本检测,所以对于曲文本和多方向文本的准确率更高。因为得到概率图和阈值图进行分类的过程都在训练过程中,所以推理速度加快,减小后处理时间。
概率图P可以通过卷积神经网络加图像分割对图像进行分类,得到生成每个像素属于特定类别的概率图。
阈值图T可以通过全局阈值法,比如使用Otsu方法自动选择最佳阈值,使得前景和背景的类内方差最小。
其中T是自适应阈值,是从网络中学习到的(通过优化损失函数)(损失函数由概率图损失,阈值图损失组成),在学习了文本位置之后设置的,k是放大系数,一般被设置为固定值。自适应可微分的二值化不仅可以帮助从背景中微分文本区域,还可以分开紧密结合的文本对象。
DB性能的提高可以由梯度的反向传播来寻找原因。比如二进制交叉熵损失,
我们可以画出这些函数图像,有个特征就是当k很大时,会对梯度进行放大,而结合了指数和对数函数,图像会对错误预测区域的梯度放大非常明显。比如x<0对于positive labels l+,和x>0对于negative labels L-。因为x>0表示的是p>t也就是有效文本区域。0对于positive>
自适应阈值。阈值图外观上和文本边界图相似。然而阈值映射的动机和文本边界图不同。
数据集准备
数据集应该有的结构为:
1 | |-train_data |
一般我们对于普通配置的电脑的推理复现采用ICDAR2015小批量数据集。
在官网下载图片数据,然后采用Linux命令下载训练集和测试集标签。
1 | 训练集标签 |
然后将ICDAR的格式转换一下,转换工具如下:
1 | 将官网下载的标签文件转换为 rec_gt_label.txt |
最后的txt文件中格式应该如下:
1 | " 图像文件名 图像标注信息 " |
CRNN模型推理仿真
基于上下文线索进行序列识别比单独处理每个字符更加稳定和有帮助。此外RNN可以操控任意长度的序列。LSTM的特殊设计允许它捕获远程依赖关系,这经常发生在序列图像中。深度结构比浅层结构允许更高水平的抽象,也可以使得性能提高。
在数学上,转录是为了找到在每帧预测条件下概率最高的标签序列,即通过选择概率最高的标签序列来进行作为预测结果。计算标签序列的概率,用了 Connectionist Temporal Classification (CTC)算法,计算的是基于标签y1,y2…yt预测下的标签序列l的概率。其中t是序列长度。即可能有多种预测序列都指向同一个预测的标签序列l,那么这时候l的概率应该较高。
训练网络时,数据集只需要输入图片和其文字的真实标签序列。
1 | python3 tools/export_model.py -c configs/rec/rec_r34_vd_none_bilstm_ctc.yml -o Global.pretrained_model=./rec_r34_vd_none_bilstm_ctc_v2.0_train/best_accuracy Global.save_inference_dir=./inference/rec_crnn |
这是推理流程,然后自己配置一下yml文件,文件中要把LMDB数据集格式改为SimpleDataset格式。本模型推理的文件效果如下:
1 | Global: |
改成这种即可,除了数据集和测试集目录其他基本不用动。