基于渐进式尺寸可扩展网络的形状鲁棒文本检测
论文链接:https://arxiv.org/pdf/1806.02559.pdf
论文代码:https://github.com/whai362/psenet
参考的文章:
【论文翻译】PSENet:Shape Robust Text Detection with Progressive Scale Expansion Network
一、简介
这是一种基于语义分割的文字框检测模型,在检测不规则形状文本和弯曲文本上效果非常好。
随着卷积神经网络(CNNs) 的飞速发展,近年来取得了很大的进展。基于包围盒回归(Bounding Box Regression) 的方法被提出了一组方法来成功地定位具有特定方向的矩形或四边形形式的文本目标。不幸的是,这些框架无法检测任意形状的文本实例(例如曲线文本),这些文本实例也经常出现在自然场景中(参见图1(B))。自然,基于语义分割的方法可以显式地处理曲线文本的检测问题。 虽然像素分割可以提取任意形状文本实例的区域,但当两个文本实例相对接近时,仍然可能无法将它们分开,因为它们的共享相邻边界可能会将它们合并为一个单一文本实例。
语义分割可以这么简单理解,对于文本来说,每个像素会有两个类别{属于文本,属于背景},通过得到一张图每个像素的类别情况,就可以得到属于文本的一块连续区域。如下图所示,忽略颜色的话,这些被着色的区域都是属于文本的区域。但是部分区域太接近了,会导致分割的时候,不同文本行的内容重叠在一起。
clipboard.png
为了解决这些问题,本文提出了一种新的实例分割网络,即渐进式扩展网络(PSENet)。PSENet有两方面的优势。 首先,psenet作为一种基于分割的方法,能够对任意形状的文本进行定位.其次,我们提出了一种渐进的尺度扩展算法,该算法可以成功地识别相邻文本实例(如上图所示)。具体地,我们将每个文本实例分配给多个预测的分割区域。为了方便起见,我们将这些分割区域表示为本文中的“核”kernel,并且对于一个文本实例,有几个对应的内核。每个内核与原始的整个文本实例共享相似的形状,并且它们都位于相同的中心点但在比例上不同。为了得到最终的检测结果,我们采用了渐进的尺度扩展算法。 它基于宽度优先搜索(BFS), 由三个步骤组成:
- 从具有最小尺度的核开始(在此步骤中可以区分实例);
- 通过逐步在较大的核中加入更多的像素来扩展它们的区域;
- 完成直到发现最大的核。
二、基础网络介绍
1. 网络结构
网络结构.png网络结构如上图所示,左边是一个FPN网络,在网络的不同层,抽取了四个feature map.层次较高的的feature map尺寸较小,但是语义信息丰富。层次低的feature map尺寸较大,视野更加开阔。P5,P4,P3,P2这四个结果都是256channel的,然后通过一个C函数,将这四层stack在一起。其中:
clipboard2.png
层次较高的不断通过上采样,保持和P2层一个尺寸规模。最终得到的1024 channel的结果之后,F首先通过一个Conv(3; 3)-BN-ReLU层将维度降低为256 channels。然后通过一个Conv(1; 1)-Up-Sigmoid层得到N个语义分割结果{S1,S2,S3,...,Sn},成为segmentation results.每个segmentation result中不同的文本行属于不同的kernel,这里就有4个kernel.可以看到SN希望得到的是和GT一致的语义分割情况,S1是SN缩小版本的语义分割。在融合的时候,实际上就是从S1开始一层层的向上融合。 融合的算法被称为Progressive Scale Expansion Algorithm。
2. Progressive Scale Expansion Algorithm
clipboard3.png首先从最小的S1开始,CC是一个寻找连接区域的函数,这个工作就是给不同的pixel设置不同的label,比如从上往下,一共有4个文本区域,被称为4个kernel,也就有四个标签(1,2,3,4).
EX就是根据已有的kernel集合C,和当前segment result,开始对C中pixel进行BFS宽度优先搜索的过程。
clipboard4.png
T是结果集合,保存了当前Si结束的时候,所有属于文本实例的pixel以及其label.P集合用于保存所有被遍历到的pixel,在应对冲突的时候有用。Q是一个队列,用于实现BFS。
首先对于C集合,将其中的pixel以及标签信息,分别送入T,P和Q。注意C集合中的pixel是被认为是文本的pixel。
当Q队列不为空时,取出(p,label),对于该点的邻居像素点,如果这个像素点没有被贴标签且在Si结果中被认为是文本类别,那么贴上p对应的label标签送入T,P,Q.
通过上面的循环,Si中被认为是文本的像素点经过了筛选优化,且贴上了属于那个kernel的标签label.原本S1中可能因为重叠而黏连的语义部分,被分开了。
最后在通过一个GroupByLabel函数,按照label将像素点分组。
经过这样的自底向上的渐进式尺寸扩展算法,文本区域被分割出来了,达到了实例分割的效果。
3. 样本生成
clipboard5.pngGT区域就是上面的蓝色区域,每个segment result的GT区域,需要根据计算得到。论文采用Vatti clipping algorithm缩小原本的多边形pn,对于segment Si,其缩小的像素数目为di,ri表示缩小的程度(0,1],Area(pn)为pn的面积,perimeter(pn)为周长。
clipboard6.png
如果有n层segment,可以通过下面的公式,得到每层的ri,其中m是一个超参数,范围在(0,1]之间
clipboard7.png
下图是选择不同的n和m的结果,根据这样的结果,选择的n=6,m=0.5
clipboard8.png
4. 损失函数
本论文主要还是一个实例分割的问题,损失函数就是Sn的损失函数Lc和Si(i=1,...,n-1)的损失函数Ls。
clipboard9.png
lambda=0.7。
采用dice coefficient来度量预测的S和GT的匹配程度,结果越接近1说明度量的结果越好,接接近0表示效果不好。其中Si,x,y,Gi,x,y分别表示像素点(x,y)在预测中的结果(范围在0到1之间)和在GT中的结果(取值只有0,1)。最完美的情况中,D=1。
clipboard10.png
难例挖掘采用的在线难样本挖掘。M是一个training mask, 对于属于难例和正例的像素点对应位置为1,其他像素点为0。这样就保证dice coefficient系数计算的是难例和正例了,在实验中,正例:难例=1:3.
clipboard11.png
Ls是除了Sn之外所有层的结果的平均,从PSE算法可以看出,不在Sn中的文本实例在最终的结果中也不会被采用。因此可以设置一个W掩码,用于标注Sn认为的文本实例,减轻计算量。
clipboard12.png
三、实验效果
一句话,效果非常好
clipboard13.png clipboard14.png
网友评论