Photo OCR问题描述

随着网络上的图片的数量越来越多,读取图片上的文字成为了一个日益增强的需求。

按照photo ocr问题的各个处理流程,我们可以大致为不同的环节分配不同数量的人去进行。

滑动窗口(Sliding Windows)

文字检测和行人检测的差别:

行人由于其矩形的长宽比例(ratio)大致比较固定(根据距离远近不同产生差别),因此可能较为容易检测。而文字则可能有各种各样的形状,相对比较难以确认其所在的区域。

如果要建立一个行人检测的系统,我们需要一些形状/像素相同的照片,分别是有行人的正例,和没有行人的反例。

  • 滑动窗口检测

用一个固定比例的小矩形(patch)作为检测器,在目标图片上逐渐平移,每次平移距离称为step-size/stride。用这个小矩形在整个图片上完成一次完整的扫描,然后再用稍微大一点的矩形,重复操作。最后,记录下所有用小矩形检测到的行人。

  • 应用于文字检测

与行人检测类似,我们用像素相同的正例和反例来做训练。

在训练好检测器模型后,我们就可以用模型来做检测工作。

如上图,首先我们会用一个小滑动窗口完成一次扫描,然后标注出模型认为可能有文字的部分为白色小块,然后我们将这些白色小块部分做一个扩张(expansion)(左图->右图)。之后没我们可以用针对扩张后的,有较大面积,连续的和有规则轮廓的白色块,我们将它们用矩形窗口框起来,再使用模型去尝试确认这些框起来的区域是否有文字。

  • 文字分割(Text Segmentation)

这是在文字检测后的下一个步骤。

如下图,同样,我们用正例和反例训练出可以检测文字边界的检测器模型。

然后,我们用滑动窗口扫描目标图像,并在每个模型认为是文字边界的地方做标记。

  • Photo OCR pipeline

Photo OCR问题的处理流程:

获得大量数据和人工数据(Getting Logs of Data and Artificial Data)

机器学习模型的训练中,我们往往需要大量的数据。而这些数据从哪里来呢?我们可以用Artificial Data Synthesis(人工数据合成)。

如下图,假设我们收集了一个文字识别的数据集(图像+字母标记),我们如何将它”扩大“呢?

首先,字母可以变换成很多不同的字体,并且给字母可以赋予不同的背景样式。对真实数据(左图)进行一番变化后,我们就可以获得合成数据(右图)。

另外,我们还可以对数据图像引入一定程度的扭曲(如下图)。

类似的做法在语音识别(speech recognition)里面也有(为原始纯净的语音添加不同的干扰音和背景音【噪音】)。

要注意的是,所添加的噪音/扭曲必须是在对应类型的数据集中比较有代表性的噪音/扭曲。

获得更多数据的注意事项:

  • 确认使用的是low bias的分类器(通过画学习曲线来判别)(如果是high bias的分类器,增加样本数量对提升模型性能已经不太有用了【见前面】,这时要增加训练特征数目,比如在神经网络里可以增加隐藏层的神经元数目)

  • 注意获得更多数据的投入成本。考虑到所付出的工作和模型可能从更多的数据中获得的性能改善,作出权衡。(不同的三种途径:人工合成,自己搜集,众筹)

瓶颈分析:需要攻克的环节(Ceiling Analysis:What Part of the Pipeline to Work on Next)

我们希望在改善机器学习系统的性能时,把更多的精力投入到性价比比较高的部分,即改善的努力最有可能得到回报的部分,那么,我们就需要首先找出当前是系统的哪个部分对系统的性能限制最大。

如下图,回到文字识别问题,我们对识别系统的不同组件(component)的准确度进行对比:

按照流程的顺序,我们会不断地将每个涉及到模型性能的流程做一些调整,使得当前流程的模型表现“完美”,即通过调整,使某个流程的模型在某个数据集上表现100%准确(手工标记正确标签(ground-truth labels),然后将完全正确处理过的数据再输入到下一个模型中)。这时,再测量系统的准确率如何,这个准确率也就是当前流程模型表现“完美”时的系统瓶颈(ceiling)性能。

获得了所有流程中的模型的表现完美的情况下,系统的瓶颈性能后,我们就可以开始抉择,在哪些模型的改进上下功夫。当然是在能够使得瓶颈性能获得最大程度的改进的模型上!(上图中,是文字检测模型,因为可以获得最大72%->89%的大幅度改善。至于文字识别的100%识别率对于系统改进是没有太大参考意义的,因为其属于模型的最后输出判断结果的部分,它的改善在实际情况下会被前面的流程限制。)

如下图,另一个瓶颈分析的例子:人脸识别。

图片OCR(Optical Character Recognition)的更多相关文章

  1. 第 38 章 OCR - Optical Character Recognition

    38.1. Tesseract 查找Tesseract安装包 $ apt-cache search Tesseract ocrodjvu - tool to perform OCR on DjVu d ...

  2. OCR (Optical Character Recognition,光学字符识别)

    OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗.亮的模式确定其形状,然后用字符识别方法将形状翻译 ...

  3. csharp:Optical Character Recognition

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...

  4. OCR(Optical Character Recognition)算法总结

    https://zhuanlan.zhihu.com/p/84815144 最全OCR资料汇总,awesome-OCR

  5. USACO 5.4 Character Recognition

    Character Recognition This problem requires you to write a program that performs character recogniti ...

  6. tf识别非固定长度图片ocr(数字+字母 n位长度可变)- CNN+RNN+CTC

    先安装必须的库 tensorflow_gpu==1.15.0 numpy opencv_python github: https://github.com/bai-shang/crnn_ctc_ocr ...

  7. USACO 5.4 Character Recognition(DP)

    非常恶心的一题,卡了三个月,没什么动力做了,代码直接抄的别人的... 这题主要思路就是预处理出几个数组,再预处理出几个数组,最后DP,输出一下路径... 写起来挺非常麻烦,代码不贴了,丢人... 把U ...

  8. 自己来实现一个简易的OCR

    来做个简易的字符识别 ,既然是简易的 那么我们就不能用任何的第三方库 .啥谷歌的 tesseract-ocr, opencv 之类的 那些玩意是叼 至少图像处理 机器视觉这类课题对我这种高中没毕业的人 ...

  9. selenium使用笔记(二)——Tesseract OCR

    在自动化测试过程中我们经常会遇到需要输入验证码的情况,而现在一般以图片验证码居多.通常我们处理这种情况应该用最简单的方式,让开发给个万能验证码或者直接将验证码这个环节跳过.之前在技术交流群里也跟朋友讨 ...

随机推荐

  1. 关于配置cordova的一些细节

    网上多数资料都是:安装nodejs->通过node js安装cordova->JDK->设置环境变量JAVA_HOME->安装android SDK->设置环境变量AND ...

  2. 使用HtmlAgilityPack和ScrapySharp抓取网页数据遇到的几个问题解决方法——格式编码问题

    需要用到对应市区县街道居委会的区域编码,于是找到统计局的网页,对这些数据进行抓取,用到了HtmlAgilityPack和ScrapySharp,由于也是第一次从网页抓取数据,所以对于HtmlAgili ...

  3. Pom.xml的依赖自动生成

    1.第一种用引入jar包的方法 网盘链接:https://pan.baidu.com/s/10HNjNeZc1d5QrFNtvLPWBA 提取码:oako 以上是整个文件直接用idea打开即可 imp ...

  4. Swift和Objective-C中的协议(protocol)有什么异同

    Swift和Objective-C中的protocol的相同点在于:两者可以被用作代理.Objective-C中的protocol类似于Java中的Interface,在实际开发中主要用与适配器模式( ...

  5. win10下安装LoadRunner12汉化包

    1.前提是已经下载LoadRunner安装文件,及已经安装成功: 安装包: 安装成功后,桌面会出现3个图标: 下面,开始安装汉化包: 1.右键点击“HP_LoadRunner_12.02_Commun ...

  6. 聊一聊关于MySQL的count(*)

    0.背景 自从大家对于MySQL数据库的稳定性有了更高的追求后,经常有小伙伴有这样的疑问,对于count(*)这样的操作,有没有正确的姿势,或者有没有可以优化的地方? 但答案比较残酷,如果已经使用了正 ...

  7. 数据结构 1 线性表详解 链表、 栈 、 队列 结合JAVA 详解

    前言 其实在学习数据结构之前,我也是从来都没了解过这门课,但是随着工作的慢慢深入,之前学习的东西实在是不够用,并且太皮毛了.太浅,只是懂得一些浅层的,我知道这个东西怎么用,但是要优化.或者是解析,就不 ...

  8. Java中如何更优雅的处理空值

    经常看到项目中存在到处空值判断的情况,这些判断,会让人觉得摸不着头绪,它的出现很有可能和当前的业务逻辑并没有关系.但它会让你很头疼.有时候,更可怕的是系统因为这些空值的情况,会抛出空指针异常,导致业务 ...

  9. canvas初尝试

    最近学习了canvas,就拿它做了这么个小东西,感觉已经爱上canvas了.上代码 /* * @auhor : 开发部-前端组-李鑫超 * @property { tableData : {Array ...

  10. 东南大学RM装甲板识别算法详解

    rm中,装甲板的识别在比赛中可谓是最基础的算法.而在各个开源框架中,该算法也可以说最为成熟.出于学习目的,之后将对比多个高校或网络代码(),尝试学习各个rm装甲板识别算法的优点和流程. 这次先是东南大 ...