OCR技术作为机器视觉领域一个非常重要的研究反向,涉及的应用领域多种多样。现今,各应用领域已经出现了非常多的产品,包括卡片证件类识别、票据类识别、文字信息结构化视频类识别、自然场景下的文字识别等。本文主要从数据、算法两个方面概述目前OCR较为成熟的解决方案。
数据
深度学习算法是非常依赖于数据数量与质量的,OCR也不例外。一般OCR任务中不仅需要识别具体的文字内容,还要识别文字具体所在位置,甚至结构化组织识别信息,所以图像数据中的监督信息就包括文字位置坐标和相应文本内容。标注数据的来源一般分为两类:人工标注和程序(模型)自动生成。
人工标注
一般人工标注的成本比较大,首先需要搭建合适的标注平台,好在github上有几个开源的关于目标检测任务的标注平台供选择(参见 十个最常用深度学习图像/视频数据标注工具 或者 深度学习图像标注工具汇总)。其次,构建专业的标注团队,尤其是涉及垂直领域的任务。另外还要设计数据质量监控机制,如标注数据交叉验证等。
数据生成
数据自动生成的数据量大,成本小,唯一需要担心的就是生成的数据分布与真实数据分布有显著差异。针对文本检测和文本识别,目前的数据生成方案基本都是模拟真实背景,同时平滑地嵌入文本内容。
Synthetic Data for Text Localisation in Natural Images 提出了一种文字检测数据生成的方案。通过计算背景图片的语义与深度信息,筛选出合适的候选区域,之后随即选择文字字体、颜色、大小、特效,将其放置到对应的区域中,并通过矩阵变化得到最后含有文本的图像。源码
-
识别数据的生成往往都极度依赖业务场景,主要分为三个步骤:
- 根据具体场景收集目标字体,如楷体、宋体、雅黑等;
- 搜集相关的背景图片、文本语料;
- 随机选取以及组合各种图像増广技巧(透视变换、对比度、随机噪声),生成比较广泛的、尽量贴合实际场景的数据,以缩小生成数据与实际场景数据之间的差异。
那么标注或生成多少数据量合适呢?当然,高质量数据肯定是越多越好的,如果非要给一个下限,一般文本检测任务图片数据量在万张级别,文本识别任务在百万张级别。
算法
整体OCR识别算法一般是分为两个部分:文本检测和文本识别。
文本检测
文本检测与目标检测算法的发展是息息相关的。目前主流的目标检测算法分为两类:
- Two-stage方法。该方法包含一个预处理阶段,负责生成候选区域并提取对应的图像特征,然后在第二阶段进行分类与精确位置修正。代表算法包括R-CNN、Fast R-CNN、Faster R-CNN、RFCN、 Mask R-CNN等。
- One-stage方案。该方法简化了Two-stage方法,略过了生成候选区域阶段,直接预测目标类别与位置。代表算法包括YOLO、SSD、YOLO9000、YOLOv3等。
通用的目标检测算法对文本一般检测都不精准,原因主要包括大多数文本没有闭合边缘、文本行方向任意、文本排列不规则等,需要结合文本的结构与分布特点优化检测模块,其中包括CTPN、SegLink、Rotation RPN、Textboxes等。
文本识别
文本识别模型一般分为特征提取器(编码器)和解码器。
- 特征提取器通常由CNN和RNN组成,一种典型的结构就是利用基础CNN分类网络结构(VGG16、ResNet、DenseNet)提取图像特征,利用双向RNN来获取序列特征,有时也会引入Attention机制。
- 变长序列解码器主要包括CTC(Connectionist Temporal Classification)、EP(Edit Probability)和直接RNN解码。还有一种利用seq2seq结构的解码方式,一般使用不多。
总结
目前针对不同识别场景的都有相应的算法调优方案,模型拟合能力方面已经有了长足进步。相较于算法,如何获取高质量数据很大程度上影响着整个OCR项目成败,打通整个数据链路会是深度学习项目的关键,也会成为企业的核心竞争力。