DBNet
1 Detection methods
- Regression-based methods
- Segmentation-bbased methods
Segmentation:对图像中的每一个像素点进行分类,图像中每个像素点都要知道它的类别
1.1 Traditional segmentation-based method (blue路径)
传统的binarization方法是设定一个阈值
B
i
,
j
=
{
1
i
f
P
i
,
j
>
=
t
,
0
o
t
h
e
r
w
i
s
e
.
B_{i,j}=\begin{cases} 1 \quad if \quad P_{i,j}>=t,\\ 0 \quad otherwise. \end{cases}
Bi,j={1ifPi,j>=t,0otherwise.
DBNet是(Red)红色路径,在基于分割的文本检测网络中,最终的二值化map都是使用的固定阈值来获取,并且阈值不同对性能影响较大。本文中,对每一个像素点进行自适应二值化,二值化阈值由网络学习得到,彻底将二值化这一步骤加入到网络里一起训练,这样最终的输出图对于阈值就会非常鲁棒。 Differentiable Binarization可微二值化。
2 DBNet 网络结构
2.1 Feature Pyramid Networks 特征金字塔
为了能最多的检测出图像上的目标大小,图像算法有以下几种方法:
(1)图像金字塔:生成不同尺寸的图片,每张图片生成不同的特征,分别进行预测,最后统计所有尺寸的预测结果。
(2)feature map:使用神经网络某一层输出的feature map进行预测,一般是网络最后一层feature map(例如Fast R-CNN、Faster R-CNN等);然而靠近网络输入层的feature map包含粗略的位置信息,导致预测的目标狂bbox不准确,靠近最后网络最后一层的feature map会忽略小物体信息。
(3)特征金字塔:使用不同层次的金字塔层feature map进行预测。SSD就是采用这种多尺度特征融合方法,从网络不同层抽取不同尺寸的特征做预测,没有增加额外的计算量。但是SSD没有使用足够底层的特征,SSD使用最底层的特征是VGG的conv4_3。
(4)特征金字塔网络:对最底层的特征进行向上采样,并与该底层特征进行融合,得到高分辨率、强语义的特征(即加强了特征的提取)。
2.2 特征金字塔网络
如下图,上半部分只取特征金字塔的最底层进行预测,下半部分对特征金字塔的所有层进行单独预测,最后再整合所有预测结果,本论文作者主要使用后者,使用多特征层进行预测。
FPN官方的backbone是ResNet。CNN的前馈计算就是自下而上的路径,特征图经过卷积核计算,通常是越变越小的,也有一些特征层的输出大小和输入大小一样。
思想:把高层的特征传下来,补充低层的语义,这样就可以获得高分辨率、强语义的特征,有利于小目标的检测。
特征金字塔网络包括自底向上、自顶向下和横向连接。
Resnet特征提取(feature map):自底向上
最后一层feature map上采样:自顶向下
特征融合:横向连接
横向连接的两层特征在空间尺寸上要相同,主要是为了利用底层的定位细节信息(由于底部的feature map包含更多的定位细节,而顶部的feature map包含更多的目标特征信息)。
特征金字塔的横向连接和自顶向下的连接示意图如下,其中 1×1 conv 用来改变feature map的通道数:
2.3 DBNet网络结构
上图是 DBNet 模型网络结构示意图,主要分为 3 个模块:
- 第一模块(1):左边的红框使用的是一个 FPN 结构,分为自底向上的卷积操作与自顶向下的上采样,以此来获取多尺度的特征。1 图下面部分是 3x3 的卷积操作,按照卷积公式分别获取原图大小比例的
1/2、1/4、1/8、1/16、1/32
的特征图;然后自顶向下进行上采样 x2,然后与自底向上生成的相同大小的特征图融合;融合之后再采用 3x3 的卷积消除上采样的混叠效应;最后对每层输出结果进行上采样,统一为 1/4 大小的特征图。 - 第二模块(2):将 1/4 大小的特征图经过一系列卷积和转置卷积的机构获取概率图 P 和阈值图 T,可参考 FCN 网络结构,目的是生成与原图一样大小的特征图 P 和 T。
- 第三模块(3):将特征图 P 和 T 经过 DB 方法(后续介绍)得到近似二值图。
经过上面三个模块,可以得到概率图、阈值图和近似二值图。在训练过程中,对这三个图进行监督学习,更新各个模块的参数。在推理过程中,直接使用概率图,然后使用固定阈值获取结果。
2.3.1 Deformable convolution 可形变卷积
FPN-Conv layer使用Deformable convolution 卷积核再各个点的偏移位置上做卷积(类似于空洞卷积)
绿色的点为卷积核上的点,但计算计算卷积的位置是图中各蓝色的点(较原来的卷积核中点发生了偏移)
**作用:**可以提供灵活的感受野,对于不同纵横比的文本很有利。
2.3.2 可微二值化
传统的二值化,式(1)是不可微分的,也就无法放到网络中进行优化学习。可微二值化就是将标准二值化中的阶跃函数进行了近似,公式如下所示:
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
其中, P i , j P_{i,j} Pi,j是probability map中的像素值, T i , j T_{i,j} Ti,j是threshold map中的像素值。可微二值化本质上是一个 带系数 k 的 sigmoid 函数,取值范围为(0, 1),k 是膨胀因子(经验型设置为50) P的每个像素位置,如果小于T对于的,二值化后就是0,如果大于,二值化后就是1。
标准二值化和可微二值化的对比如下图 (a) 所示,SB 曲线代表标准二值化,DB 代表可微二值化,可以看到曲线变得更为平滑,也就是可微。除了可微,DB方法还能改善算法的性能,在反向传播是梯度的计算上观察。当使用交叉熵损失函数
y
=
1
y=1
y=1代表文字区域时,正负样本的Loss分别为
l
+
,
l
−
l_+,l_-
l+,l−,公式如下:
C
E
L
o
s
s
=
−
y
log
B
^
−
(
1
−
y
)
log
(
1
−
B
^
)
{
l
+
=
−
log
(
1
1
+
e
−
k
(
P
i
,
j
−
T
i
,
j
)
)
y
=
1
l
−
=
−
l
o
g
(
1
−
1
1
+
e
−
k
(
P
i
,
j
−
T
i
,
j
)
)
y
=
0
CELoss = -y\log\hat{B} -(1-y)\log(1-\hat{B})\\ \begin {cases} l_+ = -\log(\frac{1} {1+e^{-k(P_{i,j}-T{i,j})}})\quad \quad y=1\\ l_- = -log(1-\frac{1} {1+e^{-k(P_{i,j}-T{i,j})}}) \quad \quad y=0 \end{cases}
CELoss=−ylogB^−(1−y)log(1−B^){l+=−log(1+e−k(Pi,j−Ti,j)1)y=1l−=−log(1−1+e−k(Pi,j−Ti,j)1)y=0
l
+
,
l
−
l_+,l_-
l+,l−分别对于输入
x
=
P
i
,
j
−
T
i
,
j
x=P_{i,j}-T{i,j}
x=Pi,j−Ti,j, 对求导,进行梯度反向传播
∂
l
+
∂
x
=
−
k
f
(
x
)
e
−
k
x
∂
+
−
∂
x
=
−
k
f
(
x
)
\frac{\partial l_+}{\partial x} = -kf(x)e^{-kx}\\ \frac{\partial +_-}{\partial x} = -kf(x)
∂x∂l+=−kf(x)e−kx∂x∂+−=−kf(x)
可以看到 增强因子k 对于错误预测对梯度的影响变大了,从而可以促进模型的优化过程产生更为清晰的预测结果。 (b)图是当y=1,x预测值从-1到1的梯度,可以发现,当k=50时候梯度远远大于k=1,错误的区域梯度更大,对于y=0的情况分析也是一样的。故:
(1) 通过增加参数K,就可以达到增大梯度的目的,加快收敛
(2) 在预测错误位置,梯度也是显著增加
2.3.3 真实标签生成
probability map可以理解为,有文字的区域值为0.9以上,没有文字的区域全黑为0,threshold map理解为一个只有文字边界才有值,其他地方为0。上图分别为原图,Ground Truth,Threshold图。这里再说下threshold map图,非文字边界处都是灰色的,这是因为统一加了0.3,所有最小值是0.3.Threshold是框出了文字区域的边框。probability map和approximate binary map的生成受GT图的监督,而threshold map的生成受Threshold图的监督。
1)Probability map Label生成
红色框完完整整把文字区域包裹住,然后进行shrink操作,A是红色框的面积,L是周长。D是搜索或扩张的距离。然后将蓝色框内部值设为1,外部设为0,就得到用于监督的标签
2)Threshold Label生成
和上图一样,但是处了进行shrink,还要进行膨胀操作,然后绿框和蓝框之间的间隔,就是我们要求的label区域,得到区域后,就要计算区域内每个点的值。该点(i, j)的值,为该点到红色框(四个边界线)的距离,然后取距离最小的值,作为该点的值。这样可以预见,绿色框上的点是所有点中最大的,也就是扩张的距离D。但是我们看左上角的图,间隔里是边缘暗,中间亮,所以我们还行再进行一下反置操作(暗的变亮,亮的变暗):可以对计算的值进行归一化(除以D)这样,绿框和篮筐上的值为1,其他地方为小于1。然后再用1减去归一化后的值即可。
上图是论文中的可视化图,第二张图是经过shrink和扩张后的图。
2.3.4 损失函数
由于在训练阶段输出 3 个预测图(大小与原图一致),所以在损失函数中,也需要有对应的真实标签去构建 3 部分损失函数。总的损失函数的公式定义如下:
L
=
L
s
+
α
×
L
b
+
β
×
L
t
α
=
1.0
,
β
=
10
L = L_s + \alpha \times L_b + \beta \times L_t \quad \quad \alpha=1.0, \beta=10
L=Ls+α×Lb+β×Ltα=1.0,β=10
其中,
L
L
L为总的损失,
L
b
L_b
Lb为近似二值图的损失,
L
s
L_s
Ls为概率图损失,均使用交叉熵损失,为了解决正负样本不均衡问题,使用hard negative mining;
L
t
L_t
Lt为阈值图损失,使用预测值和标签间的 𝐿1 距离。其中,𝛼 和 𝛽 为权重系数。
KaTeX parse error: Undefined control sequence: \abs at position 86: …sum_{i \in R_d}\̲a̲b̲s̲{y_i^*-x_i^*}
BCELoss hard negative mining 正:负=1:3。其中
R
d
R_d
Rd是扩张dilated之后区域的面积,即扩张区域内的点都要计算L1距离。
得到二值化的图像后,可以使用cv2.findContours得到文字区域的轮廓。但是文字识别的CRNN的输入是正规的矩形,检测到的轮廓是不规则的。可以使用cv2.minAreaRect()方法得到包括所有轮廓点的最小的矩形。还可以扣出文字区域,然后将区域矫正。
二值化的图像后,可以使用cv2.findContours得到文字区域的轮廓。但是文字识别的CRNN的输入是正规的矩形,检测到的轮廓是不规则的。可以使用cv2.minAreaRect()方法得到包括所有轮廓点的最小的矩形。还可以扣出文字区域,然后将区域矫正。