本文主要是介绍OCR概述和CRAFT,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
基于候选框的文本检测框架是在通用物体检测的基础上,通过设置更多不同长宽比的锚框来适应文本变长的特性,以达到文本定位的效果。例如基于经典的 Faster R-CNN 所衍生出来的 Facebook 大规模文本提取系统 Rosetta[34]、基于 SSD 框架的 SegLink[35]和 TextBoxes++[36]等。
基于像素分割的文本检测框架首先通过图像语义分割获得可能属于的文本区域的像素,之后通过像素点直接回归或者对文本像素的聚合得到最终的文本定位。例如基于 FCN 的 TextSnake[37]、由 Mask R-CNN 所衍生的 SPCNet[38]和 MaskTextSpotter[39]等。
基于候选框的文本检测对文本尺度本身不敏感,对小文本的检出率高;但是对于倾斜角度较大的密集文本块,该方法很容易因为无法适应文本方向的剧烈变化以及对文本的包覆性不够紧密而检测失败。此外,由于基于候选框的检测方法是利用整体文本的粗粒度特征,而非像素级别的精细特征,它的检测精度往往不如基于像素分割的文本检测。基于像素分割的文本检测往往具有更好的精确度,但是对于小尺度的文本,因为对应的文本像素过于稀疏,检出率通常不高,除非以牺牲检测效率为代价对输入图像进行大尺度的放大。
近些年end to end的方法例如CRNN或者下面介绍的CRAFTS(Character Region Attention For Text Spotting),最终输出一般还需要接一个CTC来完成序列到序列的变换
---------------------------
一、引言
近年来自然场景文本检测的算法大致可以分为文本框位置预测和图像分割两种思路,感兴趣的朋友可以看之前我写的一篇综述:
坚果粥:自然场景文本检测识别 - 综述 - Part II62 赞同 · 1 评论文章正在上传…重新上传取消
图像分割的方案由于不假设文本框为矩形,因而在不规则文本的检测上更胜一筹。由于文本行内的字符之间存在间隙,因此字符相比于文本框是更基本的图像分割单元。然而,字符框的标注成本太高而难以获得,所以大多数图像分割的检测算法(如PixelLink)退而求其次,以文本行作为分割单元。
以文本行作为分割单元,图片取自[3]
Character Region Awareness For Text detection (CRAFT)是2019年4月由navercorp的学者提出的文本检测模型。这篇文章最大贡献是它创新的提出了一种弱监督模型,可以在真实样本只有文本行标注的情况下,做字符尺度的图像分割。CRAFT在多个数据集上达到了SOTA的准确率,并且保持了很不错的运算速度,下面我对它做一个详细的介绍。
算法准确性和速度,图片取自[1]
二、模型架构
CRAFT的骨干卷积网络是VGG16,在此基础上作者使用了类似于U-net的结构,浅层和深层的卷积特征相结合作为输出,有效的保留了浅层的结构特征和深层的语义特征,这一思想已被广泛应用于各种STR检测模型。在U-net之后,网络增加一系列层卷积操层,最终的1x1卷积层使用两个卷积核输出两个分支结果,第一支为各像素点处于字符中心的概率(位置分),第二支为各像素点处于字符间隙的概率(邻域分)。通过这两层输出,我们可以分别得到字符位置和字符间连接情况,进而将结果整合为文本框。
CRAFT网络架构,图片取自[1]
以往的工作中,图像分割的标注往往非0即1,即某个像素点要么处于文本行内,要么处于文本行外。然而,即便处于文本行内的像素点,也存在中心和边缘的区别。在CRAFT中,图像分割的标注是一个连续的二维高斯分布,位于字符框中心的像素点有较高的位置分,而位于字符框边缘的像素点位置分较低,从而模型充分利用了像素点的位置信息。由于字符框通常为不规则的四边形,具体操作中,CRAFT需将二维标准高斯分布变换到字符框四边形中,如下图Score Generation Module所示。
具有高斯分布的位置分与邻域分标注,图片取自[1]
获取邻域分标注时,我们首先将字符框四边形的对角线相连,如上图左侧Affinity Box Generation中蓝色实线所示。接着,我们分别找到上下两个三角形的重心(蓝色十字),两个相邻的字符共有四个三角形重心,我们将它们组成的四边形定为邻域框。最后,我们用之前位置分相同的方法,生成邻域框内的高斯分布,从而得到了邻域分。最终的结果可见上图最右侧的heat map。
三、弱监督学习
如何从文本框标注获得可靠的字符框标注是本文的最大亮点。CRAFT采用了弱监督学习的方法,有效的解决了这个问题。在训练初期,我们使用的训练集为合成的非真实图片,合成图片中具有字符框准确的标注信息,因而可以直接使用。合成图片与真实图片的数据特征有相似之处但又不完全相同,其可以为模型训练提供有限的帮助。当模型具有一定预测能力后,我们再开始使用真实图片。
合成图片,图片取自[1]
由于真实图片缺乏字符框标注,文章中采取了以下的训练方案:首先我们将文本行截取出来,利用当前训练好的模型预测每个像素点的位置分;接着从位置分的分布中,我们可以分离出来当前模型判断的字符框数量和位置,并利用这些字符框作为标注回头来训练模型。由于此时模型预测的字符框准确性并没有保证,在计入损失函数时,我们需要为对应的损失乘以一个置信概率。需要注意的是,实际的字符数量(文本标注长度)是已知的,未知的仅仅是字符框的位置。因此,我们可以利用预测和实际的字符数量的差来衡量预测的准确性,即置信概率=1-字符数差/实际字符数量。例如下图中,三个文本行的置信概率分别为6/6,5/7和5/6。需要注意的是,为了保证这种训练模式的有效性,作者在这一步训练中也掺入了较低比例(1:5)的具有准确字符框标注的合成图片。
弱监督学习示意图,图片取自[1]
为了验证这种训练模式的有效性,作者观察了训练过程中模型表现的变化情况,如下图。可以看到,在训练过程的前几个epoch,模型预测结果很糟糕;但是随着训练的不断进行,模型的效果明显的提升,逐渐可以区分开不同的字符,从而证明了弱监督学习的有效性。这也说明了文本行中的字符数量是一个很强的判断指标,在CRAFT中得到了巧妙的应用。
模型效果随训练的提升,图片取自[1]
四,文本框生成
在得到了所有像素点的位置分和邻域分以后,我们还需要将结果整合为最终的文本框作为输出。文章中作者对位置分和邻域分分别设定了一个阈值,将两者中至少有一方高于阈值的像素点标为1,其他标为0,然后将所有相连的值为1的像素定为一个文本目标。在需要矩形文本框的任务中,我们找到一个面积最小的包围整个目标的矩形作为输出;在需要多边形文本框的任务中,我们可以根据每个字符的中心点和宽度构造一个多边形,如下图所示。
矩形和多边形文本框预测,图片取自[1]
五、总结
综上所述,CRAFT在没有字符框标注的情况下,巧妙的利用弱监督学习的方法训练字符分割模型,在文本检测任务中达到了SOTA的准确率。另外,CRAFT还保持了良好的运算速度,并且可以检测汉字。
在自然场景中汉字检测识别任务中,CRAFT比起Attention OCR中的Cascade Mask RCNN速度提升了一倍,极大的缩短了推断时间。当然,在使用CRAFT默认参数的测试中,它也存在少许的文本遗漏情况。
CRAFT作者已将代码和预训练模型公开在github上,感兴趣的朋友可看链接:https://github.com/clovaai/CRAFT-pytorch
最后,由于我水平有限,如果大家有什么问题和建议,欢迎在评论区指出~
看到这里了,点赞关注一下吧!
这篇关于OCR概述和CRAFT的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!