本文使用 Zhihu On VSCode 创作并发布
在文本检测任务中,较少出现字符重合的情况(重合的字符人也认不出来啊),所以基于分割思想的文本检测算法也能得到很好的效果。
1. 使用人工特征
文本检测领域常见的人工特征算法有两种:SWT和MSER,这些方法的效率比滑窗法更高,精度也更好。
SWT算法思路:图片中的文本都具有一致宽度的线条。
其计算步骤如下:
- 计算梯度图;
- 在梯度图中寻找梯度方向相反的边缘像素对;
- 根据像素对得到连通域,然后使用人工规则对连通域进行筛选,得到字符区域;
- 将字符区域拼接成文本行。
MSER算法的思路:单个文本内部的像素值不会有太大差异, 类似于分水岭算法
其计算步骤如下:
- 从0到255,选择不同的阈值对图片进行二值化;
- 记录下不同阈值下的二值化图像的各个连通域的面积变化;
- 寻找在一定阈值范围内,面积变化较为稳定的连通域;
- 根据人工规则从这些稳定连通域中筛选出文本区域;
opencv里面有MSER的实现,可以直接拿来用。
连通域法更关注局部的特征,这种局部特征难以区分图片中的类字符物体,如何剔除误检是这种方法首要解决的问题。
除这两种算法以外,还可以尝试使用一些通用的局部特征算子,我曾经用过harris角点,在文档和证件场景下的效果还是不错的。
2. 深度学习文本检测
深度学习算法在误检方便表现比传统方法要好。
另外,虽然文本检测中比较少有重合字符,却还是需要处理字符粘连的情况,所以各种深度学习的模型在得到连通域之后,都需要再进行一步特殊的后处理过程。实现字符实例之间的区分。
下面四个算法采用了四种不同的方式实现了文本实例的分隔。
EAST
网络结构如下:
EAST
模型的输出包含两个部分:
一个是score map,是图片中的每个像素为文本像素的可能性(text/non-text),其训练标签是ground truth基础上进行收缩之后得到的分割图
一个是score map上每个对应的检测框的坐标,这里的坐标有两种表示方式:(1)点到四个边界的距离 检测框的倾斜角度(2)检测框的四个顶点坐标。
因为score map上每个达到阈值的点都会对应一个检测框,会产生很多高度重合的检测框。所以EAST算法中在NMS之前添加了检测框融合的操作,称之为LocalNMS。
注意:
- 倾斜矩形或者四边形的LocalNMS计算量较大,纯靠numpy或者pytorch接口很难实现实时检测,需要借助shapely、opencv或者用C/C 自己写。
- 因为感受野的问题,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让文本实例的分隔变得更加简单。