这篇博客将介绍什么是光学字符识别OCR,介绍OCR发展的简短历史,了解OCR真实的应用场景,了解OCR与方向和脚本检测(OSD)之间的区别。并了解图像预处理和后处理对于提高OCR结果的重要性。
光学字符识别(Optical Character Recognition)简称OCR,是用于描述将文本图像转换为机器编码文本的算法和技术。主要包括以下3步:
OCR表面上看起来很简单,尽管计算机视觉领域已经存在了50多年,但研究人员尚未创建高度准确的通用OCR系统,依然道阻且长。
另外鉴于人类通过书写进行交流的方式有很多细微差别——有自然语言处理(NLP Natural Language Processing)的所有问题,并且计算机视觉系统在从图像读取文本时永远无法获得100%的准确度。噪声、书写风格、图像质量等方面的变量太多。OCR实现并不容易。
1914年,早期的OCR技术完全是机械式的,伊曼纽尔·戈德伯格开发了可以读取字符并将其转换为标准电报代码的机器;
1920~1930年,伊曼纽尔·戈德伯格开发了搜索缩微胶片(缩小的文档,通常是电影、报纸、期刊等)中的字符OCR。
1974年,OCR主要致力于创建“盲人阅读机器”。
1980年,惠普(HP)实验室开始研究Tesseract,2005年开源后很快成为世界上最流行的OCR引擎。
2010年,Tesseart继续发展,称为长短时记忆(LSTM long short-term memory)网络的专门体系结构极大地提高了OCR的准确性。
LSTM引擎提供了显著的精度增益,使得即使在较差的非最佳条件下也能准确地识别OCR文本。
LSTM引擎接受了超过123种语言的培训,使得除英语以外的语言(包括基于脚本的语言,如汉语、阿拉伯语等)进行OCR文本更加容易。
2020年,OCR被谷歌、微软和亚马逊等科技巨头日益商业化。
OCR有许多应用,最初的应用是为盲人创建阅读机器。自那时以来,OCR应用有了显著的发展,包括但不限于:
OSD:Orientation and Script Detection方向和脚本检测
文本的方向是输入图像中文本的角度(以度为单位)。为了获得更高的OCR精度,需要应用OSD来确定文本方向,纠正它然后应用OCR。
脚本和书写风格是指用于书面和打字交流的一组字符和符号。OCR系统对特定脚本或书写系统所能做出的任何规则、启发或假设都将使OCR引擎在应用于给定脚本时更加准确。
创建一个成功的OCR应用程序部分是科学,部分是艺术。
尽管 Tesseract OCR引擎的进步,OCR系统可以进行自动分割和页面分析。然而这些系统还是远不如人类智能,人类几乎可以即时解析复杂背景中的文本。
如果在OCR前应用一些基本的图像处理操作,如阈值、距离变换和形态学操作,最终将得到清晰的图像。OCR将获得更好的效果;
如果先对文本进行适当的清理和分割,OCR系统将更容易识别文本。
后处理OCR文本。OCR系统永远不会100%准确,所以应该假设会有一些错误。为了帮助解决这个问题,可以应用一些规则和启发法。
接下来将介绍4部分内容:
Tesseract OCR引擎是一个OCR软件包,最初开发于20世纪80年代,经历了多次修订和更新,现在是世界上最流行的OCR系统。
几乎每种流行编程语言(Java、C/C++、PHP等)都有Tesseract绑定。
PyTesseract库是一个Python包,它是与tesseract命令行进行交互的二进制文件。只需使用一个或两个函数调用,就可以轻松地将Tesseract OCR应用于OCR项目。
为提升OCR的准确性,基于计算机视觉和图像处理,使用OpenCV或者Keras, TensorFlow, scikit-learn 对图像进行预处理或者后处理。
- scikit学习库是使用Python训练机器学习模型时使用的标准包。
- Keras和TensorFlow在一个易于使用的API中提供了所有深入学习的能力。
当Tesseract从未训练过图像中的某种字体;或者经过预先训练的“现成”模型均不能够正确定位图像中的文本;或者开发自定义OCR可能需要花费太多的精力,可以考虑使用基于云的OCR API,例如微软Azure认知服务、Amazon RekGoNeNoint和谷歌云平台(Google Cloud Platform GCP)API。
缺点是付费使用;需要网络连接才可以提交图像并获取识别结果;有延迟不能用于实时应用;并不拥有整个OCR管道,只能用提供的一部分。