1. 简介
文本检测任务是找出图像或视频中的文字位置。不同于目标检测任务,目标检测不仅要解决定位问题,还要解决目标分类问题。
目标检测和文本检测同属于“定位”问题。但是文本检测无需对目标分类,并且文本形状复杂多样。
当前所说的文本检测一般是自然场景文本检测,其难点在于:
- 自然场景中文本具有多样性:文本检测受到文字颜色、大小、字体、形状、方向、语言、以及文本长度的影响;
- 复杂的背景和干扰;文本检测受到图像失真,模糊,低分辨率,阴影,亮度等因素的影响;
- 文本密集甚至重叠会影响文字的检测;
- 文字存在局部一致性,文本行的一小部分,也可视为是独立的文本;
2. 算法分类
3. 算法详解
3.1 基于回归的文本检测
早期基于深度学习的文本检测算法是从目标检测的方法改进来的,支持水平文本检测。常见方法有TextBoxes、CTRN等,随着数据集的丰富,后期又增加了倾斜文本检测和弯曲文本检测。
(1)水平文本检测
TextBoxes根据SSD改进的,将默认的文本框更改为适应文本方向和宽高比的规格的四边形,特点有
CTPN是基于Fast-RCNN算法,扩展RPN模块并且设计了基于CRNN的模块让整个网络从卷积特征中检测到文本序列,二阶段的方法通过ROI Pooling获得了更准确的特征定位。
(2)任意角度文本检测
TextBoxes++在TextBoxes基础上进行改进,支持检测任意角度的文本。从结构上来说,TextBoxes++针对多角度文本进行检测,首先修改预选框的宽高比,调整宽高比aspect ratio为1、2、3、5、1/2、1/3、1/5。其次是将1∗51*51∗5的卷积核改为3∗53*53∗5,更好的学习倾斜文本的特征;最后,TextBoxes++的输出旋转框的表示信息。
EAST针对倾斜文本的定位问题,提出了two-stage的文本检测方法,包含 FCN特征提取和NMS部分。EAST提出了一种新的文本检测pipline结构,可以端对端训练并且支持检测任意朝向的文本,并且具有结构简单,性能高的特点。FCN支持输出倾斜的矩形框和水平框,可以自由选择输出格式。
- 如果输出检测形状为RBox,则输出Box旋转角度以及AABB文本形状信息,AABB表示到文本框上下左右边的偏移。RBox可以旋转矩形的文本。
- 如果输出检测框为四点框,则输出的最后一个维度为8个数字,表示从四边形的四个角顶点的位置偏移。该输出方式可以预测不规则四边形的文本。
MOST提出TFAM模块动态的调整粗粒度的检测结果的感受野,另外提出PA-NMS根据位置信息合并可靠的检测预测结果。此外,训练中还提出 Instance-wise IoU 损失函数,用于平衡训练,以处理不同尺度的文本实例。该方法可以和EAST方法结合,在检测极端长宽比和不同尺度的文本有更好的检测效果和性能。
(3)弯曲文本检测
简单思路是用多点坐标描述弯曲文本的边界多边形,然后直接预测多边形的顶点坐标。
CTD提出了直接预测弯曲文本14个顶点的边界多边形,网络中利用Bi-LSTM层以细化顶点的预测坐标,实现了基于回归方法的弯曲文本检测。
LOMO针对长文本和弯曲文本问题,提出迭代的优化文本定位特征获取更精细的文本定位,该方法包括三个部分,坐标回归模块DR,迭代优化模块IRM以及任意形状表达模块SEM。分别用于生成文本大致区域,迭代优化文本定位特征,预测文本区域、文本中心线以及文本边界。迭代的优化文本特征可以更好的解决长文本定位问题以及获得更精确的文本区域定位。
Contournet基于提出对文本轮廓点建模获取弯曲文本检测框,该方法首先使用Adaptive-RPN获取文本区域的proposal特征,然后设计了局部正交纹理感知LOTM模块学习水平与竖直方向的纹理特征,并用轮廓点表示,最后,通过同时考虑两个正交方向上的特征响应,利用Point Re-Scoring算法可以有效地滤除强单向或弱正交激活的预测,最终文本轮廓可以用一组高质量的轮廓点表示出来。
PCR提出渐进式的坐标回归处理弯曲文本检测问题,总体分为三个阶段,首先大致检测到文本区域,获得文本框,另外通过所设计的Contour Localization Mechanism预测文本最小包围框的角点坐标,然后通过叠加多个CLM模块和RCLM模块预测得到弯曲文本。该方法利用文本轮廓信息聚合得到丰富的文本轮廓特征表示,不仅能抑制冗余的噪声点对坐标回归的影响,还能更精确的定位文本区域。
3.2 基于分割的文本检测
基于回归的方法虽然在文本检测上取得了很好的效果,但是对解决弯曲文本还存在问题,且模型复杂。因此,提供了基于分割的文本检测方法,先从像素层面做分类,判别每一个像素点是否属于一个文本目标,得到文本区域的概率图,通过后处理方式(opencv,polygon等后处理)得到文本分割区域的包围曲线。
Pixellink采用分割的方法解决文本检测问题,分割对象为文本区域,将同属于一个文本行(单词)中的像素链接在一起来分割文本,直接从分割结果中提取文本边界框,无需位置回归就能达到基于回归的文本检测的效果。但是基于分割的方法存在一个问题,对于位置相近的文本,文本分割区域容易出现“粘连“问题。Wu, Yue等人[8]提出分割文本的同时,学习文本的边界位置,用于更好的区分文本区域。另外Tian等人[9]提出将同一文本的像素映射到映射空间,在映射空间中令统一文本的映射向量距离相近,不同文本的映射向量距离变远。
MSR针对文本检测的多尺度问题,提出提取相同图像的多个scale的特征,然后将这些特征融合并上采样到原图尺寸,网络最后预测文本中心区域、文本中心区域每个点到最近的边界点的x坐标偏移和y坐标偏移,最终可以得到文本区域的轮廓坐标集合。
针对基于分割的文本算法难以区分相邻文本的问题,PSENet提出渐进式的尺度扩张网络学习文本分割区域,预测不同收缩比例的文本区域,并逐个扩大检测到的文本区域,该方法本质上是边界学习方法的变体,可以有效解决任意形状相邻文本的检测问题。
假设用了PSENet后处理用了3个不同尺度的kernel,如上图s1,s2,s3所示。首先,从最小kernel s1开始,计算文本分割区域的连通域,得到(b),然后,对连通域沿着上下左右做尺度扩张,对于扩张区域属于s2但不属于s1的像素,进行归类,遇到冲突点时,采用“先到先得”原则,重复尺度扩张的操作,最终可以得到不同文本行的独立的分割区域。
Seglink++针对弯曲文本和密集文本问题,提出了一种文本块单元之间的吸引关系和排斥关系的表征,然后设计了一种最小生成树算法进行单元组合得到最终的文本检测框,并提出instance-aware 损失函数使Seglink++方法可以端对端训练。
PAN针对文本检测预测速度慢的问题,从网络设计和后处理方面进行改进,提升算法性能。首先,PAN使用了轻量级的ResNet18作为Backbone,另外设计了轻量级的特征增强模块FPEM和特征融合模块FFM增强Backbone提取的特征。在后处理方面,采用像素聚类方法,沿着预测的文本中心(kernel)四周合并与kernel的距离小于阈值d的像素。PAN保证高精度的同时具有更快的预测速度。
FCENet提出将文本包围曲线用傅立叶变换的参数表示,由于傅里叶系数表示在理论上可以拟合任意的封闭曲线,通过设计合适的模型预测基于傅里叶变换的任意形状文本包围框表示,从而实现了自然场景文本检测中对于高度弯曲文本实例的检测精度的提升。
DBNet提出可微分阈值(Differenttiable Binarization module)采用动态的阈值区分文本区域和背景。通过网络去预测图片每个位置处的阈值,而不是采用一个固定的值,更好的分离文本背景与前景。
在传统的图像分割算法中,获取概率图后,会使用标准二值化(Standard Binarize)处理,但是二值化的方法是不可微的(可微的定义:左右极限存在,且相等),无法进行end to end 训练,公式为
可微二值化将标准二值化中的阶跃函数进行了近似,公式为
其中,P是上下文获得的概率图(Probability Map),T是上下文获得的阈值图(Threshold Map),k是增益因子,然后得到近似二值图(Approximate Binary Map),当损失函数为交叉熵损失函数时,正负样本的loss是
对x求偏导:
DB模型主要分为三个部分:
- Backbone网络,负责提取图像的特征
DB文本检测网络的Backbone部分采用的是图像分类网络,可以是ResNet,MobileNetV3等模型,,DB的Backbone用于提取图像的多尺度特征,如下代码所示,假设输入的形状为[640, 640],backbone网络的输出有四个特征,其形状分别是 [1, 16, 160, 160],[1, 24, 80, 80], [1, 56, 40, 40],[1, 480, 20, 20],使用方法:
from ppocr.modeling.backbones.det_mobilenet_v3 import MobileNetV3model_backbone = MobileNetV3()
model_backbone.eval()#打印网络结构
print(model_backbone)
- FPN网络,特征金字塔结构增强特征,FPN网络的输入为Backbone部分的输出,输出特征图的高度和宽度为原图的四分之一。
图像处理的两种方式:上采样(upsample)和下采样(downsample),上采样是增大图像,下采样是缩小图案。这里的upsample是获取将较小特征上采样和大特征进行累加。
- Head网络,计算文本区域概率图,文本区域阈值图以及文本区域二值图。
import math
import paddle
from paddle import nn
import paddle.nn.functional as F
from paddle import ParamAttrclass DBHead(nn.Layer):"""Differentiable Binarization (DB) for text detection:see https://arxiv.org/abs/1911.08947args:params(dict): super parameters for build DB network"""def __init__(self, in_channels, k=50, **kwargs):super(DBHead, self).__init__()self.k = k# DBHead详细实现参考 https://github.com/PaddlePaddle/PaddleOCR/blob/release%2F2.4/ppocr/modeling/heads/det_db_head.pydef step_function(self, x, y):# 可微二值化实现,通过概率图和阈值图计算文本分割二值图return paddle.reciprocal(1 + paddle.exp(-self.k * (x - y)))def forward(self, x, targets=None):shrink_maps = self.binarize(x)if not self.training:return {'maps': shrink_maps}threshold_maps = self.thresh(x)binary_maps = self.step_function(shrink_maps, threshold_maps)y = paddle.concat([shrink_maps, threshold_maps, binary_maps], axis=1)return {'maps': y}
其他模块:
- DB模型后处理
DB后处理函数根据概率图中文本区域的响应计算出包围文本响应区域的文本框坐标。由于网络预测的概率图是经过收缩后的结果,所以在后处理步骤中,使用相同的偏移值将预测的多边形区域进行扩张,即可得到最终的文本框。
DB的输出结果是文本区域的二值图,属于文本区域的响应更高,非文本的背景区域响应值低。DB的后处理即是求这些响应区域的最小包围框,进而得到每个文本区域的坐标。 另外,通过修改后处理参数可以调整文本框的大小,或者过滤检测效果差的文本框。
DB后处理有四个参数,分别是:
- thresh: DBPostProcess中分割图进行二值化的阈值,默认值为0.3
- box_thresh: DBPostProcess中对输出框进行过滤的阈值,低于此阈值的框不会输出
- unclip_ratio: DBPostProcess中对文本框进行放大的比例
- max_candidates: DBPostProcess中输出的最大文本框数量,默认1000
- 损失函数定义
模型输出是3个预测图,则总得损失函数是
其中,L是总损失函数,Lb是文本二值图的损失函数,Ls是概率图损失,Lt是阈值图损失,是权重系数。
Lb是Dice Loss,比较文本二值图和标签之间的相似度,常用于二值图分割。
Ls是Dice Loss(OHEM),采用带OHEM的Dice Loss,目的是为了改善正负样本不均衡的问题。OHEM为一种特殊的自动采样方式,可以自动的选择难样本进行loss的计算,从而提升模型的训练效果。这里将正负样本的采样比率设为1:3。
Lt是Mask L1 Loss,计算预测的文本阈值图和标签间的L1距离。
- 评估指标
文本检测的计算指标有三个,分别是Precision,Recall和Hmean,三个指标的计算逻辑为:
- 创建[n, m]大小的一个矩阵叫做iouMat,其中n为GT(ground truth)box的个数,m为检测到的框数量;其中n,m为除去了文本标定为###的框数量;
- 在iouMat中,统计IOU大于阈值0.5的个数,将这个值除以gt个数n得到Recall;
- 在iouMat中,统计IOU大于阈值0.5的个数,将这个值除以检测框m的个数得到Precision;
- Hmean的指标计算方式同F1-score的计算方式,公式如下:
4.存在问题
(1)文字漏检
原因,GT和预测框的重叠部分小,则可以增加IOU阈值,缩小GT和预测框的差距。另外,漏检测的本质原因在于,一部分文字的特征没有响应,归根结底是网络没有学习到漏检测部分文字的特征。建议具体问题具体分析,可视化预测结果分析漏检测的原因,是否是因为光照,形变,文字较长等因素导致的,然后针对性的使用数据增强、调整网络、或者调整后处理等方法优化检测结果。
参考:
飞桨AI Studio - 人工智能学习与实训社区集开放数据、开源算法、免费算力三位一体,为开发者提供高效学习和开发环境、高价值高奖金竞赛项目,支撑高校老师轻松实现AI教学,并助力开发者学习交流,加速落地AI业务场景https://aistudio.baidu.com/aistudio/projectdetail/3335972