文本识别算法介绍
文本识别问题是一个经典的序列预测问题,他输入一个有序列信息的三维图像,输出一个预测序列。常用的文本识别框架为CNN+BiLSTM+CTC,和CNN+BiLSTM+Attention。经过CNN+BiLSTM将三维图像提取特征,得到2维的特征序列(T*C),然后通过CTC或Attention将特征序列转化为预测结果。
给定一张来自于训练集Q的图像I,它的文本标签S,文本所包含的类别{1, 2, · · · , |C|},这张图像文本序列的长度L,通常的文本识别问题的损失函数为:
L(w)=−∑(I,S)∈Qlog(P(S∣I;w))=−∑(I,S)∈Q∑l=1Llog(P(Sl∣l,I;w))L(w)=-\sum_{(I,S)\in Q}log(P(S|I;w))=-\sum_{(I,S)\in Q}\sum_{l=1}^{L}log(P(S_{l}|l,I;w))L(w)=−(I,S)∈Q∑log(P(S∣I;w))=−(I,S)∈Q∑l=1∑Llog(P(Sl∣l,I;w))
其中P(Sl∣l,I;w)P(S_{l}|l,I;w)P(Sl∣l,I;w)表示在被预测序列的第l个字符预测结果为SlS_{l}Sl的条件概率。
对于上述公式的计算非常困难,因为得到的文本特征与标签文本序列存在不对齐的问题,实际上不能直接使用第二个式子。
CTC和Attention分别从两个方面解决了这个问题。
- CTC是将得到的特征序列每一个时刻都预测后直接去掉其中的空格,仅得到剩下的预测字符序列,然后将这个字符序列与标签序列计算交叉熵损失。但是他的关键在于如何反向传播,CTC通过隐马尔科夫模型中的前向后向算法从标签序列倒推回可能得到这个标签的预测序列,这些序列的概率权值是不同的,然后再进行后续的反向传播。CTC层本身是没有变量的,因此他训练的目的是使特征提取时能够学会文本序列的排布信息特征。它的损失计算是基于第一个公式 −∑(I,S)∈Qlog(P(S∣I;w))-\sum_{(I,S)\in Q}log(P(S|I;w))−(I,S)∈Q∑log(P(S∣I;w))。
- Attention是直接增加了一个可训练的解码层,将非常长的特征序列解码为长的不同的预测文本。这相当于是将CTC中的前向反向算法替换为一种参数可训练的注意力机制。通过训练能够得到要预测某个位置的文本字符,需要从哪些特征中得到。相当于Attention层本身学习到了一种文本的排布信息特征。它的损失计算是基于第二个公式−∑(I,S)∈Q∑l=1Llog(P(Sl∣l,I;w))-\sum_{(I,S)\in Q}\sum_{l=1}^{L}log(P(S_{l}|l,I;w))−(I,S)∈Q∑l=1∑Llog(P(Sl∣l,I;w))。
ACE交叉熵损失
本文提出了一种新颖的损失函数,这个损失函数不考虑序列中字符间的顺序,仅仅考虑一个字符串中某个类别的字符出现的次数。
我们在没有Attention机制的网络中直接计算 −∑(I,S)∈Q∑l=1Llog(P(Sl∣l,I;w))-\sum_{(I,S)\in Q}\sum_{l=1}^{L}log(P(S_{l}|l,I;w))−(I,S)∈Q∑l=1∑Llog(P(Sl∣l,I;w)) 是一种错误的做法,因为存在字符序列与特征序列的错位不对齐。基于此,文中提出了一种不需要考虑对齐的方案,即不考虑特征的顺序,仅仅计算各类别字符出现次数。
L(w)=−∑(I,S)∈Q∑l=1Llog(P(Sl∣l,I;w))≈−∑(I,S)∈Q∑k=1∣C∣log(P(Nk∣k,I;w))L(w)=-\sum_{(I,S)\in Q}\sum_{l=1}^{L}log(P(S_{l}|l,I;w))\approx -\sum_{(I,S)\in Q}\sum_{k=1}^{|C|}log(P(N_{k}|k,I;w))L(w)=−(I,S)∈Q∑l=1∑Llog(P(Sl∣l,I;w))≈−(I,S)∈Q∑k=1∑∣C∣log(P(Nk∣k,I;w))
其中|C|表示类别数,P(Nk∣k,I;w)P(N_{k}|k,I;w)P(Nk∣k,I;w) 表示在图像I的预测结果中,第k个类别的字符出现的次数等于标签中给定次数 NkN_{k}Nk 的条件概率。
例如标签字符串为students,则损失函数的目标是,使识别结果的s,t出现两次,其他类出现一次(包括空白类)。
基于回归的ACE损失函数
我们通过CNN+BiLSTM得到的特征序列维度为(T * K),其中T为序列长度,K为字符类别数,我们定义输出的特征序列张量为Y,第t个时刻的特征向量为 yty^{t}yt,第t个时刻第k个类别的预测概率为 ykty_{k}^{t}ykt。整个字符序列中所有位置第k个类别出现的总概率为 yk=∑t=1Tykty_{k}=\sum_{t=1}^{T}y_{k}^{t}yk=∑t=1Tykt。
我们定义 yky_{k}yk 与 NkN_{k}Nk 的平方损失(回归损失):
max∑k=1∣C∣log(P(Nk∣k,I;w))⇔min∑k=1∣C∣(Nk−yk)2max\sum_{k=1}^{|C|}log(P(N_{k}|k,I;w))\Leftrightarrow min\sum_{k=1}^{|C|}(N_{k}-y_{k})^2maxk=1∑∣C∣log(P(Nk∣k,I;w))⇔mink=1∑∣C∣(Nk−yk