文本检测 DB:Real-time Scene Text Detection with Differentiable Binarization
原文地址:https://blog.csdn.net/m_buddy/article/details/103285989
代码地址:
DB-official:https://github.com/MhLiao/DB
DBNet.pytorch:https://github.com/WenmuZhou/DBNet.pytorch
1. 概述
由于分割网络的结果可以准确描述诸如扭曲文本的场景,因而基于分割的自然场景文本检测方法变得流行起来。基于分割的方法其中关键的步骤是其后处理部分,这步中将分割的结果转换为文本框或是文本区域。这篇文章的文本检测方法也是基于分割的,但是通过提出Differenttiable Binarization module(DB module)来简化分割后处理步骤(加了一个变的预测),并且可以设定自适应阈值来提升网络性能。文章的方法在现有5个数据上在检测精度与速度上均表现为state-of-art。在换用轻量级的backbone(ResNet-18)之后可以将检测帧率提升到62FPS,其与其它一些文本检测算法的性能与速率关系见图1所示。
文章方法与其它一些方法的对比:
传统意义上基于分割的文本检测算法其流程如图2中的蓝色箭头所示。在传统方法中得到分割结果之后采用一个固定的阈值得到二值化的分割图,之后采用诸如像素聚类的启发式算法得到文本区域。
而文章的检测算法流程是图2中红色箭头所示的,其中不同的地方也是这篇文章核心的一点就是在阈值选取上,通过网络去预测图片每个位置处的阈值,而不是采用一个固定的值,这样就可以很好将背景与前景分离出来。但是这样的操作会给训练带来梯度不可微的情况,对此对于二值化提出了一个叫做Differentiable Binarization来解决不可微的问题。
在解决了阈值可微的为题之后,文章将分割算法与DB module组合起来构建了一个快速且鲁棒的文本检测器,这个方法的亮点表现在:
- 1)在几个开源的数据集上对于水平、倾斜、扭曲的文本表现出了更好的检测性能;
- 2)由于不需要繁琐的后处理,直接使用DB module产生适应的阈值使得网络提速很多,并且DB module能够生成更加鲁棒的分割二值图;
- DB module在轻量级的backbone(ResNet-18)也具有很好的性能;
- DB module在做inference的时候可以直接移除,而不会损失性能,因而减少了这部分的时间与资源消耗;
2. 方法设计
2.1 网络结构
文章的网络结构见图3所示,输入的图像经过不同stage的采样之后获得不同大小的特征图,之后这些由这些特征图构建特征金字塔,从而构建出统一尺度(相比原图像stride=8)的特征图FFF,之后这个特征图用于预测分割概率图PPP与阈值图TTT,之后将P,TP,TP,T结合得到估计的二值图Bˆ\hat{B}
B
^
。在训练的时候P,BP,BP,B是使用同样的表现作训练,而TTT会使用单独的阈值图作训练。
2.2 二值化操作
标准二值化(Standard Binarization,SB)
对于分割特征图P∈RH∗WP\in R^{H*W}P∈R
H∗W
,使用下面的方式进行二值化处理:
可微的二值化(Differentiable Binarization,DB)
由于公式1中的二值方法不是可微的,因而就不能在分割网络中随着训练的过程进行优化,为了解决这个问题文章提出了一个函数来近似这个二值化过程,既是:
B
i
,
j
=
1
1
+
e
−
k
(
P
i
,
j
−
T
i
,
j
)
B_{i,j} = \frac{1}{1+e^{-k(P_{i,j}-T_{i,j})}}
Bi,j=1+e−k(Pi,j−Ti,j)1
自适应阈值与膨胀卷积
在图6中展示了阈值图对于检测的影响,就算没有阈值图的监督,阈值图也可以很好区分文本的边界。
此外,为了增加网络的感受野,文章在backbone的stage3、stage4、stage5使用了deformable卷积
2.3 标注生成
训练标签生成
在训练标签的生成过程中借鉴了PSENet的方法,使用标签收缩的方式进行,这里对于搜索的offset DDD使用下面的计算方式得到:
其中,A是多边形区域的面积,r=0.4r=0.4r=0.4,LLL是多边形的周长。
其标注过程见下图5所示:
其标注过程见下图5所示:
2.4详细解释数据生成
B
i
,
j
=
1
1
+
e
−
k
(
P
i
,
j
−
T
i
,
j
)
B_{i,j} = \frac{1}{1+e^{-k(P_{i,j}-T_{i,j})}}
Bi,j=1+e−k(Pi,j−Ti,j)1
p可以理解,就是有文字的区域有值,0.9以上,没有文字区域黑的,为0
T呢,T是一个只有文字边界才有值的,其他地方为0,那所有的像素都是经过这个公式,得到thresh_binary,这个合适吗?
然后自己慢慢从一开始制作的标签入手,gt就是我们标注好的,p就是gt,那个T的标签threshold map是根据文字边界做的,T的标签threshold map到底是啥,
是根据文字边界做的,T的标签threshold map到底是啥,
threshold map是将文本框分别向内向外收缩和扩张d(根据第一步收缩时计算得到)个像素,然后计算收缩框和扩张框之间差集部分里每个像素点到原始图像边界的归一化距离。是根据一个算法跑出来的,看了源码就是一堆计算,没有细看。然后我就把gt与threshold map显示出来更加直观。
其实一开始就有个问题,gt是标注好的,为啥还要经过psenet里面的缩水操作?
看到图自然就会明白了,这就是这个算法的特别之处了。
分别是原图,gt图,threshold map图。
这里再说下threshold map图,非文字边界处都是灰色的,这是因为统一加了0.3,所有最小值是0.3,这是为了后面有用的。
这里其实还看不清,我们把src+gt+threshold map看看。
2.4 网络的损失函数
网络的损失函数定义为:
可以看到:
p的ground truth是标注缩水之后
T的ground truth是文字块边缘分别向内向外收缩和扩张
p与T是公式里面的那两个变量。
再看这个公式与曲线图:
并且为了样本均衡这里使用了困难样本挖掘,保持正负样本的比例为1:3。
P和T我们就用ground truth带入来理解
p网络学的文字块内部,
T网络学的文字边缘,两者计算得到B。
B的ground truth也是标注缩水之后,和p用的同一个。
在实际操作中,作者把除了文字块边缘的区域置为0.3.应该就是为了当在非文字区域,
P=0,T=0.3,x=p-T<0这样拉到负半轴更有利于区分。可以看上面的曲线图。
同时,作者在论文中也写了之所以这么做的原因:
首先:
Threshold map本身可以在没有监督的情况下学到。通过可视化的观察,发现threshold map会highlight文字区域的边缘。因此作者利用文字区域的标注对threshold进行监督以获得更好的结果。如下论文中的图:
c图是没有监督的效果,d是有监督的
其次:求导,更容易区分正负样本
3. 实验结果
3.1 消融实验
DB与膨胀卷积的影响:
阈值监督的影响:
3.2 性能比较
ICDAR 2015:
MSRA-TD500与MLT-2017:
更多推荐
所有评论(0)