很长一段时间以来,文本识别一直都是一个重要的关于文档数字化的研究课题。现有的文本识别方法通常采用 CNN 网络进行图像理解,采用 RNN 网络进行字符级别的文本生成。但是该方法需要额外附加语言模型来作为后处理步骤,以提高识别的准确率。

为此,微软亚洲研究院的研究员们展开了深入研究,提出了首个利用预训练模型的端到端基于 Transformer 的文本识别 OCR 模型:TrOCR。该模型简单有效,可以使用大规模合成数据进行预训练,并且能够在人工标注的数据上进行微调。实验证明,TrOCR 在打印数据和手写数据上均超过了当前最先进的模型。训练代码和模型现已开源。希望感兴趣的读者可以阅读全文,了解 TrOCR 的优势所在!

光学字符识别(OCR)是将手写或印刷文本的图像转换成机器编码的文本,可应用于扫描文档、照片或叠加在图像上的字幕文本。一般的光学字符识别包含两个部分:文本检测和文本识别。

  • 文本检测用于在文本图像中定位文本块,粒度可以是单词级别或是文本行级别。目前的解决方案大多是将该任务视为物体检测问题,并采用了如 YoLOv5 和 DBNet 的传统物体检测模型。

  • 文本识别致力于理解文本图像并将视觉信号转换为自然语言符号。该任务通常使用编码器-解码器架构,现有方法采用了基于 CNN 网络的编码器进行图像理解,以及基于 RNN 网络的解码器进行文本生成。

在文本识别领域中,Transformer 模型被频繁采用,其结构的优势带来了显著的效率提升。然而,现有方法仍主要采用 CNN 网络作为主干网络,并在此基础上配合自注意力机制来理解文本图像;另外,现有方法还依旧采用 CTC 作为解码器,配合额外的字符级别的语言模型来提高整体的准确率。这种混合模型虽然取得了巨大的成功,但仍然有很大的提升空间

1. 现有模型的参数是在合成或人工标注的数据上从零开始训练的,没有探索大规模预训练模型的应用。

2. 图像 Transformer 模型变得愈发流行,特别是最近提出的自监督图像预训练。现在应当开始探索预训练的图像 Transformer 是否可以替代 CNN 主干网络,以及预训练的图像 Transformer 是否可以在单一网络中配合预训练文本 Transformer 进行文本识别任务。

因此,微软亚洲研究院的研究员们聚焦文本识别任务展开了多项研究,并提出了首个利用预训练模型的端到端基于 Transformer 的文本识别 OCR 模型:TrOCR,模型结构如图1。

图1:TrOCR 模型结构示意图

与现有方法不同,TrOCR 简单、高效,没有将 CNN 作为主干网络,而是把输入的文本图像切分成图像切片,然后输入到图像 Transformer 中。TrOCR 的编码器和解码器则均使用了标准的 Transformer 结构以及自注意力机制,解码器生成 wordpiece 作为输入图像的识别文本。为了更有效的训练 TrOCR 模型,研究员们使用了 ViT 模式的预训练模型和BERT模式的预训练模型,来分别初始化编码器和解码器。

论文:https://arxiv.org/abs/2109.10282

代码/模型:https://aka.ms/trocr

TrOCR 的优势有三个方面:

1. TrOCR 使用预训练的图像和文本模型,利用大规模无标注数据的优势来进行图像理解和建模语言模型,不需要额外的语言模型介入。

2. TrOCR 不需要任何复杂的卷积网络来作为主干网络,更加易于实现和维护。实验证明,TrOCR 在打印体和手写体文本识别任务的基准数据集上均超越了当前最先进的方法,不需要任何复杂的预/后处理步骤。

3. TrOCR 可以很容易地扩展为多语言模型,只需要在解码器端使用多语种预训练模型即可。此外,通过简单调整预训练模型的参数量配置,使云/端部署变得极为简便。

实现方法

模型结构

TrOCR 采用了 Transformer 结构,包括图像 Transformer 和文本 Transformer,分别用于提取视觉特征和建模语言模型,并且采用了标准的 Transformer 编码器-解码器模式。编码器用于获取图像切片的特征;解码器用于生成 wordpiece 序列,同时关注编码器的输出和之前生成的 wordpiece。

对于编码器,TrOCR 采用了 ViT 模式的模型结构,即改变输入图像的尺寸,并切片成固定大小的正方形图像块,以形成模型的输入序列。模型保留预训练模型中的特殊标记“[CLS]”代表整张图片的特征,对于 DeiT 的预训练模型,同样保留了对应的蒸馏token,代表来自于教师模型的蒸馏知识。而对于解码器,则采用原始的 Transformer 解码器结构

模型初始化

编码器和解码器均应用在经过大规模标注/无标注数据预训练过的公开模型上,从而进行初始化。编码器采用 DeiT 和 BEiT 模型进行初始化,而解码器采用 RoBERTa 模型进行初始化。由于 RoBERTa 的模型结构和标准的 Transformer 解码器不完全匹配,例如缺乏编码器-解码器注意力层,因此研究员们将随机初始化这些在 RoBERTa 模型中不存在的层。

任务流程

TrOCR 的文本识别任务过程是:给定待检测的文本行图像,模型提取其视觉特征,并且给予图像以及已经生成的上文来预测对应的 wordpiece。真实文本以“[EOS]”符号结尾,代表句子的结束。在训练过程中,研究员们向后旋转真实文本的 wordpiece 序列,并把“[EOS]”符号挪到首位,输入到解码器中,并使用交叉熵损失函数来监督解码器的输出。在推断时,解码器从“[EOS]”符号开始迭代预测之后的 wordpiece,并把预测出的 wordpiece 作为下一次的输入。

预训练

研究员们使用文本识别任务作为预训练任务,因为它可以使模型同时学习到视觉特征提取和语言模型两者的知识。预训练过程分为两个阶段:第一个阶段,研究员们合成了一个包含上亿张打印体文本行的图像以及对应文本标注的数据集,并在其上预训练 TrOCR 模型;第二个阶段,研究员们构建了两个相对较小的数据集,分别对应打印体文本识别任务和手写体文本识别任务,均包含上百万的文本行图像,并在打印体数据和手写体数据上预训练了两个独立的模型,且都由第一阶段的预训练模型初始化。

微调

研究员们在打印体文本识别任务和手写体文本识别任务上微调了预训练的 TrOCR 模型。模型的输出基于 BPE(字节对编码)并且不依赖于任何任务相关的词典。

数据增强

为了增加预训练数据和微调数据的变化,研究员们使用了数据增强技术,合计七种图像转换方法(包括保持原有输入图像不变)。对于每个样例,研究员们在随机旋转、高斯模糊、图像膨胀、图像腐蚀、下采样、添加下划线、保持原样中会机会均等地随机选取一个方法对图像进行变换。

预训练数据

为了构建一个大规模高质量的数据集,研究员们从互联网上公开的 PDF 文档中随机选取了两百万张文档页面。由于这些 PDF 是数字生成的,因此通过把 PDF 文档转换为页面图像,然后提取文本行和裁切图像就可以得到高质量的打印体文本行图像。第一阶段的预训练数据一共包含6亿8千万文本行数据。

对于预训练的第二阶段,研究员们使用5427个手写字体和 TRDG 开源文本识别数据生成工具,合成了大量的手写文本行图像,并随机从维基百科的页面中选取文本。该阶段预训练的手写数据集包含合成数据和 IIIT-HWS 数据集,共计1800万的文本行。此外,研究员们还收集了现实世界中的5万3千张收据照片,并通过商业 OCR 引擎识别了上面的文本,对照片进行了修正和裁剪。同样,研究员们也使用 TRDG 合成了100万打印体的文本行图像,并使用了两种收据字体和其内置的打印体字体。第二阶段预训练的打印体数据集包含330万的文本行。表1统计了合成数据的规模。

表1:两阶段预训练的合成数据规模

预训练结果

首先,研究员们比较了不同编码器和解码器的组合,来寻找最佳的模型设定。研究员们比较了 DeiT,BEiT 和 ResNet50 网络作为编码器的选项。在比较中,DeiT 和 BEiT 均使用了论文中 base 的模型设定。对于解码器而言,研究员们则比较使用了 RoBERTa-base 初始化的 base 解码器和使用 RoBERTa-large 初始化的 large 解码器。作为对照,研究员们对随机初始化的模型、CRNN 基线模型以及 Tesseract 开源 OCR 引擎也进行了实验。

表2给出了组合得到的模型结果。BEiT 编码器和 RoBERTa-large 解码器表现出了最好的结果。与此同时,结果表明预训练模型确实提高了文本识别模型的性能,纯 Transformer 模型的性能要优于 CRNN 模型和 Tesseract。根据这个结果,研究员们选取了后续实验的两个模型设定:TrOCR-base,包含 334M 个参数,由 BEiT-base 编码器和 RoBERTa-large 解码器组成;TrOCR-large,包含558M个参数,由 BEiT-large 编码器和 RoBERTa-large 解码器组成。

表2:在 SROIE 数据集上进行的消融实验结果

表3给出了 TrOCR 模型和 SROIE 数据集排行榜上当前最先进模型的结果。可以看出,TrOCR 模型凭借纯 Transformer 模型超过了当前最先进模型的性能,同时也证实了其不需要任何复杂的预/后处理步骤。基于 Transformer 的文本识别模型在视觉特征提取上可以与基于 CNN 的模型有近似性能,在语言模型上可与 RNN 相媲美。

表3: 大规模预训练的 TrOCR 模型在 SROIE 印刷体数据集的实验结果

表4给出了 TrOCR 模型和 IAM 数据集上现有方法的结果。结果显示现有方法中 CTC 解码器和额外的语言模型可以带来显著的效果提升。通过与(Bluche and Messina, 2017)比较,TrOCR-large 有着更好的结果,这说明 Transformer 解码器相比于 CTC 解码器在文本识别任务中更具竞争力,同时已经具有足够的建模语言模型的能力,而不需要依赖于额外的语言模型

表4: 大规模预训练的 TrOCR 模型在 IAM 手写体数据集的实验结果

TrOCR 使用了来自于图像切片的信息,获得了与 CNN 网络相似甚至更好的结果,说明经过预训练的 Transformer 结构可以胜任提取视觉特征的任务。从结果来看TrOCR 模型使用纯 Transformer 结构超过了所有仅使用合成+IAM 数据的方法,同时在没有使用额外人工标注数据的情况下,取得了和使用人工标注数据的方法相近的结果。

总结

在本文中,研究员们提出了首个利用预训练模型的端到端基于 Transformer 的文本识别 OCR 模型:TrOCR。不同于现有方法,TrOCR 不依赖于传统的 CNN 模型进行图像理解,而是利用了图像 Transformer 作为视觉编码器,利用文本 Transformer 作为文本编码器。此外,与基于字符的方法不同,研究员们使用 wordpiece 作为识别输出的基本单元,节省了在额外的语言模型中额外的计算开销。实验证明,在没有任何后处理步骤,且仅使用一个简单的编码器-解码器模型的情况下,TrOCR 在打印文本和手写文本识别中均取得了目前最先进的准确率。

TrOCR:基于Transformer的新一代光学字符识别相关推荐

  1. 光学模拟 Android,基于Android平台的光学字符识别应用的设计与实现

    摘要: 随着数字化时代的蓬勃发展,信息量以指数级的速度增长,然而手工录入并存储信息的速度远不及信息的产生速度.光学字符识别(OCR)技术能够自动化地检测信息并识别出来,有效地解决了信息录入速度和正确率 ...

  2. python 字符识别_使用python进行光学字符识别入门

    python 字符识别 语言模型设计 (Language Model Designing) Optical Character Recognition is the conversion of 2-D ...

  3. 银行卡号识别python_银行卡号识别 基于 OpenCV 光学字符识别(OCR)

    银行卡号识别 基于 OpenCV 光学字符识别(OCR) 今天的博客文章是我们最近关于光学字符识别(OCR)和计算机视觉的系列的延续. 在之前的博客文章中,我们学习了如何安装Tesseract二进制文 ...

  4. 光学模拟 Android,基于Android的光学字符识别研究与实现

    摘要: 随着Android手机平台的普及和信息化进程的不断推进,利用手持设备高效地将文档信息录入已经成为一个亟需解决的问题,其关键技术光学字符识别在手机上的应用日益受到人们重视.本文所做工作正是针对这 ...

  5. 光学字符识别 android,基于Android的光学字符识别研究与实现

    摘要: 随着Android手机平台的普及和信息化进程的不断推进,利用手持设备高效地将文档信息录入已经成为一个亟需解决的问题,其关键技术光学字符识别在手机上的应用日益受到人们重视.本文所做工作正是针对这 ...

  6. OCR光学字符识别方法汇总(附开源代码)

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 文本是人类最重要的信息来源之一,自然场景中充满了形形色色的文字符号 ...

  7. OCR光学字符识别方法汇总

    编者荐语 OCR英文全称是Optical Character Recognition,中文叫做光学字符识别.它是利用光学技术和计算机技术把印在或写在纸上的文字读取出来,并转换成一种计算机能够接受.人又 ...

  8. SVM算法实现光学字符识别

    目录 1.数据来源 2.数据预处理 3.模型训练 4.模型性能评估 5.模型性能提升 5.1.核函数的选取 5.2.惩罚参数C的选取 OCR (Optical Character Recognitio ...

  9. 微软发布史上最大NLG模型:基于Transformer架构,170亿参数加持

    2020-02-11 18:50 导语:史上最大! 近年来,BERT.GPT-2等深度学习语言模型,极大地提高了问答.摘要.人机对话等下游自然语言处理任务的性能. 而今天,微软研究院重磅发布了有史以来 ...

最新文章

  1. 有关于mfc webbrowser插件的使用
  2. java map操作_Java 8 中的 Map 骚操作,学习下!
  3. Numpy的基本用法
  4. [Serializable]序列化一句话理解
  5. Jquery 温习,温故而知新,可以为师矣
  6. 李宏毅机器学习(七)GPT的野望
  7. vue Draggable实现拖动改变顺序
  8. Halcon 一维测量
  9. python 动态加载代码_python 动态网页爬取?(不是加载更多页的动态网页哟)?...
  10. 第三章 虚拟化概述(处理器虚拟化)
  11. 正确学习JavaScript知识和教程
  12. vue关闭浏览器退出登录
  13. ubuntu安装docker + 配置国内源和加速器
  14. Pytorch实现多层lstm
  15. 广义线性模型到底是个什么鬼?
  16. PHP的ob_flush()与flush()区别
  17. 软件需求管理(二) 需求获取
  18. 基于php+mysql的村镇干部绩效考核系统
  19. Nginx中server_name指令介绍
  20. 用过滤器实现file类实现输出目录以及子目下的结尾为.java的文件

热门文章

  1. 香橙派mqtt阿里云终端(二) --python3.5环境配置以及阿里云环境测试
  2. 利用arduino UNO配合Orangepi 4B实现制作机器人
  3. leetcode738 单调递增的数字
  4. Python爬虫中文小说网点查找小说并且保存到txt(含中文乱码处理方法)
  5. 【神经网络】tenorflow实验11--人工神经网络(2)
  6. 看到一句话,感受良多
  7. LIS系统源码 检验信息管理系统源码
  8. html交互界面怎么写,HTML5 BIOS字符交互界面模拟
  9. [转载]俄罗斯只剩“大国的脾气”
  10. vb.net的String类型和Bytes转换(C#也适用)