赞
踩
通过DBNet、EAST等文本检测网络将检测到的文本框输入到CRNN网络中,网络的结构如下图所示。
假设输入的图像大小为(32, 100, 3),整个CRNN网络可以分为三个部分:
关于代码中输入图片大小的解释:
在本文给出的实现中,为了将特征输入到Recurrent Layers,做如下处理:
在CRNN的流程中,先通过CNN提取文本图片的Feature map。然后将每一个channel作为D=512的时间序列输入到LSTM。
为了说明问题,我们定义:
CNN Feature map
Feature map的每一列作为一个时间片输入到LSTM中。设Feature map大小为
m
×
T
m\times T
m×T(m=512, T=25)。下文中的时间序列t都从t=1开始。
feature map定义为:
x
=
(
x
1
,
x
2
,
.
.
.
,
x
T
)
x=(x^1, x^2, ..., x^T)
x=(x1,x2,...,xT)
其中x每一列
x
t
x^t
xt为:
x
t
=
(
x
1
t
,
x
2
t
,
.
.
.
,
x
m
t
)
x^t=(x^t_1,x^t_2,..., x^t_m)
xt=(x1t,x2t,...,xmt)
LSTM
LSTM的每一个时间片后接softmax,输出 y 是一个后验概率矩阵,定义为:
y
=
(
y
1
,
y
2
,
.
.
.
,
y
T
)
y=(y^1, y^2, ..., y^T)
y=(y1,y2,...,yT)
其中,y的每一列
y
t
y^t
yt为:
y
t
=
(
y
1
t
,
y
2
t
,
.
.
.
,
y
n
t
)
y^t=(y^t_1,y^t_2,..., y^t_n)
yt=(y1t,y2t,...,ynt)
n代表需要识别的字符集合长度。(假如对y每一列进行argmax操作,即可获得每一列的输出字符的类别)。
如果要进行
L
=
a
,
b
,
c
,
.
.
.
,
x
,
y
,
z
L={a, b, c, ..., x, y, z}
L=a,b,c,...,x,y,z 的26个英文字符识别,考虑到有的位置没有字符,定义插入blank的字符集合:
L
′
=
L
+
b
l
a
n
k
L'=L+{blank}
L′=L+blank
比, 当T=12时:
β
(
π
1
)
=
β
(
−
−
s
t
t
a
−
t
−
−
e
)
=
s
t
a
t
e
\beta(\pi_1)=\beta(--stta-t--e)=state
β(π1)=β(−−stta−t−−e)=state
β
(
π
2
)
=
β
(
s
s
t
−
a
a
a
−
t
e
e
−
)
=
s
t
a
t
e
\beta(\pi_2)=\beta(sst-aaa-tee-)=state
β(π2)=β(sst−aaa−tee−)=state
β
(
π
3
)
=
β
(
−
−
s
t
t
a
a
−
t
e
e
−
)
=
s
t
a
t
e
\beta(\pi_3)=\beta(--sttaa-tee-)=state
β(π3)=β(−−sttaa−tee−)=state
β
(
π
4
)
=
β
(
s
s
t
−
a
a
−
t
−
−
−
e
)
=
s
t
a
t
e
\beta(\pi_4)=\beta(sst-aa-t---e)=state
β(π4)=β(sst−aa−t−−−e)=state
可见, β \beta β变换不是单对单映射。
对于LSTM给定输入 x 的情况下,输出为 l(经过
β
\beta
β转换) 的概率为:
p
(
l
∣
x
)
=
∑
π
∈
β
−
1
(
l
)
p
(
π
∣
x
)
p(l|x) = \sum_{\pi\in\beta^{-1}(l)}p(\pi|x)
p(l∣x)=π∈β−1(l)∑p(π∣x)
其中,
π
∈
β
−
1
(
l
)
\pi\in\beta^{-1}(l)
π∈β−1(l)代表所有经过
β
\beta
β变换后是
l
l
l的路径
π
\pi
π。
对于任意一条路径
π
\pi
π,都有:
p
(
π
∣
x
)
=
∏
t
=
1
,
T
y
π
t
t
p(\pi|x) = \prod_{t=1,T}y^t_{\pi_t}
p(π∣x)=t=1,T∏yπtt
y
π
t
t
y^t_{\pi_t}
yπtt表示
π
\pi
π路径下t时刻的概率值。
如对于
T
=
12
T=12
T=12的某一条路径
π
\pi
π 来说:
π
=
(
−
−
s
t
t
a
−
t
−
−
−
e
)
\pi = (--stta-t---e)
π=(−−stta−t−−−e)
$
p
(
π
1
∣
x
)
=
y
−
1
⋅
y
−
2
⋅
y
s
3
⋅
y
t
4
⋅
y
t
5
⋅
y
a
6
⋅
y
−
7
⋅
y
t
8
⋅
y
−
9
⋅
y
−
10
⋅
y
−
11
p(\pi_1|x)=y^1_-\cdot y^2_-\cdot y^3_s\cdot y^4_t\cdot y^5_t\cdot y^6_a\cdot y^7_-\cdot y^8_t\cdot y^9_-\cdot y^{10}_-\cdot y^{11}_-
p(π1∣x)=y−1⋅y−2⋅ys3⋅yt4⋅yt5⋅ya6⋅y−7⋅yt8⋅y−9⋅y−10⋅y−11\cdot y^{12}_e$
实际情况下T大于20,所以由非常多条 π \pi π路径,无法逐条求和计算 p ( l ∣ x ) p(l|x) p(l∣x)。所以需要一种快速的计算方法(动态规划的思想)。
如下图,基于RNN条件独立假设,即可得到CTC Loss函数的定义:
假定选择单层LSTM为RNN结构,则最终的模型结构如下图:
由于直接暴力计算
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。