简介
图1:论文原文
上一篇博文简要介绍了文本检测领域较为经典的一篇文章,
C
T
P
N
{\rm CTPN}
C T P N 。本文将继续介绍文本识别领域较为经典的一项工作,
C
R
N
N
{\rm CRNN}
C R N N 。一般来说,在自然场景中进行文字识别主要包括以下步骤:文字检测 ,即找到图像中文字的大致范围,如上文CTPN的检测结果;文字识别 ,对定位好的文字区域进行识别,输出文字的具体内容。一般情况下,二者都是基于
C
N
N
{\rm CNN}
C N N +
R
N
N
{\rm RNN}
R N N 的基本结构。而本文介绍的
C
R
N
N
{\rm CRNN}
C R N N 是一种能够以端到端的方式训练的模型,且可以识别任意长度的序列、不需要预定义词库等。论文原文 源码
0. Abstract
在文字识别领域,当属自然场景下的文字识别最为困难。这是因为在自然场景下,文字的排列形式、文体形式、遮挡、光照等因素都会极大影响最终的检测结果。论文提出一种针对自然场景下的序列识别方法,
C
R
N
N
{\rm CRNN}
C R N N 。简单来说,它具有如下特点:它能够以端到端 的方式训练;它能够处理任意长度 的序列,且不设计字符分割或水平尺度的归一化;它不需要预定义词库 ;模型本身体积较小 ,能够很好地满足实际需要。最后,在
I
I
I
T
{\rm IIIT}
I I I T -
5
K
{\rm 5K}
5 K 、
S
V
T
{\rm SVT}
S V T 和
I
C
D
A
R
{\rm ICDAR}
I C D A R 上均取得了较好的结果。
论文贡献 :(一)
C
R
N
N
{\rm CRNN}
C R N N 可以以序列标注的方式进行训练,减轻了标注工作量;(二)同
D
C
N
N
{\rm DCNN}
D C N N 的特性一样,它不需要手工提取特征;(三)它可以处理变长的序列数据;(四)在当前文本识别任务中达到了
S
O
T
A
{\rm SOTA}
S O T A 。
1. Introduction
由于实际生活中文字通常以序列方式呈现,论文将深度卷积神经网络应用于自然场景下的序列识别。文字识别与图像识别的最大不同 是,文字识别中必须针对每个字符进行识别,并能够保持序列中各元素间的相对位置关系。并且,序列本身的长度可能是多变的。由于
D
C
N
N
{\rm DCNN}
D C N N 处理的是固定尺寸的输入输出,它并不能直接用于文本识别中。
前人已有对文本识别的工作包括:使用
D
C
N
N
{\rm DCNN}
D C N N 识别序列中的单个字符,每个字符都有单独的标签。但这种训练方式使得标注数据的工作量大大增加,没有利用序列中各元素间的语义信息,即要求模型精确地识别出每一个字符。早前,这类方法主要用于简单的英文序列识别中,但它不能够满足复杂场景下的识别,特别是含有中文的序列识别的场景中。
R
N
N
{\rm RNN}
R N N 是深度神经网络的又一应用,它的一大特点是可以处理序列数据 ,保持序列间各元素的相对位置关系。在此前,通常需要提取序列的整体特征,如使用
C
N
N
{\rm CNN}
C N N 或
H
O
G
{\rm HOG}
H O G 等。此外,集中传统的文字识别方法也取得了不错的结果,包括将字符和文本转换到公共向量空间,进而将字符识别转化为检索问题、使用
M
i
d
{\rm Mid}
M i d -
L
e
v
e
l
{\rm Level}
L e v e l 特征等。
2. The Proposed Network Architecture
图2:CRNN整体结构
上图是
C
R
N
N
{\rm CRNN}
C R N N 的整体结构,它主要由三个部分组成:卷积层 、循环层 、转录层 。在
C
R
N
N
{\rm CRNN}
C R N N 的底部,卷积层自动提取输入图像中的特征序列;然后循环层对特征序列的每一帧进行处理;转录层的作用是翻译循环层对于每一帧的处理结果。
2.1 Feature Sequence Extraction
上面提到,
D
C
N
N
{\rm DCNN}
D C N N 用于提取输入图像的特征序列。具体地,特征序列的每个特征向量通过特征图上按列从左到右得到 。由于卷积和池化操作都具有平移不变性,这就意味着第
i
i
i 个特征向量刚好对应于特征图的第
i
i
i 列。如下图每个特征向量所对应的感受野如下:
图3:每个特征向量所对应的感受野
2.2 Sequence Labeling
循环层部分使用的是双向
R
N
N
{\rm RNN}
R N N 。对于每一帧的输入
x
t
x_t
x t (
x
=
x
1
,
.
.
.
,
x
T
{\rm x}=x_1,...,x_T
x = x 1 , . . . , x T ,即输入向量的形状是
m
×
T
m×T
m × T )(
t
∈
[
1
,
m
]
t\in[1,m]
t ∈ [ 1 , m ] ),循环层产生输出
y
t
y_t
y t (
y
=
y
1
,
.
.
.
,
y
T
{\rm y}=y_1,...,y_T
y = y 1 , . . . , y T ,即输入向量的形状是
n
×
T
n×T
n × T )(
t
∈
[
1
,
n
]
t\in[1,n]
t ∈ [ 1 , n ] ,
n
n
n 表示所识别的序列的长度)。这里使用双向
R
N
N
{\rm RNN}
R N N 的考虑主要有:首先 ,
R
N
N
{\rm RNN}
R N N 具有捕捉序列中的上下文信息的功能,这使得在自然场景下的文本识别精度更高。其次 ,与
C
N
N
{\rm CNN}
C N N 一样,
R
N
N
{\rm RNN}
R N N 也能反向传播更新参数,这使得二者可以在单个网络中共同训练。最后 ,
R
N
N
{\rm RNN}
R N N 能够处理变长的序列。
传统意义上,
R
N
N
{\rm RNN}
R N N 内含有自连接的隐藏层 。当接受的输入为
x
t
x_t
x t 时,当前隐藏单元的状态
h
t
h_t
h t 由输入
x
t
x_t
x t 和前一状态
h
t
−
1
h_{t-1}
h t − 1 共同决定,即
h
t
=
g
(
x
t
,
h
t
−
1
)
h_t=g(x_t,h_{t-1})
h t = g ( x t , h t − 1 ) 。如下图所示:
图4:RNN(图来自这里 )
然后通过
h
t
h_t
h t 得到输出
y
t
y_t
y t 。在这个过程中,过去的信息
{
x
t
′
}
t
′
<
t
\{x_{t^{'}}\}_{t^{'}<t}
{ x t ′ } t ′ < t 被收集起来用于预测输出。由于深度和
R
N
N
{\rm RNN}
R N N 中隐藏层的设计,
R
N
N
{\rm RNN}
R N N 通常会遭受梯度消失和梯度爆炸的问题。因此,现在常用的
R
N
N
{\rm RNN}
R N N 结构是长短期记忆网络,
L
S
T
M
{\rm LSTM}
L S T M ,它的结构如下:
图5:LSTM
如上图是
L
S
T
M
{\rm LSTM}
L S T M 的单元结构,它在
R
N
N
{\rm RNN}
R N N 的基础上添加了三个门控单元 ,分别是输入门控、输出门控和遗忘门控。门控的设计是让信息以一种选择性的方式通过,它的主要作用是在相应地方添加或删除信息。通过门控单元,
L
S
T
M
{\rm LSTM}
L S T M 能够记住过去更长时期的信息,也就解决了梯度消失的问题;也能够及时删除不重要的信息,也就解决了梯度爆炸的问题。但我们找到,序列中的文本其实是有前后位置信息的,如老鹰__小鸡中我们需要填入一个动词,单独考虑老鹰或者小鸡的元素我们并不能很好地确定所填位置的信息。所以在实际使用过程中,通常将
L
S
T
M
{\rm LSTM}
L S T M 设计成一个双向的结构,这也是论文中所使用的结构。如下图:
图6:双向LSTM
在双向
L
S
T
M
{\rm LSTM}
L S T M 中,误差的梯度按上图中箭头的反方向传播以更新相关参数。为了连接卷积层和循环层间的梯度,论文在二者之间加入一个名为
M
a
p
{\rm Map}
M a p -
t
o
{\rm to}
t o -
S
e
q
u
e
n
c
e
{\rm Sequence}
S e q u e n c e 的层。
2.3 Transcription
转录层的主要功能是将循环层的预测结果转化成标签序列,即取最高概率的转换结果。通常存在两种转换的方式:无词典 和基于词典 。词典是指一组标签序列,而模型的预测结果受限于这组序列。因此在基于词典的方法中,模型选择具有最高概率的标签序列作为预测结果。
2.3.1 Probability of Label Sequence
在标签序列的预测中,论文所使用的是
C
T
C
{\rm CTC}
C T C 。序列
l
{\rm l}
l 的预测概率根据循环层的输出,即
y
=
y
1
,
.
.
.
,
y
T
{\rm y}=y_1,...,y_T
y = y 1 , . . . , y T 得到,这时并不需要考虑序列中每个字符的位置。因此,使用负对数似然函数作为目标函数来训练网络时,我们仅需要图像本身以及对应的标签序列,从而避免对序列中的每个字符进行标注。
C
T
C
{\rm CTC}
C T C 中所定义的条件概率公式如下:转录层的输入是
y
=
y
1
,
.
.
.
,
y
T
{\rm y}=y_1,...,y_T
y = y 1 , . . . , y T ,其中
T
T
T 表示序列的长度。因此,
y
t
∈
R
∣
L
′
∣
y_t\in R^{|L^{'}|}
y t ∈ R ∣ L ′ ∣ ,即
y
y
y 的分布位于
∣
L
′
∣
|L^{'}|
∣ L ′ ∣ 空间内。其中
L
′
=
L
∪
b
l
a
n
k
L^{'}=L\cup blank
L ′ = L ∪ b l a n k ,其中
L
L
L 是我们预测结果的集合,如我们需要预测小写英文字母序列,即
L
=
{
a
,
b
,
c
,
.
.
.
}
L=\{a,b,c,...\}
L = { a , b , c , . . . } ;
b
l
a
n
k
blank
b l a n k 表示空白区域,因为有时候的预测区域可能并不包含字符。然后定义序列映射函数为
B
B
B ,它作用于序列
π
∈
L
′
T
\pi\in L^{'T}
π ∈ L ′ T ,其中
T
T
T 表示加入空格后序列的长度。即
B
B
B 的作用可以描述为:
π
∈
L
′
T
→
L
≤
T
\pi\in L^{'T}\rightarrow L^{\le T}
π ∈ L ′ T → L ≤ T 。现举例说明如下:
B
(
−
−
h
h
−
e
−
l
−
l
l
−
o
o
−
−
)
=
h
e
l
l
o
B(--hh-e-l-ll-oo--)=hello
B ( − − h h − e − l − l l − o o − − ) = h e l l o
B
(
h
h
−
h
−
e
e
l
−
l
−
−
−
o
o
−
)
=
h
e
l
l
o
B(hh-h-eel-l---oo-)=hello
B ( h h − h − e e l − l − − − o o − ) = h e l l o
B
(
−
−
h
−
e
e
−
l
−
l
−
−
o
o
−
−
)
=
h
e
l
l
o
B(--h-ee-l-l--oo--)=hello
B ( − − h − e e − l − l − − o o − − ) = h e l l o
B
(
−
−
h
−
−
e
−
l
−
l
l
−
−
o
−
−
)
=
h
e
l
l
o
B(--h--e-l-ll--o--)=hello
B ( − − h − − e − l − l l − − o − − ) = h e l l o
B
(
h
−
h
h
−
e
−
l
−
l
l
−
−
−
o
o
)
=
h
e
l
l
o
B(h-hh-e-l-ll---oo)=hello
B ( h − h h − e − l − l l − − − o o ) = h e l l o
其中
−
-
− 代表空格。
C
T
C
{\rm CTC}
C T C 的做法是,将条件概率定义为将所有
π
\pi
π 映射为
l
l
l 的概率之和:
p
(
l
∣
y
)
=
∑
π
:
B
(
π
)
=
1
p
(
π
∣
y
)
(1)
p({\rm l}|{\rm y})=\sum_{\pi:B(\pi)=1}p(\pi|{\rm y})\tag{1}
p ( l ∣ y ) = π : B ( π ) = 1 ∑ p ( π ∣ y ) ( 1 )
式中
B
(
π
)
=
1
B(\pi)=1
B ( π ) = 1 表示
π
\pi
π 也有可能转化为其他字符串,如上述第一个序列可能转化为
h
h
e
l
l
o
hhello
h h e l l o 等。则
p
(
π
∣
y
)
p(\pi|{\rm y})
p ( π ∣ y ) 的定义如下:
p
(
π
∣
y
)
=
∏
t
=
1
T
y
π
t
t
(2)
p({\pi}|{\rm y})=\prod_{t=1}^Ty_{\pi_{t}}^t \tag{2}
p ( π ∣ y ) = t = 1 ∏ T y π t t ( 2 )
式中
t
t
t 是时间变量,
y
π
t
t
y_{\pi_{t}}^t
y π t t 表示在
t
t
t 时刻,标签为
π
t
\pi_{t}
π t 的概率。如对于上述举例的第一个来说,假定令当前标签为
π
1
\pi_{1}
π 1 ,
T
=
16
T=16
T = 1 6 ,即
π
1
=
(
−
−
h
h
−
e
−
l
−
l
l
−
o
o
−
−
)
\pi_{1}=(--hh-e-l-ll-oo--)
π 1 = ( − − h h − e − l − l l − o o − − ) ,则各
p
(
π
1
∣
y
)
p(\pi_1|y)
p ( π 1 ∣ y ) 的定义如下:
p
(
π
1
∣
y
)
=
y
_
1
⋅
y
_
2
⋅
y
h
3
⋅
y
h
4
⋅
y
_
5
⋅
y
e
6
⋅
y
_
7
⋅
y
l
8
⋅
y
_
9
⋅
y
l
10
⋅
y
l
11
⋅
y
_
12
⋅
y
o
13
⋅
y
o
14
⋅
y
_
15
⋅
y
_
16
(3)
p(\pi_1|y)=y_{\_}^1·y_{\_}^2·y_{h}^3·y_{h}^4·y_{\_}^5·y_{e}^6·y_{\_}^7·y_{l}^8·y_{\_}^9·y_{l}^{10}·y_{l}^{11}·y_{\_}^{12}·y_{o}^{13}·y_{o}^{14}·y_{\_}^{15}·y_{\_}^{16}\tag{3}
p ( π 1 ∣ y ) = y _ 1 ⋅ y _ 2 ⋅ y h 3 ⋅ y h 4 ⋅ y _ 5 ⋅ y e 6 ⋅ y _ 7 ⋅ y l 8 ⋅ y _ 9 ⋅ y l 1 0 ⋅ y l 1 1 ⋅ y _ 1 2 ⋅ y o 1 3 ⋅ y o 1 4 ⋅ y _ 1 5 ⋅ y _ 1 6 ( 3 )
2.3.2 Lexicon-Free Transcription
在无词典的转录方式中,将式
(
1
)
(1)
( 1 ) 中得到的最大概率所对应的序列
l
{\rm l}
l 作为最终的预测结果。但通常为了简便,直接令预测结果
l
∗
{\rm l}^*
l ∗ 为:
l
∗
=
B
(
arg
max
π
p
(
π
∣
y
)
)
(4)
{\rm l}^*=B(\mathop{\arg\max}\limits_{\pi}p({\pi}|{\rm y}))\tag{4}
l ∗ = B ( π arg max p ( π ∣ y ) ) ( 4 )
即直接令
y
y
y 最大概率的转化结果作为预测结果,后续通过去掉空格和去重等操作得到最终的检测序列。
2.3.3 Lexicon-Based Transcription
在基于词典的转录方式中,每个样本都与词典
D
D
D 有关。这时,通常直接将式
(
1
)
(1)
( 1 ) 的最大概率所对应的序列作为最终的预测结果,即:
l
∗
=
arg
max
l
∈
D
p
(
l
∣
y
)
(5)
{\rm l}^*=\mathop{\arg\max}\limits_{{\rm l}\in D}p({\rm l}|{\rm y})\tag{5}
l ∗ = l ∈ D arg max p ( l ∣ y ) ( 5 )
但对于上式,当
D
D
D 变得非常大时,式
(
5
)
(5)
( 5 ) 相对应的计算量也会激增。为了解决这一问题,论文借助无词典的转录方式的特点,由于该方法得到的检测结果同真实值很接近(这里通常使用编辑距离 衡量,编辑距离的定义是一个字符串转化为另一个字符串所需要的最少操作数)。因此论文的做法是缩小搜索空间,将最终结果限制在无词典转录方式得到的检测结果的领域
N
δ
(
l
′
)
N_{\delta}({\rm l}^{'})
N δ ( l ′ ) 内,其中
δ
\delta
δ 表示最大编辑距离、
l
′
{\rm l}^{'}
l ′ 表示由无词典转录方式得到的检测结果,即:
l
∗
=
arg
max
l
∈
N
δ
(
l
′
)
p
(
l
∣
y
)
(6)
{\rm l}^*=\mathop{\arg\max}\limits_{{\rm l}\in N_{\delta}({\rm l}^{'})}p({\rm l}|{\rm y})\tag{6}
l ∗ = l ∈ N δ ( l ′ ) arg max p ( l ∣ y ) ( 6 )
这里,领域
N
δ
(
l
′
)
N_{\delta}({\rm l}^{'})
N δ ( l ′ ) 可以通过
B
K
{\rm BK}
B K 树而快速得到。
B
K
{\rm BK}
B K 树搜索的时间复杂度为
O
(
l
o
g
∣
D
∣
)
O({\rm log}|D|)
O ( l o g ∣ D ∣ ) ,其中
O
∣
D
∣
O|D|
O ∣ D ∣ 为词典的大小。因此,该方法可以满足大规模词典的情景。
2.4 Network Training
对于网络的训练,令
χ
=
{
I
i
,
l
i
}
i
\chi=\{I_i,{\rm l}_i\}_i
χ = { I i , l i } i 表示训练数据集,其中
I
i
I_i
I i 表示输入图像、
l
i
{\rm l}_i
l i 表示标注的标签序列。训练目标是最小化上述条件概率对应的的负对数似然函数:
O
=
−
∑
I
i
,
I
i
∈
χ
l
o
g
p
(
I
i
∣
y
i
)
(7)
O=-\sum_{I_i,{\rm I}_i\in\chi}{\rm log}p({\rm I}_i|{\rm y}_i)\tag{7}
O = − I i , I i ∈ χ ∑ l o g p ( I i ∣ y i ) ( 7 )
3. Experiments
3.1 Datasets
论文所使用的数据集包括
I
C
03
{\rm IC03}
I C 0 3 、
I
C
13
{\rm IC13}
I C 1 3 、
I
I
I
T
5
k
{\rm IIIT5k}
I I I T 5 k 、
S
V
T
{\rm SVT}
S V T ,论文的使用情况如下:
I
C
D
A
R
2003
(
I
C
03
)
{\rm ICDAR\ 2003(IC03)}
I C D A R 2 0 0 3 ( I C 0 3 ) 包含
251
251
2 5 1 张自然场景图像,然后忽略那些不包含字母序列和少于三个字符的序列。最后得到
860
860
8 6 0 张裁剪的包含文本序列的图片,且每个序列的元素都存在于一个
50
50
5 0 词的词典内;
I
C
D
A
R
2013
(
I
C
13
)
{\rm ICDAR\ 2013(IC13)}
I C D A R 2 0 1 3 ( I C 1 3 ) 包含
1015
1015
1 0 1 5 张裁剪的文本图像;
I
I
I
T
5
k
{\rm IIIT5k}
I I I T 5 k 包含
3000
3000
3 0 0 0 张裁剪的文本图像;
S
V
T
{\rm SVT}
S V T 包含
249
249
2 4 9 张街景图像,共产生
647
647
6 4 7 张裁剪的文本图像。
3.2 Implementation Details
本文所使用的
C
N
N
{\rm CNN}
C N N 部分是
V
G
G
{\rm VGG}
V G G ,其结构图如下:
图7:VGG
3.3 Comparative Evaluation
图8:CRNN与其他模型的对比
4. Conclusion
本文所介绍是经典的基于深度学习的文本识别一篇文章。总体来看,它包含三大结构:卷积层、循环层、转录层,分别对应于
C
N
N
{\rm CNN}
C N N 、
R
N
N
{\rm RNN}
R N N 、
C
T
C
{\rm CTC}
C T C 。其中,本文只对
R
N
N
{\rm RNN}
R N N 和
C
T
C
{\rm CTC}
C T C 做了简要介绍,
R
N
N
{\rm RNN}
R N N 的门控单元、
C
T
C
{\rm CTC}
C T C 的求导机制等没有提及,详细内容可参考对应论文。最后,当前,对于自然场景下的文本识别,大多数做法是先做文本检测、再做文本识别,一站式端到端的识别方法较少,后续我也会关注几种经典的方法。其中由于文本检测可以借助于目标检测思路,而当前目标检测方法得到了很大的发展,所以基本能够保证文本识别的基本前提——文本检测。
参考
Shi B, Bai X, Yao C. An end-to-end trainable neural network for image-based sequence recognition and its application to scene text recognition[J]. IEEE transactions on pattern analysis and machine intelligence, 2016, 39(11): 2298-2304.
https://zhuanlan.zhihu.com/p/43534801.
完