OCR(Optical Character Recognition,光学字符识别)技术是一种将印刷体或手写体文本转换为机器编码文本的技术。在OCR技术中,识别文字的过程涉及多个步骤,主要包括图像预处理、特征提取、字符识别和后处理。下面详细介绍这些步骤:
1. 图像预处理
图像预处理是OCR过程中的第一步,目的是改善图像质量,使其更适合后续处理。这包括以下几个步骤:
-
灰度化和二值化:将彩色图像转换为灰度图像,然后进一步转换为二值图像(黑底白字或白底黑字),以便简化后续处理。
-
噪声去除:使用滤波器如中值滤波器来减少图像中的噪声。
-
图像增强:通过锐化、对比度调整等方法增强图像,使文字更加清晰。
-
倾斜校正:校正扫描文档的倾斜,使得文字行水平对齐。
-
分割:将整个文档分割成单独的字符或行。
2. 特征提取
在图像预处理之后,需要对字符进行特征提取。这些特征用于训练模型或直接用于识别。常见的特征包括:
-
轮廓:字符的轮廓信息,如轮廓的长度、宽度等。
-
形状:字符的几何形状,如矩形度、圆形度等。
-
纹理:字符的纹理特征,如直方图、梯度分布等。
3. 字符识别
特征提取后,可以使用多种方法进行字符识别:
-
模板匹配:将提取的特征与预定义的模板进行比较。
-
机器学习方法:如SVM(支持向量机)、神经网络等,通过训练模型来识别字符。
-
深度学习方法:使用卷积神经网络(CNN)等深度学习模型进行高级特征学习和字符识别。
4. 后处理
识别出的字符可能包含错误,后处理步骤包括:
-
错误校正:使用纠错算法修正识别错误。
-
文本重建:将识别出的字符重新组合成完整的文本。
-
格式化:调整文本格式,如段落划分、标点添加等。
5. 应用示例 - OCR引擎如Tesseract
Tesseract是一个开源的OCR引擎,它使用了机器学习和深度学习技术来提高识别的准确率。Tesseract的主要工作流程包括:
-
图像预处理:包括二值化、去噪等。
-
页面分析:识别文本块和行。
-
字符识别:使用机器学习模型识别单个字符。
-
后处理:包括错误校正和文本重建。
通过这些步骤,OCR技术能够有效地将图像中的文字转换为可编辑的文本格式。随着深度学习技术的发展,现代OCR系统的准确率已经显著提高。
参考:
OCR概述
OCR(Optical Character Recognition,光学字符识别)技术是一种将图像中的文字内容提取为可编辑的数字文本的技术。它能够识别图片中的印刷字体、手写字体,甚至复杂的表格和图形内容,实现从“图像”到“数据”的转换。也就是说将图象中的文字进行识别,并返回文本形式的内容。
OCR在分类上可以分为手写体识别和印刷体识别两个大主题,当然印刷体识别较手写体识别要简单得多,我们也能从直观上理解,印刷体大多都是规则的字体,因为这些字体都是计算机自己生成再通过打印技术印刷到纸上。
OCR技术的起源可以追溯到20世纪20年代,当时德国科学家Tausheck首次提出了OCR的概念,设想利用机器来读取字符和数字。随着计算机技术的发展、扫描设备的逐渐提升以及计算机视觉的不断成熟,开始出现基于图像处理(边缘检测、腐蚀膨胀、投影分析等)和统计机器学习的OCR技术,识别准确度进一步提升。其标准的处理流程包括:图像预处理、文本行检测、单字符分割、单字符识别、后处理。
2. 实现流程
基于传统方法和深度学习方法实现了拍照文档边缘校正。版面分析是文档图像处理中的一个关键步骤,用于识别和分类文档中的内容,如文本、图片、表格等,并为后续的处理(如OCR或结构化输出)奠定基础。
重点总结文本行检测、文本行方向分类、文字识别。简单来说图片经过文字检测之后将图片中可能为文字的部分用矩形框标出,此时的文字可能是倒转或斜的,然后由方向分类器处理矩形框,将角度不正确的文字处理成正常方向的。经过方向分类器处理后的文字矩形框再通过文字识别,提取其中的文字。
常用的文本检测算法包括基于传统图像处理、基于深度学习和基于OCR引擎的检测的方法。
(1)基于传统图像处理的方法
适用于规则性较强的文档图像或简单场景。首先将图像转为灰度图像,并使用Otsu或自适应二值化方法增强文本内容的对比度;随后通过形态学操作对图像进行膨胀以连接文本区域,并通过腐蚀去除非文本噪声。接着,利用OpenCV的findContours进行连通域分析,检测文本区域,并根据面积、宽高比等特征(OpenCV的boundingRect获得矩形框信息)过滤非文本区域。最后,对每个检测到的文本块生成外接矩形框,完成文本区域的定位。
(2)基于深度学习的文本检测算法
适用于复杂文档场景或自然场景文本。可分为基于回归框的检测方法和基于像素级分割的检测方法。
基于回归的方法:借鉴目标检测算法,采用预测边界框的方法实现对文本的定位,典型的模型有 CTPN 和 EAST等。
CTPN(Connectionist Text Proposal Network):是一种经典的文本检测算法,通过结合卷积神经网络(CNN)和长短期记忆网络(LSTM)的优势,有效地检测出自然场景和文档图像中的横向分布的文字。CTPN通过滑动窗口机制生成候选文本框,使用RNN连接这些小块,最终输出完整的文本行。
EAST(Efficient and Accurate Scene Text Detector):是一种端到端的文本检测模型,能够同时检测水平和倾斜的文本。它通过全卷积网络(FCN)直接输出文本行或单词的检测结果,简化了传统的候选框提取、过滤和合并等步骤,常用作OCR识别的前置检测模块。
CRAFT(Character Region Awareness for Text Detection): 是一种针对自然场景文本检测的算法,能够精确地检测文本实例并支持任意方向的文本。CRAFT通过检测字符级区域和其相邻关系,生成完整的文本实例边界,在多语言文本检测任务中表现优异。
TextBoxes:是一个端到端可训练的快速文本检测器,能够在单次网络前向传播中高效且准确地检测场景文本。在不同层次的特征图后都设置了输出层,这些输出层被称为text-box layers,用于预测文本的存在和边界框。
基于分割的方法:基于回归的方法虽然在文本检测上取得了很好的效果,但是对解决弯曲文本往往难以得到平滑的文本包围曲线,并且模型较为复杂不具备性能优势。而基于图像分割的文本分割方法,先从像素层面做分类,判别每一个像素点是否属于一个文本目标,得到文本区域的概率图,通过后处理方式得到文本分割区域的包围曲线,典型的网络有 PSENet 和 DBNet等。
PixelLink:首先将文本实例通过将同一实例中的像素链接在一起进行分割,然后直接从分割结果中提取文本边界框,无需进行位置回归。
PSENet(Shape Robust Text Detection with Progressive Scale Expansion Network):是一种针对复杂场景文本检测的深度学习算法,能够检测任意形状的文本,包括水平、倾斜和弯曲文本。利用不同尺度的文本核(kernels)来逐步逼近真实的文本边界。算法首先生成多个具有不同尺度的文本分割图,然后通过渐进式扩展的方式,从小尺度的文本核开始,逐步扩展到最终的文本边界。特别适用于密集文本和不规则文本的场景。
DBNet(Differentiable Binarization Network):是一种高效的端到端文本检测算法,专注于解决复杂场景中的文本检测问题。因其高准确率和鲁棒性而备受青睐。DBNet通过骨干网络提取特征,使用DBFPN结构融合特征,最终生成概率图和阈值图,从而定位文本区域。通过引入可微分二值化(Differentiable Binarization)技术,能够自适应地学习到一个合适的二值化阈值,从而提高文本检测的精度和速度。模型参数量较少,推理速度快,适合嵌入式设备,适合实时场景。
(3)基于OCR引擎的检测的方法,如 PaddleOCR、Tesseract、EasyOCR 自带文本检测功能。
模型选择(DBNet)
为了平衡检测精度和实时需求,笔者最终选择DBNet进行文本行的检测。下面简单介绍一下DBNet算法。
DBNet 的网络结构主要由三部分组成:
特征提取网络:它使用特征金字塔骨干网络(Feature-pyramid Backbone)提取多尺度特征图,然后通过特征融合(Feature Fusion)生成融合特征图。
检测网络:这部分网络用于预测文本区域的概率图(probability map)和阈值图(threshold map)。概率图表示每个像素属于文本区域的概率,阈值图则用于自适应地对概率图进行二值化。
可微分二值化(Differentiable Binarization)模块:这是 DBNet 的核心模块。通过可微分二值化(DB)模块计算出近似的二值图。传统的二值化操作是不可微分的,而 DBNet 提出了一种可微分的二值化函数。
3.2 方向分类
方向分类器指的是针对图片中某些经文本检测得到的bounding box中的文字方向为非水平排列的情况,对bounding box的方向进行检测。如果发现bounding box中的文字方向为非水平排列,则对该bounding box的方向进行纠正,使其旋转为文字水平排列的方向,方便下一步的文本识别。由于文本的方向是影响识别准确率的关键因素之一,因此方向分类器在OCR系统中至关重要。
例如,在PaddleOCR系统中,方向分类器通常支持0度和180度的分类,以确保文本能够被正确识别。
3.3 文字识别
3.3.1 原理与方法
文字识别是将文本检测得到的bounding box中的具体的文字内容识别出来。
目前存在几种基于深度学习的文本识别方法。卷积神经网络(CNN) : CNN 常用于基于图像的文本识别。输入图像由卷积层提供动力,卷积层提取特征并学习文本表示。然后 CNN 的输出被传送到一个递归神经网络(RNN)进行进一步的处理和文本识别。递归神经网络: 递归神经网络广泛应用于基于序列的文本识别,如手写和语音识别。RNN 使用反馈回路来处理序列数据,允许它们捕获长期依赖和上下文信息。编码器-解码器网络: 编码器-解码器网络用于端到端的文本识别。首先将输入图像编码成特征向量,然后将其解码成一系列字符或单词。这些网络可以进行端到端的训练,提高效率和准确性。
(1)传统文字识别算法:
主要基于图像处理技术(如投影、膨胀、旋转等),结合opencv库实现或采用统计机器学习方法实现特征提取。使用边缘检测、HOG、SIFT等方法提取字符的轮廓和形状特征。然后利用SVM、KNN等方法对字符分类。
(2)深度学习文字识别算法:
3.3.2 模型选择(CRNN)
卷积回归神经网络(Convolutional Recurrent Neural Network,CRNN)是2015年被提出的,到目前为止还是被广泛应用。CRNN的主要结构包括基于CNN的图像特征提取模块以及基于多层双向LSTM的文字序列特征提取模块。
主要思想是卷积神经网络(CNN)在处理图像数据方面是很好的,而对于像文本这样的序列数据,回归神经网络(RNN)是首选的。而文本识别其实需要对序列进行预测,所以采用了预测序列常用的RNN网络。算法通过CNN提取图片特征,然后采用RNN对序列进行预测,最终使用CTC方法得到最终结果。
CRNN的网络架构由三部分组成,从底向上包括卷积层,循环层和转录层。
(1)第一模块: 使用CNN网络,对输入图像进行特征提取,从而得到特征图。
(2)第二模块: Im2Seq,将CNN获取的特征图变换为RNN需要的特征向量序列的形状;
输入图像首先通过若干卷积层以提取特征图。这些特征图随后被分割成一系列特征向量,如墨绿色部分所示。这些特征向量是通过将特征图按单像素宽度划分为列获得的。具体是在处理特征图时,将特征图按照列的方式分割开来,每一列的宽度是 1 个像素。每一列的像素值(沿着高度方向的一组值)被看作一个特征向量。这些特征向量实际上是将特征图从二维(高度和宽度)形式转换为一组一维向量的过程。
为什么要按列对特征图进行划分?这个问题的答案与感受野(Receptive Field)的概念有关。感受野被定义为特定卷积神经网络(CNN)的特征图所关注的输入图像中的区域。例如,对于上方输入图像,每个特征向量的感受野对应于输入图像中的一个矩形区域(每列对应于特定的感受野),如下图所示。
并且每个矩形区域按照从左到右的顺序排列。因此,每个特征向量可以看作该矩形区域的图像描述符。这些特征向量随后被输入到一个双向LSTM中。
但是,正如你在上图中可能注意到的,这些特征向量有时可能无法包含完整的字符。
因此,在 LSTM 的输出中,我们可能会得到重复的字符,如下图红色框所示。