论文地址:https://arxiv.org/abs/1903.12473
论文翻译:https://blog.csdn.net/m0_38007695/article/details/96425198
代码地址:
PyTorch版本:https://github.com/whai362/PSENet , https://github.com/WenmuZhou/PSENet.pytorch
TensorFlow版本:https://github.com/liuheng92/tensorflow_PSENet
方法简介
PSENet:主干网络ResNet,基本框架FPN。
亮点: 提出了内核(把 S 1 , S 2 , . . . , S n S_1,S_2,...,S_n S1,S2,...,Sn 中的文本实例的分割区域称为内核kernels)和渐进式扩展算法(Progressive Scale Expansion )。
优势:
- 是一个基于像素分割的方法,能够精确地定位任意形状的文本实例
- 提出了渐进式扩展算法,即使两个文本实例离得很近也可以分开,从而保证文本实例的准确位置。
方法流程
- 输入图像,从主干网络获得四个256通道特征图(即 P 2 , P 3 , P 4 , P 5 P_2, P_3, P_4, P_5 P2,P3,P4,P5)。
- 通过函数 C ( ⋅ ) \Bbb C(\cdot) C(⋅) 用1024个通道融合了四个特征映射得到feature map F F F(进一步将语义特征从低级别升级到高级别):
F = C ( P 2 , P 3 , P 4 , P 5 ) = P 2 ∣ ∣ U p × 2 ( P 3 ) ∣ ∣ U p × 4 ( P 4 ) ∣ ∣ U p × 8 ( P 5 ) F = \Bbb C(P_2, P_3, P_4, P_5) = P_2 \;||\; Up_{×2}(P_3) \;||\; Up_{×4}(P_4) \;||\; Up_{×8}(P_5) F=C(P2,P3,P4,P5)=P2∣∣Up×2(P3)∣∣Up×4(P4)∣∣Up×8(P5)
其中 “ ∣ ∣ || ∣∣” 代表拼接(concatenation), U p × 2 ( ⋅ ) , U p × 4 ( ⋅ ) , U p × 8 ( ⋅ ) Up_{×2}(\cdot),\; Up_{×4}(\cdot), \; Up_{×8}(\cdot) Up×2(⋅),Up×4(⋅),Up×8(⋅) 分别代表上采样 2 , 4 , 8 2, \; 4, \;8 2,4,8 倍。
-
随后,将 F F F 通过到 C o n v ( 3 , 3 ) − B N − R e L U Conv(3,3)-BN-ReLU Conv(3,3)−BN−ReLU 层中并减少至256个通道。 接下来,它通过 n n n 个 C o n v ( 1 , 1 ) − U p − S i g m o i d Conv(1, 1)-Up-Sigmoid Conv(1,1)−Up−Sigmoid 层并产生 n n n 个分割结果 S 1 , S 2 , . . . , S n S_1,S_2,...,S_n S1,S2,...,Sn。
C o n v Conv Conv, B N BN BN, R e L U ReLU ReLU 和 U p Up Up 指的是卷积,批量归一化,整流线性单元和上采样。
每个 S i S_i Si是一定尺度的所有文本实例的一个分割掩码,此处的尺度由超参数决定。 S 1 S_1 S1 具有最小尺度(最小内核)的文本实例的分割结果, S n S_n Sn 表示原始分割掩模(最大内核)。
-
使用渐进式算法将 S 1 S_1 S1 中的所有实例的内核逐渐扩展到它们在 S n S_n Sn 中的完整形状,并获得最终的检测结果 R R R。
对于训练步骤:
执行1,2,3,得到 n n n 个分割结果 S 1 , S 2 , . . . , S n S_1,S_2,...,S_n S1,S2,...,Sn 之后,对每一个分割结果和其对应的ground truth计算损失,反向传播,更新参数。
对于推理步骤:
执行1,2,3,4得出最终的检测结果。
方法细节
1. 渐进尺度扩展算法
这有一个生动的例子(下图),解释了渐进扩展算法的流程,其中心思想来自于广度优先搜索(BFS)算法。在这个例子里,我们有三个分割的结果 S = { S 1 , S 2 , S 3 } S = \{S_1, S_2, S_3\} S={S1,S2,S3}(图(a)(e)(f))。首先基于最小内核的map S 1 S_1 S1(图(a)),4个不同的连通域 C = { c 1 , c 2 , c 3 , c 4 } C = \{c_1, c_2, c_3,c_4\} C={c1,c2,c3,c4} 可以作为初始化。在图(b)中分别使用不同的颜色代表不同的连通域。现在,我们检测到了全部文本实例的中心部分(最小内核)。然后,我们通过合并 S 2 S_2 S2 中的像素逐步扩展检测到的内核,然后 S 3 S_3 S3。这两个尺度扩展结果分别在图©和图(d)中显示。最后,我们提取在图(d)中用不同颜色标记的连通域作为文本实例的最终预测。
尺度扩展的流程在图(g)中说明。扩展基于广度优先搜索算法,该算法从多个核的像素开始并迭代地合并相邻的文本像素。请注意,在扩展期间可能存在冲突的像素,如图(g)中的红色框所示。在我们的实践中处理冲突的原则是,混淆的像素只能由一个单独的内核合并 - 先到先得。由于“渐进式”扩展程序,这些边界冲突不会影响最终检测和性能。 算法1总结了尺度扩展算法的细节。在伪代码中,
T
,
P
T, P
T,P 是中间结果,
Q
Q
Q 是队列。
N
e
i
g
h
b
o
r
(
⋅
)
\rm Neighbor(\cdot)
Neighbor(⋅) 代表
p
p
p 的邻近像素(4个方向)。
G
r
o
u
p
B
y
L
a
b
e
l
(
⋅
)
\rm GroupByLabel(\cdot)
GroupByLabel(⋅) 是按标签对中间结果进行分组的函数。“
S
i
[
q
]
=
T
r
u
e
S_i[q] = \rm True
Si[q]=True” 表示
S
i
S_i
Si 中像素
q
q
q 的预测值属于文本部分。
C
C
C 和
E
E
E 分别表示扩展前后的内核。
2. 标签生成
PSENet生成不同尺度内核的分割结果(例如
S
1
,
S
2
,
.
.
.
,
S
n
S_1, S_2,...,S_n
S1,S2,...,Sn)。因此,在训练的时候,有相对应的不同内核的Ground Truth。这些Ground Truth通过缩小原始文本实例生成。在上图 (b) 中蓝色边框的多边形代表原始文本实例,它对应于最大的分割标签掩码(最右边图 ( c ))。为了顺序获得在图 ( c ) 中的收缩掩模,我们利用
V
a
t
t
i
\rm Vatti
Vatti 裁剪算法将原始多边形
p
n
p_n
pn 缩小
d
i
d_i
di 像素并得到缩小的多边形
p
i
p_i
pi(见图(a))。随后,每个收缩的多边形
p
i
p_i
pi 被转换成 0/1 二进制掩码作为分割标签 Ground Truth。 我们将这些Ground Truth分别表示为
G
1
,
G
2
,
.
.
.
,
G
n
G_1,G_2,...,G_n
G1,G2,...,Gn。在数学上,如果我们将比例视为
r
i
r_i
ri,则
p
n
p_n
pn 和
p
i
p_i
pi 之间的余量
d
i
d_i
di 可以计算为:
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{\rm{Area}(\it{p_n}) × (1 - r_i^2)}{\rm Perimeter (\it p_n)}
di=Perimeter(pn)Area(pn)×(1−ri2)
其中,
A
r
e
a
(
⋅
)
\rm Area(\cdot)
Area(⋅) 是计算多边形面积的函数,
P
e
r
i
m
e
t
e
r
(
⋅
)
\rm Perimeter(\cdot)
Perimeter(⋅) 是计算多边形周长的函数。我们定义Ground Truth
G
i
G_i
Gi 的比例
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
m
m 是最小的尺度比例(在
(
0
,
1
]
(0,1]
(0,1]之间),
n
n
n 代表分割结果数。基于上方公式的定义,比例值(
r
1
,
r
2
,
.
.
.
,
r
n
r_1, r_2, ...,r_n
r1,r2,...,rn)由两个超参数
n
n
n和
m
m
m决定,它们从
m
m
m 线性增加到 1 。
3. 损失函数
损失函数为:
L
=
λ
L
c
+
(
1
−
λ
)
L
s
L = \lambda L_c + (1-\lambda) L_s
L=λLc+(1−λ)Ls
其中
L
c
L_c
Lc 和
L
s
L_s
Ls 分别代表完整的文本实例和一个缩小的文本实例,
λ
\lambda
λ 平衡
L
c
L_c
Lc 和
L
s
L_s
Ls 之间的重要性。
在自然图像中,文本实例基本只占图像很小的区域,当使用二进制交叉熵时,这使得网络的预测更偏向于非文本区域。所以采用了 dice系数。这个dice系数
D
(
S
i
,
G
i
)
D(S_i, G_i)
D(Si,Gi) 可以表示为:
D
(
S
i
,
G
i
)
=
2
∑
x
,
y
(
S
i
,
x
,
y
×
G
i
,
x
,
y
)
∑
x
,
y
S
i
,
x
,
y
2
+
∑
x
,
y
G
i
,
x
,
y
2
D(S_i, G_i) = \frac{2 \sum_{x,y}(S_{i,x,y} × G_{i,x,y})}{\sum_{x,y}S_{i,x,y}^2 + \sum_{x,y}G_{i,x,y}^2}
D(Si,Gi)=∑x,ySi,x,y2+∑x,yGi,x,y22∑x,y(Si,x,y×Gi,x,y)
其中
S
i
,
x
,
y
S_{i, x,y}
Si,x,y 和
G
i
,
x
,
y
G_{i,x,y}
Gi,x,y 分别代表了像素
(
x
,
y
)
(x, y)
(x,y) 在分割结果
S
i
S_i
Si 和Ground Truth
G
i
G_i
Gi 中的值。
此外,有许多类似于文本笔划的模式,例如栅栏,格子等。因此,文章在训练期间采用在线硬实例挖掘(OHEM)来更好地区分这些模式。
对于OHEM可以参考文章:https://blog.csdn.net/u014380165/article/details/73148073
L
c
L_c
Lc 重点在于分割文本和非文本区域。把通过OHEM给出的training mask作为
M
M
M,则
L
c
L_c
Lc 可以表示为:
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)
L
s
L_s
Ls 是缩减文本区域的损失。因为他们是被完整文本实例的原始区域包围的,在分割结果
S
n
S_n
Sn 中忽视非文本区域的像素去避免一定冗余。因此,
L
s
L_s
Ls 可以表示为:
L
s
=
1
−
∑
i
=
1
n
−
1
D
(
S
i
⋅
W
,
G
i
⋅
W
)
n
−
1
W
x
,
y
=
{
1
,
i
f
S
n
,
x
,
y
≥
0.5
;
0
,
o
t
h
e
r
w
i
s
e
.
L_s = 1 - \frac{\sum_{i=1}^{n-1}D(S_i \cdot W, G_i \cdot W)}{n-1} \\ W_{x,y} = \begin{cases} 1, \quad if \;S_{n,x,y} \geq 0.5; \\ 0, \quad otherwise. \end{cases}
Ls=1−n−1∑i=1n−1D(Si⋅W,Gi⋅W)Wx,y={1,ifSn,x,y≥0.5;0,otherwise.
其中
W
W
W 是在
S
n
S_n
Sn 中忽视非文本区域的 mask,
S
n
,
x
,
y
S_{n,x,y}
Sn,x,y 是
S
n
S_n
Sn 中像素
(
x
,
y
)
(x,y)
(x,y) 的值。
实现细节
训练:
-
使用 ImageNet 预训练的 ResNet,随机梯度下降(SGD)
-
数据:ICDAR2017 MLT(7200训练图像,1800张验证图像)
-
Batch Size:16
-
迭代次数:180K
-
学习率: 1 × 1 0 − 3 1 × 10^{-3} 1×10−3 ,在60K和120K迭代步数时分别除以10
-
权重衰减: 5 × 1 0 − 4 5×10^{-4} 5×10−4 ,0.99的Nesterov动量 没有阻尼
其余数据集采用了两种训练策略:(1)从头训练。(2)在IC17-MLT上fine-tuning。从头开始训练时,batch size 16,迭代次数36K训练PSENet,初始学习率为 1 × 1 0 − 3 1 × 10^{-3} 1×10−3 ,在12K和24K迭代步数时分别除以10。在IC17-MLT上fine-tuning是,迭代次数是24K,初始学习率为 1 × 1 0 − 4 1× 10^{-4} 1×10−4,在12K迭代次数时除以10
损失函数:
-
λ = 0.7 \lambda = 0.7 λ=0.7
-
OHEM的负样本比例设置为 3
数据增强:
- 图像随机缩放 { 0.5 , 1.0 , 2.0 , 3.0 } \{0.5, 1.0, 2.0, 3.0\} {0.5,1.0,2.0,3.0};
- 图像随机的水平翻转,在 [ − 1 0 ∘ , 1 0 ∘ ] [-10^\circ, 10^\circ] [−10∘,10∘] 范围内随机旋转;
- 从转换的图像中随机剪切 640 × 640 640 × 640 640×640 大小的图像。