【项目实践】中英文文字检测与识别项目(CTPN+CRNN+CTC Loss原理讲解)(一)

本文涉及的产品
个人证照识别,个人证照识别 200次/月
票据凭证识别,票据凭证识别 200次/月
教育场景识别,教育场景识别 200次/月
简介: 【项目实践】中英文文字检测与识别项目(CTPN+CRNN+CTC Loss原理讲解)(一)

OCR——简介


   文字识别也是图像领域一个常见问题。然而,对于自然场景图像,首先要定位图像中的文字位置,然后才能进行文字的识别。


   所以一般来说,从自然场景图片中进行文字识别,需要包括2个步骤:

   文字检测:解决的问题是哪里有文字,文字的范围有多少

   文字识别:对定位好的文字区域进行识别,主要解决的问题是每个文字是什么,将图像中的文字区域进转化为字符信息。


1、CTPN原理——文字检测


1.1、简介

   CTPN是在ECCV 2016提出的一种文字检测算法。CTPN结合CNN与LSTM深度网络,能有效的检测出复杂场景的横向分布的文字,效果如下图,是目前比较好的文字检测算法。

CTPN算法的提出,出于以下几点:

   (1)、假设文本是水平的;

   (2)、文本可以看做由每一个“字母”组成的。这里的字母可以认为是小片段。之所以有这样的想法,是因为基于通用目标检测的算法难以适应文字检测的场景,如上图中的文字,长度方面变化幅度很大。

   因此作者将文本在水平方向解耦,分成每一个小片,然后将文本行的检测转化为小片的检测,最后利用规则将属于同一水平行的小片组合成文本行。化繁为简。


1.2、CTPN模型创新点

CTPN的创新点主要由以下三点:

   (1)、将文本行拆分为slice进行检测,这样在检测过程中只需要对文本的高度进行先验性的设置anchor。

   (2)、作者认为文本具有时序性,即和阅读习惯一直,从左到右。因此作者加入RNN获取这种语义性。

   (3)、后处理算法:文本连接算法。


1.3、CTPN与RPN网络结构的差异

如上图所示,左图为RPN,右图为CTPN的网络结构。可以看到,CTPN本身就是RPN,唯一不同的是加入了双向LSTM获取时序方向的信息,使得模型可以序列性的预测文本的小片。

当然这里的不同之处主要有以下几点:

   (1)、双向LSTM对文本行方向编码

   (2)、标签构造方式不同:CTPN使用水平方向的切片框作为回归目标。


1.4、CTPN网络结构

原始CTPN只检测横向排列的文字。CTPN结构与Faster R-CNN基本类似,但是加入了LSTM层(CNN学习的是感受野内的空间信息,LSTM学习的是序列特征。对于文本序列检测,显然既需要CNN抽象空间特征,也需要序列特征,毕竟文字是连续的)。假设输入N Images:

CTPN的整体结构与流程:

1.首先通过BackBone架构网络VGG16进行特征的提取,其Conv5层输出N x C x H x W的特征图,由于VGG16的卷积网络中经过4个池化层累计的Stride为16。也就是Conv5层输出的Feature map中一个像素对应原图的16像素。


2.然后在Conv5上做3 x 3的滑动窗口,即每个点都结合周围3 x 3区域特征获取一个长度为3 x 3 x C的特征向量。如下图所示,输出为N x 9C x H x W的Feature map,该特征依然是由CNN学习到的空间特征。

3.之后继续对上一步输出的Feature map进行Reshape操作:

4.然后以Batch = NH且最大时间长度Tmax=W的数据流输入Bi-LSTM,学习每一行的序列特征。Bi-LSTM输出为(N H) x W x 256,再经Reshape回复形状:

   该特征既包含了空间特征,也包含了Bi-LSTM学习到的序列特征。

5.再然后经过“FC”层,变为N x 512 x H x W的特征

6.最后经过类似Faster RCNN的RPN网络,获得Text Proposals。


Bi-LSTM的输出输入至FC中,最终模型三个输出:

   文本小片的坐标偏移(y, h)。这里作者没有对起始坐标进行预测,因为这部分在标签构造过程有固定的偏移,因此只需要知道文本的y, h,利用固定的偏移可以构造出完整的文本行。


1.5、如何通过FC层输出产生Text proposals?

CTPN通过CNN和BLSTM学到一组“空间 + 序列”特征后,在"FC"卷积层后接入RPN网络。这里的RPN与Faster R-CNN类似,分为两个分支:

   左边分支用于Bounding Box Regression。由于FC Feature map每个点配备了10个Anchor,同时只回归中心y坐标与高度2个值,所以RPN_bboxp_red有20个Channels;

   右边分支用于Softmax分类Anchor。


1.6、竖直Anchor定位文字位置

由于CTPN针对的是横向排列的文字检测,所以其采用了一组(10个)等宽度的Anchors,用于定位文字位置。Anchor宽高为:

需要注意,由于CTPN采用VGG16模型提取特征,那么Conv5 Feature map的宽高都是输入Image的宽高的1/16。同时FC与Conv5 width和height都相等。如下图所示,CTPN为FC Feature map每一个点都配备10个上述Anchors。

1c622d11e27e1c1614ba46410a20e811.png

这样设置Anchors是为了:

   1.保证在x方向上,Anchor覆盖原图每个点且不相互重叠。

   2.不同文本在y方向上高度差距很大,所以设置Anchors高度为11-283,用于覆盖不同高度的文本目标。


注意:Anchor大小为什么对应原图尺度,而不是conv5/fc特征尺度?

   这是因为Anchor是目标的候选框,经过后续分类+位置修正获得目标在原图尺度的检测框。那么这就要求Anchor必须是对应原图尺度!除此之外,如果Anchor大小对应conv5/FC尺度,那就要求Bounding box regression把很小的框回归到很大,这已经超出Regression小范围修正框的设计目的。


获得Anchor后,与Faster R-CNN类似,CTPN会做如下处理:

   1.Softmax判断Anchor中是否包含文本,即选出Softmax Score大的正Anchor;

   2.Bounding box regression修正包含文本的Anchor的中心y坐标与高度。


   注意,与Faster R-CNN不同的是,这里Bounding box regression不修正Anchor中心x坐标和宽度。具体回归方式如下:

a46074782df92dbf2587c7e9354629aa.png

   其中,v=(v_c,v_h)是回归预测的坐标,v=(v^{*}_{c},v^{*}_{h})是Ground Truth,c^{a}_{y}和h^{a}是Anchor的中心y坐标和高度。Bounding box regression具体原理请参考之前文章。

   Anchor经过上述Softmax和  方向bounding box regeression处理后,会获得下图所示的一组竖直条状text proposal。后续只需要将这些text proposal用文本线构造算法连接在一起即可获得文本位置。

ceced9d41d1b3e4e875c5888dd5fb6be.jpg

在论文中,作者也给出了直接使用Faster R-CNN RPN生成普通proposal与CTPN LSTM+竖直Anchor生成text proposal的对比,如图8,明显可以看到CTPN这种方法更适合文字检测。

b7a686be3b1d6fb8e2f4a973bcd657dc.jpg


1.7、文本线构造算法

在上一个步骤中,已经获得了一串或多串text proposal,接下来就要采用文本线构造办法,把这些text proposal连接成一个文本检测框。

5f281be06c1fb73c4209174fd69688e5.png

为了说明问题,假设某张图有上图所示的2个text proposal,即蓝色和红色2组Anchor,CTPN采用如下算法构造文本线:

   1.按照水平x坐标排序Anchor;

   2.按照规则依次计算每个Anchor boxi的pair(boxj),组成pair( boxi,boxj);

   3.通过pair( boxi,boxj)建立一个Connect graph,最终获得文本检测框.


下面详细解释。假设每个Anchor index如绿色数字,同时每个Anchor Softmax score如黑色数字。


文本线构造算法通过如下方式建立每个Anchor boxi的pair( boxi,boxj):

正向寻找:

   1.沿水平正方向,寻找和 boxi水平距离小于50的候选Anchor;

   2.从候选Anchor中,挑出与 boxi竖直方向overlapv > 0.7的Anchor;

   3.挑出符合条件2中Softmax score最大的boxj

再反向寻找:

   1.沿水平负方向,寻找和boxj水平距离小于50的候选Anchor;

   2.从候选Anchor中,挑出与boxj竖直方向overlapv > 0.7的Anchor;

   3.挑出符合条件2中Softmax score最大的boxk

最后对比scorei和scorek:

   1.如果scorei >= scorek,则这是一个最长连接,那么设置Graph(i,j)=True;

   2.如果scorei < scorek,说明这不是一个最长的连接(即该连接肯定包含在另外一个更长的连接中)。

6c5cb06066a439598239c1c6ef29b170.jpg

举例说明,如上图,Anchor已经按照x顺序排列好,并具有图中的Softmax score(这里的score是随便给出的,只用于说明文本线构造算法):

   对于i=3的box3,向前寻找50像素,满足overlapv > 0.7且score最大的是box7,即j=7;box7反向寻找,满足 overlapv > 0.7且score最大的是box3,即k=3。由于score3 >= score3,pair( box3,box7)是最长连接,那么设置Graph(3,7)=True

对于box4正向寻找得到box7;box7反向寻找得到box3,但是score4 < score3,即pair( box4,box3)不是最长连接,包含在pair( box3,box7)中。

   然后,这样就建立了一个N X N的Connect graph(其中N是正Anchor数量)。遍历Graph:

   1.Graph(0,3)=True且Graph(3,7)=True,所以Anchor index 1→3→7组成一个文本,即蓝色文本区域。

   2.Graph(6,10)=True且Graph(10,12)=True,所以Anchor index 6→10→12组成另外一个文本,即红色文本区域。

这样就通过Text proposals确定了文本检测框。


1.8、CTPN的训练策略

该Loss分为3个部分:

fae26387af6fc21cbc23b7880df25456.jpg

Anchor前后景分类误差:该Loss用于监督学习每个Anchor中是否包含文本。s^{*}_{i}={0,1}表示是否是Groud truth。


竖直方向坐标偏移回归误差:该Loss用于监督学习每个包含为本的Anchor的Bouding box regression y方向offset,类似于Smooth L1 loss。其中vj是si中判定为有文本的Anchor,或者与Groud truth vertical IoU>0.5。


边界处Anchor x的矫正误差:该Loss用于监督学习每个包含文本的Anchor的Bouding box regression x方向offset,与y方向同理。


前两个Loss存在的必要性很明确,但这个Loss有何作用作者没有解释(从训练和测试的实际效果看,作用不大)说明一下,在Bounding box regression的训练过程中,其实只需要注意被判定成正的Anchor,不需要去关心杂乱的负Anchor。这与Faster R-CNN类似。


1.9、CTPN小结

   1.由于加入LSTM,所以CTPN对水平文字检测效果超级好。


   2.因为Anchor设定的原因,CTPN只能检测横向分布的文字,小幅改进加入水平Anchor即可检测竖直文字。但是由于框架限定,对不规则倾斜文字检测效果非常一般。


   3.CTPN加入了双向LSTM学习文字的序列特征,有利于文字检测。但是引入LSTM后,在训练时很容易梯度爆炸,需要小心处理

相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
相关文章
|
1月前
|
机器学习/深度学习 JSON 算法
语义分割笔记(二):DeepLab V3对图像进行分割(自定义数据集从零到一进行训练、验证和测试)
本文介绍了DeepLab V3在语义分割中的应用,包括数据集准备、模型训练、测试和评估,提供了代码和资源链接。
179 0
语义分割笔记(二):DeepLab V3对图像进行分割(自定义数据集从零到一进行训练、验证和测试)
|
6月前
|
测试技术 计算机视觉
ICLR 2024 Spotlight:自蒸馏激发CLIP模型的检测分割能力
【2月更文挑战第28天】ICLR 2024 Spotlight:自蒸馏激发CLIP模型的检测分割能力
158 1
ICLR 2024 Spotlight:自蒸馏激发CLIP模型的检测分割能力
|
6月前
|
机器学习/深度学习 算法 TensorFlow
【计算机视觉+Tensorflow】SORT目标跟踪算法的讲解(图文解释 超详细)
【计算机视觉+Tensorflow】SORT目标跟踪算法的讲解(图文解释 超详细)
229 0
|
文字识别
【项目实践】中英文文字检测与识别项目(CTPN+CRNN+CTC Loss原理讲解)(三)
【项目实践】中英文文字检测与识别项目(CTPN+CRNN+CTC Loss原理讲解)(三)
161 0
|
机器学习/深度学习 文字识别 算法
【项目实践】中英文文字检测与识别项目(CTPN+CRNN+CTC Loss原理讲解)(二)
【项目实践】中英文文字检测与识别项目(CTPN+CRNN+CTC Loss原理讲解)(二)
279 0
|
算法 计算机视觉 网络架构
【项目实践】基于Mask R-CNN的道路物体检测与分割(从数据集制作到视频测试)(一)
【项目实践】基于Mask R-CNN的道路物体检测与分割(从数据集制作到视频测试)(一)
191 0
|
计算机视觉
【项目实践】基于Mask R-CNN的道路物体检测与分割(从数据集制作到视频测试)(二)
【项目实践】基于Mask R-CNN的道路物体检测与分割(从数据集制作到视频测试)(二)
75 0
|
机器学习/深度学习 文字识别 算法
【OCR学习笔记】9、OCR中文项目综合实践(CTPN+CRNN+CTC Loss原理讲解)(二)
【OCR学习笔记】9、OCR中文项目综合实践(CTPN+CRNN+CTC Loss原理讲解)(二)
349 0
|
文字识别
【OCR学习笔记】9、OCR中文项目综合实践(CTPN+CRNN+CTC Loss原理讲解)(三)
【OCR学习笔记】9、OCR中文项目综合实践(CTPN+CRNN+CTC Loss原理讲解)(三)
230 0
|
机器学习/深度学习 文字识别 算法
【OCR学习笔记】9、OCR中文项目综合实践(CTPN+CRNN+CTC Loss原理讲解)(一)
【OCR学习笔记】9、OCR中文项目综合实践(CTPN+CRNN+CTC Loss原理讲解)(一)
456 0