当前位置: 首页 > article >正文

OCR原理解析

目录

1.概述

2.应用场景

3.发展历史

4.基于传统算法的OCR技术原理

4.1 图像预处理

4.1.1 灰度化

4.1.2 二值化

4.1.3 去噪

4.1.4 倾斜检测与校正

4.1.4.2 轮廓矫正

4.1.5 透视矫正

4.2 版面分析

4.2.1 连通域检测文本

4.2.2 MSER检测文本

4.3 字符切割

4.3.1 连通域轮廓切割

4.3.2 垂直投影切割

4.4 字符识别

4.4.1 识别原理

4.5 版面恢复

4.6 后处理

4.7 传统OCR局限性

5.基于深度学习的OCR技术原理

5.1 两阶段文本识别

5.1.1 文本检测

5.1.1.1 基于回归的方法

5.1.1.2 基于分割的方法

5.1.1.3 文本检测算法发展

5.1.2 文本识别

5.1.2.1 基于CTC技术的预测方法

5.1.2.2 基于Attention机制的网络模型预测方法

5.1.2.3 文字识别算法发展

5.2 端到端文本识别

6.ChatOCR

7.总结


1.概述

OCR (Optical Character Recognition,光学字符识别)技术是一种将印刷体或手写文字转化为可编辑文本的技术。即将图像中的文字进行识别,并以文本的形式返回。

2.应用场景

OCR具有广泛的应用场景,涵盖了各个领域,如OCR识别车辆牌照实现快速通行和行车计费、识别票据快速录入信息、识别试卷辅助计算分数等,以下是一些主要的应用场景:

OCR生态图:

3.发展历史

1929年:德国科学家Tausheck首次提出了OCR的概念,设想利用机器来读取字符和数字

20世纪60年代:世界各国开始对OCR进行正式研究,研究人员将OCR技术理论运用到实际应用中,诞生了第一批OCR系统,但基本只支持数字和英文字母的识别,典型案例就是邮政编码自动识别系统。

20世纪70年代末:我国开始开始进行汉字识别研究,直到1986年研究才进入实际性阶段(863计划),相继推出各种OCR产品。

20世纪80年代:随着计算机技术的发展、扫描设备的逐渐提升以及计算机视觉的不断成熟,开始出现基于图像处理(二值化、投影分析等)和统计机器学习的OCR技术,识别准确度进一步提升。

21世纪:OCR场景逐渐复杂以及识别精度的要求不断提升,传统OCR逐渐不能满足已有需求,基于深度学习的技术让OCR识别效果更近一步。

4.基于传统算法的OCR技术原理

传统OCR基于图像处理(二值化、连通域分析、投影分析等)和统计机器学习(Adaboot、SVM),提取图片上的文本内容;用到的计算机视觉算法库主要有OpenCV、Halcon、VisionPro等,出于开源、多语言支持和方便易用的考虑,我们通常采用OpenCV进行开发,该算法主要流程如下:

4.1 图像预处理

图像预处理是一种在进行主要的图像分析之前,改进图像数据(消除无用信息,强化有用信息,或者提高计算速度)的技术。它可以增强图像质量,使得OCR引擎更好地分离出文本和背景,提高文本的识别准确度,常用图像预处理操作有灰度化、二值化、去噪、倾斜检测与校正、透视矫正等。

4.1.1 灰度化

将彩色图像转化为灰度图像。因为在大多数情况下,我们只需要关注文字和背景的对比度,而不需要关注它们的颜色。灰度化能将计算复杂度大幅降低,同时保留主要信息。

4.1.2 二值化

将图像转换为只包含黑白两色的图像。二值化过程可以通过设定一个阈值来实现,所有低于这个阈值的像素将被标记为黑色,而高于阈值的像素将被标记为白色。这样可以进一步强化文字与背景的对比度。

4.1.3 去噪

使用各种滤波器(例如,中值滤波器、高斯滤波器等)来减少图像中的噪声,如尘埃、划痕、噪点等

4.1.4 倾斜检测与校正

OCR系统需要自动纠正图像中的倾斜,以确保文本的正确识别。这个过程包括检测图像中文本行的倾斜角度,并进行相应的校正,有如下两种常用倾斜校正算法:

4.1.4.1 霍夫曼直线矫正

主要流程如下:

矫正效果如下:

4.1.4.2 轮廓矫正

主要流程如下:

矫正效果如下:

4.1.5 透视矫正

主要流程如下:

矫正效果如下:

4.2 版面分析

识别图像中的文本区域、非文本区域以及文本的结构信息,如列、行、块、标题、段落、表格等,为后续的文字提取步骤提供基础,主要检测文本算法有连通域检测文和MSER检测文本

4.2.1 连通域检测文本

传统检测算法,一般可以分为两个部分,第一个是连通域的提取,第二个是文字连通域的判别。其中,将图像二值化后,通过连通域提取环节会将所有的连通域找出来作为候选集,然后根据启发式规则算法判断提取的连通域是否是文字连通域。流程如图所示:

输出结果:

4.2.2 MSER检测文本

MSER的处理过程:对一幅灰度图像取不同的阈值进行二值化处理,阈值从0至255递增,这个递增的过程就好比是一片土地上的水面不断上升,随着水位的不断上升,一些较低的区域就会逐渐被淹没,从天空鸟瞰,大地变为陆地、水域两部分,并且水域部分在不断扩大。在这个“漫水”的过程中,图像中的某些连通区域变化很小,甚至没有变化,则该区域就被称为最大稳定极值区域。在一幅有文字的图像上,文字区域由于颜色(灰度值)是一致的,因此在水平面(阈值)持续增长的过程中,一开始不会被“淹没”,直到阈值增加到文字本身的灰度值时才会被“淹没”。流程如图所示:

4.3 字符切割

在深度学习序列化模型还未兴起的时候,传统文本识别还不能直接对文本行直接进行文字识别,因为词与词的组合、词组与词组的组合无法枚举穷尽,对这些词组直接分类基本不可能。相对于词语、词组,字符的个数可以穷尽,如果把文本切分成单个字符来识别,任务会简单很多。主要有连通域轮廓切割和垂直投影切割两种方式:

4.3.1 连通域轮廓切割

每个文本行切片的局部图中,单个字符都是一个个独立的对象存在,如果能找到单个独立对象的轮廓信息,那么他的最小外接矩形也能通过一些opencv的函数获取得到,基于连通域的大致流程原理如下:

4.3.2 垂直投影切割

简单场景下,文本行图像中,除了文字像素就是背景像素,字符与字符之间的空隙像素一般较少,而在文字内像素分布较多,基于该特征,将文本行切片二值化变成黑底白字,统计每列中白色像素的个数,得到每列的白色像素的分布,然后根据规律找到合适的分割间隔点并对单字符进行分割,得到最终结果,流程图如下所示:

统计每列白色像素个数和画出垂直投影分布图示例:

4.4 字符识别

在传统OCR文字识别领域,是将文本行的字符识别看成一个多分类问题,中文领域字符识别类别大概有5800,包括常见汉字、标点符号、特殊字符等。

4.4.1 识别原理

在字符分类之前,我们首先将字符切片归一化成统一尺寸,参考经典手写字符分类尺寸大小28x28,统一尺寸后根据图像的常见算法去提取特征,比如hog、sift等;最后分类器选择支持向量机、逻辑回归、决策树等,模型训练完成可以集成端到端进行预测识别。大致流程如下:

像素特征:指图像中每个像素的颜色、亮度、饱和度等属性

HOG特征:也叫方向梯度直方图特征,将输入的图像分割成一个个小小的连通区域,这些独立的区域被称为“细胞单元”。然后,对每一个细胞单元中的所有像素点,计算其梯度或边缘的方向信息,并对这些信息进行统计,生成相应的直方图。最后,将所有细胞单元的直方图按照一定的规则组合起来,就构成了这个图像的HOG特征描述符。

SIFT特征:中文名为尺度不变特征变换,是一种在图像处理领域广泛应用的局部特征提取算法,核心思想实在不同尺度的空间中寻找并精确定位极值点(也称为关键点或特征点),这些极值点通常是图像中比较突出的元素,如角点和边缘点等,并且不会因为光照、仿射变换或者噪声等因素而变化。

4.5 版面恢复

与版面分析相对应,将识别后的文字恢复原始文档图片的排列方式,包括段落、位置和顺序等信息。这个过程不仅涉及到单个字符的识别,也需要考虑文本的布局和结构。例如,对于包含表格、段落样式、文字样式和文档版面的复杂文档,版面恢复可以确保识别结果与原图片的版面布局一致。

4.6 后处理

由于图像质量、字体、噪声等原因,OCR识别文本后往往存在一定的错误,使用合适的后处理方案可以进一步提升OCR识别准确率,后处理阶段主要包含两个核心任务:文本纠错和文本结构化。

文本纠错主要目标是纠正OCR输出文本中的错误文字,通常利用先验词典进行实现或经验规则来进行纠错,也可以采用基于语言模型的纠错机制等方法来对OCR结果进行进一步的校正。

文本结构化主要目标是从OCR输出的文本中定位出所需的信息,并根据特定的应用需求将这些信息进行有效的处理,如从一张包含名片信息的图片中,通过OCR技术识别出名片上的文字,然后利用命名实体识别技术标记出名片中的姓名、电话、邮箱等语义实体 。

4.7 传统OCR局限性

虽然传统OCR技术在许多场景中表现得相当出色,但这种技术确定存在一些局限性,尤其实在比较复杂的场景下,一下是一些主要的局限性:

  • 对清晰度和质量的高要求:传统的OCR技术高度依赖图像的质量。如果输入的图像质量较差(例如,图像模糊、对比度低、光照不均、存在噪声等),则OCR的准确度可能会大大降低。
  • 对字体和布局的依赖性:传统的OCR技术通常基于特定的字体和布局进行训练。因此,如果输入的文本使用了训练数据中未包含的字体或者不同的布局,那么识别精度可能会受到影响。
  • 复杂背景下识别效果差:如果文本字符与背景紧密相连或者文本在复杂的背景上,传统的OCR系统可能会难以准确地分割和识别字符。类似地,如果字符被装饰或者以艺术字形式呈现,传统的OCR系统可能也无法准确地识别出这些字符。
  • 手写识别效果差:对于手写文字的识别,传统的OCR系统通常会遇到更大的挑战,因为手写文字的形状、大小和倾斜度变化非常大,且往往缺乏清晰的边界。
  • 无法处理多语言和特殊字符:传统的OCR系统通常针对单一或者少数几种语言进行优化,对于其他语言或者特殊字符,例如数学符号、音乐符号等,可能无法提供满意的识别效果。
  • 缺乏上下文理解:传统的OCR技术通常将字符识别作为一个独立的任务进行,而没有考虑字符的上下文信息。因此,如果一个字符在图像中模糊不清,OCR系统可能无法准确地识别出这个字符。

5.基于深度学习的OCR技术原理

传统OCR技术在处理复杂的图像和不规则形状的文本时,效果并不理想。深度学习时代,机器可以“学习”处理复杂任务,并且对数据具有很好的适应性。通过结合深度学习,建立更为强大和灵活的OCR模型,它能够处理各种类型的文本,并且提高字符识别的准确率。

典型OCR技术路线如下图所示:

基于深度学习的场景文字识别主要包括两种方法,第一种是分为文字检测和文字识别两个阶段;第二种则是通过端对端的模型一次性完成文字的检测和识别。

5.1 两阶段文本识别

5.1.1 文本检测

给定输入图像或视频,找出文本区域,可以是单字符位置或者整个文本行位置;

5.1.1.1 基于回归的方法

基于回归的文本检测是一种自然场景文本检测方法,这种方法主要是借鉴目标检测技术,文本检测方法只有两个类别,图像中的文本视为待检测的目标,其余部分视为背景。通过设定anchor回归检测框或者直接做像素回归实现,这类方法对规则形状文本检测效果较好,但是对不规则形状的文本检测效果会相对差一些。

  • 设定anchor回归检测框方式实现思路

Anchor,也被称为锚框或先验框,主要思路是在图像上预设参照框,这些参照框有不同的大小和形状,并且会在图片上滑动,形成不同的候选框,对于每个候选框,我们都需要预测两个参数:一个是回归值,这个值描述了候选框相对于锚框的位置偏移量;另一个则是分类值,用于判断该候选框是否包含物体。

主要方法有CTPN、Textbox系列和EAST。

  • 像素回归方式实现思路

像素回归可以通过图像语义分割获得可能的文本像素,然后通过像素点进行回归或对文本像素进行聚合得到文本框位置。

主要方法有CRAFT和SA-Text。

  • 优缺点:

优点:对规则形状文本检测效果较好

缺点:无法准确检测不规则形状文本

5.1.1.2 基于分割的方法

基于分割的识别算法是自然场景文本检测算法的一个重要分支,通常包括3个步骤:图像预处理、单字符分割和单字符识别,实现思路与传统OCR识别过程中的字符切割流程类似。

主要实现思路如图所示:

算法示意图:

主要算法有PixelLink、PSENet、DB等

参考:基于分割思想的文本检测算法-腾讯云开发者社区-腾讯云

  • 优缺点:

优点:对不同形状文本的检测效果都比较好

缺点:后处理复杂且耗时长,重写文本识别效果差

5.1.1.3 文本检测算法发展

5.1.2 文本识别

在传统的文本识别方法中,任务分为3个步骤,即图像预处理、字符分割和字符识别。需要对特定场景进行建模,一旦场景变化就会失效。面对复杂的文字背景和场景变动,基于深度学习的方法具有更优的表现。多数现有的识别算法可用如下统一框架表示,算法流程被划分为4个阶段:

常见文本识别算法可以分为基于CTC技术的方法和基于Attention机制的网络模型两大类。

5.1.2.1 基于CTC技术的预测方法

CTC(Connectionist Temporal Classification)是一种经常被用于语音识别和文本识别的算法。它的主要作用是解决输入序列和输出序列长度不同、无法直接对齐的问题。

  • 技术说明

CTC的关键创新是引入了一个特殊的符号,通常被称为“空格”字符或者“blank”字符。这个字符没有实际的语义含义,但它在训练模型时起着关键的作用。

由于OCR识别过程中,输入图像的宽度往往是固定的,而输出的字符数量是变化的,这导致了输入和输出之间存在一个“不对齐”的问题。

CTC通过引入“空格”字符,有效地解决了这个问题。在训练时,我们可以为每个可能的字符预测一个概率,同时还预测一个“空格”字符的概率。然后,我们可以通过一种叫做“解码”的过程,从这些预测的概率中生成最终的字符序列。

  • 典型模型(CRNN)

CRNN网络结构包含三部分,从下到上依次为:

1.卷积层,使用深度CNN,对输入图像提取特征。

2.循环层,使用双向RNN(BLSTM)对特征序列进预测,输出预测标签(真实值)分布。

3.转录层,使用 CTC 损失,把从循环层获取的一系列标签分布转换成最终的标签序列。

  • 小结

基于CTC的解码方式在处理定长输入和变长输出的问题上有着显著的优势,但由于其预测每个字符时并未充分利用上下文信息,所以在处理不规则形状的文本(如弯曲文本或者手写文本)时,效果可能会有所下降。

5.1.2.2 基于Attention机制的网络模型预测方法

我们在阅读时,总是会关注到一些特定的部分,而忽略其他不太重要的信息。在这个过程中,我们总是在上下文中寻找重要的信息,这就是Attention机制。

基于Attention的解码方式是一种在深度学习中广泛使用的方法,尤其在处理序列型问题,如机器翻译和OCR时,表现优异。它之所以被称为"Attention"(注意力),是因为这种机制能模仿人类在处理信息时会关注关键部分的特性。

  • 技术说明

Attention机制的基本思想是,在进行预测时,模型应该“关注”输入中最相关的部分。在OCR的环境中,这意味着在预测某个字符时,模型应该关注图像中与该字符最相关的区域。

Seq2Seq+Attention模型就是基于Attention的一种典型模型。这种模型通常由两部分组成:编码器(Encoder)和解码器(Decoder)。编码器的任务是将输入图像转化为一组特征向量。解码器的任务是将这些特征向量转化为字符序列。

与传统的Seq2Seq模型不同,这里的解码器在生成每一个字符时,都会通过Attention机制来选择和关注哪些特征向量。换句话说,模型会“关注”那些对当前预测最有帮助的特征。

  • 典型模型(ASTER)

引入注意力机制,整合矫正和识别,改善大规则文字识别

1.卷积层:使用DCNN,将输入的图像转化为一组特征向量

2.循环层:使用双向RNN(BLSTM)对特征序列进预测,将这些特征向量转化为字符序列,在生成每一个字符时,解码器都会使用Attention机制来选择和关注哪些特征向量。

  • 小结

基于Attention的解码方式虽然在处理不规则形状的文本,如弯曲文本或手写文本时效果较好,但是需要注意的是,当处理的文本过长或者过短时,这种方法可能效果会有所降低。此外,由于模型需要考虑全部的上下文信息,因此计算复杂度相对较高,这也是基于Attention的解码方式需要注意的一点。

5.1.2.3 文字识别算法发展

5.2 端到端文本识别

与检测-识别的多阶段OCR不同,深度学习使端到端的OCR成为可能,将文本的检测和识别统一到同一个工作流中,其基本思想是共享同一个主干网络,并设计不同的检测模块和识别模块,可以同时训练文本检测和文本识别。

  • 典型模型(FOTS)

FOTS是一个快速的端对端的文字检测与识别框架,通过共享训练特征、互补监督的方法减少了特征提取所需的时间,从而加快了整体的速度。其整体结构如图所示:

1.卷积共享:从输入图象中提取特征,并将底层和高层的特征进行融合;

2.文本检测:通过转化共享特征,输出每像素的文本预测;

3.ROIRotate:将有角度的文本块,通过仿射变换转化为正常的轴对齐的本文块;

4.文本识别:使用ROIRotate转换的区域特征来得到文本标签。

  • 小结

端到端OCR的主要优点包括模型小,速度快,以及整合了文本检测和识别的功能,但由于只有一个模型,可解释性更差,且目前仅在英文、数字识别领域识别效果较好,中文领域识别准确性有待提升。

6.ChatOCR

最近百度飞桨团队推出了一款基于文心大模型的通用图像关键信息抽取工具PP-ChatOCR。它结合了OCR文字识别和文心一言大语言模型,可以在多种场景下提取图像中的关键信息,效果非常惊艳。而传统的OCR识别技术的准确率容易受到多种因素影响,例如图像质量、字符布局、字体样式等。但当我们将OCR技术与大语言模型相结合时,可以避免繁杂的规则后处理,提升泛化能力,从而能够更智能、准确地理解和利用文本信息。

PP-ChatOCRv2体验地址:【PaddleX】PP-ChatOCRv2_AI应用-飞桨AI Studio星河社区

PP-ChatOCRv2效果演示图如下:

7.总结

尽管基于深度学习的OCR表现相较于传统方法更为出色,但是深度学习技术仍需要在OCR领域进行特化,而其中的关键正式传统OCR方法的精髓。因此我们仍需要从传统方法中汲取经验,使其与深度学习有机结合进一步提升OCR的性能表现。另一方面,作为深度学习的推动力,数据起到了至关重要的作用,因此收集广泛而优质的数据也是现阶段OCR性能的重要举措之一。相信随着大模型技术的发展,OCR表现也会越来越好。


http://www.kler.cn/a/154444.html

相关文章:

  • 使用 Ant Design Vue 自定渲染函数customRender实现单元格合并功能rowSpan
  • mac上使用docker搭建gitlab
  • 云速搭助力用友 BIP 平台快速接入阿里云产品
  • PETR/PETRv2/StreamPETR论文阅读
  • Chrome 浏览器开启打印模式
  • Python如何获取request response body
  • Redis面试常见问题
  • Python基础学习快速入门
  • ESP32-Web-Server 实战编程-通过网页控制设备多个 GPIO
  • SpringBoot拦截器、过滤器、自定义注解、监听器、全局异常-使用详解
  • Vue3中定义变量是选择ref还是reactive?
  • 使用KubeSphere练习故障注入
  • SELinux refpolicy详解(4)
  • Layer Normalization是什么
  • Oauth2.0 学习
  • 180天Java从小白到就业-Day03-03Java位运算符、赋值运算符、数据交换的三种方式
  • P1 什么是链表 C语言简单易懂
  • Sql Server数据库跨机器完整恢复(源文件恢复)
  • QPrinter 是 Qt 框架中的一个类,用于与打印机进行交互,并提供打印功能
  • Linux 进程(三)
  • 每日一练:冒泡排序
  • 7、Jenkins+Nexus3+Docker+K8s实现CICD
  • 最小生成树算法
  • C++的一些基础
  • 光伏测算工具能测量哪些数据?
  • 自己开发组件更新到npm网站上 通过npm install 安装 保姆级别教程