照片OCR是指照片光学字符识别(photo optical character recognition)。
OCR的大概步骤
- 文字识别技术(Text detection):首先使用文字识别技术(Text detection)将给定的图片扫描一遍,找出这张图片中哪里有文字信息。
- 字符切分:接下来就是重点关注这些文字区域,对这些文字区域的矩形轮廓进行字符切分。
- 字符分类:当文字被分割成独立的字符之后,我们可以尝试运行一个分类器,输入这些可识别的字符,然后试着识别出上面的字符。
机器学习流水线(machine learning pipeline)
像上面这样的一个系统,我们把它称之为机器学习流水线(machine learning pipeline)。
在很多复杂的机器学习系统中,这种流水线形式都非常普遍。在流水线中会有多个不同的模块,比如在本例中我们有文字检测、字符分割和字母识别,其中每个模块都可能是一个机器学习组件。
因此使用流水线的方式通常提供了一个很好的办法来将整个工作分给不同的组员去完成。(当然所有这些工作都可以由一个人来完成,如果你希望这样做的话。)
滑动窗体
假设我们想要实现一个从图中识别出行人的应用:
为了建立一个行人检测系统,以下是具体步骤:
指定行人矩形比例
假如说我们把宽高比标准化到82:36这样一个比例。
搜集样本
接下来我们要做的就是到街上去收集一大堆正负训练样本。
训练算法
如果你能得到大规模训练样本的话,然后你要做的事是训练一个神经网络或者别的什么学习算法,输入这些82×36维的图像块,然后对y进行分类,把图像块分成”有行人”和”没有行人”两类。
因此这一步实际上是一个监督学习。你通过一个图像块然后决定这个图像块里有没有行人。
现在假如我们获得一张新的测试样本图像,我们如果想要从这张图中找到行人:
- 首先要做的是对这个图像取一小块长方形(82×36)
- 通过分类器来确定这个图像块中是不是有行人
- 然后我们把这个绿色的长方形图片滑动一点点
- 逐步扫描
每次滑动窗口的大小是一个参数,通常被称为步长(step size),有时也称为步幅参数(stride parameter)。步长为1代表每次移动一个像素,这样通常表现得最好但可能计算量比较大,因此通常使用4个像素、或者8个像素、或者更多像素作为步长值。
通过固定步长,你的窗体去逐步扫描完整个图,并在每一步扫描过程中,将窗体扫描到的图片代入之前训练的行人识别的分类器中,直到窗体滑过图片中所有不同的位置:
但这个矩形是非常小的,只能探测到某种尺寸的行人。接下来我们要做的是看看更大的图像块。因此我们用更大矩形来滑过图片,传入分类器运行:
顺便说一下,“用更大一些的图像块”的意思是当你用这样的图像块时,我们需要将扫描得到的图片重新压缩到分类器可以识别的尺寸(82×36像素)。
以此类推,接下来你可以用一个更大的矩形,以同样的方式滑动窗口。直到完成最后的扫描过程之后,你的算法应该就能检测出图像中是否出现行人了。
因此整个步骤就是:训练一个分类器,然后用一个滑动窗分类器来找出图像中出现的行人。
上限分析
我们可以对学习系统使用一个数值评价量度。
以照片OCR流水线为例:
我们假设整个系统的估计准确率为72%(对测试集上的图像分别运行流水线上的每一个模块操作之后,整个测试集的准确率是72%)。
首先我们要模拟在文字检测准确率100%的情况下,得出当前系统的准确率。(我们可以通过人工的方式找出这种样本)
模块 | 准确率 |
---|---|
整个系统 | 72% |
文字检测 | 89% |
- 然后以同样的方式,得出在文字检测,以及字符切分准确率100%的情况下,当前系统的准确率。
模块 | 准确率 |
---|---|
整个系统 | 72% |
文字检测 | 89% |
字符切分 | 90% |
字符识别 | 100% |
- 有了这些数据,我们就知道了每一个模块进行改善它们各自的上升空间是多大。
因此,通过上限分析,很清楚地指出了哪一个模块是最值得花精力去完善的。