本专栏将逐一盘点自然语言处理、计算机视觉等领域下的常见任务,并对在这些任务上取得过 SOTA 的经典模型逐一详解。前往 SOTA!模型资源站(sota.jiqizhixin.com)即可获取本文中包含的模型实现代码、预训练模型及 API 等资源。
本文将分 3 期进行连载,共介绍 17 个在OCR任务上曾取得 SOTA 的经典模型。
- 第 1 期:CTPN、TextBoxes、SegLink、RRPN、FTSN、DMPNet
- 第 2 期:EAST、PixelLink、TextBoxes++、DBNet、CRNN、RARE
- 第 3 期:ABCNet、Deep TextSpotter、SEE、FOTS、End-to-End TextSpotter
您正在阅读的是其中的第 1 期。前往 SOTA!模型资源站(sota.jiqizhixin.com)即可获取本文中包含的模型实现代码、预训练模型及 API 等资源。
本期收录模型速览
模型 | SOTA!模型资源站收录情况 | 模型来源论文 |
CTPN | https://sota.jiqizhixin.com/project/ctpn 收录实现数量:3 支持框架:PyTorch、TensorFlow |
Detecting Text in Natural Image with Connectionist Text Proposal Network |
TextBoxes | https://sota.jiqizhixin.com/project/textboxes | TextBoxes: A Fast Text Detector with a Single Deep Neural Network |
SegLink | https://sota.jiqizhixin.com/project/seglink-2 收录实现数量:2 支持框架:TensorFlow |
Detecting Oriented Text in Natural Images by Linking Segments |
RRPN | https://sota.jiqizhixin.com/project/rrpn 收录实现数量:1 支持框架:PyTorch |
Arbitrary-Oriented Scene Text Detection via Rotation Proposals |
FTSN | https://sota.jiqizhixin.com/project/ftsn | Fused Text Segmentation Networks for Multi-oriented Scene Text Detection |
DMPNet | https://sota.jiqizhixin.com/project/dmpnet | Deep Matching Prior Network: Toward Tighter Multi-oriented Text Detection |
光学字符识别(Optical Character Recognition,OCR)是指对文本资料进行扫描后对图像文件进行分析处理,以获取文字及版面信息的过程。一般来说,在获取到文字之前需要首先对文字进行定位,即执行文本检测任务,将图像中的文字区域位置检测出来;在找到文本所在区域之后,对该区域中的文字进行文字识别。文字识别就是通过输入文字图片,然后解码成文字的方法。OCR解码是文字识别中最为核心的问题。传统技术解决方案中,分别训练文本检测和文字识别两个模型,然后在实施阶段将这两个模型串联到数据流水线中组成图文识别系统。
对于文本检测任务,主要包括两种场景,一种是简单场景,另一种是复杂场景。简单场景主要是对印刷文件等的文本检测,例如像书本扫描、屏幕截图,或是清晰度高、规整的照片等。由于印刷字体的排版很规范,背景清晰,现在的检测、识别技术已经很成熟了,检测的效果都比较好。通过利用计算机视觉中的图像形态学操作,包括膨胀、腐蚀基本操作,即可实现简单场景的文字检测。复杂场景主要是指自然场景,由于光照环境以及文字存在着很多样的形式,例如灯箱广告牌、产品包装盒、设备说明、商标等,存在角度倾斜、变形、背景复杂、光线忽明忽暗、清晰度不足等情况,这时要将文本检测出来难度就比较大了,此时主要考虑引入深度学习模型进行检测。
对于文字识别任务,一般由下面的步骤组成:首先是读取输入的图像,提取图像特征,因此,需要有个卷积层用于读取图像和提取特征;然后,由于文本序列是不定长的,因此需要处理不定长序列预测的问题;再次,为了提升模型的适用性,最好不要要求对输入字符进行分割,直接可进行端到端的训练,这样可减少大量的分割标注工作,这时就要引入 CTC 模型(Connectionist temporal classification, 联接时间分类)来解决样本的分割对齐的问题;最后,根据一定的规则,对模型输出结果进行纠正处理,输出正确结果。
最近流行的技术解决方案中,考虑用一个多目标网络直接训练出一个端到端的模型以替代两阶段模型。在训练阶段,端到端模型的输入是训练图像及图像中的文本坐标、文本内容,模型优化目标是输出端边框坐标预测误差与文本内容预测误差的加权和。在实施阶段,原始图像经过端到端模型处理后直接输出预测文本信息。相比于传统方案,该方案中模型训练效率更高、资源开销更少。
我们在这篇报告中分别总结了OCR中必备的文本检测模型、文字识别模型和端到端的方法。其中,文本检测模型主要考虑复杂场景中的深度学习模型。
一、文本检测模型
1、 CTPN
CTPN( Connectionist Text Proposal Network )是在ECCV 2016中提出的一种文本检测模型。CTPN是从Faster RCNN改进而来的,结合了CNN与LSTM深度网络,能有效的检测出复杂场景的横向分布的文字,是非常经典的文本检测模型。CTPN是基于Anchor的算法,在检测横向分布的文字时能得到较好的效果。CTPN结构与Faster R-CNN基本类似,但是加入了LSTM层。
假设输入N张图片,首先,利用VGG提取特征,获得大小为 N×C×H×W 的conv5 feature map;然后,在conv5上做3×3 的滑动窗口,即每个点都结合周围3×3 区域特征以获得一个长度为3×3×C 的特征向量。输出N×9C×H×W 的feature map,该特征显然只有CNN学习到的空间特征;再将这个feature map进行Reshape,Reshape: Nx9CxHxW→(NH)xWx9C;然后,以Batch=NH 且最大时间长度Tmax=W 的数据流输入双向LSTM,学习每一行的序列特征。双向LSTM输出(NH)×W×256 ,再经Reshape恢复形状:Reshape: (NH)xWx256→Nx256xHxW,该特征既包含空间特征,也包含了LSTM学习到的序列特征;然后经过“FC”卷积层,变为N×512×H×W 的特征;最后经过类似Faster R-CNN的RPN网络,获得text proposals。
图1(a) CTPN结构。通过VGG16模型的最后一个卷积图(conv5)密集地滑动一个3×3的空间窗口。每行的顺序窗口由双向LSTM(BLSTM)循环连接,其中每个窗口的卷积特征(3×3×C)被用作256D BLSTM(包括两个128D LSTM)的输入。RNN层连接到512D全连接层,然后是输出层,共同预测文本/非文本分数、y轴坐标和k个anchor的side-refinement偏移。(b)CTPN输出连续的固定宽度的细刻度文本建议。每个box的颜色表示文本/非文本得分。最终只呈现正分数的方框
CTPN网络最后输出的预测参数包括三部分:纵向坐标(vertical coordinates),表示每一个box的中心点x坐标和高度;分数(scores),表示是否是文本区域的置信度;水平偏移量(side-refinement)用于精修文本框的左右边缘部分,表示对于左右两侧边界处box的坐标偏移值。具体的数量如下:2k个vertical coordinate,因为一个anchor用的是中心位置的高(y坐标)和矩形框的高度两个值表示的,所以一共2k个输出。2k个score,因为预测了k个text proposal,所以有2k个分数,text和non-text各有一个分数。k个side-refinement,这部分主要是用来精修文本行的两个端点的,表示的是每个proposal的水平平移量。这样就可以得到一个密集预测的text proposal,接下来使用一个标准的非极大值抑制算法(NMS)来滤除多余的box。最后使用基于图的文本行构造算法,将得到的文本段合并成文本行。构造文本行的方法是,令每两个相近的anchor组成一个pair,然后合并不同的pair直到无法再合并,这就构成了一个文本区域。
最后,CTPN 的 loss 分为三部分:(1)预测每个 anchor 是否包含文本区域的classification loss;(2)文本区域中每个 anchor 的中心y坐标cy与高度h的regression loss;(3)文本区域两侧 anchor 的中心x坐标cx 的regression loss。
项目 | SOTA!平台项目详情页 |
CTPN | 前往 SOTA!模型平台获取实现资源:https://sota.jiqizhixin.com/project/ctpn |
2、 TextBoxes
TextBoxes 是一个端到端可训练的快速文本检测算法,是改进版的SSD。TextBoxes整体网络结构如图2所示,TextBoxes共有28层卷积,前13层来自于VGG-16(conv_1到conv4_3),后接9个额外的卷积层,最后是包含6个卷积层的多重输出层,被称为text-box layers,分别和前面的9个卷积层相连。由于这些default box都是细长型的,使得box在水平方向密集在垂直方向上稀疏,从而导致该模型对水平方向上的文字检测结果较好。text-box layers的输出通道数是72(2个通道预测分数,4个通道预测位置偏移量,共12个anchor,所以共(2+4) x 12=72个通道),整合所有的 text-box layers的输出结果后再使用NMS( nonmaximum suppression )处理,就得到了最终的结果。
图2 TextBoxes架构。TextBoxes是一个28层的全卷积网络。其中,13层是继承自VGG-16。9个额外的卷积层被附加在VGG-16层之后。文本框层与其中6个卷积层相连。在每个map位置上,一个文本框层预测了一个72维的向量,即12个默认框的文本存在分数(2维)和偏移量(4维)。对所有文本框层的汇总输出进行了NMS处理
Text-box layer是TextBoxes的核心,同时负责两种预测:文本行/非文本行预测和文本行的bbox预测,在每个特征图的每个位置上,它同时输出文本行的概率及其相对于default box的偏移。对于bbox的预测公式如下:
训练图像中文本行的ground truth与default box的匹配原则,采用的也是box overlap。这有效地将文本行按照各自的尺寸和宽高比进行划分。为了更好地适应文本行的large aspect ratio,论文中设计长宽比分别是1、2、3、5、7、10的default box(即长条形的default box)。但同时也引入了另外一个问题:default box在水平方向上排列紧密而垂直方向上排列稀疏,这会造成检测失误的情况。针对上述问题,论文中将水平方向上的这些默认框全部向下平移半个区域的单位(图3中黑色与绿色,蓝色与红色),这样一个位置总共12个默认框,解决了默认框排列不均匀的问题。
图3 4 x 4网格的默认box说明。为了更好的可视化,只绘制了一列长宽比为1和5的默认框。其余的长宽比为2、3、7和10,它们的位置类似。黑色(ar:5)和蓝色(ar:1)的默认框在其单元格中居中。绿色(ar:5)和红色(ar:1)方框具有相同的长宽比,并分别与网格中心有一个垂直偏移(单元格高度的一半)
此外在 text-box layers中替换传统的33卷积为不规则的15和5x1卷积核,这种 inception-style过滤器生成矩形接收场,更好地适合具有较大纵横比的文本,也避免了方形接收场会带来的噪声信号。
损失函数方面,TextBoxes的损失函数由两部分构成,一是二分类的损失函数,由于TextBoxes只会把区域分成两类,一类是背景,一类含有文字,因此这部分是一个二分类的softmax损失函数。二是预测的bounding box位置的回归损失,这部分使用的是smooth L1损失函数。
检测过程中可能会遇到文字区域过长,超过了默认框的最大比例的问题,即使在anchor和卷积滤波器上进行优化,也仍然很难检测出极端纵横比和大小的文本。解决办法是将原图片放缩到不同的大小(对于每张图片,分别rescale到300300,700700,300700,500700,1600 x 1600),这样某些在水平方向很长的文字就会被挤压从而满足默认框的比例,这种方法提高了检测的准确度,但是会消耗一定的运算能力。
项目 | SOTA!平台项目详情页 |
TextBoxes | 前往 SOTA!模型平台获取实现资源:https://sota.jiqizhixin.com/project/textboxes |
3、SegLink
SegLink将检测文本行的任务分解为检测segment和link的两个小任务,依然是采用了SSD结构,重点是改变了网络的输出,即数据的表现形式,然后融合两个小任务的结果最终输出文本行。完整结构如图4。
图4 SegLink网络结构。网络由卷积特征层(显示为灰色块)和卷积预测器(灰色细箭头)组成。卷积滤波器的格式为"(#filters),k(kernel size)s(stride)"。一个多行过滤器规格意味着一个隐藏层之间。分段(黄框)和链接(未显示)由卷积预测器在多个特征层(以l = 1 ... 6为索引)上检测,并通过组合算法组合成整个单词
SegLink的完整工作流程如下:
- 主干网络沿用SSD网络结构,修改了最后的Pooling层,将其改为卷积层.具体来说:首先,用VGG16作为base net,并将VGG16的最后两个全连接层改成卷积层。接着增加一些额外的卷积层,用于提取更深的特征,最后,修改SSD的池化层,将其改为卷积层;
- 提取不同层的特征图,文中提取了conv4_3, conv7, conv8_2, conv9_2, conv10_2, conv11;
- 对不同层的特征图使用3x3的卷积层以得到最终的输出,不同特征层输出的维度是不一样的,因为除了conv4_3层外,其它层存在跨层的link。这里segment是text的带方向bbox信息,link是不同bbox的连接信息;
- 通过融合规则,将segment的box信息和link信息进行融合,得到最终的文本行。
Segments表示一个文本框里的一个部分,可以是一个文字也可以是多个文字。segment是一个增加了方向信息的五元组x、y、w、h、θ,分别表示:中心的坐标,矩形框的宽高,矩形框的角度。在SSD中,每个特征图的每一个像素会生成多个default box,但是在seglink中,只有一个宽高比为1的default box。对于segments的预测包括:2个segment score和5个geometric offsets(xs,ys,ws,hs,θs)。
link主要是用于连接上述segment,对于link detection部分,主要分成层内link检测(within-layer)和跨层link检测(cross-layer),分别表示特征图内和跨特征图的segment是否应该相连。每个link有两个分数,一个用是正分,一个是负分,正分用来表示二者是否属于同一个单词;负分表示二者是否属于不同单词,应该断开连接。Within-Layer Link:衡量了每一个特征图内部的segment是否应该相连,对于当前的segment,会寻找其八邻域内的segment是否与其相连。Cross-Layer Link:衡量了当前特征图和其上一级特征图内部的segment是否应该相连,对于当前的segment,会寻找其四邻域内的segment是否与其相连。如l6 层和l5 层, 所以只需要对conv7, conv8_2, conv9_2, conv10_2, conv11进行cross-layer link检测。
Combining Segments with Links算法的流程是:首先,通过人工设定的两个参数 α 和β对网络预测的segments和links进行滤除;然后,将每个segment看成节点,link看成边,建立图模型,再用DFS(depth first search)找到连通分量,每个连通分量包含一系列segments(用B表示),执行Alg1进行融合输出单词的box,Alg1算法其实就是一个平均的过程。先计算所有的segment的平均θ作为文本行的θ,再根据已求的θ为已知条件,求出最可能过每个segment的直线,以segment的最左和最右为边界的线段中点作为word的中心点(x, y),最后用线段长度加上首尾segment的平均宽度作为word的宽度,用所有segment的高度的平均值作为word的高度。
项目 | SOTA!平台项目详情页 |
SegLink |
前往 SOTA!模型平台获取实现资源:https://sota.jiqizhixin.com/project/seglink-2 |