[关闭]
@w460461339 2019-02-18T17:42:28.000000Z 字数 1774 阅读 4048

CRNN:网络结构和CTC loss

MachineLearning


CRNN是目前OCR领域比较火的一个方法,下面分网络结构和loss来分别介绍一下。

CRNN结构参考:
https://blog.csdn.net/quincuntial/article/details/77679463

CTC LOSS参考:
https://distill.pub/2017/ctc/
https://www.jianshu.com/p/34cfde8bab29
这个csdn的效果也不错
https://blog.csdn.net/left_think/article/details/76370453

这两篇知乎的讲的不错
https://zhuanlan.zhihu.com/p/27345171
https://zhuanlan.zhihu.com/p/27593978

1、模型

下面用语言解释一下模型:

2、CTC_LOSS

在seq2seq的模型中,无论是词级别,还是字符级别,我们都有一个假设:

target的第i位,是由某一个时间步的输出决定的;
同时,我们不存在两个时间步的输出共同决定同一个target的第i位的情况。

但是,对于OCR,或者语音问题中,我们需要观察比较大的一部分(多个特征向量对应的矩阵组合起来)或者听一段时间,才能够确定这一位。

这意味着,RNN每一个时间步的输出,不再和target一一对应。

2.1 对应问题

而CTC的第一步,就是解决这个对应问题。

2.2 计算P(Y|X)

在知道了这个对应方法之后,我们有以下操作。

ctc_loss1.jpg-120.2kB

2.3 CTC LOSS计算

当我们知道如何计算Si的概率之后,我们如果粗暴的计算每个Si的概率,然后算loss的话,计算量太大了,因此就需要一个简单的方法来计算。

参考:
https://blog.csdn.net/left_think/article/details/76370453

一定好好看看楼上这篇参考
image_1cct21ugm1of9djh125lim01h0r6k.png-29.8kB

首先要对label做一个处理。即在首位和每个字符间都加上一个blank。

大概的说,我认为总体思路是这样的:

1、对于第t个时间步,它输出是oti,我们计算前面的t-1步,能够使得第t步输出oti的概率之和。

简单点说,前面t-1步有很多种可能使得第t步得到这个值,并且由于递归的效应,可以认为前面t-1步的输出,哪怕li不同,但是经过去掉blank和去重后,最后会生成相同的si。

ctc_loss2.jpg-106.3kB

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注