文本检测之-craft检测算法

论文名称:
Character Region Awareness for Text Detection
开源代码:
https://github.com/clovaai/CRAFT-pytorch

论文核心思想:
本论文为2019年韩国学者提出的一种字符级的文本检测算法, 取得了不错的检测效果.
craft文本检测的主要思想:

  1. 图像分割的思想, 采用u-net结构, 先下采样再上采样,
  2. 非像素级分割, 而是将一个character视为一个检测目标对象,而不是一个word(所有的word都由character构成),即不把文本框当做目标。这点有点类似ctpn, 先检测很小的bbox, 再利用bbox之间的关系进行concat. 这样的好处是***只需要关注字符级别的内容而不需要关注整个文本实例, 从而使用小感受野也能预测长文本***. ctpn检测算法也是对于长文本的检测效果会比较好. 与之相对应的就是east检测算法, 受限于感受野, 所以长文本的两端往往检测不准确.
  3. 对于公开数据集大部分都是文本框级别的标注, 而非字符级别的标注, 本文提出了一种弱监督学习思路, 先利用合成样本进行预训练, 再将预训练模型对真实数据集进行检测, 得到预测结果, 经过处理后得到高斯热度图作为真实数据集的字符级标签.

整体网络结构
文本检测之-craft检测算法_第1张图片
网络采用VGG-16的backbone进行下采样, 总共进行了5次下采样, 所以在预测阶段的输入图片的预处理上, 会将输入图片的长和宽padding到距离长和宽的值最近的32的倍数. 比如输入图片为500x400, 则会将图片padding到512x416, 可以有效的避免分割中的像素漂移现象. 利用Unet的思想, 对下采样的特征图再进行上采样和特征图concat操作, 最终得到原图大小1/2的2个通道特征图:region score mapaffinity score map,分别为单字符中心区域的概率和相邻字符区域中心的概率.

训练数据处理
训练数据的标签生成:
标准的像素级图像分割: 以二值化的方式离散标记每个像素的label.背景对应的mask标签为0, 前景对应的mask标签为1, 如果是多类目标, 就1,2,3,…
本文craft算法标签处理: 采用高斯热度图来生成region score和affinity score.采用高斯热度图的好处:它能很好地处理没有严格包围的边界区域.

文本检测之-craft检测算法_第2张图片craft检测算法的数据标签处理过程如图所示.绿色框为单个字符的字符框的4个顶点构成的四边形Character box, 每个Character box对角线相连, 找到上线两个三角形的中心点, 得到上图左1中的蓝色的点. 连接邻近的两个Character box的蓝色点, 构成一个红色的四边形, 即为这两个Character box对应的Affinity box. 将Character box作用在一个标准的高斯热度图上, 即可得到相对应的字符的高斯热度图标签, 即Region Score GT, 同理, 可得到Affinity Score GT.

弱监督训练过程
文本检测之-craft检测算法_第3张图片训练数据包括两个部分:

  1. 合成数据Synthetic Image . 这部分数据因为是合成的数据, 是有字符级的字符标注框的, 所以可以进行有监督的训练.
  2. 真实数据集Real Image. 这部分数据是来源于真实的公开数据集, 因为公开数据集一般只有文本框, 但没有单个字符的标注框, 所以需要进行弱监督训练.
    上图中, 蓝色的pipeline是合成数据的训练过程, 每张图片都有其相对应的高斯热度图标签. 绿色的pipeline是真实数据的训练过程. 红色的pipeline是真实数据的标签的生成过程.
    对于真实数据集, 1. 先将其图片中的文本框从原图中crop出来, 将其经过透视变换拉伸到比较正的文本框, 利用图像分割中的分水岭算法得到单个字符的位置框box, 生成对应的高斯热度图, 然后变换后重新贴回原图对应的标签图的相应的位置上. 分水岭算法得到的字符分割肯定存在一定的误差, 作者为了减少这种误差, 引入了一个评分指标的概念.
    文本检测之-craft检测算法_第4张图片
    因为真实数据集基本都标注了其文本框对应的识别结果.所以其文本框对应的字符长度信息是知道的. 比如对于文本框w, 假如其识别标签为"label", 那么l(w)=5.而分水岭算法分割出字符后也可以知道其字符长度信息lc(w), 可以计算得到其标签评分s, 假如分水岭算法分割得到的字符长度和真实字符长度一致, 那么s=1, 长度相差越大, 评分越低, 说明分水岭分割出来的结果越不可信.

在这里插入图片描述
上述公式表示: 在文本框区域, 其对应位置的像素值为上述计算得到的评分值, 在其他的非文本框区域, 对应的像素值为1.

损失函数
在这里插入图片描述
S∗r p and S∗a p 表示图片通过分水岭算法得到的估计的标签, Sr§ and
Sa§ 表示图片经过网络后最终得到的预测值, 挡训练数据为真实数据时, Sc p如公式2所示. 当训练数据为合成数据时, Sc p=1.
损失函数如上所示, 由affinity score map和region score map的L2范数两部分构成.

后处理

利用图像分割来做文本检测的话, 缺点就是后处理比较麻烦. 这点是其相较于proposal检测方法的劣势.
本文主要分为两部分:
常规矩形bbox:
1、首先对0-1之间的概率图affinity score map和region score map分别进行取二值化阈值计算, 然后将两个二值化map求并集得到一张mask图.
2、使用Connected Component Labeling(CCL) 进行区域连接
3、最后使用opencv的MinAreaRect去框出最小的四边形区域

非常规四边形poly:
文本检测之-craft检测算法_第5张图片
1、先找到扫描方向的局部最大值(blue line)
2、连接所有the local maxima上的中心点叫做中心线
3、然后将the local maxima lines旋转至于中心线垂直
4、the local maxima lines上的端点是文本控制点的候选点,为了能更好的覆盖文本,将文本最外端的两个控制点分别向外移动the local maxima lines的半径长度最为最终的控制点.

你可能感兴趣的:(文本检测)