OCR技术概览

2023-05-16

OCR技术概览

OCR(Optical Character Recognition ) 光学字符识别技术主要分为手写体识别和印刷体识别两类 , 印刷体识别比手写体识别要简单, 因为印刷体更规范, 字体来自于计算机字库, 尽管印刷过程中可能会发生不清晰\粘连, 这些都可以通过一些"腐蚀"/"膨胀"图像处理技术还原, 但是手写体由于个体差异的存在, 还是非常难的.
从内容角度, 可以分为: 汉字, 英文, 数字和图画. 数字最简单, 英文次之, 汉字比较难.

开放API资源

谷歌OCR识别引擎: tesseract
百度OCR API:https://cloud.baidu.com/doc/OCR/OCR-API.html
腾讯 OCR:https://ai.qq.com/product/ocr.shtml#identify
阿里OCR: https://data.aliyun.com/product/ocr

OCR技术发展历程

早期字符模板匹配算法, 用实现定义的文字/数字模板滑动匹配图片上的字符, 直接给出识别结果. 这种方法简单,暴力, 直接.但是对于复杂场景的泛化能力很弱.
特征设计方法, 利用字符的图像特征进行特征提取, 例如结构特征, 笔画特征, 等等, 进行人工设计后, 提取文字特征, 送入SVM中做分类给出识别结果, 这种方法需要大量的人工特征设计, 而且当字体变化\模糊等复杂条件下泛化能力同样不行.
深度学习, 特别是卷积神经网络给OCR识别提供了新的思路.
目前非常优秀的模型有哪些?

整体pipeline流程

这里说的pipeline流程不区分手写或者印刷体. 对于输入系统的文本, 例如一段文字的图片, 或者

预处理 --> 版面分析/行列切割 --> 字符识别 --> 后处理识别矫正
预处理: 文档图像可能是倾斜或者有污渍的, 需要进行角度矫正, 去噪

预处理

openCV轮廓检测+透视变换+ 二值化
轮廓提取: 适用于车牌, 身份证, 人民币, 书本, 发票一类的矩形且边界明显的物体矫正
直线探测矫正: 适用于文本类的矫正.
透视变换: cnn model(spatial transformer network, STN), 可以有效矫正文字的扭曲/翻转问题, 配准算法.STN可以有效地学习从一组点到对应点的变化关系, 可以作为一个组件和其他模型搭配使用.

版面分析

版面分析: 判断页面上文本的朝向, 做行和列的切割, 把文字按照行切割出来, 然后(按照列)切割出每一个文字
字符识别和后处理识别矫正: 文字识别算法模型进行识别, 通常是利用经典的CNN模型(例如vgg, lenet)作为backbone, 配合循环神经网络或者结合识别结果, 进行微调/上下图片关系分析, 连接, 重新送入模型识别, 提高识别正确率.

行列切割:
行列的切割可以用横向投影和纵向投影获得. 横向投影, 是将像素点的纵坐标(y)做histogram, 得到:
在这里插入图片描述

很显然, 从横向水平投影histgram可以很容易地区分出每一行文本. 纵向竖直投影histogram如下:
纵向投影没有横向那么分割"清晰". 这种情况主要发生在汉字中, 因为英语字母都是连通体, 不像中文的这种框架结构, 特别是左右结构的汉字, 很容易被模型识别为两个字.
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以说文字的分割对正确的识别非常重要, 甚至是至关重要. 基于深度神经网络的算法有: yolo/ssd/frcnn算法等.

字符识别

识别模型: 以CNN为基础, 嵌入其他网络, 例如循环网络等.

Faster RCNN

Faster RCNN做目标检测的关键步骤有哪些:

  • 基础网络做特征提取
  • 特征送入RPN做候选框提取
  • 分类层对候选框内物体进行分类,回归层对候选框的(x,y,w,h)进行精细调整
    Faster RCNN做文本检测感觉问题不大,但是从效果来看,仅套用Faster RCNN来做文本检测效果并不好,原因在于,文本有自己独有的特点,这种通用的文本检测框架并不能很好地解决文本的这些特点。
    在这里插入图片描述

CTPN模型

2016年的detceting text in natural lmage with connectionist text proposal network一文提出了CTPN网络, 采用了一个以小的窄矩形检测框代替大检测框, 同时针对文字之间间隔的问题, 采用RNN对连续的小检测框的结果进行判断, 在CTPN中, 小检测框在文本上的移动就如同一个序列, CTPN的双向LSTM(BiLSTM)模型可以对当前检测框及其左右两边的小检测框建立联系, 可以有效地提高对于文本检测的精度.

在这里插入图片描述

seglink 模型

VPR2017的一篇spotlight论文《Detecting Oriented Text in Natural Images by Linking Segments》介绍以一种可以检测任意角度文本的检测算法,我们一般称这个算法为SegLink,这篇论文既融入CTPN小尺度候选框的思路又加入了SSD算法的思路,达到了当时自然场景下文本检测state-of-art的效果。
在这里插入图片描述

  • 主干网络是沿用了SSD网络结构,并修改修改了最后的Pooling层,将其改为卷积层.具体来说:首先用VGG16作为base
    net,并将VGG16的最后两个全连接层改成卷积层.接着增加一些额外的卷积层,用于提取更深的特征,最后的修改SSD的Pooling层,将其改为卷积层
  • 提取不同层的feature map,文中提取了conv4_3, conv7, conv8_2, conv9_2, conv10_2, conv11.这里其实操作还是和SSD网络一样
  • 对不同层的feature map使用3*3的卷积层产生最终的输出(包括segment和link),不同特征层输出的维度是不一样的,因为除了conv4_3层外,其它层存在跨层的link.这里segment是text的带方向bbox信息(它可能是个单词,也可能是几个字符,总之是文本行的部分),link是不同bbox的连接信息(文章将其也增加到网络中自动学习).
  • 然后通过融合规则,将segment的box信息和link信息进行融合,得到最终的文本行.

EAST模型

seglink这种先做分割再合并的思路,增大了文本检测精度的损失和时间的消耗,CVPR2017有一篇文章提出了一个能优雅且简洁地完成多角度文本检测,这个算法叫做EAST,论文为《EAST: An Efficient and Accurate Scene Text Detector》。
在这里插入图片描述
EAST网络分为特征提取层+特征融合层+输出层三大部分。

  1. 特征提取层: backbone采取PVANet来做特征提取,接下来送入卷积层,而且后面的卷积层的尺寸依次递减(size变为上一层的一半),而且卷积核的数量依次递增(是前一层的2倍)。抽取不同level的feature map,这样可以得到不同尺度的特征图,目的是解决文本行尺度变换剧烈的问题,size大的层可用于预测小的文本行,size小的层可用于预测大的文本行。
  2. 特征合并层,将抽取的特征进行merge.这里合并的规则采用了U-net的方法,合并规则:从特征提取网络的顶部特征按照相应的规则向下进行合并,这里描述可能不太好理解,具体参见下述的网络结构图。
    在这里插入图片描述
  3. 网络输出层:网络的最终输出有5大部分,他们分别是:
  • score map:一个参数,表示这个预测框的置信度;
  • text boxes: 4个参数,(x,y,w,h),跟普通目标检测任务的bounding box参数一样,表示一个物体的位置;
  • text rotation angle: 1个参数,表示text boxe的旋转角度;
  • text quadrangle coordinates:8个参数,表示任意四边形的四个顶点坐标,即(x1,y1),(x2,y2),(x3,y3),(x4,y4)。
    所以从整体看来,EAST就是借助FCN架构直接回归出文本行的(x,y,w,h,θ)+置信度+四边形的四个坐标.

其他方法

基于语义分割的思路做文本检测的、基于角点检测做文本检测、各种方法混合的文本检测.
在这里插入图片描述

字符识别

主流模型分为两种: attention OCR(= cnn+ rnn+ attention) 或者CRNN(= cnn+rnn+CTC ) . 这两大方法的主要区别在于最后的输出层,attention OCR采用的是attention机制, CRNN对齐采用的是CTC算法.

后处理识别矫正

利用语法检测器, 检测字符的组合逻辑是否合理.
#参考与更多阅读:
CTPN - 自然场景文本检测 https://blog.csdn.net/zchang81/article/details/78873347
一文读懂FRCNN: https://zhuanlan.zhihu.com/p/31426458
文字识别seglink : https://zhuanlan.zhihu.com/p/37781277

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OCR技术概览 的相关文章

  • 描边宽度变换 (SWT) 实现(Java、C#...)[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我最近发现了笔划宽度变换 如以下研究论文中所述 使用笔划宽度变换检测自然场景中的文本 https ie
  • java中pdf解析为文本

    我有一个阿拉伯语 PDF 我想使用 Java 将其解析为文本文档 我已经尝试了很多次 英语单词解析成功 但阿拉伯语单词解析失败 谁能推荐一个可以正确转换阿拉伯语单词的解决方案 我想到了几个图书馆 阿帕奇蒂卡 http tika apache
  • 如何在 OCR 中区分斜线零和八 (0->8)

    我正在为我的 Android 应用程序使用 ML Kit for Firebase ReCalc 收据计算器 https play google com store apps details id info trekto receipts
  • 超正方体的替代方案

    Python 或 OpenCV 中是否有替代软件或任何库可以替代 Tesseract 进行字符识别 有什么建议的可以用Python实现的字符识别方法吗 Thanks This site https github com kba awesom
  • opencv 中的二值化和背景过滤

    不久 我想在OCR之前进行预处理程序 建议来自ABBYY的技术 http www abbyy developers eu en tech insideocr adaptive binarisation 文章分为两部分 Background
  • Tesseract OCR Android tessdata 目录未找到

    我目前正在使用 OCR 开发 Android 应用程序 并且已经达到了调用 BaseAPI init 方法的程度 我不断收到错误消息 指出该目录必须包含 tessdata 作为子文件夹 我已检查文件目录是否包含其中包含训练数据文件的文件夹
  • Pytesseract 对于实时 OCR 来说非常慢,有什么方法可以优化我的代码吗?

    我正在尝试使用 python 创建实时 OCRmss and pytesseract 到目前为止 我已经能够捕获整个屏幕 其 FPS 稳定为 30 如果我想捕获大约 500x500 的较小区域 我已经能够获得 100 FPS 然而 一旦我包
  • 什么是可以检测手写的好的 OCR? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我需要一个库 可以在扫描手写纸后从其中提取文本 正常拉丁文本 它可以是一个免费的解决方案 甚至是我必须付费的解决方案 只要它可以处理大写字
  • 使用贝叶斯类进行数字识别

    我需要编写一个仅用于数字的 OCR 程序 我将使用 MNIST 数据集 问题是我不知道从哪里开始 有很多论文并没有真正解释算法 我对模式识别真的了解不多 所以我有几个问题 Q1 在哪里可以找到算法 或教程 Q2 如何对数字进行分类 我不需要
  • 提高识别率的图像预处理步骤

    我正在为我的项目使用 TessBaseAPI 制作一个简单的 OCR Android 应用程序 我已经完成了一些图像预处理步骤 例如二值化和图像增强 但他们的结果是50 到60 怎样才能提高识别率呢 我包括两个示例图像 http image
  • tess4j 与 Spring mvc

    我已经尝试将 tess4j 作为独立的 java 程序 并且它可以正常工作并给出文本输出 现在我正在尝试创建一个 spring mvc web 项目 在 pom 中添加 tess4j 的依赖项 并且我已在我的项目中添加了 tess4j 源
  • pytesseract 错误 Windows 错误 [错误 2]

    您好 我正在尝试使用 python 库 pytesseract 从图像中提取文本 请查找代码 from PIL import Image from pytesseract import image to string print image
  • 使用 Tesseract OCR 和 python 进行数字识别

    我使用 Tesseract 和 python 读取数字 从能量计 除了数字 1 之外 一切都运行良好 Tesseract 无法读取 1 数字 This is the picture I send to tesseract tesseract
  • 屏幕截图中低分辨率文本的 OCR

    我正在编写一个 OCR 应用程序来从屏幕截图图像中读取字符 目前 我只关注数字 我的方法部分基于这篇博文 http blog damiles com 2008 11 basic ocr in opencv http blog damiles
  • 收据褪色部分可以恢复吗?

    我有一些包含一些扫描收据的文件 我需要使用 OCR 从中提取文本 由于收据上打印的文字在一段时间后会褪色 导致收据上的某些文字不清晰 影响OCR结果 褪色单词的一些示例 有什么方法可以恢复褪色的部分 以便提高 OCR 结果吗 我在OpenC
  • 如何去除给定图像中的噪声,使 ocr 输出完美?

    我已经对这个孟加拉文本图像进行了大津阈值处理 并使用 tesseract 进行 OCR 但输出非常糟糕 我应该应用什么预处理来消除噪音 我也想校正图像 因为它有轻微的倾斜 我的代码如下 import tesserocr from PIL i
  • Tesseract OCR - 手写字体

    我正在尝试使用Tesseract OCR http code google com p tesseract ocr 检测其中包含纯文本的图像文本 但这些文本具有名为的手写字体Journal Example 结果不是最好的 千里马 尺寸 宽
  • 在 R 中使用深度网络和 MNIST 数据读取手写数字第 3 部分

    我尝试编写一个基于深度网络的程序来读取手写数字 我在 Youtube 上找到了一个代码 https www youtube com watch v 5bso 5X7Zu4 https www youtube com watch v 5bso
  • 未应用 Tesseract 用户模式

    I want to do OCR on this image This is pre define format ie first five will characters then next four will be digits and
  • Tesseract OCR 培训的替代方案?

    在过去的三个月里我一直在尝试训练 Tesseract通过识别我拥有的图像集合 由于真正的缺乏适当的文档 以及非常高的复杂性 我开始放弃 Tesseract 作为解决方案 我正在寻找一种相对无痛的替代方案对于训练 我不想在这里重新发现轮子 如

随机推荐