找回密码
 立即注册
查看: 374|回复: 0

OCR文本识别算法总结

[复制链接]
发表于 2022-8-22 17:19 | 显示全部楼层 |阅读模式
一般来讲OCR主要分为两部分: 1. 文本检测, 即找出文本所在位置 2. 文本识别, 将文字区域进行识别. 本文主要介绍第二阶段文本识别的算法.
论文列表

算法论文论文出处引用量
CRNNAn End-to-End Trainable Neural Network for Image-Based Sequence Recognition and Its Application to Scene Text RecognitionTPAMI20161808
2D-CTC2D-CTC for Scene Text RecognitionarXiv190725
ACEAggregation Cross-Entropy for Sequence RecognitionCVPR201958
SVTRSVTR: Scene Text Recognition with a Single Visual ModelIJCAI20221
R^2AMRecursive Recurrent Nets with Attention Modeling for OCR in the WildCVPR2016416
SARShow, Attend and Read: A Simple and Strong Baseline for Irregular Text RecognitionAAAI2019167
TrOCRTrOCR: Transformer-based Optical Character Recognition with Pre-trained ModelsarXiv210911
论文解读

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-24 14:09 , Processed in 0.090550 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表