端到端的OCR:LSTM+CTC的实现

姓名:崔少杰       学号:16040510021

转载自:http://www.jianshu.com/p/4fadf629895b=有修改

【嵌牛导读】:CTC是序列标志的一个重要算法,它主要解决了label对齐的问题

【嵌牛鼻子】:OCR、CTC

【嵌牛提问】:LSTM+CTC的实现有什么不一样的功能?

【嵌牛正文】:假设我们要解决的是4位数字的识别,图片是80*30的图片。那么我们就将每张图片按列切分成80个30维的向量。然后作为一个lstm的80个输入。一个lstm的输出和输入数目应该是相同的。而我们的预测目标却只有4个数字。而不是80个数字。在没有用ctc时我想了两个解决方案。第一个是用encode-decode模式。也就是80个输入做encode,然后decode成4个输出。实测效果很挫。第二个是把4个label每个copy20遍,从而变成80个label。实测也很挫。没办法,最后只能用ctc loss了。

用ctc loss的体会就是,如果input的长度远远大于label的长度,比如我这里是80和4的关系。那么一开始的收敛会比较慢。在其中有一段时间cost几乎不变。此刻一定要有耐心,最终一定会收敛的。在ocr识别的这个例子上最终可以收敛到95%的精度。

ctcStatus_t compute_ctc_loss(const float* const activations,

float* gradients,

const int* const flat_labels,

const int* const label_lengths,

const int* const input_lengths,

int alphabet_size,

int minibatch,

float *costs,

void *workspace,

ctcComputeInfo info);

你可能感兴趣的:(端到端的OCR:LSTM+CTC的实现)