基于分割思想的文本检测算法

2020-10-23 14:50:57 浏览数 (1)

本文使用 Zhihu On VSCode 创作并发布

在文本检测任务中,较少出现字符重合的情况(重合的字符人也认不出来啊),所以基于分割思想的文本检测算法也能得到很好的效果。

1. 使用人工特征

文本检测领域常见的人工特征算法有两种:SWT和MSER,这些方法的效率比滑窗法更高,精度也更好。

SWT算法思路:图片中的文本都具有一致宽度的线条。

其计算步骤如下:

  1. 计算梯度图;
  2. 在梯度图中寻找梯度方向相反的边缘像素对;
  3. 根据像素对得到连通域,然后使用人工规则对连通域进行筛选,得到字符区域;
  4. 将字符区域拼接成文本行。

MSER算法的思路:单个文本内部的像素值不会有太大差异, 类似于分水岭算法

其计算步骤如下:

  1. 从0到255,选择不同的阈值对图片进行二值化;
  2. 记录下不同阈值下的二值化图像的各个连通域的面积变化;
  3. 寻找在一定阈值范围内,面积变化较为稳定的连通域;
  4. 根据人工规则从这些稳定连通域中筛选出文本区域;

opencv里面有MSER的实现,可以直接拿来用。

连通域法更关注局部的特征,这种局部特征难以区分图片中的类字符物体,如何剔除误检是这种方法首要解决的问题。

除这两种算法以外,还可以尝试使用一些通用的局部特征算子,我曾经用过harris角点,在文档和证件场景下的效果还是不错的。

2. 深度学习文本检测

深度学习算法在误检方便表现比传统方法要好。

另外,虽然文本检测中比较少有重合字符,却还是需要处理字符粘连的情况,所以各种深度学习的模型在得到连通域之后,都需要再进行一步特殊的后处理过程。实现字符实例之间的区分。

下面四个算法采用了四种不同的方式实现了文本实例的分隔。

EAST

网络结构如下:

EAST

模型的输出包含两个部分:

一个是score map,是图片中的每个像素为文本像素的可能性(text/non-text),其训练标签是ground truth基础上进行收缩之后得到的分割图

一个是score map上每个对应的检测框的坐标,这里的坐标有两种表示方式:(1)点到四个边界的距离 检测框的倾斜角度(2)检测框的四个顶点坐标。

因为score map上每个达到阈值的点都会对应一个检测框,会产生很多高度重合的检测框。所以EAST算法中在NMS之前添加了检测框融合的操作,称之为LocalNMS。

注意:

  1. 倾斜矩形或者四边形的LocalNMS计算量较大,纯靠numpy或者pytorch接口很难实现实时检测,需要借助shapely、opencv或者用C/C 自己写。
  2. 因为感受野的问题,EAST对长文本效果较差,有长文本检测需求的可以尝试AdvancedEAST。

PixelLink

网络结构如下:

PixelLink

网络的输出也包含两个部分:

一个是score map, 也是图片中的每个像素为文本像素的可能性(text/non-text)。

一个是link predict, 即每个像素的八个相邻位置与该像素同属一个文本实例的可能性。

在预测过程时,只要有一个方向的link成立则认为两个像素属于同一个文本实例,然后使用并查集算法将这些像素点合并,合并之后用opencv找最小包含矩形即可。

PSENet

网络结构如下:

PSENet

在训练之前,将ground truth进行多次不同比例的收缩,并生成对应的分割图。

预测不同粗细的文本区域,从细区域开始使用广度优先搜索,逐级膨胀得到连通域。

CRAFT

全名:Character Region Awareness for Text Detection

网络结构如下:

CRAFT

网络的输出也包含两个部分:

一个是region map, 是字符区域的高斯map 一个是affinity map, 是字符之间的连接区域的高斯map

对于icdar15这样的只提供了单词级标签的数据集,需要借助预训练的模型来完成字符分割。

字符级的高斯map让文本实例的分隔变得更加简单。

0 人点赞