OCR相关介绍

OCR相关介绍

0 计算机视觉技术(computer version)

计算机视觉是人工智能的一个重要分支,它要解决的问题就是:看懂图像里的内容

人的大脑皮层, 有差不多70% 都是在处理视觉信息。 是人类获取信息最主要的渠道,没有之一。

下图是网络上新增数据的占比趋势图。灰色是结构化数据,蓝色是非结构化数据(大部分都是图像和视频)。可以很明显的发现,图片和视频正在以指数级的速度在增长。

图片和视频数据在飞速增长

而在计算机视觉出现之前,图像对于计算机来说是黑盒的状态。

一张图片对于机器只是一个文件。机器并不知道图片里的内容到底是什么,只知道这张图片是什么尺寸,多少MB,什么格式的。

在这里插入图片描述

如果计算机、人工智能想要在现实世界发挥重要作用,就必须看懂图片!这就是计算机视觉要解决的问题。

0.1 什么是计算机视觉

计算机视觉是人工智能的一个重要分支,它要解决的问题就是:看懂图像里的内容

比如:

  • 图片里的宠物是猫还是狗?
  • 图片里的人是老张还是老王?

在这里插入图片描述

在计算机眼里,一张图片读取后,其实是以0-255的像素矩阵矩阵的形式存在的:

在这里插入图片描述

  • 图像为64*64*3像素大小,而一个像素由红绿蓝三色值构成,一张图像由近** **1.2****万个数值表示。

不同的图片对应不同的像素矩阵,那么这些像素矩阵是如何体现这张图片的内容的呢?这就要说到特征了。

早期处理图片获取图像特征的技术是通过一些算子从中提取特征,比如hog算子等。但是随着深度学习的出现,这些传统方式的应用也逐渐变少了,都转向深度学习这一方向。

0.2 计算机视觉的原理是什么

目前主流的基于深度学习的机器视觉方法,其原理跟人类大脑工作的原理比较相似。

人类的视觉原理如下:从原始信号摄入开始(瞳孔摄入像素 Pixels),接着做初步处理(大脑皮层某些细胞发现边缘和方向),然后抽象(大脑判定,眼前的物体的形状,是圆形的),然后进一步抽象(大脑进一步判定该物体是只气球)。

人类大脑看图的原理

机器的方法也是类似:构造多层的神经网络,较低层的识别初级的图像特征,若干底层特征组成更上一层特征,最终通过多个层级的组合,最终在顶层做出分类。

在这里插入图片描述

0.3 计算机视觉的8大任务

在这里插入图片描述

0.3.1 图像分类

图像分类是计算机视觉中重要的基础问题。后面提到的其他任务也是以它为基础的。

举几个典型的例子:人脸识别、相册根据人物自动分类等。

图像分类

0.3.2 目标检测

目标检测任务的目标是给定一张图像或是一个视频帧,让计算机找出其中所有目标的位置,并给出每个目标的具体类别。

目标检测

0.3.3 语义分割

它将整个图像分成像素组,然后对像素组进行标记和分类。语义分割试图在语义上理解图像中每个像素是什么(人、车、狗、树…)。

如下图,除了识别人、道路、汽车、树木等之外,我们还必须确定每个物体的边界。

语义分割

0.3.4 实例分割

除了语义分割之外,实例分割将不同类型的实例进行分类,比如用 5 种不同颜色来标记 5 辆汽车。我们会看到多个重叠物体和不同背景的复杂景象,我们不仅需要将这些不同的对象进行分类,而且还要确定对象的边界、差异和彼此之间的关系!

实例分割

0.3.5 视频分类

与图像分类不同的是,分类的对象不再是静止的图像,而是一个由多帧图像构成的、包含语音数据、包含运动信息等的视频对象,因此理解视频需要获得更多的上下文信息,不仅要理解每帧图像是什么、包含什么,还需要结合不同帧,知道上下文的关联信息。

视频分类

0.3.6 人体关键点检测

人体关键点检测,通过人体关键节点的组合和追踪来识别人的运动和行为,对于描述人体姿态,预测人体行为至关重要。

人体关键点检测

0.3.7 场景文字识别

很多照片中都有一些文字信息,这对理解图像有重要的作用。场景文字识别是在图像背景复杂、分辨率低下、字体多样、分布随意等情况下,将图像信息转化为文字序列的过程。

停车场、收费站的车牌识别就是典型的应用场景。

场景文字识别

0.3.8 目标跟踪

目标跟踪,是指在特定场景跟踪某一个或多个特定感兴趣对象的过程。传统的应用就是视频和真实世界的交互,在检测到初始对象之后进行观察。无人驾驶里就会用到这个技术。

目标跟踪

1. 什么是OCR技术

OCR,全称是Optical Character Recognition, 即光学字符识别,面向扫描文件。但是由于现在数字图像的普及,也包含场景文字识别(Scene Text Recognition, STR), 也面向自然场景。 这里泛指文字检测和识别,包括扫描文档和自然场景的文字识别。
在这里插入图片描述

可以看到,其主要工作内容是从各种各类图片中去识别出对应的文字内容,包含中文、英文及其它各种字符类型。一般而言,需求针对具体应用来设计具体类型的字符识别。

2. 应用现状

OCR的应用场景很多,主要充当的作用是计算机的眼睛筛选器,从图片这类非结构化数据中识别出对应的字符出来,再进行后续的处理,比如扫描翻译等。

2.1 社会应用

在这里插入图片描述

这项技术非常省时省力,但有时候由于识别错误问题,需要人工再校正一遍,但也比挨个挨个输入对应的文本更加省时省力。

2 发展历程

光学字符识别(OCR)这一概念,最早由德国科学家Tausbeck在1929年提出。几 年后,美国科学家Handel也提出了文字识别的思法。当然直到计算机的出现才 得以慢慢实现。

最早的印刷体汉字识别进行研究的是IBM公司的Casey和Nagy,1966年他们发表了第一篇关于汉字识别的文章,采用了模板匹配法识别了1000个印刷体汉字。

img

20世纪70年代,日本东芝综合研究所研制出可以识别2000个单体印侧汉字的识别系统代表了当时汉子识别等最高水准。我国研究汉字识别的起步比较晚,20世纪70年代末才开始进行OCR的研究工作。

Toshiba东芝品牌介绍及标志图片_标志网

早期的OCR软件,由于识别率及产品化等多方面的因素,未能达到实际要求。同时,由于硬件设备成本高,运行速度慢,也没有达到实用的程度。只有个别部门,如信息部门、新闻出版单位等使用OCR软件。

中国在上世纪后期有了高速发展,在汉字建模和识别方法上都有所创新,在系统研制和开发应用中都取得了丰硕的成果,不少单位相继推出了中文OCR产品。进入20世纪90年代以后,随着平台式扫描仪的广泛应用,以及我国信息自动化和办公自动化的普及,大大推动了OCR技术的进一步发展,使OCR的识别正确率、识别速度满足了广大用户的要求。

在这里插入图片描述

到了20世纪90年代,LeNet5网络的出现开创了深度学习的新纪元,并且在OCR的 应用中达到了商用的水平,之后由于种种原因沉寂了10年。直到2012年,AlexNet网络的出现使得视觉相关的技术进入爆发期,加之此后识别网络和物休检测框架的革新也间接地促进了OCR技术的发展。

文字检测领域借鉴了物体检侧的经典网络Faster RCNN系列,yolo系列,发展出一系列文字专用检测技术,如CTPN, TextBox, Dense Box等。文字识别领域借鉴了识别网络和序列化网络,演变出以CNN+RNN+CTC 以及CNN+RNN+Attention为主流架构的识别方式。

4.早期方法

文字识别从本质上可以归类为序列化标注问题,主要目标是寻找文本串图像到文本串内容的映射,这一点与自然语言处理中的一些任务非常类似。当然,与自然语言处理相比,文字识别又有不小的区别,因为其具有一些独特性。

首先是局部特性,文本串中的局部会直接体现在整个识别目标当中;

其次是组合特性,文本串的内容组合千变万化,例如,常用的英文单词有几万个,而汉字的组合就更多了,因为汉字的组成单元常用的有6000多个,加上繁体字和生僻字足有10000个,组合出来的情况千变万化。

基于上面的考量,一种直接的方法是先将其切分成单字,然后识别单字的类别,之后将结果串起来。

这种切分到基本单元的方法在深度学习之前的几十年是通用方法,其流程如图所示。

在这里插入图片描述

  • 图像输入:对于不同的图像来说,因为有着不同的格式和压缩方式,所以需要使用不同的方法进行解码。这个过程就是将图片文件读取,用某种方式将图片文件进行表示。

  • 图像预处理:主要包括二值化、去噪声、倾斜较正等,具体操作说明如下。

    • 二值化:摄像头采集到的图像,一般都是彩色图像。彩色图像所含信息量巨大,常
      含有很多与文字无关的信息,所以对于图像的内容,需要进行简单的前景与背景分
      离,即先对彩色图像进行处理,使图像只包含前景信息与背景信息。简单地将前景
      信息定义为黑色,背景信息定义为白色,这就是二值化图。

    • 去噪:对于不同场景下的文字,需要根据噪声的特征进行去噪

    • 倾斜较正:很多情况下,获得的文字都是比较随意的,不可避免地会产生倾斜,这就需要在识別之前先对相关的内容进行校正。常规的思路是找出边缘直线,并根据直线找出倾角后进行旋转。

  • 版面分析:对文档图片分段落、分行的过程,称为版面分析。由于实际文档的多样
    性、复杂性,目前还没有一个固定、统一的切割模型。

  • 字符切割:因为需要对每个字做识别,所以需要将版式的文字切割成一个个单字,以用于后续识別器的识别。
  • 字符识别:该研究在比较早的时期就有模板匹配,后来以特征提取为主。文字的位移,笔画的粗细、断笔、粘连、旋转等因素极大地增加了特征提取的难度。
    • 字符模板制作:模板的要求是与要识别的字符的字体格式一致
    • 字符模板归一化:尽量采用小模板识别可以提神运算速度
    • 字符识别:将待识别字符与字符模板做同样的归一化处理,然后遍历与字符模板比较,处理方法为先和字符模板做差,然后计算做差后的图像的总像素值,如果小于设定的阈值,则表示该待识别字符和该模板是同一个字符
  • 版面恢复:人们希望识別后的文字,仍然像原文档图片那样排列着,段落、位置和顺序都不变地输出到Word文档和PDF文档等。
  • 后处理:根据语言模型,对识别的结果进行语义校正(主要是一些正则化处理)。

5. 深度学习方法

上面提到的传统的OCR处理方法,使用了大量的图像处理的相关知识,而且基本上是合乎人类视觉处理逻辑的。首先是数据的预处理,然后是数据的特征提取、特征降维等,之后送入一些典型的分类器(例如SVM、Softmax等)进行分类,最后通过后处理进行数据结构化。这样处理似乎是合理的,其实引入了很多问题。首先,整个处理流程的工序太多,而且是串行的,导致错误不断被传递放大,例如,每一步都是90%的正确率,正确率看似很高,但是经过五步的错误叠加之后为0.9^5=0.59049, 结果就已经不及格。其次,整个过程涉及太多的人工设计,而人工设计并不一定能够抓住问题的本质。例如文字的二值化这一预处理,参与过实际调整二值化参数项目的人深有感触,这个阈值在一些情况下很难调整好,实际处理过程中会过滤掉很多有用的信息。然后,在一些背景稍微复杂或者变体文字的情况下,传统方法基本会失效,模型的泛化性偏弱。版面分析(连通域方式)以及投影变换(行切分)的方式只能限定处理相对简单的场景,一旦场景变为自然场景(例如,街拍、复杂的广告、菜单等),基本上就会失效。最后,传统方法对单字的识别完全没有考虑到上下文的语义关联信息(局部和整体是相关的)。为了解决上述问题,传统方法进行了很多组合,例如,对识別的结果进行动态路径搜索,搜索最优的路径。路径寻优过程中,经常需要结合文字的外观特征以及语言模型进行处理,这里的前后处理存在非常多的耦合,导致实际系统中的识別模块往往需要堆砌非常多的算法。即使如此,传统方法也存在很多完全无法处理的问题,例如手写字体、验证码等存在非常多的粘连,根本无法进行切分。而深度学习的自适应学习驱动方式,能够很好地应对这些问题,因为要做的参数预处理的流程基本上少了很多,而且基本上做到了端到端的处理。

如图所示,基于深度学习的OCR方法将一些繁杂的流程分成两个主要步骤:

  • 文本检测(主要用于定位文本的位置)
  • 文本识别(主要用于识别文本的具体内容)

在这里插入图片描述

5.1 文字检测算法

文字检测算法主要有基于回归和基于分割这两类算法。

在这里插入图片描述

5.1.1 基于回归的算法(以EAST算法为例)
  • https://blog.csdn.net/attitude_yu/article/details/80724187
  • https://zhuanlan.zhihu.com/p/37504120

EAST全称是Efficient and Accuracy Scene Text,之所以这样命名是因为它是一个高效和准确的场景文本检测pipeline。

​ 首先,将图像送到FCN网络结构中并且生成单通道像素级的文本分数特征图和多通道几何图形特征图。文本区域采用了两种几何形状:旋转框(RBOX)和水平(QUAD),并为每个几何形状设计了不同的损失函数;然后,将阈值应用于每个预测区域,其中评分超过预定阈值的几何形状被认为是有效的,并且保存以用于随后的非极大抑制。NMS之后的结果被认为是pipeline的最终结果。

在这里插入图片描述

网络结构可以分解为三个部分:特征提取,特征合并和输出层

  • 特征抽取: 基于VGG模型从特征提取阶段中提取四个级别的特征图(记为fi),其大小分别为输入图像的1/32、 1/16、 1/8和1/4;
  • 特征合并:在每个合并阶段,首先将来自上一个阶段的特征图首先被输入到一个unpooling层来扩大其大小;然后,与当前层特征图进行合并(通道);最后通过conv1×1 减少通道数量和计算量;conv3×3,将局部信息融合以最终产生该合并阶段的输出。在最后一个合并阶段之后,conv3×3层会生成合并分支的最终特征图并将其送到输出层;
  • 输出层:包含若干个conv1×1操作,以将32个通道的特征图投影到1个通道的分数特征图Fs和一个多通道几何图形特征图Fg。几何形状输出可以是RBOX(旋转框)或QUAD(水平框)中的任意一种。

RBOX的几何形状由4个通道的水平边界框(AABB)R和1个通道的旋转角度θ表示;AABB 4个通道分别表示从像素位置到矩形的顶部,右侧,底部,左侧边界的4个距离;QUAD使用8个数字来表示从矩形的四个顶点到像素位置的坐标偏移,由于每个距离偏移量都包含两个数字(Δxi;Δyi),因此几何形状输出包含8个通道。

5.1.2 基于分割的算法(DB算法为例)
  • https://blog.csdn.net/xz1308579340/article/details/106579349
  • https://www.cnblogs.com/monologuesmw/p/13223314.html
  • DB算法全称(Differentiable Binarization,可微分的二值化)

基于分割的场景文本检测即把分割方法产生的概率图(热力图)转化为边界框和文字区域,其中会包含二值化的后处理过程。二值化的过程非常关键,常规二值化操作通过设定固定的阈值,然而固定的阈值难以适应复杂多变的检测场景。本文作者提出了一种可微分的二值化操作,通过将二值化操作插入到分割网络中进行组合优化,从而实现阈值在热力图各处的自适应。网络会生成与热力图对应的阈值图,通过二者的结合生成最终的二值化操作

在这里插入图片描述

  • 网络模型:

在这里插入图片描述

首先,图片通过特征金字塔结构的backbone,通过上采样的方式将特征金字塔的输出变换为同一尺寸,并级联(cascade)产生特征F;然后,通过特征图F预测概率图§和阈值图(T);最后,通过概率图P和阈值图T生成近似的二值图(B)。

  • 概率图(热力图):像素值比较接近的区域

  • 阈值图:阈值相差多少内为同一区域

  • 实现:

    • 使用函数近似二值化操作过程,实现可微的二值化
    • 将阈值图、概率图建立可微的关系生成二值图解决阈值自适应的问题
5.2 文字识别算法

文字识別的目标是对定位好的文字区域进行识别,主要解决的是将一串文字图片转录为对应的字符的问题。深度学习和文字识別有很深的渊源。在深度学习还未成为热门研究对象之前,文字识別技术就一直在使用卷积神经网络和循环神经网络。比如在深度学习体系中占据重要地位的LeNet5网络就应用在OCR上,序列化模型LSTM、BLSTM和CTC Loss很早就被应用在手写英文的识別中。随着2012年深度学习大发展,各种新的深度学习技术也促进了文字识別技术的发展。常用的文字识別框架主要有两个,即CNN+RNN+CTCCNN+Seq2Seq+Attention

文字识别算法早期的做法是将单行文字进行分割,分割后对于单个字符一般使用特征工程+分类器来进行识别。

目前深度学习做法大多数是不进行字符分割,这类算法主要有基于定长的与基于不定长的。
在这里插入图片描述

5.2.1 需要分割的算法

流程一般是:

  • 搜索到最佳分割点:用的最多的是基于投影直方图极值点作为候选分割点并使用分类器+beam search 搜索最佳分割点

    • 投影直方图:统计每行像素值,观察形状进行切分,基本上每一个峰就是一行文本
    • beam search:使用宽度优先搜索来构建它的搜索树。
  • 基于分割点后划分单行句子,并对分割后的句子中的每个字符进行划分,对于单个字符,传统方法就是特征工程+分类器

  • 一般流程是 灰度 -> 二值化->矫正图像 -> 提取特征 >分类器(分类器大致有SVM ANN KNN等等 ), 近年来,特征工程被CNN网络取代的多,省去人工找特征的操作

5.2.2 不需要分割的算法
  • 定长:各个字符看成是独立的,多标签分类mutli-label classification, 比如车牌,验证码等;
  • 不定长:
    • CRNN
    • Rosetta
    • STAR-Net
    • RARE
    • RNN/LSTM/GRU+CTC
    • attention-mechanism(CNN+Seq2Seq+Attention)

目前工业界以CRNNCNN+Seq2Seq+Attention两种为主流架构。
在这里插入图片描述

CRNN是白翔教授等提出的端到端方法,是目前主流的图文识别模型,可以识别比较长的文本序列,包含CNN特征提取层和BLSTM序列特征提取层,能够进行端到端的联合训练。同时,CRNN利用Bi-LSTM和CTC Loss 学习文字的上下文关系,从而提升了文字的识别率,使得模型更加健壮。
CNN+Seq2Seq+Attention相较于CRNN的区别是,其主要使用Seq2Seq+Attention,可以用于解决多对多的射,同时利用最新的Attention技术,提升了文字的识别率。Attention在英文识别上的效果非常好,但是在中文识别上的效果不稳定且算力开销大,所以工业界还是使用CTC居多。

以CRNN算法为例
1. 卷积层

卷积层结构采用的是VGG的结构,并且对VGG网络做了一些微调,如下图所示
在这里插入图片描述

微调如下:

  1. 为了能将CNN提取的特征作为输入,输入到RNN网络中,文章将第三和第四个maxpooling的核尺度从2×2改为了1 × 2
  2. 为了加速网络的训练,在第五和第六个卷积层后面加上了BN层。

这里需要说明的是第一点,为什么将第三和第四个maxpooling的核尺度从2 × 2改为1 × 2, 这是为了方便的将CNN的提取特征作为RNN的输入。首先要注意的是这个网络的输入为W × 32 ,也就是说该网络对输入图片的宽没有特殊的要求,但是高都必须resize到32。文中举例说明了,如果一张包含10个字符的图片大小为100 × 32,经过上述的CNN网络得到的特征尺度为25 × 1 ,这样得到一个序列,每一列特征对应原图的一个矩形区域(如下图所示),这样就很方便作为RNN的输入进行下一步的计算了,而且每个特征与输入有一个一对一的对应关系。
在这里插入图片描述

2. 循环层

RNN网络是对于CNN输出的特征序列中的xt都有一个输出yt。为了防止训练时梯度的消失,文章采用了LSTM神经单元作为RNN的单元。文章认为对于序列的预测,序列的前向信息和后向信息都有助于序列的预测,所以文章采用了双向RNN网络。

在这里插入图片描述

将RNN输出做softmax后,为字符输出
在这里插入图片描述

在实际情况中,标记这种对齐样本非常困难(除了标记字符,还要标记每个字符的位置),工作量非常大。另外,由于每张样本的字符数量不同,字体样式不同,字体大小不同,导致每列输出并不一定能与每个字符一一对应。

3. CTC层

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

img

在这里插入图片描述
img

在这里插入图片描述

6 实现

6.1 如何从一张图片中找到身份证区域部分,忽略背景图片或者文字对识别结果的影响;
  • 边缘提取,提取边缘区域
  • 标注数据,训练并构建区域检测器
6. 2.碰到倾斜图片的身份证图片如何处理(90、180、270);
  • 根据检测结果不断调整角度尝试再次检测, 直到有想要的结果;
  • 带有方向的区域检测器(整体)
  • 也可以训练一个方向分类器(局部也能用)
6.3 数据集的制作来源
  • 公开数据集

    • LSVT 45w中文街景图 https://ai.baidu.com/broad/introduction?dataset=lsvt
    • ICDAR2019-LSVT行识别 29w张标注图片 https://aistudio.baidu.com/aistudio/competition/detail/8
    • 中文街景文字 https://aistudio.baidu.com/aistudio/competition/detail/8
    • 中文文档文字 https://github.com/YCG09/chinese_oc

    在这里插入图片描述

  • 使用第三方服务方的api接口生成数据

    • 百度
    • 商汤
    • 华为
    • … …
  • 人工标注及数据扩充

    • 人工标注
    • 数据扩充(各类图像变换)
  • 开源项目自动合成生成

    • text_renderer
    • SynthText
    • SynthText_Chinese_version
    • TextRecognitionDataGenerator
  • 7
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

uncle_ll

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值