前言
这篇论文发表在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%的框都不会被滤掉,所以就这样选了。
其实就是一个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的效果,实乃懒人福音。