返回首页

ocr识别原理及算法?

233 2024-04-23 16:47 admin

一、ocr识别原理及算法?

OCR即光学字符识别,是一种将图像中的文字转换为可编辑的文本的技术。它的原理是将图像中的字符进行分割、预处理、特征提取和分类识别等步骤,最终得到可编辑的文本。OCR算法主要包括基于模板匹配、基于统计模型、基于神经网络等多种方法。其中,基于神经网络的OCR算法具有较好的识别准确率和鲁棒性。

二、OCR文字识别用的是什么算法?

梳理一下OCR文字识别三种解码算法,先介绍一下什么是OCR文字识别,然后介绍一下常用的特征提取方法CRNN,最后介绍3种常用的解码算法CTC/Attention/ACE

什么是OCR文字识别?

一般来说,文字识别之前需要先对文字进行定位(文字检测主要有基于物体检测和基于分割两种方法),文字识别就是通过输入文字图片,然后解码成文字的方法。本文主要讲文字识别部分,文字识别主要分成三种类型:单字分类、整词分类和整词识别。当能够定位出单字时,可以用图像分类的方法直接对单字进行分类;当需要预测整词数量较少时,可以对整词进行分类;当有大量整词需要预测并且没有单字定位时,就需要用解码序列的方法进行识别了。因此,文字识别中最常用的是文字序列识别,适用场景更为广泛。本文将主要介绍文字序列识别的解码算法。

OCR解码是文字识别中最为核心的问题。本文主要对OCR的序列方法CTC、Attention、ACE进行介绍,微信OCR算法就是参考这三种解码算法的。

不同的解码算法的特征提取器可以共用,后面接上不同的解码算法就可以实现文字识别了,以下用CRNN作为特征提取器。

CRNN

CRNN的特征抽取器由一个CNN和一个BiLSTM组成,其中BiLSTM使用的是stack形深层双向LSTM结构。

CRNN特征提取器流程如下:

1.假设输入图像尺寸为32x100x3(HxWxC),经过CNN转换成1x25x512(HxWxC)。

2.将CNN的输出维度转换为25个1x512的序列,送入深层双向LSTM中,得到CRNN的输出特征,维度转换成为25xn(n是字符集合总数)。

OCR文字识别的难点

OCR文字识别的解码主要难点在于如何进行输入输出的对齐。如上图所示,如果每个1xn预测一个字符,那么可能会出现多个1xn预测同一个字符,这样子得到的最终结果会产生重复字符。所以需要设计针对文字识别的解码算法来解决输入输出的对齐问题。

目前我了解到的主要有三种解码方法,可以解决OCR解码的一对多问题,分别为CTC、Attention和ACE三种。

CTC

CTC是最为经典的OCR解码算法,假设CRNN特征抽取器的输出维度Txn,其中T=8,n包含blank(记作 - )字符(blank字符是间隔符,意思是前后字符不连续)。对每一列1xn进行softmax得到概率最大的字符,得到的最终序列需要去除连续的重复字符,比如最终得到的序列为-stt-ate,那么去重合并后就得到state序列。

那么state的序列概率就变成了所有去重合并后为state的字符序列概率之和,只要最大化字符序列概率,就可以优化CRNN+CTC的文字识别算法。由于每个字符前后都可以插入blank,所以可以将所有可能状态如下图展开。

为了方便起见,对于所有state序列的合法路径做一些限制,规则如下:

1.转换只能往右下方向,其它方向不允许

2.相同的字符之间起码要有一个空字符

3.非空字符不能被跳过

4.起点必须从前两个字符开始

5.终点必须落在结尾两个字符

根据上述约束规则,遍历所有"state"序列的合法路径,“state”的所有合法路径如下图所示:

其中绿色框部分为起点和终点,蓝色箭头为"state"序列的合法路径。当然可以通过枚举所有路径,然后求所有路径的概率之和即为"state"序列的概率。但是枚举所有路径计算复杂度太高了,于是CTC引入了HMM的前向-后向算法来减少计算复杂度(可以参考一下我之前的回答,增加隐马尔可夫模型(HMM)的理解如何用简单易懂的例子解释隐马尔可夫模型?)。

以前向算法为例(后向算法可以认为是状态序列的反转,计算方法相同),简单来说,就是利用分治和动态规划的思想,把8个时间点拆分成7个重复单元,然后先计算出第一个重复单元红色虚线框中每个状态的观测概率,并且保存下来当作下一个重复单元的初始状态,循环计算7次就得了最终的观测概率。比起暴力求解观测概率,复杂度大大降低。

Attention

基于Attention的OCR解码算法,把OCR文字识别当成文字翻译任务,即通过Attention Decoder出文字序列。

RNN -> Seq2Seq

左图是经典的RNN结构,右图是Seq2Seq结构。RNN的输入序列和输出序列必须有相同的时间长度,而机器翻译以及文字识别任务都是输入输出不对齐的,不能直接使用RNN结构进行解码。于是在Seq2Seq结构中,将输入序列进行Encoder编码成一个统一的语义向量Context,然后送入Decoder中一个一个解码出输出序列。在Decoder解码过程中,第一个输入字符为<start>,然后不断将前一个时刻的输出作为下一个时刻的输入,循环解码,直到输出<stop>字符为止。

Seq2Seq -> Attention Decoder

Seq2Seq把所有的输入序列都编码成一个统一的语义向量Context,然后再由Decoder解码。由于context包含原始序列中的所有信息,它的长度就成了限制模型性能的瓶颈。如机器翻译问题,当要翻译的句子较长时,一个Context可能存不下那么多信息,就会造成精度的下降。除此之外,如果按照上述方式实现,只用到了编码器的最后一个隐藏层状态,信息利用率低下。

所以如果要改进Seq2Seq结构,最好的切入角度就是:利用Encoder所有隐藏层状态解决Context长度限制问题。于是Attention Decoder在Seq2Seq的基础上,增加了一个Attention Layer,如上图所示。

在Decoder时,每个时刻的解码状态跟Encoder的所有隐藏层状态进行cross-attention计算,cross-attention将当前解码的隐藏层状态和encoder的所有隐藏层状态做相关性计算,然后对encoder的所有隐藏层加权求和,最后和当前解码的隐藏层状态concat得到最终的状态。这里的cross-attention计算方式也为后来的Transformer框架打下了基础(详细看我之前写的文章计算机视觉"新"范式: Transformer)。

另外,从形式上看,Attention Decoder很自然的可以替换成最近非常流行的Transformer,事实上,最近也有几篇基于Vision Transformer的文本识别算法。

ACE

基于ACE的解码方法不同于CTC和Attention,ACE的监督信号实际上是一种弱监督(输入输出没有做形式上的对齐,没有先后顺序信息,倾向于学习表征),并且可以用于多行文字识别。

对于单行文字,假设输出维度为Txn(T是序列长度,n是字符集合总数),那么第k个字符出现的总数为,然后除以T,就能得到第k个字符出现的概率分布(记作),做相同计算,可以求出所有字符的概率分布,最后和label字符的概率分布计算交叉熵优化网络。同理,对于多行文字,只需要将HxW压缩成T=HW,然后计算所有字符的概率分布即可。

CTC/Attention/ACE三种解码算法比较

从模型设计上来看,可以采用结合上面3种方法的多任务文本识别模型。在训练时,以CTC为主,Attention Decoder和ACE辅助训练。在预测时,考虑到速度和性能,只采用CTC进行解码预测。多任务可以提高模型的泛化性,同时如果对预测时间要求不高,多结果也可以提供更多的选择和对比。

上图来源于微信OCR技术的比较:

1.CTC和ACE方法不需要额外的计算参数,Attention需要额外的计算参数

2.推理内存,ACE < CTC < Attention;推理速度,ACE > CTC > Attention

3.CTC效果更好一些,适合长文本;Attention可以得到语言模型;ACE可以用于计数和2D预测

由于Attention依赖于上一个预测结果,导致只能串行解码,推理速度影响较大,但是可以得到语言模型做pretrain迁移使用;而CTC可以通过引入blank字符做形式上对齐,并且通过HMM前向-后向算法加速;ACE则直接不依赖顺序信息,直接估计整体分布。三者各有利弊,实际使用时,需要结合具体任务按需使用。

Reference

[1] An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition

[2] Connectionist Temporal Classification: Labelling Unsegmented Sequence Data with Recurrent Neural Networks

[3] Robust Scene Text Recognition with Automatic Rectification

[4] Aggregation Cross-Entropy for Sequence Recognition

[5] https://mp.weixin.qq.com/s/6IGXof3KWVnN8z1i2YOqJA

强烈推荐以下三篇blog

一文读懂CRNN+CTC文字识别

完全解析RNN, Seq2Seq, Attention注意力机制

https://xiaodu.io/ctc-explained/

陀飞轮:OCR文字识别—基于CTC/Attention/ACE的三大解码算法

欢迎关注Smarter,构建CV世界观

欢迎加入Smarter交流群,添加微信「cjy094617」,备注「学校-方向」即可

三、ocr和图像识别算法

OCR和图像识别算法的应用与发展

在当今数字化信息大爆炸的时代,OCR和图像识别算法的应用越来越广泛,成为许多行业解决方案中的关键技术。从简单的文字识别到复杂的图像分析,OCR和图像识别算法正不断演进,为人工智能、大数据分析等领域带来了革命性的变化。

OCR技术介绍

OCR(Optical Character Recognition)技术是一种将印刷文字或手写文字转换成可编辑文本的技术。基于OCR和图像识别算法,计算机可以识别图像中的文字,并将其转换成可编辑的文本数据,极大地提高了信息的利用率和可搜索性。

图像识别算法的发展

随着深度学习的发展,图像识别算法的准确性和稳定性得到了极大的提升。利用深度学习算法,计算机可以实现对图像中对象、场景等内容的准确识别和分析,为各行各业提供了更多的可能性。

OCR和图像识别在金融行业的应用

OCR和图像识别算法在金融行业的应用非常广泛。通过OCR技术,银行可以快速准确地识别客户填写的表单信息,提高了工作效率;而图像识别算法则可以用于检测金融交易中的风险因素,保障交易的安全性。

未来发展趋势

随着人工智能技术的不断进步,OCR和图像识别算法将会迎来更广阔的应用前景。未来,我们将看到这些算法在自动驾驶、医疗诊断、智能家居等领域大放异彩,为人类生活带来更多的便利和创新。

四、图像识别算法开源ocr

图像识别算法开源ocr

图像识别算法开源ocr——提高效率的利器

在当今信息爆炸的时代,大量的文字信息每天都在不断产生和流动,而处理这些海量的文字通常需要耗费大量的人力和时间。然而,随着图像识别技术的发展,人们发现可以通过使用开源OCR(Optical Character Recognition)算法来实现自动化的文字识别,从而极大地提高工作效率。

什么是OCR?

OCR是一种将图像中的文字转换为电子文本的技术。通过OCR技术,计算机可以自动识别和提取出图像中的文字,并将其转换为可编辑和可搜索的文本。

图像识别算法开源OCR的优势

与传统的商业OCR软件相比,使用开源OCR算法具有以下几个明显的优势:

  • 1. 免费开源:开源OCR算法通常可以免费获取和使用,节省了昂贵的软件许可费用。
  • 2. 自定义灵活:开源OCR算法提供源代码,用户可以根据自己的需要进行修改和定制,以满足特定的应用场景。
  • 3. 支持多种语言:开源OCR算法通常支持多种语言的文字识别,包括中文、英文等,适用范围广泛。
  • 4. 社区支持强大:开源OCR算法往往有庞大的开发者社区支持,用户可以获得及时的技术支持和更新。

常用的开源OCR算法

以下是几种常用的开源OCR算法:

  • Tesseract OCR

    Tesseract OCR是一款由Google开发的开源OCR引擎,它支持多种语言的文字识别,包括中文。Tesseract OCR具有良好的识别精度和速度,是目前最受欢迎的开源OCR算法之一。

  • OCRopus

    OCRopus是一个OCR系统的集合,其中包括了Tesseract OCR引擎。OCRopus具有高度灵活的架构,可以通过插件的方式集成其他OCR引擎。

  • EasyOCR

    EasyOCR是一个基于深度学习的开源OCR库,它使用了卷积神经网络(CNN)和循环神经网络(RNN)等先进的图像处理技术,能够实现准确和快速的文字识别。

  • OCR.space

    OCR.space是一个云端OCR服务提供商,它提供了简单易用的API接口,可以用于快速集成OCR功能到自己的应用中。OCR.space支持多种图像格式和语言,包括中文OCR识别。

如何使用开源OCR算法进行图像识别?

使用开源OCR算法进行图像识别可以分为以下几个步骤:

  1. 1. 准备图像数据:将需要识别的图像准备好,可以是扫描的纸质文档、照片或者电子文档。
  2. 2. 图像预处理:对图像进行必要的预处理操作,如图像降噪、调整图像尺寸和对比度等。
  3. 3. 文字识别:使用开源OCR算法对预处理后的图像进行文字识别操作,获取识别结果。
  4. 4. 后处理和输出:根据需要对识别结果进行后处理,如去除空格和换行符,然后将结果输出到指定的格式中,如文本文件或数据库中。

开源OCR算法在实际应用中的例子

开源OCR算法在各个领域都有广泛的应用,以下是一些实际应用的例子:

  • 1. 文档数字化:将纸质文档或历史档案进行扫描和OCR识别,实现数字化存储和快速检索。
  • 2. 自动化数据录入:通过OCR识别将图片或者扫描件中的表格数据自动转换为电子表格,提高数据录入的效率和准确性。
  • 3. 车牌识别:通过OCR识别车牌号码,实现智能交通管理和车辆追踪。
  • 4. 手写体识别:通过OCR识别手写字迹,实现自动化的签名识别和文字转录。

总结

图像识别算法开源OCR是一种强大的工具,可以帮助我们快速实现图像中文字的识别和转换。通过使用开源OCR算法,我们可以节省时间和人力成本,提高工作效率和准确性。选择合适的开源OCR算法,并结合实际应用需求,相信你会发现图像识别算法开源OCR的巨大潜力。

五、算法工程师工资,算法工程师工资很高吗?

算法工程师各种待遇按工作时间,资历,等不同,差异很大,基本从4500元到15000元不等。

六、算法工程师原理?

算法工程师是处理数据的专业人士,他们研究并开发可用于计算机程序的算法。原理是基于数学和计算机科学的基础理论,结合各种技术来实现数据处理、模型构建和性能优化等任务。算法工程师的工作需要了解常用算法的原理,需要掌握数据结构、算法复杂度分析等知识,以及具备编程能力。算法工程师的工作职责是识别问题、设计解决方案,实现这些方案并优化算法的性能。算法的使用和优化是算法工程师的核心任务,他们需要保证算法的准确性、高效性以及可扩展性,以使计算机程序能够高效地进行数据处理和分析。

七、算法工程师简称?

答:算法工程师简称是cuda。

利用算法处理事物的人

算法(Algorithm)是一系列解决问题的清晰指令,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。

不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。算法工程师就是利用算法处理事物的人。

八、算法工程师评价?

我认为算法工程师的核心竞争力是对模型的理解,对于模型不仅知其然,还得知其所以然。

于是我把目标检测的经典论文翻来覆去地看,将各种目标检测模型分解成了N个模块,针对每个模块,反复比对各篇论文处理方式的异同,思考各种处理方式各自的优缺点,以及有没有更好的处理方式,比如:

深度卷积神经网络中的降采样总结了降采样的各种方式;

深度卷积神经网络中的升采样梳理了升采样的诸多方法;

关于物体检测的思考简述了anchor free与anchor based的异同、one stage和two stage的区别与联系;

深度学习高效网络结构设计和高效卷积神经网络一览总结了高效网络的设计思路与具体细节;

在anchor free检测器炙手可热的时候,Why anchor?分析了anchor free和anchor based的历史由来,以及各自利弊。

同时对目标检测实践中一些开放式的问题也有一些自己的思考,比如:

关于感受野的总结详述了感受野的计算方式和在应用时需要注意的地方;

目标检测网络train from scratch问题猜想了一下目标检测能够train from scratch的关键,在这篇文章里我质疑了DSOD和DropBlock这两篇论文对train from scratch问题下的结论(当时何恺明那篇讨论train from scratch的paper还没出来,从何恺明后来paper的实验看来,我的质疑是对的)。

上面是把模型揉碎了看,最近开始有更多时间与精力接触除了目标检测以外的任务,于是思考如何将各个计算机视觉任务统一起来,最近有了一点小的想法,该想法形成了一篇简短的文章。

第二阶段

这一阶段我认为算法工程师的核心竞争力在于代码功底好,一则知道各个模型的实现细节,二则能即快又好地实现idea。于是我用pytorch手撸了Yolov2和Yolov3。同时看了不少优秀的开源代码,比如darknet、mmdetection等等。最近正在用pytorch仿照mmdetection撸一个语意分割的训练框架。

第三阶段

最近开始接触各个行业对计算机视觉的需求,我发现一名优秀的算法工程师仅仅对模型理解不错、代码功底不错是不够的,还需要对有计算机视觉业务需求的行业有着较深入的理解。恰好最近看了一篇阿里云机器智能首席科学家闵万里的专访文章,专访里这几段话我深以为然:

在阿里云的时候,我就亲自打造了一个岗位:DTC:Data Technology Consultant。DT有两个含义,一个是数据技术Data Technology,一个是数字化转型Digital Transformation,一语双关。他们像大夫,望闻问切,跟客户一起梳理出业务流程中的痛点,找到优化方式。DTC不只是对行业整体的判断,还要对赛道中的选手体检,有开药的能力。可以把对方的难言之隐梳理出来,定量、优先级排序,然后从整体到细节,一层层结构化分解,最后进入具体执行。你要在传统行业创造新价值,就要搞清楚:什么东西制约了你的产能,制约了你的效率,制约了你的利润率。技术人员今天往产业走,我相信整体遇到的障碍就是如何把技术思维变成以业务需求为导向的技术思维、技术分解思维。

虽然闵万里这几段话里的主体是技术咨询师,但我觉得这也是成为一名优秀算法工程师的必备品质。

总结一段话就是:

算法工程师往产业里走,需要把技术思维转变为以业务需求为导向的技术思维、技术分解思维;

算法工程师需要像大夫一样望闻问切,跟客户一起梳理出业务流程中的痛点,找到优化方式;

算法工程师不仅需要有对行业整体的判断,还需要对客户有体检、开药的能力,可以把客户的难言之隐梳理出来,定量、优先级排序,然后整体到细节,一层层结构化分解,最后进入具体执行;

要在传统行业创造新价值就要搞清楚什么东西制约了产能、效率、利润率。

仅仅输出模型的算法工程师比较容易被替代,更高的追求是输出一整套端到端的系统方案,从与客户一起梳理业务痛点、硬件选型、模型部署环境的规划与搭建、数据采集和标注标准制定、模型选型与设计等等。

九、算法工程师能干多久?

40岁。据今晚报可知,一般来说,算法工程师的职业寿命很少超过40岁。当然这中间的原因很多,有的是跟不上IT行业的发展节奏,有的是因为常年加班没有自己的生活,有的是因为没有养成常年学习的习惯,被行业淘汰了。算法工程师就是利用算法处理事物的人, 算法工程师有计算机、电子、通信、数学等相关专业要求,研究方向有视频算法工程师、图像处理算法工程师、音频算法工程师等。

十、图像算法工程师前景?

算法工程师前景好,愿意投入大量时间精力进去,时刻跟进国际前沿,确实非常有前途。随着岗位对技术的要求越来越高,薪水在大规模增长。 所以,图像算法的前景有很多好的。够有天赋,够努力,再有好的团队和项目,初学者几年以后,会发展的不错。

如果不是兴趣使然,依靠图像算法发家致富的可能性不大。

如果自身喜欢,愿意投入大量时间精力进去,时刻跟进国际前沿,确实非常有前途。