【论文学习笔记】PSENet:Shape Robust Text
论文地址:https://arxiv.org/pdf/1903.12473.pdf
论文翻译:https://blog.csdn.net/m0_38007695/article/details/96425198?depth_1-utm_source=distribute.pc_relevant_right.none-task&utm_source=distribute.pc_relevant_right.none-task
Pytorch代码实现:https://github.com/whai362/PSENet
最新一版是19年的CVPR,由南京大学、同济大学和face++合作,代码已开源。
介绍
针对现在主流的一些实现文本检测的方法,一种是基于回归(regression-based)的,例如图1(b)所示,该方法需要四边形的bounding box,并不能处理具有任意形状的文本;另一种是基于分割(segmentation-based)的方法,如图1(c)所示,该方法是基于像素级分类来定位文本实例,其可以检测不规则的文本,效果也不错,但是不容易将相邻文本区分开来,从而可能会导致多个不同的文本区域会被预测为一个。图1(d)是本文提出的PSENet方法(本质也是一种基于语义分割的改进版文本检测方法),有图可见,该方法能同时很好的解决上述两个问题,即可以准确的检测出任意形状的不规则文本且能将其区分开来。
对于基于分割的方法,相较于基于回归,可以较好的实现对弯曲不规则文本的检测,但由于语义分割只关心每个像素的分类问题,所以即使文字区域的一些边缘像素分类错误,其对loss的影响也不大。针对这个问题,一个直接的思路是:增大文字块之间的距离,使它们离得远一点。基于这个思路,PSENet 方法引入了新的概念“kernel”,即文字块的核心。
进一步介绍一下“kernel”在本文中起到的作用,这个“kernel”只是文字块的核心,并不是完整的文字块,故不能作为最终的检测结果。那么,如何通过“kernel”来构建完整的文字块呢?本文通过一种基于广度优先搜索(BFS)的渐进扩展算法来构建完整的文字块。这个算法的核心思想是:从每个“kernel”出发,利用广度优先搜索来不断地合并周围的像素,使得“kernel”不断地扩展,最后得到完整的文字块。
图1 不同方法的文本检测结果PSENet 方法简介
主干网络ResNet,基本框架FPN。
【补充】FPN详解: https://blog.csdn.net/WZZ18191171661/article/details/79494534
亮点:提出了内核(把S1,S2,...,Sn中的文本实例的分割区域称为内核kernels)和渐进式扩展算法(Progressive Scale Expansion )。
优势:
① 是一个基于像素分割的方法,能够精确地定位任意形状的文本实例。
② 提出了渐进式扩展算法,即使两个文本实例离得很近也可以分开,从而保证文本实例的精准定位。
PSENet 方法流程
图 2 网络架构1. 输入图像,从主干网络获得四个256通道特征图(即P2,P3,P4,P5)。
2. 通过函数C(⋅)用1024个通道融合四个特征映射得到feature map F(进一步将语义特征从低级别升级到高级别):
3. 随后将F通过Conv(3,3)− BN − ReLU 层,并减少至256个通道。 接下来,它通过n个Conv(1,1)−Up−Sigmoid层,并产生n个分割结果S1,S2,...,Sn。
补充说明:Si是图像文字的分割结果,S1是最小的文字区域分割结果,而Sn给出的是最大的文字区域分割结果(理想情况下就是GroundTruth)
4. 使用渐进式算法将Si中的所有实例的内核逐渐扩展到它们在Sn中的完整形状,并获得最终的检测结果R。
对于训练步骤:执行1,2,3, 得到n个分割结果S1,S2,...,Sn之后,对每一个分割结果和其对应的ground truth计算损失,反向传播,更新参数。
对于推理步骤:执行1,2,3,4得出最终的检测结果。
PSENet 方法细节
1、渐进扩展算法(Progressive Scale Expansion)
渐进扩展算法的主要思想就是利用BFS(广度优先搜索)算法,逐渐扩展kernel(就是下图中的白色的部分,预测的文本行区域)的大小,最终扩增到原始文本行大小(如S3)。
渐进扩展算法的输入是不同的kernel scale 的分割图S1,S2,...Sn,输出是最后的检测结果R。
图3 渐进尺度扩展算法的流程。其中CC表示求连通区域,EX表示扩展操作。令n=3个不同尺度的kernel(如图a,e,f)则其渐进扩展的算法过程如图3所示。
首先,对S1(上图a,代表最小kernel的分割结果)求连通区域,其内部有四个连通域C={c1,c2,c3,c4},经CC操作后得到不同的连通域,即图b(四个连通区域使用不同颜色标记)。现在我们已经得到了图b中的四个连通域(小kernel,不同文本行之间的margin很大,很容易区分开),且我们已知S2中的kernel是比S1中的kernel大的,也就是可以说S2中的kernel是包含S1中的kernel的。现在我们的任务就是将属于S2中的kernel的但不属于S1中的kernel的像素点(即图g左图中的灰色的部分,蓝色和橘色部分分别表示S1中的两个连通域)进行分配。如图所示,在灰色区域(S2的kernel范围)内,将b图所找到的连通域的每个pixel以BFS的方式,逐个向上下左右扩展,即相当于把S1中预测的文本行的区域逐渐变宽(或者换种说法:对于S2中kernel的每个像素点,把它们都分别分配给S1中的某个连通域)。这里还有一个问题,如图g右图所示,图中值为2的点为冲突点,例子中的两个连通域都可能扩展到这个pixel,论文中对这种冲突的解决方法就是“先到先得”原则,这对最后的结果没什么影响。
后面的S3同理,最终我们抽取图d中不同颜色标注的连通区域作为最后的文本行检测结果。
渐进式扩展算法的伪代码见下图:
其中,T、P代表中间结果,Q是一个队列,Neighbor(.)代表p的邻近像素(4个方向 )。GroupByLabel(.)是根据按标签对中间结果T进行分组的函数。“Si[q]=True” 表示Si中像素q的预测值属于文本部分。C和E分别表示扩展前后的内核。
这里需要解释一下上图中画线的部分,if的三个条件分别表示的是:q是p的邻居,q没有被打标签(还没有被扩展到),q是一个前景像素点(在当前的Si预测的kernel内,即扩展是仅在灰色区域内进行的)
2、标签生成
图5 标签生成首先从网络结构中可以看出,我们需要生成不同尺度的kernel,这是需要有标签的图像来进行训练的。为了生成训练时不同尺寸kernels所对应的ground truths,作者采用Vatti clipping 算法将原始多边形Pn缩放di个像素从而得到Pi,其中每个缩放的Pi都是使用0/1的二进制mask来表示分割后的标签的。
假设缩放的比例为ri,则Pn和Pi之间的余量(margin)di为:
其中Area(.)代表多边形的面积,而Perimeter(.)代表多边形的周长。
对于ri的定义为:
其中n是不同尺度的kernel的个数(即S1,S2,…,Sn),m代表最小的缩放比例,取值范围为(0,1]。由上面两式可以看出,ri由超参数n和m来决定,当i=1时,ri为m,当i=n时,ri为1,因此ri的取值范围为[m,1]。
作者也分别将n和m取不同参数在ICDAR2015和CTW1500数据集上做了实验,结果如图6所示:
图6 消融研究(ablation study)固定内核数量n=2,令最小尺度m从1到0.1变化,从图6(a)中我们可以发现,当m过大或者太小时,测试集上的F-measures值下降。当m太大时,PSENet 很难分割离得很近的文本实例 ;当m太小时,PSENet 经常把一整个文本行错误分割成不同的部分,从而造成训练不能很好的收敛。
分别在ICDAR2015上设置m=0.4,在CTW1500上设置m=0.6,让n从2到10增加,从图6(b)中结果发现,随着n的增加,测试集上的F-measures也保持上升,当n≥5时开始平稳。由此可知,采用多核的方法是有效的,但也不需要过多的kernels。
另外,图6(a)中的虚线表示n=1,即仅使用最小尺度的内核。由图中可知,因最小尺度的内核不能覆盖文本实例的完整面积,对文本的检测和识别很不利,测试集上的F-measures也是糟糕的。
3、损失函数
损失函数定义为:
损失函数分为两部分,其中Lc和Ls分别代表整个文本实例(Sn)和缩放后文本实例(S1 ---> Sn-1)的损失,而λ用于平衡Lc和Ls,本文设置为0.7。
通常文本实例可能只占自然场景图像中很小的一部分,因此如果采用二进制交叉熵损失会造成预测结果更加偏向于非文本区域。这里我们采用dice 系数损失函数:
其中Si,x,y和Gi,x,y分别代表了像素(x,y)在分割结果Si和Ground Truth Gi中的值。
考虑到很多文本区域和栅栏、栅格很相似,为了避免误检,我们在训练期间采用OHEM来更好的区分这些模式,其中负样本-正样本的比例设置为3:1.
对于OHEM可以参考文章:https://blog.csdn.net/u014380165/article/details/73148073
首先,来看Lc的计算方式:
其中M代表OHEM的training mask,Lc主要用于区分文本和非文本区域。
再来看Ls的计算方式:
Ls主要是缩减文本区域的损失。考虑到缩减后的文本区域均是被原始文本区域包围的,故作者忽略了分割结果Sn中非文本区域的像素从而避免像素冗余的情况。其中W是Sn中忽视了非文本区域的文本区域mask,Sn,x,y是Sn中(x,y)的像素值。
PSENet 实验细节
训练
1. 使用ImageNet预训练的ResNet,随机梯度下降(SGD)
2. 数据:ICDAR2017 MLT(7200训练图像,1800张验证图像)
3. Batch Size:16
4. 迭代次数:180K
5. 学习率:1×10−3,在60K和120K迭代步数时分别除以10
6. 权重衰减:5×10−4,0.99的Nesterov动量,没有阻尼
其余数据集采用了两种训练策略:
(1)从头训练。
(2)在IC17-MLT上fine-tuning。从头开始训练时,batch size 16,迭代次数36K训练PSENet,初始学习率为1×10−3,在12K和24K迭代步数时分别除以10。在IC17-MLT上fine-tuning时,迭代次数是24K,初始学习率为1×10−4,在12K迭代次数时除以10。
损失函数
1. λ=0.7 ;
2. OHEM 的负样本比例设置为 3。
数据增强
1. 图像随机缩放{0.5,1.0,2.0,3.0};
2. 图像随机的水平翻转和在[−10∘,10∘]范围内随机旋转;
3. 从变换后的图像中随机裁剪出640×640大小的图像。