论文地址: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 )。
优势:
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得出最终的检测结果。
这有一个生动的例子(下图),解释了渐进扩展算法的流程,其中心思想来自于广度优先搜索(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 分别表示扩展前后的内核。
PSENet生成不同尺度内核的分割结果(例如 S 1 , S 2 , . . . , S n S_1, S_2,...,S_n S1,S2,...,Sn)。因此,在训练的时候,有相对应的不同内核的Ground Truth。这些Ground Truth通过缩小原始文本实例生成。在上图(b)中蓝色边框的多边形代表原始文本实例,它对应于最大的分割标签掩码(最右边图©)。为了顺序获得在图©中的收缩掩模,我们利用 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 。
损失函数为:
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
数据增强: