基于字符区域感知的文本检测
论文地址:https://arxiv.org/abs/1904.01941
论文翻译:https://blog.csdn.net/m0_38007695/article/details/97813906
Pytorch 代码实现 https://github.com/clovaai/CRAFT-pytorch (只有预测部分)
Pytorch 代码实现 https://github.com/backtime92/CRAFT-Reimplementation (非官方实现,未达到论文结果)
方法介绍
本文提出了一种基于 字符感知 的文本检测方法。该方法是通过精确地定位每一个字符,然后再把检测到的字符连接成一个文本达到检测的目的。由于该方法只需要关注字符以及字符之间的距离,不需要关注整行文本,所以不需要很大的感受野,对于弯曲、变形或者极长的文本都适用。由于要精确的检测到每一个字符,所以对粘连字符(比如孟加拉语和阿拉伯语)的检测效果并不是很好。
在网络结构方面,使用的是VGG16-BN以及类似于 U-net 的结构,最终输出两个通道的 score map: region score 和 affinity score(见上图)。region score表示该像素是字符中心的概率,affinity score 表示相邻字符中间空白区域中心的概率。根据这两个score map将字符连接成文本。
方法流程
训练:
- 首先使用合成数据集训练 50K 个迭代(图2蓝线流程),然后采用每个基准数据集微调模型;
- 对于实际数据集,首先使用 弱监督学习 生成 伪GTs(图2红线流程),然后进行与合成数据相同的训练;
推断:
- 使用训练好的模型生成字符的 region score 和 affinity score;
- 使用文本提出的 后处理方法 生成文本边框;
- 围绕字符区域生成多边形;
对于 CTW-1500 数据集,添加了一个 LinkRefiner 去细化 affinity score,生成了 refined affinity score 来替代 affinity score ,然后再生成多边形。
要进行训练首先需要生成 region score 和 affinity score 的ground truth。
Ground Truth 生成
给定字符边界框坐标,为 region score 和 affinity score 生成 ground truth。
文中生成 ground truth 使用的不是离散化的二进制图,而是使用高斯热图对字符中心的概率进行编码(高斯热图在处理非严格限制的ground truth 区域时具有高度灵活性),来表示ground truth。
给定字符框(Character Boxes),region score 和 affinity score 的 ground truth的 生成流程 如下:
- 使用字符框生成亲和框(Affinity Boxes);
- 准备一个二维各向同行高斯映射;
- 计算高斯图和每个字符框(亲和框)之间的透视变换;
- 把高斯图映射到字符框(亲和框)得到 region score GT(affinity score GT)。
亲和框定义: 连接字符框的对角线,生成两个三角形(上下三角形)。然后对于每对相邻字符框(有四个三角形),连接四个三角形的中心生成亲和框。
现在生成了Ground Truth,可以进行训练了?不,生成Ground Truth的前提条件是要有字符框,但是在真实的数据集中一般都是词(行)注释,没有字注释,所以需要把词(行)注释转换成字注释。文中提出了一个弱监督学习框架使用词(行)注释来估计字注释,再生成ground truth。
弱监督学习
通过弱监督训练模型,得到的字符框与实际的字符框存在差距,所以需要在训练时增加这一部分损失来衡量生成的伪GTs(pseudo-GTs)。每个词(行)注释的置信度图与检测到的字符数除以ground truth字符的数量成比例。
对于训练数据的词(行)注释样本
w
w
w, 令
R
(
w
)
R(w)
R(w) 和
l
(
w
)
l(w)
l(w) 分别代表边框区域和单词长度。获得估计的字符框和字符长度
l
c
(
w
)
l^c(w)
lc(w) 之后,样本
w
w
w 的置信分数
s
c
o
n
f
(
w
)
s_{conf}(w)
sconf(w) 计算如下:
s
c
o
n
f
(
w
)
=
l
(
w
)
−
m
i
n
(
l
(
w
)
,
∣
l
(
w
)
−
l
c
(
w
)
∣
)
l
(
w
)
(1)
s_{conf}(w) = \frac{l(w) - min(l(w), |l(w) - l^c(w)|)}{l(w)} \tag{1}
sconf(w)=l(w)l(w)−min(l(w),∣l(w)−lc(w)∣)(1)
一张图像的像素级置信图
S
c
S_c
Sc 计算如下:
S
c
(
p
)
=
{
s
c
o
n
f
(
w
)
p
∈
R
(
w
)
1
o
t
h
e
r
w
i
s
e
(2)
S_c(p) = \begin{cases} s_{conf}(w) \quad p \in R(w) \\ 1 \qquad \qquad \rm{otherwise} \end{cases} \tag{2}
Sc(p)={sconf(w)p∈R(w)1otherwise(2)
其中
p
p
p 代表在区域
R
(
w
)
R(w)
R(w) 中的像素。则弱监督这部分的损失
L
L
L 定义为:
L
=
∑
p
S
c
(
p
)
⋅
(
∣
∣
S
r
(
p
)
−
S
r
∗
(
p
)
∣
∣
2
2
+
∣
∣
S
a
(
p
)
−
S
a
∗
(
p
)
∣
∣
2
2
)
(3)
L = \sum_{p} S_c(p) \cdot (||S_r(p) - S^*_r(p)||^2_2 + ||S_a(p) - S^*_a(p)||^2_2) \tag{3}
L=p∑Sc(p)⋅(∣∣Sr(p)−Sr∗(p)∣∣22+∣∣Sa(p)−Sa∗(p)∣∣22)(3)
其中
S
r
∗
(
p
)
S^*_r(p)
Sr∗(p) 和
S
a
∗
(
p
)
S^*_a(p)
Sa∗(p) 分别代表 region score 和 affinity map 的伪GTs ,
S
r
(
p
)
S_r(p)
Sr(p) 和
S
a
(
p
)
S_a(p)
Sa(p) 分别表示预测的 region score和 affinity score。使用合成数据训练时,不使用无监督学习,可以获得真的ground truth,所以
S
c
(
p
)
S_c(p)
Sc(p) 设置为1。
弱监督学习字符分割流程(图4):
- 从原始图像裁剪词(行)图像;
- 从训练模型中得出的 region score;
- 使用分水岭算法分割字符区域,使字符边界框覆盖此区域;
- 使用来自裁剪步骤的逆变换将字符框的坐标变换回原始图像坐标。
然后使用 Ground Truth 生成流程生成伪GTs。
如果置信分数 s c o n f ( w ) s_{conf}(w) sconf(w) 低于0.5,估计的字符边界框应该忽视,因为在训练模型时,他们会产生不良影响。在这种情况下,我们假设单个字符的宽度是常数,并通过简单地将词区域 R ( w ) R(w) R(w) 除以字符数 l ( w ) l(w) l(w) 来计算字符级预测。然后, s c o n f ( w ) s_{conf}(w) sconf(w) 设置为 0.5 学习看不见的文本。
后处理方法
生成四边形矩形框:
-
生成和原图大小相同的二进制图 M M M, 并初始化为0;
-
如果 S r ( p ) > τ r S_r(p) > \tau_r Sr(p)>τr 或者 S a ( p ) > τ a S_a(p) > \tau_a Sa(p)>τa 则 M ( p ) M(p) M(p) 设置为1;
S r ( p ) S_r(p) Sr(p) 和 S a ( p ) S_a(p) Sa(p) 分别表示预测的 region score和 affinity score, τ r \tau_r τr 是区域阈值, τ a \tau_a τa 是亲和力阈值。
-
在 M M M 上使用连通区域标记法(Connected Component Labeling,CCL);
-
通过在封闭的最小区域内连接对应于每个标签的组件找到旋转的矩形来获得 Q u a d B o x QuadBox QuadBox (词边框)。
生成多边形框,处理曲线文本:
首先,沿扫描方向找到字符区域的局部最长线(图5蓝线),局部最长线的长度都设置为它们中的最大长度。然后,连接全部局部最长线的中点生成中心线(图5黄色),并且旋转局部最长线以垂直于中心线(反应字符的倾斜角度(图5红线))。局部最长线的端点是文本多边形的候选点。最后,为了完全覆盖文本区域,沿着中心线(黄线)向外移动两个最外边的局部最长线(红线),形成最终的控制点。连接全部的控制点,组成多边形。
LinkRefiner
CTW-1500数据集只提供了多边形注释,没有文本。而且只有行级注释,中间没有空格。这和文中的 affinity score不符。为了从检测到的字符中获取单个长的多边形,采用了一个网络进行连接细化,即LinkRefiner。
在训练时,保持CRAFT不变,只使用CTW1500训练LinkRefiner。该网络输入是 region score,affinity score和 原始CRAFT模型 Stage4的feature map。采用ASPP来确保可以把同一行的字和词组合到一个大的感受野中。该网络输出是 link score,用来代替 affinity score。然后使用上边的生成流程生成多边形。CRAFT模型定位单个字符,LinkRefiner 模型将字符以及有空格分隔的单词组合在一起,用来做CTW1500评估。
LinkRefiner的ground truth生成:在多边形注释的成对控制点的中心之间绘制线,每条线的宽度与成对控制点的距离成比例。如图7。
总结
- 本文使用的字符感知方法,只需要很小的感受野就可以处理长的弯的文本。
- 泛化能力比较好,在IC13和IC17上训练的模型,在其他数据集上也有较好的结果。
- 由于要精确到每个字符的位置,所以对一些语言(孟加拉语和阿拉伯语)或者粘连字符的检测效果不好。
本文方法与其他方法对比的结果以及本文方法实现的效果图可查看论文翻译