|
一般来讲OCR主要分为两部分: 1. 文本检测, 即找出文本所在位置 2. 文本识别, 将文字区域进行识别. 本文主要介绍第二阶段文本识别的算法.
论文列表
算法 | 论文 | 论文出处 | 引用量 | CRNN | An End-to-End Trainable Neural Network for Image-Based Sequence Recognition and Its Application to Scene Text Recognition | TPAMI2016 | 1808 | 2D-CTC | 2D-CTC for Scene Text Recognition | arXiv1907 | 25 | ACE | Aggregation Cross-Entropy for Sequence Recognition | CVPR2019 | 58 | SVTR | SVTR: Scene Text Recognition with a Single Visual Model | IJCAI2022 | 1 | R^2AM | Recursive Recurrent Nets with Attention Modeling for OCR in the Wild | CVPR2016 | 416 | SAR | Show, Attend and Read: A Simple and Strong Baseline for Irregular Text Recognition | AAAI2019 | 167 | TrOCR | TrOCR: Transformer-based Optical Character Recognition with Pre-trained Models | arXiv2109 | 11 | 论文解读
CRNN
算法流程
CRNN算法的模型设计非常直觉, 通过CNN抽取一个1维特征表示 (如下图, 可以想象为一个滑动窗口提取的1维特征, 整体来看, 维度为 W\times 1\times C , C 为通道数), 然后送入LSTM后得出一个后验概率矩阵 (维度为 W \times L , L 为字典长度+1, 因为有空字符).
得到这样一个后验概率矩阵后, 我们需要将其转换为输出的文字. 这里的矩阵维度由图片长度确定, 大于文本的长度, 所以并不能直接将概率矩阵转为文本 (如果直接转换, 会有重复字符), 而是使用Connectionist Temporal Classification (CTC)算法.
CTC的算法思想类似于HMM的前向后向算法, 简而言之, 就是通过动态规划求解出满足概率矩阵的文本, 具体的原理推导可以参见https://zhuanlan.zhihu.com/p/43534801, 这里不再赘述.
简单总结, CRNN的思想就是通过神经网络得到一个概率矩阵, 然后通过CTC loss来优化这个概率矩阵. 推理时, 则得出概率矩阵的最大值, 并消减重复字符, 如下图.
思考
- 很多别的文章都指出, CTC决定了CRNN只能处理单行文本, 而无法处理多行文本, 关于这点, 我觉得只说对了一半. CTC算法的过程确实需要按顺序排列好的后验概率矩阵, 但是概率矩阵并非滑动窗口直接得到的, 而是CNN提取的feature map后经过LSTM后所得, CNN的feature map虽然是1维的, 但是从整体上看, 其依然涵盖了全图的信息, 经过LSTM后, 理论上可以学习到多行信息模式, 并将其重新排列并输出理想的有序后验概率矩阵 (可以将LSTM看作一个翻译模型, 把多行信息的feature map翻译成有序的后验概率矩阵). 所以, 在一定程度上, CRNN也是可以处理多行文本等复杂情形的, 经过简单实验, 结果也确实如此.
- CRNN的RNN并不是必须的, 也可以将CNN的feature map的维度设置为所需要的概率矩阵的维度, 直接接一个CTC算法. 这样的方法缺点有两点: 1. 没有抽取上下文信息, 在单词/句子识别等场景下, 表现应该略差, 而在车牌等无规律组合的场景性能不会下降很多 (未验证) 2. 完全无法进行多行文本等非规律场景的识别.
2D-CTC
2D-CTC解决的问题主要是不规则图像包含大量背景, 而这些信息对于模型是噪声, CTC的1D概率矩阵不可避免的会因此引入噪声. 2D-CTC将后验概率矩阵的维度有 W\times L 变为 W\times H \times L , 即增加了高度信息, 这样的话尽可能避免背景噪音对于概率矩阵的影响.
与1D-CTC相同的是, 2D-CTC依然每一列只有一个输出, 也就是说, 它的后验概率矩阵依然是以列为序的, 所以如果碰到多行文本, 后验概率矩阵依然要通过CRNN等模型学习出一个按列重排的有序概率矩阵.
ACE
ACE loss的出发点是觉得计算CTC loss的过程计算消耗大, 提出了一种简单的近似算法来优化后验概率矩阵来替代CTC loss. ACE算法只要计算单词出现频率, 与标签的真实频率求交叉熵损失, 通过这个去优化概率矩阵. 并且这样的算法, 可以直接用于2D概率矩阵优化, 2D概率矩阵的优点和2D-CTC类似, 更适合含有背景的不规则图像.
根据网上分享, 只用ACE loss可能存在收敛困难等问题, 而ACE loss结合CTC loss一起训练, 相较于CTC loss可以获得额外的提升, 微信AI团队的OCR算法也采用了这样的训练策略.
SVTR
PaddleOCR的PP-OCRv3钦定模型, 模型小, 效果好.
主要就是利用Transformer替代了RNN, 得益于self-attention机制, 这样面对不规则文本图像的时候应该有更好的信息抽取能力, 可以更好的抽取有序后验概率矩阵.
R ^2 AM
OCR很像图像描述/翻译, 所以很自然的想到将图像描述/翻译领域大获成功的seq2seq模型运用到OCR任务中.
CNN提取的特征是一个一维向量, RNN的输出是每个位置的字母的预测概率 (如英文26个字母, 维度就是26), 求交叉熵损失反向传播. Attention机制可以帮助RNN关注到需要关注的特征, 提升性能, 上图几种办法在规则文本数据集上的表现如下
SAR
算法流程
SAR同样是一个seq2seq模型, 不同于R ^2 AM直接用CNN抽取图像的一维特征, SAR先用CNN抽取一个feature map, 再将feature map一列一列送入LSTM encoder得到一维特征在进行解码, 解码过程依靠原来的feature map做attention.
点评
SAR一列一列送入LSTM encoder的做法很想CRNN中的做法, 可以看作引入了文本横向阅读的先验知识, 并且feature map保留了图像的空间信息, 用它做attention更合理.
TrOCR
Transformer的暴力美学, 一个encoder一个decoder完事, 轻松SOTA, 不过模型参数量也相当惊人. Decoder可以使用语言预训练模型. 并且Transformer还有一些自监督预训练的办法, MaskOCR就采用自监督预训练继续刷榜.
相关资料
PaddleOCR https://github.com/PaddlePaddle/PaddleOCR
PaddleOCR FAQ https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.5/doc/doc_ch/FAQ.md
20年及以前经典论文 https://github.com/hwalsuklee/awesome-deep-text-detection-recognition
PapersWithCode https://paperswithcode.com/task/optical-character-recognition |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|