前言
这篇论文发表在AAAI2018上,作者给出了源码,个人认为是一篇比较work的论文。在之前DPR和SegLink两篇论文的阅读过程中,我就曾思考二者multi-task的必要性。特别是DPR的classification task,其实跟segment是几乎等价的。在复现过程中,回归任务远比分类(分割)任务难收敛。 可以认为,在自然场景下的文本检测任务中,DPR证明了anchor的非必要性,而这篇论文也从segment角度证明了location regression的非必要性,同时参考了SegLink学习分割后pixel-level的连通。 关键词:PixelLink、Segment、Link、Scene Text Detection 论文链接:https://arxiv.org/abs/1801.01315 源码链接:https://github.com/ZJULearning/pixel_link
注:编者水平有限,如有谬误,欢迎指正。若要转载,请注明出处,谢谢。 联系方式: 邮箱:yue_zhan@yahoo.com QQ:1156356625
概述
这篇论文的核心思想很直接,去除了文本检测里面比较繁琐的Location Regression部分,引入pixel-link将像素级分割link得到文本(instance)级的预测框,当然其基础框架还是FPN。一般而言,分类任务相对回归任务更好实现,也更容易训练。 不过个人拙见,论文也存在瑕疵:
分割任务得到的预测结果近似于一个下采样的feature map,会有很多噪点(离群点)影响结果。本文采取的方法是根据数据集先验生成滤波器,将连通后的噪点块滤掉。这一块处理的比较粗糙,同时引入了先验和后验的计算量。优化策略和之前的几种方法基本一致,没有什么亮点。
模型框架:
模型结构
整体框架可以简要分成预处理、CNN网络、后处理三个模块。
预处理
图片和标注按分割的来处理,主要是GT(ground truth)的处理。相比location regression,实在是简单很多。只需要根据分割生成mask即可,同时按像素的连通规则对每个像素点生成其8-连通域的mask。 对训练数据集生成先验的滤波器,这个滤波器其实只相当于俩阈值。文中举例,对IC15数据集,短边小于10个像素或面积小于300就给滤掉。具体设定是,训练集99%的框都不会被滤掉,所以就这样选了。
CNN网络
其实就是一个FPN,跟之前几个网络没大区别。
后处理
用生成的link prediction将分割得到的mask连通成框,主要是为了适应数据集,其实分割是不用按框处理的。对于相邻两个像素点,只要有一方的link为真,就进行连接。论文特别指出,采用并查集的数据结构可以在A连B、B连A这样的冗余下,快速生成连通分支。一个联通分支就是一个预测框了,不过会有重叠情况,这一块要看源码理解。
损失函数
Loss on Pixels 同样是一个multi-task的损失函数,
λ
\lambda
λ设为2.0:
L
=
λ
L
p
i
x
e
l
+
L
l
i
n
k
(1)
L=\lambda L_{pixel}+L_{link}\tag1
L=λLpixel+Llink(1)图片中大文本区域像素数量远多于小区域的,理所当然按区域size做一个pixel loss的归一化,论文称为Instance-Balanced Cross-Entropy Loss:
B
i
=
S
N
,
S
=
∑
i
N
S
i
,
∀
i
∈
{
1
,
.
.
.
,
N
}
(2)
B_i=\frac{S}{N},S=\sum^N_i S_i,\forall i\in \{1,...,N\}\tag2
Bi=NS,S=i∑NSi,∀i∈{1,...,N}(2)每个框的权值是
w
i
=
B
i
S
i
w_i=\frac{B_i}{S_i}
wi=SiBi,可以简单理解为按框框size做了归一化。 Online Hard Example Mining(OHEM),针对负样本与正样本数量不均衡的问题,GT框框内像素为正样本。按1:3比例取置信度最高的top 3*S个负样本。所以总的pixel classification loss为:
L
p
i
x
e
l
=
1
(
1
+
r
)
S
W
L
p
i
x
e
l
_
C
E
(3)
L_{pixel}=\frac{1}{(1+r)S}WL_{pixel\_CE}\tag3
Lpixel=(1+r)S1WLpixel_CE(3)其中
L
p
i
x
e
l
_
C
E
L_{pixel\_CE}
Lpixel_CE是文本/非文本的交叉熵损失。Loss on Links 连接损失仅在分类正样本上计算,可以分成两部分:
L
l
i
n
k
_
p
o
s
=
W
p
o
s
_
l
i
n
k
L
l
i
n
k
_
C
E
L_{link\_pos}=W_{pos\_link}L_{link\_CE}
Llink_pos=Wpos_linkLlink_CE
L
l
i
n
k
_
n
e
g
=
W
n
e
g
_
l
i
n
k
L
l
i
n
k
_
C
E
L_{link\_neg}=W_{neg\_link}L_{link\_CE}
Llink_neg=Wneg_linkLlink_CE
W
p
o
s
_
l
i
n
k
(
i
,
j
,
k
)
=
W
(
i
,
j
)
∗
(
Y
l
i
n
k
(
i
,
j
,
k
)
=
=
1
)
W_{pos\_link}(i,j,k)=W(i,j)*(Y_{link}(i,j,k)==1)
Wpos_link(i,j,k)=W(i,j)∗(Ylink(i,j,k)==1)
W
n
e
g
_
l
i
n
k
(
i
,
j
,
k
)
=
W
(
i
,
j
)
∗
(
Y
l
i
n
k
(
i
,
j
,
k
)
=
=
0
)
W_{neg\_link}(i,j,k)=W(i,j)*(Y_{link}(i,j,k)==0)
Wneg_link(i,j,k)=W(i,j)∗(Ylink(i,j,k)==0) 总的连接损失:
L
l
i
n
k
=
L
l
i
n
k
_
p
o
s
r
s
u
m
(
W
p
o
s
_
l
i
n
k
)
+
L
l
i
n
k
_
n
e
g
r
s
u
m
(
W
n
e
g
_
l
i
n
k
)
L_{link}=\frac{L_{link\_pos}}{rsum(W_{pos\_link})}+\frac{L_{link\_neg}}{rsum(W_{neg\_link})}
Llink=rsum(Wpos_link)Llink_pos+rsum(Wneg_link)Llink_neg这样设计也是考虑到,正负连接样本量不均衡。主要也是一个归一化操作,因为只在框框边缘上会有negative的连接。
总结
这篇论文工作量不是很大,不过想法很新颖(在当时)也很make sense。同时作者开放了源码,在数据集上的表现也很不错。不过我最喜欢的是,它走的是精简路线却还能达到SOTA的效果,实乃懒人福音。