图片OCR(Optical Character Recognition)
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)的更多相关文章
- 第 38 章 OCR - Optical Character Recognition
38.1. Tesseract 查找Tesseract安装包 $ apt-cache search Tesseract ocrodjvu - tool to perform OCR on DjVu d ...
- OCR (Optical Character Recognition,光学字符识别)
OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗.亮的模式确定其形状,然后用字符识别方法将形状翻译 ...
- csharp:Optical Character Recognition
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...
- OCR(Optical Character Recognition)算法总结
https://zhuanlan.zhihu.com/p/84815144 最全OCR资料汇总,awesome-OCR
- USACO 5.4 Character Recognition
Character Recognition This problem requires you to write a program that performs character recogniti ...
- tf识别非固定长度图片ocr(数字+字母 n位长度可变)- CNN+RNN+CTC
先安装必须的库 tensorflow_gpu==1.15.0 numpy opencv_python github: https://github.com/bai-shang/crnn_ctc_ocr ...
- USACO 5.4 Character Recognition(DP)
非常恶心的一题,卡了三个月,没什么动力做了,代码直接抄的别人的... 这题主要思路就是预处理出几个数组,再预处理出几个数组,最后DP,输出一下路径... 写起来挺非常麻烦,代码不贴了,丢人... 把U ...
- 自己来实现一个简易的OCR
来做个简易的字符识别 ,既然是简易的 那么我们就不能用任何的第三方库 .啥谷歌的 tesseract-ocr, opencv 之类的 那些玩意是叼 至少图像处理 机器视觉这类课题对我这种高中没毕业的人 ...
- selenium使用笔记(二)——Tesseract OCR
在自动化测试过程中我们经常会遇到需要输入验证码的情况,而现在一般以图片验证码居多.通常我们处理这种情况应该用最简单的方式,让开发给个万能验证码或者直接将验证码这个环节跳过.之前在技术交流群里也跟朋友讨 ...
随机推荐
- Python——10模块
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- 使用Pods中使用Swift和Objective-C混编-编译不通过的原因
iOS开发#使用Pods中使用Swift和Objective-C混编-编译不通过的原因-ld: symbol(s) not found for architecture arm64 问题基本描述 在P ...
- Dubbo中@Service工作过程解析
Dubbo中@Service工作过程解析 Spring中的BeanPostProcessor 首先我们应当了解到在spring体系中BeanPostProcessor是什么.加载流程 它是什么 Bea ...
- p2.js 与 createjs 的组合应用
开始前简单说下其他几款js物理引擎 box2d老牌,功能全面,但是效率低下,移动端基不用考虑的 matterjs 效率目前我测试下来最高,但是依然还在开发中(好像还很缓慢),目前功能局限,而且有bu ...
- H5开发移动应用APP(店铺系列一)
首先,这是个真实的案例,我大兄弟在深圳开汽修店铺,但需要系统来管理日常经营活动,这正不是我擅长的吗? 说干就干,直接后端+web端+移动端来一套,于是紧急赶工,起早摸黑,产出约3万行总量代码,此系统与 ...
- IDEA非maven项目怎么添加jar包
今天本人给大家讲解一下在使用Tomcat启动后,报找不到JAR包的问题,那么如何在IDEA中添加jar包,下面请看,如有不对的或者讲的不好的可以多多提出,我会进行相应的更改,先提前感谢提出意见的各位了 ...
- Head First设计模式——复合模式
复合模式是HeadFirst上面详细讲的最后一个模式,其前面的模式作者认为都是成熟的经常使用的模式.所以这是详细讲解模式的最后一篇,同时这个模式讲解的篇幅也是最长的,接下来我就对其进行总结提炼进行讲解 ...
- 论JS函数传参时:值传递与引用传递的区别
什么是值传递:值传递是指在调用函数时将实际参数(实参)复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数. 值传递的总结:也就是说,将实参复制到函数中的这个过程叫值传递 什么是 ...
- Flink系列之状态及检查点
Flink不同于其他实时计算的框架之处是它可以提供针对不同的状态进行编程和计算.本篇文章的主要思路如下,大家可以选择性阅读. 1. Flink的状态分类及不同点. 2. Flink针对不同的状态进行编 ...
- PHP的for循环
For循环执行代码块指定的次数,或者当指定的条件为真时循环执行代码块.for循环用于您预先知道脚本需要运行的次数的情况 for(初始值:条件:增量) { 要执行的代码: } <html> ...