机器之心专栏
本专栏由机器之心SOTA!模型资源站出品,每周日于机器之心公众号持续更新。 本专栏将逐一盘点自然语言处理、计算机视觉等领域下的常见任务,并对在这些任务上取得过 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
您正在阅读的是其中的第 3 期。前往 SOTA!模型资源站(sota.jiqizhixin.com)即可获取本文中包含的模型实现代码、预训练模型及 API 等资源。
第 1 期回顾:CTPN、TextBoxes、SegLink、RRPN、FTSN、DMPNet…你都掌握了吗?一文总结OCR必备经典模型(一)
第 2 期回顾:EAST、PixelLink、TextBoxes++、DBNet、CRNN…你都掌握了吗?一文总结OCR必备经典模型(二)
本期收录模型速览
模型 | SOTA!模型资源站收录情况 | 模型来源论文 |
ABCNet | https://sota.jiqizhixin.com/project/abcnet 收录实现数量:2 支持框架:PyTorch |
ABCNet: Real-time Scene Text Spotting with Adaptive Bezier-Curve Network |
Deep TextSpotter | https://sota.jiqizhixin.com/project/deep-textspotter | Deep TextSpotter: An End-to-End Trainable Scene Text Localization and Recognition Framework |
SEE | https://sota.jiqizhixin.com/project/see-2 收录实现数量:1 支持框架:TensorFlow |
SEE: Towards Semi-Supervised End-to-End Scene Text Recognition |
FOTS | https://sota.jiqizhixin.com/project/fots 收录实现数量:7 支持框架:PyTorch、TensorFlow |
Fast Oriented Text Spotting with a Unified Network |
End-to-End TextSpotter | https://sota.jiqizhixin.com/project/end-to-end-textspotter 收录实现数量:1 |
An end-to-end TextSpotter with Explicit Alignment and Attention |
光学字符识别(Optical Character Recognition,OCR)是指对文本资料进行扫描后对图像文件进行分析处理,以获取文字及版面信息的过程。一般来说,在获取到文字之前需要首先对文字进行定位,即执行文本检测任务,将图像中的文字区域位置检测出来;在找到文本所在区域之后,对该区域中的文字进行文字识别。文字识别就是通过输入文字图片,然后解码成文字的方法。OCR解码是文字识别中最为核心的问题。传统技术解决方案中,分别训练文本检测和文字识别两个模型,然后在实施阶段将这两个模型串联到数据流水线中组成图文识别系统。
对于文本检测任务,主要包括两种场景,一种是简单场景,另一种是复杂场景。简单场景主要是对印刷文件等的文本检测,例如像书本扫描、屏幕截图,或是清晰度高、规整的照片等。由于印刷字体的排版很规范,背景清晰,现在的检测、识别技术已经很成熟了,检测的效果都比较好。通过利用计算机视觉中的图像形态学操作,包括膨胀、腐蚀基本操作,即可实现简单场景的文字检测。复杂场景主要是指自然场景,由于光照环境以及文字存在着很多样的形式,例如灯箱广告牌、产品包装盒、设备说明、商标等,存在角度倾斜、变形、背景复杂、光线忽明忽暗、清晰度不足等情况,这时要将文本检测出来难度就比较大了,此时主要考虑引入深度学习模型进行检测。
对于文字识别任务,一般由下面的步骤组成:首先是读取输入的图像,提取图像特征,因此,需要有个卷积层用于读取图像和提取特征;然后,由于文本序列是不定长的,因此需要处理不定长序列预测的问题;再次,为了提升模型的适用性,最好不要要求对输入字符进行分割,直接可进行端到端的训练,这样可减少大量的分割标注工作,这时就要引入 CTC 模型(Connectionist temporal classification, 联接时间分类)来解决样本的分割对齐的问题;最后,根据一定的规则,对模型输出结果进行纠正处理,输出正确结果。
最近流行的技术解决方案中,考虑用一个多目标网络直接训练出一个端到端的模型以替代两阶段模型。在训练阶段,端到端模型的输入是训练图像及图像中的文本坐标、文本内容,模型优化目标是输出端边框坐标预测误差与文本内容预测误差的加权和。在实施阶段,原始图像经过端到端模型处理后直接输出预测文本信息。相比于传统方案,该方案中模型训练效率更高、资源开销更少。
我们在这篇报告中分别总结了OCR中必备的文本检测模型、文字识别模型和端到端的方法。其中,文本检测模型主要考虑复杂场景中的深度学习模型。
一、文字识别模型
1、 ABCNet
ABCNet是一个端到端的可训练框架,用于定向或弯曲的场景文本发现,首次使用参数化的贝塞尔曲线来表示定向或弯曲的文本。ABCNet通过贝塞尔曲线的适应性实现了定向或弯曲场景的文本检测,与标准的矩形边界框检测相比,它引入的计算开销可以忽略不计。此外,设计了一个新颖的特征对齐层—BezierAlign,以精确计算弯曲形状的文本实例的卷积特征,因此可以在不引入很多计算成本的情况下实现高识别精度。
图1 ABCNet框架。使用立方贝塞尔曲线和BezierAlign,利用贝塞尔曲线的检测结果来提取弯曲的序列特征。整个框架是可以端到端训练的,效率很高。紫色的点代表立方贝塞尔曲线的控制
ABCNet的框架如图所示。ABCNet采用single-shot、anchor-free的卷积神经网络作为检测框架。探测是在探测头的输出特征图上密集预测的,它由4个堆叠的卷积层构成,跨度为1,填充为1,核为3×3。ABCNet由三个部分组成,第一部分共享的检测头预测两条贝塞尔曲线的四个顶点以及四个控制点的坐标偏移;第二部分Bezier Align用于对齐特征;第三部分是一个轻量级的识别模块,用于从对齐后的特征中识别出文字。
贝塞尔曲线表示一条以伯恩斯坦多项式为基础的参数曲线c(t)。其定义如下所示:
为了用贝塞尔曲线拟合任意形状的文本,作者从现有的数据集和现实世界中全面观察定向或弯曲的场景文本,并通过经验表明,立方贝塞尔曲线(即n为3)足以拟合不同类型的定向或弯曲的场景文本。如图2所示。
图2立体贝塞尔曲线。bi代表控制点。绿色线条构成控制多边形,黑色曲线是立方贝塞尔曲线。注意,只有两个端点b1和b4,贝塞尔曲线就会退化为一条直线
根据如下公式计算出贝塞尔曲线控制点的坐标。b0—b3 对应一条贝塞尔曲线上四个控制点的坐标其中两个端点坐标已知;p0—pm 对应弯曲边界标注的点的坐标。有2m+2个方程,m+5个未知数,可通过最小二乘法得到方程的解:
为了实现端到端的训练,以前的方法大多采用各种采样(特征对齐)方法来连接识别分支。通常情况下,抽样方法代表了网络内区域裁剪程序。换句话说,给定一个特征图和感兴趣的区域(RoI),使用采样方法选择RoI的特征,并有效地输出一个固定大小的特征图。然而,以前基于非分割的抽样方法,如RoI Pooling、RoIRotate、Text-Align-Sampling或RoI Transform,都不能正确地对齐定向或弯曲文本的特征。通过利用紧凑贝塞尔曲线bounding box的参数化性质,本文提出了BezierAlign的特征取样。
定向或弯曲网格的每一列都与文本的贝塞尔曲线边界正交。采样点在宽度和高度上分别有等距的间隔,这些间隔是相对于坐标而言的双线性插值。形式上,给定一个输入特征图和贝塞尔曲线控制点,同时处理矩形输出特征图的所有输出像素,大小为h_out × w_out。以位置为(g_iw, g_ih)的像素g_i(来自输出特征图)为例,通过以下方式计算t:
根据t可以索引到贝塞尔曲线上下两条边上对应的点,然后根据这两个点的坐标进行线性插值可以索引到这两个点之间所有采样点的位置,以此类推可以得到贝塞尔曲线包围的区域所有采样点的位置坐标。最后根据op ,可以得到双线性插值后的结果:
识别分支由六个卷积层、一个双向LSTM和一个全连接层组成,最终输出分类分数,采用CTC loss用于字符串的对齐。在训练期间,直接使用生成的Bezier曲线GT(Ground truth)来提取RoI特征,因此,检测分支不会影响识别分支。在推理阶段,RoI区域由检测得到的贝塞尔曲线代替。
项目 | SOTA!平台项目详情页 |
ABCNet | 前往 SOTA!模型平台获取实现资源:https://sota.jiqizhixin.com/project/abcnet |
二、端到端方法
1、 Deep TextSpotter
Deep TextSpotter是一个端到端可训练场景文本检测和识别框架,其创新之处在于:在一个单一的端到端通道中对文本检测和识别进行训练,识别CNN的结构及其输入层的几何形状保留了文本的方面并使其分辨率适应数据。
图3方法概述。由区域建议网络( Region Proposal Network)生成文本区域。通过双线性抽样将每个具有足够文本置信度的区域规范化处理为一个可变宽度的特征张量。最后,每个区域都与一连串的字符相关联,或者被判定为非文本而拒绝
Deep TextSpotter在一个给定的场景图像中定位文本区域,并为所有有文本的区域提供文本转录的字符序列。Deep TextSpotter采用的是YOLOv2架构,是因为YOLOv2的准确性较高,而复杂度明显低于标准VGG16架构(完整的VGG-16架构仅仅处理一张224×224(0.05 Mpx)的图像就需要300亿次操作)。使用YOLOv2架构使我们能够以更高的分辨率处理图像,这是文本识别的关键能力---需要以更高的分辨率进行处理,因为1Mpx的场景图像可能包含10个像素高的文本,所以缩小源图像会使文本无法阅读。Deep TextSpotter使用YOLOv2架构中的前18个卷积层和5个最大池层,该架构以3×3卷积滤波器为基础,在每个池化步骤后将通道数量增加一倍,并增加1×1滤波器以压缩3×3滤波器之间的表征。去掉全连接层,使网络完全卷积,所以模型最终层的尺寸为W/32×H/32×1024,其中,W和H表示源图像宽度和高度。
使用区域建议网络(RPN)来生成区域建议,但增加了旋转r_θ,这对成功的文本识别至关重要。在最后一个卷积层的每个位置,该模型预测了k个旋转的bounding boxes,对于每个bounding box r,预测了6个特征—它的位置r_x、r_y,尺寸r_w、r_h,旋转r_θ和分数r_p,它捕捉了该区域包含文本的概率。bounding boxes的位置和尺寸是使用逻辑激活函数对预定义的anchor boxes进行编码的,因此,源图像中实际的bounding boxes位置(x, y)和尺寸(w, h)计算方式如下:
其中,c_x和c_y表示最后一个卷积层中的网格的偏移量,a_w和a_h表示某个anchor box a预定义的高度和宽度。通过r_θ直接预测bounding box的旋转角度θ∈( - π2,π2)。
通过聚合训练集上的kmeans聚类找到合适的anchor box尺度和宽高比。要求IoU具有至少60%的时候,得到k = 14个不同的anchor boxes尺寸。对于每个图像,RPN生成大小为W/32 x H/32 x 6k的bounding box,其中,k是每个位置的anchor box数量,6是预测参数的数量(x,y,w,h,θ和文本分数)。
图4 anchor box的宽度和高度,是通过训练集的K-均值聚类得到的。要求每个ground-truth box与一个anchor box的交集至少达到60%,共k = 14个箱子
在训练阶段,使用YOLOv2方法通过采集源图像中的所有正样本和负样本,其中每20个批次随机将输入维度大小更改为{352,416,480,544,608}中的一个。正样本是与ground-truth结合最高的交叉点的区域,其他交叉区域是负样本。在运行时,作者发现最好的方法是推迟得分r_p高于特定阈值p_min的所有区域,并在识别阶段后推迟非最大值抑制,因为具有非常相似的r_p得分的区域可以产生非常不同的转录,因此在这个阶段选择具有最高r_p的区域并不总是对应于正确的转录。
在前一阶段中检测到的每个区域具有不同的尺寸和旋转角度,因此有必要将特征映射到规范尺寸的张量,这可以用于识别。使用双线性采样将来自源图像的w×h×C区域映射到固定高度wH'/h×H'×C的张量(本文的H '= 32,即固定高度为32)。与标准RoI方法相比,此特征表示具有关键优势,因为它允许网络规范化旋转和缩放,但同时保持单个字符的宽高比和位置。
给定检测到的区域特征U,利用下式将其映射到固定高度张量:
考虑到来自源图像的规范化区域,每个区域都与一连串的字符相关联,或在以下过程中被拒绝为非文本。给定来自源图像的归一化区域,每个区域与字符序列相关联,或者在下面的过程中作为非文本被拒绝。在该步骤中必须解决的问题是,不同大小的文本区域必须被映射到不同长度的字符序列。模型采用如下的网络结构,采用可变宽度特征张量W×H ×C作为输入并输出矩阵W4×| A | ,其中A是字母表(例如所有英文字符)。矩阵高度是固定的(它是字符类的数量),但它的宽度随着源区域的宽度而增加,因此随着预期字符序列的长度而增长。
表2 用于文本识别的全卷积网络
该模型使用CTC将可变宽度特征张量转换为标签序列上的条件概率分布。然后使用该分布为文本区域选择最可能的标记序列。令y = y1,y2,...,yn表示从用空白符号“ - ”扩展的字母A中的长度为n的网络输出的矢量。然后给出路径π的概率为:
进一步定义多对一映射B:A n→A≤n,其中A≤n是长度更短或相等的所有序列的集合。映射B删除所有空白和重复标签,这对应于每次标签预测改变时输出新标签。在训练中,使用最大化目标标记p(w | y)的对数似然的目标函数。在每个训练步骤中,使用类似于HMM训练的前向算法有效地计算小批量中每个文本区域的概率p(w_gt | y),并且使用目标函数导数来更新网络权重,使用标准反向传播算法。在测试时,分类输出w *应该由最可能的路径p(w | y)给出,遗憾的是它不易处理,因此作者采用了最可能的标记的近似方法:
在此过程结束时,图像中的每个文本区域都具有字符序列形式的关联内容,或者当所有标签都为空白时,它被拒绝为非文本。该模型通常对图像中的单个文本区域产生许多不同的方框,因此作者通过基于文本识别置信度的标准非最大值抑制算法来抑制重叠的方框,该置信度是由文本长度归一化的p(w∗|y)。
项目 | SOTA!平台项目详情页 |
Deep TextSpotter | 前往 SOTA!模型平台获取实现资源:https://sota.jiqizhixin.com/project/deep-textspotter |
2、SEE
SEE是一个端到端的半监督文本检测和识别模型,不需要提供文本检测的 bounding box ,只需要提供正确的 label,然后通过预测误差反向传播修正文本检测结果。SEE使用一个单一的深度神经网络,以半监督的方式学习从自然图像中检测和识别文本。SEE是包括一个定位网络,学习检测图像中的文本区域;以及一个文本识别网络,识别出的文本区域及其文本内容。
图5 SEE由两个主要部分组成。首先是定位网络,它接收输入图像并预测N个变换矩阵,这些矩阵用于创建N个不同的采样网格,采样网格有两种使用方式:(1)计算已识别的文本区域的边界框 ;(2)提取N个文本区域。然后,识别网络对这些提取的区域进行文字识别。整个系统通过只提供每个文本区域的文本标签信息进行端到端的训练
用空间变换器检测文本
SEE使用的空间变换器是DNN的一个可微调模块,它接受一个输入特征图I,并对这个特征图进行空间变换,生成一个输出特征图O。空间变换器模块由三部分组成:第一部分是一个计算函数f_loc的定位网络,它预测要应用的空间转换的参数θ。这些预测的参数在第二部分中被用来创建一个采样网格,它定义了一组应该对输入map进行采样的点。第三部分是一个可微调的插值方法,它采用生成的采样网格,生成空间转换的输出特征图O。
定位网络。定位网络接受输入的特征图I∈R^C×H×W,有C个通道,高度H和宽度W,输出变换参数θ。在系统中,使用定位网络(f_loc)来预测N个二维仿生变换矩阵(A_θ)^n:
其中,N是定位网络应定位的字符、单词或文本行的数量。以这种方式预测的仿生变换矩阵允许网络对输入图像进行翻译、旋转、缩放和倾斜。在SEE中,N个转换矩阵(A_θ)^n是通过使用一个前馈CNN和一个RNN产生的。N个转换矩阵中的每一个都是使用全局提取的卷积特征c和RNN每个时间步长的隐藏状态h_n来计算的。
文中使用ResNet架构的一个变体作为CNN用于定位网络。定位网络中使用的RNN是一个LSTM单元,使用这个LSTM生成隐藏状态h_n,而这些隐藏状态又被用来预测仿生变换矩阵。
旋转Dropout。旋转Dropout的作用是随机dropout负责旋转的仿生变换的参数。这可以防止定位网络输出进行过度旋转的变换矩阵。
网格生成器。网格生成器使用一个有规则间隔的网格G_o,其坐标为y_ho,x_wo,高度为H_o,宽度为W_o。网格G_o与仿生变换矩阵(A_θ)^n一起使用,生成N个规则网格G^n,其坐标为输入特征图I的(u_i)^n、 (v_j)^n:
在推理过程中,可以提取N个结果网格G^n,其中包含定位网络发现的文本区域的bounding box。高度H_o和宽度W_o可以自由选择。
本地化的特定正则器。作者发现增加额外的正则化处理是有益的,这些正则化项会对网格进行惩罚,这些网格会沿着任何轴线进行镜像。作者还发现,该网络倾向于预测在训练过程中变得更大的网格,因此又加入了一个正则化项,根据其面积对大网格进行惩罚。最后,还加入了一个正则化项,鼓励网络预测宽度大于高度的网格,因为文本通常是在水平方向书写的,通常比高度宽。
图像采样器。网格生成器生成的N个采样网格G^n用于在每个n∈N的坐标(u_i)^n、 (v_j)^n处对特征图I的值进行采样。这些点不会总是与输入特征图中的离散值网格完全一致。作者使用了双线性抽样,并将N个输出特征图O_n在给定位置i,j(其中i∈Ho,j∈Wo)的值定义为:
文字识别阶段
文本检测阶段的图像采样器生成一组N个区域,这些区域是从原始输入图像中提取的。文字识别阶段使用这N个不同的区域并利用一个CNN对它们进行独立的处理。这个CNN也是基于ResNet架构的。识别阶段的CNN预测了标签空间L上的概率分布yˆ,其中L=L∪{ε},L是用于识别的字母表,并代表空白标签。该网络的训练是通过运行LSTM的固定数量的T个时间段,并计算每个时间步长的输出的交叉熵损失。时间步长T是基于数据集中最长的单词的字符数选择的。损失L的计算方法如下:
项目 | SOTA!平台项目详情页 |
SEE |
前往 SOTA!模型平台获取实现资源:https://sota.jiqizhixin.com/project/see-2 |