概述
文本检测主流 的两个方法就是基于回归的方法和基于分割的方法。 基于回归的方法 指的是迁移一些经典的目标检测算法,比如SSD,用于文本的检测。主要过程就是经过网络得到一个包含预测结果的tensor,然后解析tensor得到预测结果,接着简单后处理就可以了。但是他们对于弯曲、的检测效果没那么好,而这类文本呢又是场景种最常见的文本。 基于分割的方法 :首先,分割指的是像素点级别的分类,判别每一个像素点是否属于一个文本目标,计算量特别大。通过一个分割网络得到分割图或者叫做概率图,接着进行固定阈值的二值化操作得到二值图,通过后处理得到文本分割区域的包围曲线。 二值化 :就是根据一个固定的门限值,将概率图中每个数值变为0/1,如
f
(
x
)
=
1
i
f
x
>
0.7
e
l
s
e
0
f(x)=1 if x>0.7 else 0
f(x)=1ifx>0.7else0
而本文 ,是在基于分割的方法上进行的研究,主要目的是为了减少后处理过程的计算量,他提出了一种将二值化操作加到分割网络中的一种方法。也就是说,在本文中,分割网络同时生成概率图和门限图,二值化中的门限不再是给定的,而是模型学习到的,是能够自适应的。而二值化过程,如
f
(
x
)
=
1
i
f
x
>
0.7
e
l
s
e
0
f(x)=1 if x>0.7 else 0
f(x)=1ifx>0.7else0,显然是不可微的,因此同时还提出了一种可微分二值化过程Differentiable Binarization (DB)。
细节
骨干网络
骨干网络会对输入图片进行多次下采样得到不同尺寸的feature-map,再将它们上采样和浅层网络中长宽相同的feature-map进行concat操作,然后继续卷积,最后将尺度相同的feature-map进行concat,然后得到两个图:概率图和门限图,通过他们得到二值图,根据它进行后处理得到文本分割区域的包围曲线。
二值化
标准二值化 操作: 可微分二值化 :
B
i
,
j
^
=
1
1
+
e
?
k
(
P
i
,
j
?
T
i
,
j
)
\hat{B_{i,j}}=\frac{1}{1+e^{-k(P_{i,j}-T_{i,j})}}
Bi,j?^?=1+e?k(Pi,j??Ti,j?)1? B是近似二值函数的函数值,k是放大因子(计算导数,发现k都是乘的,所以会放大梯度,作者取了50),
P
i
,
j
P_{i,j}
Pi,j?是概率,
P
i
,
j
P_{i,j}
Pi,j?是门限 可微分二值化的作用 :1、使得门限值能够通过网络学习得到而不是直接给定。2、提高性能。 为什么能够提高性能? :像素的分类错误,会得到更大的梯度,而为了网络的收敛,模型必须自己学会解决这些问题。 更大的梯度? :首先,二值图的损失是二元交叉熵损失。
x
=
P
i
,
j
?
T
i
,
j
x=P_{i,j}-T_{i,j}
x=Pi,j??Ti,j?,
f
(
x
)
=
1
1
+
e
?
k
x
f(x)=\frac{1}{1+e^{-kx}}
f(x)=1+e?kx1?,
l
o
s
s
=
?
y
l
o
g
(
f
(
x
)
)
?
(
1
?
y
)
l
o
g
(
1
?
f
(
x
)
)
loss=-ylog(f(x))-(1-y)log(1-f(x))
loss=?ylog(f(x))?(1?y)log(1?f(x)),正样本:
l
o
s
s
+
=
?
y
l
o
g
(
f
(
x
)
)
loss_{+}=-ylog(f(x))
loss+?=?ylog(f(x)),负样本:
l
o
s
s
?
=
?
(
1
?
y
)
l
o
g
(
1
?
f
(
x
)
)
loss_{-}=-(1-y)log(1-f(x))
loss??=?(1?y)log(1?f(x)),他们各自对应的导数的曲线在k=1和k=50的情况下,如图 观察可以发现,首先 ,梯度的大小是与K有关的。其次 ,网络如果将正例预测称负例,那么梯度很很大;网络将负例预测乘正例,梯度也很大。
自适应的门限
用处 :主要是为了计算得到二值图,另外实验中发现,无论给不给这个门限一个监督,门限图中都会去凸显文本的边框,也就是能够直到网络更好的检测文本。
可变形卷积
目的:为了获得更大、更灵活的感受野,尤其适用于长宽比例比较极端的文本
标注
概述 :概率图和近似二值图受到同一个ground truth监督,是白色部分比较小;门限图受到另一个ground truth监督,是黄色部分比较大。 为什么概率图和近似二值图受到同一个ground truth监督 :直观感觉上,他们都得受到原图绘制的二值图的监督。 为什么区域会有大小? :这或许就是设计的奥秘吧… 计算二值化之后结果的案例:
标注1:概率图和近似二值化图对应的标注,先对文本进行标注,然后做一步shrink。里面就是1表示有文本,外面是0,表示没文本。 标注2:门限图对应的标注,首先对于文本检测框,进行收缩和放大,它们中间的区域就是。 标注值 :对于,区域内部所有点,计算它达4条红线的距离,取最近的一个。这样就得到了一个两边大中间小的结果,然后对所有的值做
1
?
X
/
D
1-X/D
1?X/D的操作,再进行操作,将这些值归一化到一个范围比如
0.3
?
0.7
0.3-0.7
0.3?0.7 为什么这么复杂 :一步一步分析 最后为什么要归一化到某个范围?因为不归一化的话就无法得到二值化的结果了。 为什么要
X
/
D
X/D
X/D:因为门限肯定是0-1的数,而这里最大就是D,所以可以这么做来进行归一化。 为什么要
1
?
X
/
D
1-X/D
1?X/D:为了得到中间小两边大的结果,门限图的重点就是对于边框的敏感
损失计算
主要是三部分:概率图和近似二值图的损失还有门限图的损失 其中门限图的损失只计算文本边框范围内的损失,使用的是L1范数 为什么用L1范数 :????
我理解的错题集:之前机器学习课程中讲到,模型将判别错误的样本加权
推理
推理的时候,不需要门限图和二值化图了,直接根据概率图,使用标准的二值化操作就行,然后得到文本的边界,并进行矫正,得到原始的文本边界区域,之后就可以用一些软件包把这部分的区域拿出来了。但是 分割主要解决的是弯曲形状文本区域的效果,但是一些文本检测方法处理的是矩形框,那么一个做法就是直接取包含这些区域的最小矩形框。
感悟
问题 :比如YOLO v3中,检测的时候模型输出
n
?
n
?
3
?
(
1
+
4
+
20
)
n*n*3*(1+4+20)
n?n?3?(1+4+20)的tensor,解析这个tensor我们就能得到检测结果,但是为什么能够这么做呢? 模型输出结果解析的可解释性 :所谓监督,就是给网络一个参考,让网络自己学习参数,不断逼近这个参考。因为我们训练的时候,也就是制作dataset的时候,不仅仅是得到了numpy格式的img,还做了对应的tround-truth,也就是那些
n
?
n
?
3
?
(
1
+
4
+
20
)
n*n*3*(1+4+20)
n?n?3?(1+4+20)的tensor,训练的时候要求模型输出的tensor和ground-truth尽可能地接近,检测的时候,模型就能够按照以前的经验得到一个类似的输出,但是这个输出是否足够好呢?还是的看训练的时候是否则够充分,是否学习到了最优的function。 问题 :模型的结构到底怎么设计呢?
|