代码地址:PSENet
1. 概述
导读:现有的对形状鲁棒的文本检测方法存在着两个方面的挑战:1)基于矩形框的检测器很难检测任意形状的文本区域;2)基于分割的方案对于相邻的目标很难将它们分开,会存在相邻行相交的情况。为了解决前面提到的两个问题,文章提出了一个新的网络结构PSENet(Progressive Scale Expansion Network),该方法也是基于分割的,只不过对一个目标使用多个不同的预测结果来得到。这些不同的预测结果对应的是原始标签中不同收缩比例的标注(用算法在原始结果上生成的)。之后从最小的的预测结果开始不断进行扩展得到最后的文本区域。由于最小分割图较小,因而就可以很好区分开相邻的文本行区域,这就使得对网络对形状比较鲁棒。性能方面,PSENet在SCUT-CTW1500数据集上超过之前最好的模型6.37%。
文中指出现有基于带倾斜角度的矩形框并不能很好适应文本扭曲的情况,其检测结果见图1(b)所示;基于分割的文本检测方法会存在相邻行检测混淆在一起的情况,如图1(c)中的情况所示;文章在之前工作的基础上提出了新的方法PSENet很好解决了该问题,其得到的检测结果如图1(d)所示,很好区分开了4行文本。文章提出的PSENet具有如下两个优势:
- 1)PSENet是基于分割的方法这就使得其可以检测任意形状的文本;
- 2)提出了有效的扩展方法,相邻的文本也能很有效地区分开。文中对一个文本区域分配多个分割预测结果,这些分割预测结果的大小是不一样的,文中将其称之为kernel(kernel的大致形状相同,其对应的标注是通过不同收缩力度得到的)。从最小的kernel开始不断往外扩展得到相对独立的分割区域。扩展使用的算法是基于BFS(Breadth-First-Search)的,其运算的步骤可以归纳为:(1)从最小kernel的核心开始(需要检测的实例能够被显著区分);(2)从kernel核心开始逐渐向外扩展得到更大的区域(大区域提升检测的精度);(3)直到最大的kernel被使用了;
2. 方法设计
2.1 网络结构
文章提出的网络结构见图2所示,图2中左半部分构建了4个层级的FPN网络(每层256个channel),之后将这4个层级的FPN特征concat起来(总共1024个channel),也就是经过特征融合(concat)得到融合特征F,之后使用3x3的卷积降维到256。右半边是掩膜生成部分,这里在融合特征的基础上生成
S
1
S_1
S1到
S
n
S_n
Sn的分割掩膜结果,是使用多个1x1的卷积得到的。其中
S
1
S_1
S1是最小的分割结果,可以理解为文本区域的骨干区域,该分割结果能够很好区分每个文本实例防止串行。从
S
1
S_1
S1开始使用文中提到的扩张算法得到最后的分割结果R。
2.2 检测区域扩张算法
使用分割集合
{
S
1
,
S
2
,
S
3
}
\{S_1,S_2,S_3\}
{S1,S2,S3}来对扩张算法过程进行说明,其整体流程见图3流程所示:
上图中输入的最小分割图
S
1
S_1
S1经过CC寻找到连通域,EX代表就是文章所说的扩张算法了。整个扩展算法可以使用下面的算法进行描述:
这里对扩展过程中出现冲突的像素,采取的是谁先扩展到归谁的原则进行像素归类。
2.3 标签的生成
标签是从原始标注使用不同收缩力度生成的,记生成的训练标注为
{
G
1
,
G
2
,
…
,
G
n
}
\{G_1,G_2,\dots,G_n\}
{G1,G2,…,Gn}(
G
n
G_n
Gn为原始标注),对应的多边形为
{
p
1
,
p
2
,
…
,
p
n
}
\{p_1, p_2,\dots,p_n\}
{p1,p2,…,pn},则每次收缩的力度可以计算为:
d
i
=
A
r
e
a
(
p
n
)
⋅
(
1
−
r
i
2
)
P
e
r
i
m
e
t
e
r
(
p
n
)
d_i=\frac{Area(p_n)\cdot (1-r_i^2)}{Perimeter(p_n)}
di=Perimeter(pn)Area(pn)⋅(1−ri2)
其中,
A
r
e
a
(
⋅
)
,
P
e
r
i
m
e
t
e
r
(
⋅
)
Area(\cdot), Perimeter(\cdot)
Area(⋅),Perimeter(⋅)分别代表多边形的面积与周长,对于
r
i
r_i
ri的计算可以使用如下算式得到:
r
i
=
1
−
(
1
−
m
)
∗
(
n
−
i
)
n
−
1
r_i=1-\frac{(1-m)*(n-i)}{n-1}
ri=1−n−1(1−m)∗(n−i)
其中,
m
∈
(
0
,
1
]
m\in (0,1]
m∈(0,1]是代表最小的尺度比例。
m
,
n
m,n
m,n对性能的影响见下图所示:
2.4 损失函数
文章提出网络的损失来自于分割,因而网络的损失函数被定义为多个分割掩膜联合的结果:
L
=
λ
L
c
+
(
1
−
λ
)
L
s
L=\lambda L_c + (1-\lambda)L_s
L=λLc+(1−λ)Ls
对于损失的第一项其定义形式为:
L
c
=
1
−
D
(
S
n
⋅
M
,
G
n
⋅
M
)
L_c=1-D(S_n\cdot M,G_n\cdot M)
Lc=1−D(Sn⋅M,Gn⋅M)
其中D是分割与标注的dice coefficient,其定义为:
对于损失的第二项,其定义为:
3. 实验结果
文本检测性能比较: