项目场景:
提示:PaddleOCR 源码阅读
ppocr/data/postprocess/rec_postpocess.py
使用ctclabeldecode
问题描述:
当时面试时 问CTC是如何解码的,回答有点模糊,就大概理解是一个序列话,跟字典去一一对应
解决方案:
1、ctc blank机制
现在的理解是这样的。一张图片要映射到一个字符序列,识别的基础还是单字符的识别(如果不考虑直接把图片映射为一个单词的方法)。单字符的识别就涉及到图片切分的问题了,切分有显示切分和隐式切分两种方法。早期的方法是显示切分,切成图片块序列再进行单字符分类,但是识别性能受制于切分的质量。后面出来的隐式切分方法如crnn,用cnn+lstm做序列建模,加上ctc转码实现隐式切分。
也就是说切分是绕不开的,实现切分的话就需要知道字符边界。显示切分确定字符边界最简单的方法就是,把图片灰度均值超过阈值的列视做边界(假设白底黑字,这里随便说的一个想法,我还没做过显示切分的工作)。前面说过显示切分的问题,切分质量难以保证。如果不用这种方法怎么实现切分呢?
既然抛弃了在图片端进行切分的方法,那就只能在图片处理过后进行切分了。不论用cnn还是rnn,最后都可以把图片变成一个特征序列,我们可以对序列中的每列特征进行分类。为了在这里进行切分,引入一个新的类别,这个类别代表字符边界。所以ctc引入blank的目的就是为了表征字符边界,实现隐式切分的目的。
2、一篇博客 整体的讲述了一下 CTC原理和理解及实现
https://zhuanlan.zhihu.com/p/39266552