首发于学习
Character Region Awareness for Text Detection 论文阅读

Character Region Awareness for Text Detection 论文阅读

Character Region Awareness for Text Detection 论文阅读

论文地址(arXiv)pytorch版本代码地址

最近在看一些OCR的问题,CRAFT是在场景OCR中效果比较好的模型,记录一下论文的阅读

已有的文本检测工作大致如下:

  • 基于回归的文本检测(Regression-based text detectors):TextBoxes、DMPNet .etc,运用通用目标检测方法到文本检测中。
  • 基于分割的文本检测(Segmentation-based text detectors):Multi-scale FCN、SSTD .etc,即将文本检测视为语义分割任务来分析。
  • 端到端的文本检测(End-to-end text detectors):FOTS、EAA .etc,将文本检测和识别一起处理。
  • 字符级别的文本检测(Character-level text detectors):MSER、Mask TextSpotter .etc,相对经典的方法。

之前的基于严格的词级边界的 ground truth 的方法对于不规则形状的词边界做不到很好的识别效果(例如任意方向、弯曲或变形的文本),在本文中,作者提出了一种字符级的新方法来解决已有的问题,通过探索每个字符和字符之间的亲和力来有效检测文本区域。



上图展示了CRAFT在水平、弯曲、任意弯曲三种情况下的文本检测表现情况

网络结构

本文主要思想是利用弱监督方案来finetune character-level的文本检测器,CRAFT的网络结构如下所示,



采用基于 VGG-16和批量归一化的全卷积网络架构为backbone。模型在解码部分具有Skip connect,这类似于 U-net,因此聚合了低级特征。 最终输出有两个通道作为Score:区域分数(Region score)和亲和力分数(Affinity score)。

  • Region score表示当前像素是字符中心的概率
  • Affinity score表示当前像素是相邻两字符的中心的概率

ground truth 生成

对于每个训练图像,使用字符级边界框为区域分数和亲和度分数生成真实标签。 区域得分表示给定像素为字符中心的概率,亲和度得分当前像素是相邻两字符的中心的概率。使用高斯热图对字符中心的概率进行编码。使用热图表示来学习区域分数和亲和力分数。



上图总结了合成图像的标签生成流程。直接为边界框内的每个像素计算高斯分布值非常耗时,由于图像上的字符边界框通常会通过透视投影失真,因此使用以下步骤来近似并生成区域分数和亲和度分数的真实值:

  • 准备二维各向同性高斯图
  • 计算高斯图区域与每个字符框之间的透视变换
  • 将高斯图放缩到框区域中
  • 对于Region score 的 ground truth,即采用字符级分割框定义Region Box
  • 对于Affinity score 的 ground truth,使用相邻的字符框定义Affinity Box。

通过绘制对角线连接每个字符框的对角,生成两个三角形,作为上下字符三角形。 然后,对于每个相邻的字符框对,通过将两个字符的四个上下三角形的中心设置为框的四个角来生成Affinity Box。由于 character-level 检测使卷积可以只关注字符内和字符间而不是整个文本实例,所以可以使用小的 feature map。

采用弱监督学习训练模型

与合成数据集不同,真实数据集图像通常只有 word-level 注释。在这里,以弱监督的方式从每个词级注释生成字符框,如下图所示。



  • 图中蓝线即表示使用合成数据集(character-lavel annotation)训练得到一个预训练的模型
  • 红线表示使用真实图像(word-level annotation)生成伪ground truth



生成伪GT的方法,就是先从图像中裁剪出word box,然后输入预训练模型得到Region score,接着用分水岭算法(watershed algorithm)分割每个字符位置得到Character box,最后再把分割结果映射回原来图像中的位置,即为伪GT。

  • 绿线表示使用真实图像(word-level annotation)和生成的伪ground truth微调模型

由于生成的伪GT不一定是正确的,因此需要一些线索来保证伪GT的质量,所以利用了word length(单词中字符的个数)作为一个很强的约束,并以此来构建confidence map来构建一个用于训练的Loss。具体的公式推导如下: 对于裁剪出的单词框w,R(w)表示单词框区域,l(w)表示word length(单词中字符的个数)。通过红色部分,我们能够得到伪的单词长度$l^c(w)$。然后我们定义置信分数$s_{conf}(w)$:



伪单词长度与真实单词长度差异越小,置信分越高。然后将属于R(w)内的像素点的置信分都设置成$s_{conf}(w)$,p代表像素点,得到的$S_c{p}$就是confidence map。



Loss最终定义为:


发布于 2021-06-29 15:35