1. 移动端的优势与难点
移动端OCR有两种做法,一种是在移动端本地进行 OCR 识别,只能对背景简单的印刷体文字取得较好的效果,比如名片识别,证件识别等都有成熟的商业 SDK。另外一种做法则是对拍照图像上传到云端服务器,在云端服务器进行处理然后返回结果。
优势:隐私保护、极大减少服务端的压力。
难点:模型规模小、云端 GPU 运行,手机端 CPU 无法保持高的算力。
2. 文本检测
传统的文本检测方法多利用手动设计的特征捕捉场景文本的属性,通常无法解决复杂背景、光照、遮挡、曲线文字、旋转文字等对检测结果的影响。在基于深度学习的方法中,有效的特征是直接从训练数据中学习的,该方法的出现突破了上述瓶颈,使得检测方法更加灵活。目前场景文本检测方法大致分为:基于回归的检测方法、基于分割的检测方法和两者有效结合的方法。
基于回归的方法:预设形状的文本框,模型对候选区域是否包含物体进行预测,如果包括目标物体则进一步预测物体所需类别(目标检测)。更为重要的一点,锚框位置固定,需要进行微调以形成更准确的预测框。
基于分割的方法:将文本检测视为对文本/背景的分类问题(2分类),并且是像素级别。
FCN 网络:去掉了全连接(FC)层,利用反卷积、上池化等上采样的操作,将特征矩阵恢复到接近原图尺寸,对每个位置上的像素做类别预测。
过去两三年它的发展趋势,从早期2015年以前是以水平的矩形框检测为主,后来发展到多方向的矩形框,再到2017年开始有人做任意的四边形,再到这两年任意曲线文本的检测,大概是这样发展的趋势。
场景文字检测的挑战?
首先方向是多变;第二是有很多不规则的文本,弯弯曲曲;其次一个图片文字的尺度多样,有的字很大、有的字很小。
2.1 基于回归的模型
2.1.1 TextBoxes++
网络结构
TextBoxes++ 使用的基础网络结构是比较经典的 VGG16,保持前五个卷积层(conv1-conv5),并通过参数下采样方法将最后两个全连接转化成卷积层(conv6-conv7),然后在后面再加上 8 个卷积层,每两个一组(conv8-conv11),形成四个不同分辨率的 stage。类似于 SSD,不同 scale 的层都会接入到 Multiple output layers,也叫 text-box layers。它负责将不同 scale 下检测到的框进行一个聚合,并做一个级联的 NMS。Textboxes++ 是一个全卷积的结构,因此在训练和测试的过程中可以接受不同大小的图片。不同于上一个版本 Textboxes,将最后一个 global average pooling 替换成了卷积层,这样对于多尺度的训练和测试有益处。
模型任务
在 TextBoxes++ 中,作者预设了一系列长宽比为 1,2,3,5,1/2,1/3,1/5 的锚框以刻画不同形状的文本。
网络输出:在骨干网络的基础上,模型增加了卷积层输出每个位置上每个锚框对应于文本的概率和位置回归。
下图解释:图中的绿色和黑色虚线都是预设的锚框,绿色对应于正例而黑色对应于负例。在对正例做位置回归时,模型同时执行两个任务,一个是计算最小的包含文本的四边形(黄色实线)的顶点坐标相对于锚框的位置偏移,如图中红线所示;另一个是计算最小的包含文本的水平矩形(绿色实线)相对于锚框的位置偏移。这两个任务可以用于不同的应用。
2.1.2 EAST 模型
传统的文本检测方法和一些基于深度学习的文本检测方法,大多是 multi-stage,在训练时需要对多个 stage调优,这势必会影响最终的模型效果,而且非常耗时。针对上述存在的问题,本文提出了端到端的文本检测方法,消除中间多个 stage(如候选区域聚合,文本分词,后处理等),直接预测文本行。
EAST 做文本检测只需要两步:先是一个全卷积的网络直接产生一个字符或者文本行的预测(可以是旋转的矩形或者不规则四边形),然后通过 NMS(Non-Maximum Suppression)算法合并最后的结果。
网络结构
主要分为三个部分:特征提取层、特征融合层和输出层。
特征提取层
骨干网络(ResNet、PVANet 等),分别从 stage1,stage2,stage3,stage4 的卷积层抽取出特征图,卷积层的尺寸依次减半,但卷积核的数量依次增倍。通过这种方式,可抽取不同尺度的特征图,以实现对不同尺度问本行的预测。(大的 feature map 擅长检测小物体,小的 feature map 擅长检测大物体)-
特征融合层
将前面的特征图按照一定的规则进行合并,采用 U-net 方法,规则如下:- 特征提取层中抽取的最后一层的特征图
被最先送入 unpooling 层,将图像放大 1 倍
- 接着与前一层的特征图
串起来(concatenate)
- 然后依次作卷积核大小为 1 x 1, 3 x 3 的卷积
- 对
重复以上过程,而卷积核的个数逐层递减,依次为 128,64,32
- 最后经过 32 核, 3 x 3 卷积后将结果输出到“输出层”
- 特征提取层中抽取的最后一层的特征图
-
输出层
上图也是分为 3 个部分:score map、RBOX geometry、QUAD geometry- score map:特征融合层后接一个 1*1 的卷积,输出通道为1,最后输出一个分数图,代表每个像素点属于文本区域的概率。
- RBOX:这部分一共输出 5 个通道。分别由两个 1*1 卷积产生 4 个和 1 个,其中 4 个通道分别表示从像素位置到矩形的顶部,右侧,底部,左侧边界的4个距离,1个通道表示边界框的旋转角度。这部分用来预测旋转矩形的文本。输出的是
。
- QUAD:使用 8 个数字来表示从四边形的四个角顶点到 label 的坐标偏移。该部分可以预测不规则四边形的文本。
2.2 基于分割的模型
2.2.1 DBNet
由于场景文字的大小形状的多样,使用基于分割的检测方法往往更好,但是大部分基于分割的方法需要复杂的后处理将像素级别的结果组合成文字行,在预测时开销往往很大。例如 PSENet 使用连续尺度扩张的方式后处理;LSAE 计算像素之间的特征距离来聚类。
大部分检测模型用上图的方式做后处理(蓝色箭头)。第一种,设置一个固定的阈值,把分割图转化成二值化图,然后用一些启发式的方法例如聚类把像素处理成文字行;而作者的方法(红色箭头),把二值化的操作放到网络里面同时优化,这样每个像素点的阈值都可以自适应地预测,这样就可以更好地区分前景与背景。常规的二值化方法是不可微的,DB 提出了 Differentiable Binarization,一种近似的方法来做二值化,这种方法在与分割网络一起使用时是完全可微的。
具体参考文档:https://www.jianshu.com/writer#/notebooks/50653564/notes/94920807/preview
DBNet++ 模型
相较于 DBNet 增加了 ASF 模块。
ASF:通过自适应地融合不同尺度的特征提高鲁棒性。ASF 集成空间注意力,动态融合不同尺度的特征。
流程:
- input feature map (B,C,H,W) x N(N=4),不看 Batch,size为(N,C,H,W),concat 为(NxC,H,W)
- Conv(NxC,C,3) 之后输出为(C,H,W)。
- Spatial:AvgPool之后输出为(1,H,W),经过Conv-relu、Conv-sigmoid输出为(1,H,W),与(C,H,W)相加后为(C,H,W),最后经过Conv(C,N,1)输出为(N,H,W)。
- 最后 (N,C,H,W)与(N,1,H,W)相乘输出(N,C,H,W)
2.2.2 PSENet(渐进式的尺度扩张网络)
引言
目前文本检测主要有两种方法:一种是 Anchor-based 的方法,如下 (b) 所示,其主要问题是基于 anchor 的方法很难适用于形状不规则的文本。另一种是 segmentation-based 的方法,如下 (c) 所示,基于语义分割的方法,是从 pixel 的级别对像素进行分类,理论上来讲其可以检测不规则的文本,但是不容易将相邻的文本区分开来,从而可能会导致多个不同的文本区域被预测为一个。如下 (d) 是本文提出的 PSENet(其本质也是一种改进版的基于语义分割的方法),由图可见,其可以很好的检测不规则的文本并能很好地将其区分开来。
本文思路:
PSENet 具体采用的方式是首先预测每个文本行的不同尺度的 kernels,这些 kernels 和原始文本行具有同样的形状,并且中心和原始文本行相同,但是在尺度上是逐渐递增的。最大的 kernel 就是原始文本行大小。之后对这些 kernels 采用 PSE 算法(基于 BFS),首先从最小 scale 的 kernel 开始,逐步对它进行扩增到更大的 kernel,最终扩增到原始文本行大小。而之所以这种方式能够区分文本行边缘像素,是因为对于最小 scale 的 kernel,不同的文本行之间的间距很大,是可以完全分离开的。而在逐渐扩展的过程中是受上一级 kernel 监督的,因此即使扩增到原始文本行大小也能够将边缘像素区分开来。
网络结构
网络结构主体由 ResNet + FPN 作为特征提取模块,首先将高层特征与底层特征融合后得到(P2、P3、P4、P5)四个特征层,其中每个特征层的 channel 数量为 256;之后将四个特征层 concat 到 F(上采样);将 F 送入 Conv(3, 3)-BN-ReLU 层,并将特征层的 channel 数量变为 256;之后再将 F 送入多个 Conv(1, 1)-Up-Sigmoid 层来得到 n 个分割结果 S1,S2,...,Sn(实际上是通过 11n 卷积得到的),其中的 Up 代表上采样。
渐进尺度扩张算法(Progressive Scale Expansion)
PSE 算法的主要思想就是利用BFS(广度优先搜索)算法,逐渐扩展kernel(就是下图中的白色的部分,预测的文本行区域)的大小,最终扩增到原始文本行大小(如S3)。
假设用了 3 个不同尺度的 kernel(如图a,e,f),其中 S1(上图a) 代表最小 kernel 的分割结果,它内部有四个连通域 C={c1,c2,c3,c4},CC 操作得到 S1 中的四个连通域,得图b(四个连通区域使用不同颜色标记)。现在我们已经得到了图b中的四个连通域(小 kernel,不同文本行之间的 margin 很大,很容易区分开),且我们已知 S2 中的 kernel 是比 S1 中的 kernel 大的,也就是可以说 S2 中的 kernel 是包含 S1 中的 kernel 的。现在我们的任务就是将属于 S2 中的 kernel 的但不属于 S1 中的 kernel 的像素点(即图 g 左图中的灰色的部分,蓝色和橘色部分分别表示S1中的两个连通域)进行分配。如图所示,在灰色区域(S2 的 kernel 范围)内,将b图所找到的连通域的每个 pixel 以 BFS 的方式,逐个向上下左右扩展,即相当于把 S1 中预测的文本行的区域逐渐变宽(或者换种说法:对于 S2 中 kernel 的每个像素点,把它们都分别分配给 S1 中的某个连通域)。这里还有一个问题,如图 g 右图所示,图中值为 2 的点为冲突点,例子中的两个连通域都可能扩展到这个 pixel,论文中对这种冲突的解决方法就是“先到先得”原则,这对最后的结果没什么影响。后面的 S3 同理,最终我们抽取图 d 中不同颜色标注的连通区域作为最后的文本行检测结果。
PaddleOCR 实战解释:
预处理之后 input x: [4, 3, 640, 640]
input transform x [4, 3, 640, 640]
backbone f2: [4, 16, 160, 160]
backbone f3: [4, 24, 80, 80]
backbone f4: [4, 56, 40, 40]
backbone f5: [4, 480, 20, 20]
neck fpn fuse: [4, 384, 160, 160]
neck fpn fuse: [4, 384, 160, 160]
head pse out: [4, 7, 160, 160]
# loss 的计算:
loss predicts 0 [4, 7, 160, 160]
loss predicts 1 [4, 7, 640, 640]
loss texts [4, 640, 640]
loss kernels [4, 6, 640, 640]
2.3 其他模型
2.3.1 FCENet
目前现有的任意形状文本实例建模大致上可以分为基于分割的自底向上的方法和从数学上对文本包围框进行建模的自顶向下的方法。自底向上的方法借鉴了实例分割的思想,对输入的图像的每个像素进行分类从而生成掩模,再经过聚合操作得到输出结果。但是通常这类方法的聚合后处理比较复杂,使得网络的处理流程变得冗长,而且对于重叠在一起的目标,因为不同的文本共享同样的像素,这类方法难以将它们进行区分。而目前在自顶向下的方法中,轮廓表征模型的表达能力还是有限的、当遇到一些形状比较复杂的轮廓时会建模失败,并且需要较多的参数。由于傅里叶系数表示在理论上可以拟合任意的封闭曲线,并且文本轮廓信息更多集中在低频分量上,所以通过在傅立叶域对不规则场景文字实例进行表征能够很好地解决上述问题,并且具有简单、紧凑、对复杂轮廓表达能力优异的特点。
论文提出 FCE 方法将文本实例轮廓从点序列转换为傅里叶特征向量。首先,论文提出一种 重采样机制 来获得每一文本轮廓固定数量的稠密点。为了保证傅里叶特征向量的独特性,论文将文本轮廓域穿过文本中心点的水平线的最右边的交点作为采样起始点,固定采样方向为顺时针方向,沿着文本轮廓进行等间隔采样。其次,空间域中轮廓采样点序列通过傅里叶变换被嵌入到傅里叶域中。
傅里叶轮廓嵌入 (Fourier Contour Embedding)
上图解释:红色的点是真实标签坐标点,绿色点通过重采样出来的坐标点,黄色点是起始点。蓝色箭头是方向,粉红色箭头是 向量。
额外的知识点:
欧拉公式为:
傅里叶级数:
傅里叶轮廓嵌入算法首先把封闭曲线的参数方程嵌入到复数域:
上式中, 表示复函数的虚部,
。其中,
表示轮廓曲线上的点,且由于曲线封闭,
。然后算法通过在 0 到 1 区间上对
进行采样和傅里叶变换得到对应的傅里叶系数
,其中 表示轮廓的中心点位置。将傅里叶系数拆分为实部和虚部,则轮廓可由长度为
的实数向量表示。
同时为了使包围框的傅里叶特征向量唯一,算法会在傅里叶变换前固定采样初始点为通过轮廓中心点的水平线与包围框的最右交点,同时采样顺序固定为顺时钟方向并保持恒定的采样间隔。
网络结构
FCENet 包含三个部分:backbone(ResNet50_DCN)、neck(FPN)、head(FCE)。输入图像会经过主干网络和 FPN 提取特征。FPN 上不同层负责不同尺度的文本目标,提取的特征会送入到共享的检测头中。共享的检测头具有两个分支,其中分类分支预测文本区域和文本中心区域的概率图,相乘得到属于文本中心分类的得分图;回归分支则负责预测傅里叶特征向量。算法对文本中心置信度大于阈值的像素点所对应的傅里叶特征向量进行傅里叶反变换,并经过非极大值抑制得到最终的检测结果。
3. 文本识别
目前主要分为基于分割的自然场景文本识别、无需分割的自然场景文本识别。
对于无需分割的文本识别步骤分为以下四步:
- 图像预处理
背景擦除、超分辨率、不规则纠正(TPS)
- 特征提取(字符级特征)
VGGNet、残差网络、DenseNet
- 序列建模(语义相关性)
LSTM、transformer...
- 预测转录阶段
CTC、Attention
场景文字识别挑战?
比如变形文字、不规则文本、曲线文本、字体的多样性、形状的多样性、自然场景中拍的照片有各种背景的干扰、对焦、图像模糊、遮挡等等问题。
3.1 基于 CTC 转录层模型
3.1.1 RCNN 模型
参考链接:https://www.jianshu.com/p/da2488955c94
3.2 基于 Attention 转录层模型
3.2.1 RARE 模型
1. 引言
文章提出 RARE 模型实现对不规则文本的 end-to-end 文字识别,RARE 由 STN(Spatial Transformer Network) 和 SRN(Sequence Recognition Network) 组成。STN 用于对输入的不规则文本进行矫正,得到形状规则的文本作为 SRN 的输入,SRN 是一个基于注意力机制的网络结构,实现 sequence to sequence 的文本识别。
RARE 的流程如下图所示:
2. STN
传统的 STN 通过预测仿射变换矩阵的方式对输入图像进行矫正。但是真实场景的不规则文本要复杂的多,可能包括扭曲、弧形排列等情况,传统的 STN 解决不了。因此作者提出了基于 TPS 的 STN,TPS 可以近似和生物有关的形变。RARE 的 STN 也分为 3 部分:
- localization network:预测 TPS 矫正所需要的 K 个基准点;
- Grid Generator:基于基准点进行 TPS 变换,生成输出 Feature Map 的采样窗格(Grid);
- Sampler:每个 Grid 执行双线性插值。
算法流程如下:
1)、localization network
Localization network 是一个有卷积层,池化层和全连接构成的卷积网络。由于一个点由定义,所以一个要预测 K 个基准点的卷积网络需要由 2K 个输出。为了将基准点的范围控制到 [-1, 1],输出层使用 tanh 作为激活函数,在论文的实验部分给出 K=20.
2)、Grid Generator
3)、Sampler
3. Sequence Recognition Network
SRN 是一个 seq2seq2 的模型结构,外加 Attention 机制。整体的网络结构如下图所示:
介绍如下:
4. 目前研究进展(2021)
检测模型:
- 提出一个 TextField 的概念,就是文字方向场的概念,传统基于分割的文字检测方法有一个很大的局限性就是对密集文本无法有效区分开,他们提出一个文字方向场,基于像素做回归,然后通过后处理组合成一个文字条,对于弯曲特别离谱的文字都可以检测出来。
- 解决anchor调参的问题:DeRPN
识别模型:
ACE Loss:对文字尺度多样性比较敏感,如果一个文本行中同时有不同尺度的文字,ACE 可能识别效果就不会太好。
评测标准:
TIOU
数据合成:
SynthText3D
数据增广:
AutoAugment:用强化学习寻找最佳的数据增广策略。