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(单词中字符的个数)。通过红色部分,我们能够得到伪的单词长度lc(w)l^c(w)lc(w)。然后我们定义置信分数sconf(w)s_{conf}(w)sconf(w):
伪单词长度与真实单词长度差异越小,置信分越高。然后将属于R(w)内的像素点的置信分都设置成sconf(w)s_{conf}(w)sconf(w),p代表像素点,得到的ScpS_c{p}Scp就是confidence map。
Loss最终定义为: