【论文解读】【论文翻译】ABCNet-程序员宅基地

技术标签: 文字检测  OCR  

ABCNet: Real-time Scene Text Spotting with Adaptive Bezier-Curve Network

作者:Yuliang Liu‡;华南理工大学;阿特来德大学;华为诺亚方舟实验室

 

端到端算法要点:

Challenges:

1、场景文本背景中存在很多类似文字的图像

2、形状、字体、长宽比、多语言等变化较大

3、标注奇异性

为什么要设计一个端到端方法?

1、使用识别的信息能够提高检测模型的准确性

2、一个pipeline,便于维护

3、检测识别之间不存在gap

4、共享backbone,更加直接、快速、更小、更鲁棒

现有端到端模型的问题

1、多为检测识别分开优化

2、特征采样模块(RoIpooling,RoIAlign,TPS-based)等,对于弯曲特征提取粗糙

3、文字阅读顺序:从左到右/从上到下/弯曲等

4、现有的端到端模型速度不具有优势,多为两个算法的堆叠。

5、检测和识别对于数据的需求不一致:

- 检测:1k-20k

- 识别:100k-20M,(特别是对于中文,业界通常数据量量级在1000w)

背景知识

1、什么是贝塞尔曲线:用点表示曲线的方式,由起始点、终止点和控制点组成

2、贝塞尔曲线的类型:贝塞尔曲线根据控制点的数量分为:

  • 一阶贝塞尔曲线(2 个控制点)
  • 二阶贝塞尔曲线(3 个控制点)
  • 三阶贝塞尔曲线(4 个控制点)
  • n阶贝塞尔曲线(n+1个控制点)

其他描述略,可见参考文献

参考文献:https://juejin.im/post/6844903666361565191

 

本算法的改进

 1、使用贝塞尔模型来表示曲线文本的形状:用四个控制点的贝塞尔曲线拟合弯曲文本,就是通过标注多边形的点,反解出四个控制点的坐标,其中,每个标注点都被假设在三次贝塞尔曲线上。

2、使用BezierAlign做特征对齐工作,完成弯曲文本的特征提取:对两条包围像素中的点进行Align:首先是通过Bezier表示计算出上下两条曲线的所有点坐标,设上边界点为tp,下边界点为bp,则可以通过双线性插值计算出这两个点之间的所有点像素。

3、贝塞尔合成数据集:修改了VGG16的方法,使用COCO的背景图分割结果,合成弯曲艺术字文本等。

4、端到端,或者单独的检测任务,都能达到sota的效果。

5、单纯的使用合成数据,中文效果不理想,但是如果加入开源中文数据集如Rects等,效果有很好的改善。

未来可能的端到端的方法

1、统一的多语言端到端方法:

- 不同语言可能有奇异性,如阿拉伯文字并非严格从左到右阅读顺序

2、弱监督端到端方法:

- 使用半监督或者增量标注的方式训练检测

- 使用无监督学习做文本识别

3、更少字符级别标注的端到端方法

- 避免字符级别的box标注:利用纹理信息等

4、优化:如果使用SGD训练检测很快,但是训练识别很慢

- 使用联合解码和字符分类:检测的loss某些程度上可以优化识别

5、加速和量化

6、OCR+NLP

论文翻译:

Abstract

        场景文本检测和识别已经吸引了大量的研究者关注。现有的方法可以大致分为两类:基于字符的方法和基于分割的方法。这些方法或者需要花费字符标注的精力或者需要维护一个复杂的pipeline,这对于实时应用是十分不利的。因此我们提出了自适应贝塞尔曲线网络ABC-Net。我们的贡献包括以下三个部分:

1)首先,我们通过参数化的贝塞尔曲线拟合任意形状的文本区域;

2)我们设计了一个新的BezierAlign层来准确提取任意形状文本实例的特征,这有效的提升了文本识别的准确性;

3)相比较基于候选区域类的检测算法,我们的贝塞尔曲线检测算法具有更高的性能

         实验基于任意形状的开源数据集,Total-Text和CTW1500,ABCNet实现了sota的准确率,同时提升了速度。特别的,在Total-Text上,我们的实时版本相比较之前的sota方法快了10倍,同时能够具有相同的识别准确性。代码已经开源到https://github.com/aim-uofa/AdelaiDet

1. Introduction

        场景文本检测和识别近年大热,应用众多,并且取得了很大的进展,如[10, 41, 27, 35, 26, 42]等工作。由于自然场景的文本的多样化,如长宽比,字体样式,透视扭曲,形状等,对他的检测和识仍然是一项挑战。即使深度学习的发展极大的提高了自然场景端到端识别的准确性,现有的方法在实际应用上仍然存在一些问题,特别是识别的效率问题。

        近来,很多端到端方法[30, 36, 33, 23,43, 20]已经有效提升了任意形状文本的性能。然而,这些方法或者基于分割,需要维护一个复杂的pipeline,或者需要大量的昂贵的字符级别的标注。而且,几乎所有的这些方法都运行很慢,限制了很多实时应用。因此,我们的目标是提出一种简单高效的端到端文本spot方法,能够定位任意形状或扭曲的自然场景文本[5, 26],并且在获取快速推理的前提下达到sota的准确性。

        为了实现这个目标,我们提出了一个自适应贝塞尔曲线网络(ABC-Net),一个端到端可训练的框架,能够完成任意形状的文本spot。ABCNet通过自适应贝塞尔曲线高效的完成任意形状的文本检测,并且相比较标准的矩形bbox检测,开销可以忽略。而且,我们设计了一个全新的特征对齐层——BezierAlign,为了精确计算弯曲形状的文本实例的卷积特征,以此提高文本识别的准确性,且不会带来额外计算开销。我们第一次用参数化的贝塞尔曲线表示有向弯曲文本,并通过实验结果证实了我们方法的有效性。我们的识别结果展示在图1中。

        先前的方法如TextAlign和FOTS可以被视为ABCNet的特殊情况,因为一个矩形bbox可以被视作特殊的四条边都是直线的任意形状bbox。除此之外,ABCNet能够避免复杂的例如2D-attention的transformation过程,让识别分支可以被涉及的更加简单。

        我们将我们的贡献总结为以下:

- 为了准确定位任意方向和弯曲的场景文本,我们首先提出了一种新的利用Bezier曲线对曲线进行参数化表示的方法。与标准的bbox表示文本相比,这种方法的计算开销可以忽略不计。

- 我们提出了一个采样方法:BezierAlign,为了精确的进行特征对齐,以此使得识别分支能够自然的学习到整体文字结构。通过分享backbone提取的特征,识别分支可以被设计成轻量化结构。

- 所提方法的简洁性使得我们可以在实时应用中使用该算法。ABCNet在两个开源数据集上取得了sota的准确性,Total-Text和CTW1500,准确度和性能都很高。

 

1.1. Related Work

场景文本端到端识别需要检测和识别分段进行而不是连续的一个任务。近来,基于深度学习的方法极大的提升了文本检测和文本识别的性能。我们总结了几个具有代表性的基于深度学习的场景文本端到端识别,将其分成两类。图2展示了这些工作。

        Regular End-to-end Scene Text Spotting:[18]提出了第一个基于深度学习的端到端可训练的场景文本spot方法。该方法使用ROIPooling来将检测和识别的特征联合起来,但是它仅能识别水平文本。它的改进版本[19]显著提升了精度,但是推理速度很慢。[11,24]提出了一个anchor_free的机制来提升训练和推理速度。为了能够从检测结果种提取矩形的特征,它们使用一个简单的采样逻辑,如:Text-Align-Sampling和RoI-Rotate。这两种方法不支持任意形状文本。

        Arbitrarily-shaped End-to-end Scene Text Spotting:为了检测任意形状的场景文本,[30]提出了一个MaskTextSpotter方法,它巧妙的利用了mask-RCNN和字符级别的标注来spot字符和文本实例。该方法极大的提升了任意形状场景文本spot的性能。然后字符级别的标注极其昂贵,使用合成数据很难拟合真实场景。它的改进版本[20]有效避免了对字符级别标注的依赖。该方法以来与区域候选网络,因此推理速度比较慢。[36]提出了TextNet,能够产生出矩形的bbox,然后将bbox送入识别分支进行文本识别。尽管该方法能够识别任意形状文本,但是由于来自于矩形框,文本识别精度受限。

        最近,[33]提出了一个使用ROI Masking的方法来处理任意形状文本区域。然而,该方法的结果会被外部像素轻易影响。除此之外,分割分支增加了计算消耗,另外,还引入了多边形拟合,对结果进行平滑处理的附加时间消耗。[23]中的第一次使用单阶段任意形状场景文本spot方法,需要字符级的标注数据进行训练。[43]的作者提出了一种水平抽样方法RoISlide,它利用文本实例的预测片段中的融合特征,对任意形状的长文本具有鲁棒性。

2. Adaptive Bezier Curve Network (ABCNet)

        ABCNet是一个端到端可训练的任性形状场景文本spot算法。pipeline的直观如图3所示。受到[47, 37, 12]工作的启发,我们提出了一个一阶段anchor-free的卷积网络作为检测框架。移除了anchor box有效的简化了我们的任务。检测分支在detection_head的输出特征上进行密集预测,detection_head由4个堆叠的卷积成构成,步长为1,padding为1,kernel为3*3。然后我们提出了ABCNet的两个关键部分:1)Bezier 曲线检测;2)Beizier-Align和识别分支。

 

2.1. Bezier Curve Detection

        与基于分割的方法[40, 44, 1, 38,45, 28]相比,基于回归的方法能够直接处理任意形状的文本,如[26, 42]。然而,先前的基于回归的方法都需要复杂的参数预测来拟合文本边界,实际应用上,这对多类型的文本既不有效又鲁棒。

        为了利用回归来拟合任意形状的文本检测,我们贝塞尔曲线是一个理想的曲线参数化概念。Bezier曲线表示一个参数曲线c(t),它以Bernstein多项式[29]为基础。定义如公式1所示。

    其中,n表示级别,bi 表示第i个控制点,Bi,n(t)表示伯恩斯坦基多项式(Berntein),例如公式2:

    其中\binom{n}{i}是二项式系数。为了使用贝塞尔曲线拟合任意形状的文本形状,我们观察了很多开源数据集和真实场景中的文本,发现使用三次贝塞尔曲线可以有效的拟合不同种类的任意形状文本。三次贝塞尔曲线展示在图4中。

        基于三次贝塞尔曲线,我们利用8个控制点可以将任意形状文本的bbox表示出来。注意,平直文本只有四个控制点,它可以被视为特殊的任意形状文本。为了连续性,我们在每个矩形的长边中间插入两个控制点,构成8个。

        为了学习控制点的对应关系,我们首先利用2.1.1描述的方式来生成标注数据,然后使用类似[25]的方式来回归目标。对于每个文本实例,我们使用:

其中xmin和ymin代表4个点中的最小x和最小y值。使用相对距离进行预测的优势是贝塞尔控制点是否在图片边界内部对于预测是没有影响的。在detection_head内部,我们仅需要一个带有输出通道为16的卷积层来学习\Deltax和\Deltay,这几乎没有计算开销,而且结果仍然准确,第3节将会详细讨论该方法。

 

2.1.1 Bezier Ground Truth Generation

        在这一节,我们简单的介绍如何通过原始标注生成贝塞尔曲线的标注。Total-Text,CTW1500等开源数据集使用多边形标注来表示文本区域。给定曲线边界的标注点{pi}(i=1,...,n),其中pi代表第i个标注点,主要的目的是获取三次贝塞尔曲线c(t)的理想参数(公式1)。可以使用标准的最小二乘法来实现这个目的,如公式4:

其中,m代表一个曲线边界的标注点的个数,对于Total-Text/CTW1500来说,m就是5/7。t是通过计算长度与周长之比来获得。一个可视化效果比较展示在图5中。可以看出生成的结果开起来比原始标注更加合适。除此之外,基于贝塞尔曲线结构的bbox,我们可以轻松的使用Bezier-Align来将弯曲文本表还到一个矩形格式的文本,并且文本本身不会发生剧烈形变。更多的例子展示在图6中。我们方法的简洁有效性使得其可以应用它多种类型的文本当中。

 

2.1.2 Bezier Curve Synthetic Dataset

        对于端到端的场景文本spotting方法,大量的合成文本很有必要,如表2展示。然而现有的800k的SynText数据集只提供了四边形的bbox来处理直线文本。为了增加和丰富任意形状的场景文本,我们使用VGG16的合成方法[7]合成了150k的合成数据(94,723个直线文本,54,327 个弯曲文本)。特别的,我们过滤出从COCO-Text中40k的没有文本的背景图片,然后使用[32] 和 [17]进行了分割mask和景深信息的生成。为了丰富合成文本的信息,我们修改了VGG16的工具,增加了多种艺术字体和语料,生成了多边形标注。这些标注之后会被用来生产Bezier曲线标签,图8展示了合成数据的实例。

 

2.2. BezierAlign

        为了完成端到端训练,大多数先前的算法提出了多种采样方法(特征对齐)来连接识别分支。值得注意的是,一个采样方法代表着一个网络中的区域剪切过程。换句话说,就是给定一个ROI,使用采样方法来选择特征的ROI并且输出一个固定尺寸的特征图。然而,先前基于分割的方法先前采样方法,如ROIPooling[18],RoI Rotate[24],Text-Align-Sampling[11],或者RoI Transform[36]不能都准确对齐任意形状的文本特征。通过探索利用贝塞尔曲线来表示任意形状的bbox。我们提出了Bezier-Align来进行特征采样。Bezier-Align从RoIAlign扩展得来。不同于RoIAlign,Bezier-Align的采样区域是不规则的,每个任意形状的列网格都正交与文本的贝塞尔曲线边界。采样点在宽度和高度上都是等间距的,使用各自的coordinates进行双线性插值。

        形式化的给出一个特征图和贝塞尔曲线控制点,我们同时处理所有的矩形中的特征图输出尺寸为hout×wout。假设gi是位置为(giw, gih)的一个例子,我们能够通过公式5计算t值:

 我们然后使用公式1来计算贝塞尔曲线的上边界tp和下边界bp。使用tp和bp,我们能够利用公式6线性索引采样点。

 

使用位置op,我们能够轻易的使用双线性插值来计算结果。与之前的采样方法相比,Bezier-Align方法展示在图7中。

Recognition branch:得益于backbone特征和Bezier-Align,我们设计了一个轻量级的识别分支,如表1所示。为了更快速的预测,它包含了6个卷积层,一个双线性LSTM层和一个全链接层。基于输出的分类分数,我们使用经典的CTC-loss来做字符对齐。注意,在训练阶段,我们直接使用生成的Bezier曲线标注数据提取ROI特征,因此检测分支不会影响识别分支。在推理阶段,ROi区域被2.1节中描述的Bezier曲线的输出所代替。第3节的消融学习实验展示出了Bezier-Align分支能够显著提升识别分支的性能。

 

3. Experiments

        我们在两个开源数据集Total-Text和CTW1500上来评估我们的方法,这其中也包含了大量的直线文本。我们也在Total-Text上构建消融学习实验来验证我们方法的有效性。

 

3.1. Implemented details

        本文Backbone的设计遵循了先前的文章如,为ResNet-50 [9]结合Feature Pyramid Network (FPN)。对于检测分支,我们在输入图像的1/8、1/16、1/32、1/64和1/128分辨率的5个特征图上使用roalign;对于识别分支,则在1/4、1/8和1/16大小的三个特征图上进行BezierAlign。训练数据集包含开源可用的单词级别的标注,包含150k的2.1.2中描述的合成数据和15k、COCO-Text中过滤出的数据和7k的ICDAR-MLT数据。预训练模型完成后会finetuning到目标数据集。除此之外我们进行了若干数据增强操作,例如随机在500-800之间选择短边长度,并且保证长边的长度小于1333;随机裁剪,我们保证裁剪的长度大于原始图片大小的一半,并且需要保证所有文本区域不可以被裁剪,对于特殊case,不进行裁剪。

        训练GPU是Tesla V100,batch_size给到32,最大迭代次数为150k;初始学习率是0.01,在第70k步减少到0.001,第120k个迭代减少到0.0001。整个训练过程耗时3天。

 

3.2. Experimental results on Total-Text

Dataset:Total-Text 数据集[3] 是2017年提出的非常重要的任意形状文本的开源数据集。其中的数据搜集自多种场景,包括复杂背景,类似文本的数据等,共1555个图片,1255个训练,300个测试。为了与真实场景的图片相似,图片中包含大量的直线文本,但是每张图片至少有一个弯曲文本。文本实例的标注基于单词级别。它的扩展版本[5]改进了训练集的注释,在文本识别序列之后用固定的十个点对每个文本实例进行注释。数据集仅包含英文文本。为了评估端到端的结果,我们采用了与以前方法相同的度量,即使用F度量来度量单词的准确性。

Ablation studies: BezierAlign:为了评估所提方法的有效性,我们在该数据集上构建了消融性学习。我们首先进行了采样点的个数如何影响最终的端到端结果的实验,结果如表4。

从结果我们可以发现,采样点的数量能够显著影响模型最终的性能和准确性。我们发现(7, 32)的设置可以在F值和FPS当中达到最佳平衡,该参数会在接下来的实验中被使用。进一步我们评估了Bezier-Align,通过评估以前的采样方法,如图7。

结果如表3所示,Bezier-Align显著提升了端到端的识别率,矩形矫正的结果如图9所示。

更多实验结果请自行阅读:https://arxiv.org/abs/2002.10200

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lz867422770/article/details/107629722

智能推荐

uni-app本地打包配置过程中出现的问题_本地安装包生成失败,请重试或者切换到非安心打包模式进行打包-程序员宅基地

文章浏览阅读1.3w次,点赞2次,收藏5次。1、配置android studio这里面没有主要碰到以下坑:1、偶尔会出现没有这个选项,可以通过重启电脑或者重启软件的方式解决(多重启几次);2、碰到opengles的版本过低的问题,可以升级一下驱动,可以在这个网站进行下载http://www.ldmnq.com/bbs/thread-9-1-1.html(注意可能会有捆绑软件!)3、Emulator: Process finish..._本地安装包生成失败,请重试或者切换到非安心打包模式进行打包

JAVA中的互斥锁_java 互斥锁-程序员宅基地

文章浏览阅读1.2k次。无_java 互斥锁

UnityAR之旅-Vuforia ModelTarget模型识别(一)_modeltarget面数是什么-程序员宅基地

文章浏览阅读4.4k次,点赞6次,收藏35次。最近接触了Unity的AR开发,踩了无数个坑,最终还是成功的扫描了出来。Model Target功能是Vuforia近几年才推出的功能,而且在Unity2017.3之后的版本中,Vuforia已经内嵌到了Unity中,可以说是非常的方便。这里先分享一下开发过程,之后在分享一下踩过的奇葩的坑。使用的Unity版本是2018.3.8f1.这里建议使用2018的版本。首先,要去Vuforia的官网..._modeltarget面数是什么

区别 stream().filter和stream().map,简单的不要不要的_stream filter map-程序员宅基地

文章浏览阅读5.7k次,点赞3次,收藏5次。用到stream特性的情况。一般是在List的操作上。用List的操作,一般都是获取子集(匹配)或者获取其中某些制定项的操作会比较多。例如从一个List<T>中获取满足条件的子集。一般我们都会用stream().filter和stream().map来处理。这两个用的比较多,有些同学还会遇到用着用着就迷糊了:到底什么时候用什么?这两个又有什么区别呢?下面我们简单来上个代码。1、先上个砧板上的肉肉(List):@Data //Lombokpublic Cl..._stream filter map

office2016找不到 Internet 服务器或代理服务器 的问题_excel 2016无法连接到internet-程序员宅基地

文章浏览阅读5.6k次。找到Internet选项然后:连接-局域网设置 里面,如果自动配置是 “使用自动配置脚本”,把它取消掉改成自动检测设置就行了。_excel 2016无法连接到internet

spring Boot快速入门-程序员宅基地

文章浏览阅读1.7k次,点赞25次,收藏33次。spring boot+maven+mybatis实现web json数据返回数据库的数据

随便推点

LeetCode 279.Perfect Squares-程序员宅基地

文章浏览阅读82次。Perfect SquaresGiven a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 16, ...) which sum to n.Example 1:Input: n = 12Output: 3 Explanation: 12 = 4 +...

zabbix - API 入门 - 未完待续_zabbix接口入门-程序员宅基地

文章浏览阅读136次。官网介绍:ZabbixAPIallows you to programmatically retrieve and modify the configuration of Zabbix and provides access to historical data. It is widely used to:Create new applications to work with Zab..._zabbix接口入门

php后台调图片,记一次 PHP 对图片的裁剪,缩略图 方法(后台方法)-程序员宅基地

文章浏览阅读118次。//裁剪function get_thumb_img($old_src){$new_src= "******/".time().rand(0,5000).rand(5000,10000).'_n.jpg';$old_info= getimagesize($old_src);switch($old_info[2]){case 1:$im = imagecreatefromgif($old_src);..._访问php后端的图片

C++多线程详细讲解-程序员宅基地

文章浏览阅读4.7w次,点赞178次,收藏1.1k次。本文是纯转载,觉得大佬写的非常好!如有侵权可以删除链接: link.C++多线程基础教程目录1 什么是C++多线程?2 C++多线程基础知识2.1 创建线程2.2 互斥量使用lock()与unlock():lock_guard():unique_lock:condition_variable:2.3 异步线程async与future:shared_future2.4 原子类型automic实例生产者消费者问题4 C++多线程高级知识4.1 线程池线程池基础知识线程池_c++多线程

关于QTableWidget的item所占内存的释放问题 ._new qtablewidgetitem 需要delete吗-程序员宅基地

文章浏览阅读1.3k次。关于QTableWidget中的数量众多的item所占内存比较多,用完要释放的问题。现在有两个问题:1 是什么时候释放?2 如何释放我们先看第一个问题,因为我现在的程序里面是定期刷新table,每次加载大量的数据,所以如果不清除之前的内存,就会使内存一直申请得_new qtablewidgetitem 需要delete吗

SQL查询练习_查询score表的所有记录以cno降序,degree升序显示-程序员宅基地

文章浏览阅读1.9k次,点赞3次,收藏18次。-- 练习--1、 查询Student表中的所有记录的Sname、Ssex和Class列。select SNAME,SSEX,CLASS FROM STUDENT;--2、 查询教师所有的单位即不重复的Depart列。-- distinct:去除重复 all:显示所有(默认)select distinct DEPART from TEACHER;select DEPART from TEACHER group by DEPART;--3、 查询Student表的所有记录。sele._查询score表的所有记录以cno降序,degree升序显示

推荐文章

热门文章

相关标签