代码地址:FOTS.PyTorch
1. 概述
导读:考虑到现有的文本检测与识别是单独分开的方法,文章提出了将两者结合实现端到端训练的网络FOTS(Fast Oriented Text Spotting)。这两个任务通过权值共享方式减少了重复计算特征的时间消耗,由于文本位置存在的任意性,对此文章提出了RoIRotate方法将文本区域检测与文本识别关联起来(获取对识别有效的特征区域方便文本识别)。并且通过这两个任务组合起来优化能够使得特征更加泛化,也使得网络的性能表现更加优秀。其在ICDAR数据集上超过之前最好的方法5个点,并且处理的帧率为22.6FPS。
下图1中展示了文章提出的方法与传统上检测识别相分离方法的对比,可以看出检测识别相结合的方式更加快速。
文章的主要贡献:
- 1)文章提出一种端到端的快速任性朝向文本检测框架,通过权值共享在只增加少量计算量的情况下实现文本检测与文本内容识别,达到了22FPS;
- 2)引入RoIRotate操作将文本对应的特征区域与识别相关联;
- 3)在现有的ICDAR2015、ICDAR2017 MLT与ICDAR2013数据集上表现除了优异的性能;
2. 方法设计
2.1 模型的结构
文章提出的FOTS方法其整体结构如图2所示:
其中主干网络文章中采用的是ResNet-50的结构,并使用类似U型的FPN网络结构将特征分辨率扩展到输入图像的
1
4
\frac{1}{4}
41,增加对于小目标的检测(但是目标尺寸多样变化,大小差异20倍呢?)。其结构见图3所示:
在文本去被检测出来之后,使用RoIRotate方法将文本区域变换到固定高度(长度等比)的特征图上,送入由CNN与LSTM组成的识别网络中去,识别网络的详细结构见表1所示:
2.2 文本检测分支
使用U型连接的网络结构将特征图增加到原始输入的
1
4
\frac{1}{4}
41,之后对文本区域的预测采用的是6个channel的组合实现的。第一个channel用于预测文本的概率,后面接着的4个channel预测该点到文本区域上下左右四个边界的距离,最后的一个channel自然就是预测文本的旋转角度了。同时文章还采用了OHEM的方法,提升对于困难样本的预测准确度,同时也平衡了训练样本,文中提到使用OHEM在ICDAR 2015上提上了2个点。
对于这个分支的损失函数,采用的是分类损失加上边界框回归损失的形式的。对于分类损失是在OHEM结果
Ω
\Omega
Ω上使用交叉熵进行的,其表达形式为:
L
c
l
s
=
1
∣
Ω
∣
∑
x
∈
Ω
H
(
p
x
,
p
x
∗
)
L_{cls}=\frac{1}{|\Omega|}\sum_{x\in \Omega}H(p_x,p_x^*)
Lcls=∣Ω∣1x∈Ω∑H(px,px∗)
对于边界框回归使用IoU损失加上旋转角度损失的形式实现,其定义为:
L
r
e
g
=
1
∣
Ω
∣
∑
x
∈
Ω
I
o
U
(
R
x
,
R
x
∗
)
+
λ
θ
(
1
−
c
o
s
(
θ
x
,
θ
x
∗
)
)
L_{reg}=\frac{1}{|\Omega|}\sum_{x\in \Omega}IoU(R_x,R_x^*)+\lambda_{\theta}(1-cos(\theta_x, \theta_x^*))
Lreg=∣Ω∣1x∈Ω∑IoU(Rx,Rx∗)+λθ(1−cos(θx,θx∗))
最后,将这两部分的损失函数加权调和起来得到最后的损失函数表达(
λ
=
1
\lambda=1
λ=1):
L
d
e
t
e
c
t
=
L
c
l
s
+
λ
r
e
g
L
r
e
g
L_{detect}=L_{cls}+\lambda_{reg}L_{reg}
Ldetect=Lcls+λregLreg
2.3 RoIRotate
RoIRotate其实就是将文本区域变换到相同高度,宽度等比缩放的区域内,目的就是为了方便识别,其过程见图4所示:
对于旋转文本的处理就要说一下RRPN中RRoI Pooling了,它是使用max-pooling操作将旋转的区域固定到一个尺寸上去,文章中则是使用了双线性插值的方式,从而避免了量化与采样带来的损失,并且使得长宽比例相同,从而避免了畸形的情况。
这里对于文本区域的校正操作使用到了GT或是检测结果的参数
(
t
,
b
,
l
,
r
,
θ
)
(t,b,l,r,\theta)
(t,b,l,r,θ),分别代表与四个边界的距离与角度,因而变换的关系与得到的变换矩阵M可以描述为:
2.4 文本识别分支
在文本区域被矫正出来之后就是送入到熟悉的CRNN网络结构中去了,对于一个文本区域识别的条件概率可以表示为:
p
(
y
∗
∣
x
)
=
∑
π
∈
b
−
1
(
y
∗
)
p
(
π
∣
x
)
p(y^*|x)=\sum_{\pi \in b^{-1}(y^*)p(\pi |x)}
p(y∗∣x)=π∈b−1(y∗)p(π∣x)∑
对于一张图中识别损失函数的定义表示为:
L
r
e
c
o
g
=
−
1
N
∑
n
=
1
N
l
o
g
p
(
y
n
∗
∣
x
)
L_{recog}=-\frac{1}{N}\sum_{n=1}^{N}logp(y_n^*|x)
Lrecog=−N1n=1∑Nlogp(yn∗∣x)
整个网络的损失函数表示为(
λ
=
1
\lambda=1
λ=1):
L
=
L
d
e
t
e
c
t
+
λ
r
e
c
o
g
L
r
e
c
o
g
L=L_{detect}+\lambda_{recog}L_{recog}
L=Ldetect+λrecogLrecog
3. 实验结果
其中,Our Detection:文章的检测分支结果;FOTS:标准实现和测试版本;FOTS RT:ResNet-34的backbone,1280*720的输入;FOTS MS:多尺度测试;