0%

Part1-应用实例:照片OCR

Part1-应用实例:照片OCR

问题描述和管道(pipeline)

照片OCR全称是照片光学字符识别(Photo Optical Character Recognition)

它有如下几个步骤:

  1. 给定某张图片,将图像扫描一遍
  2. 找出照片中的文字信息
  3. 重点关注这些文字区域,并对区域中的文字进行识别
  4. 将这些文字内容显示并记录下来

照片OCR管道:

  1. 文字检测(Text detection)
  2. 字符分割(Character segmentation)
  3. 字符分类(Character recognition)

像这样一个系统,我们将它称为机器学习流水线(machine learning pipeline)

滑动窗口

OCR pipeline的第一步是文字检测,文字检测在计算机视觉中是一个比较难的问题,因为根据找到的文字区域,它们对应的矩形具有不同的长宽比例,所以为了说明如何在图片中检测它们,首先从一个简单的例子开始,即行人检测,之后我们再将做行人检测的思路应用到文字识别中去。

如图,在行人检测中,有一张类似这样的图片,我们要找出图片的各个行人,这个问题比文字检测简单的地方在于要识别的东西具有相似的长宽比,仅用一个固定长宽比的矩形就可以了。

行人检测监督学习

如将比例标准定为\(82\times 36\),当然也可以选择其它的相近的数字

我们要做的是从数据集中收集一些正样本和负样本如图:

滑动窗口

现在,假设我们得到一张新图,我们尝试在图片中找到一个行人,我们首先在图片中选取一个矩形块如图:

将这个图块传递给分类器,来检测图块中是否有行人,这里,分类器得到的结果应该是\(y=0\),接下来,将这个绿色矩形稍微移动一点,如图:

然后,再将这个图块传递给分类器判断是否有行人,之后再移动绿色矩形框,以此类推

这个绿色矩形每次移动的距离是一个参数,一般称为步长,有时也被称为滑动参数,如果一次移动一个像素,则步长就为1,一般步长为1时表现最好,但计算成本较高,通常将步长设为4像素或8像素或更大的数是比较常见的。

目前,这个矩形是一个很小的矩形,且它只会检测某个特定大小的行人,接下来,我们需要使用更大的矩形,再如上所述在整个图片上进行滑动,然后将每个图块调整到\(82\times 36\)的大小,然后输入到分类器中。

最后还可以使用更大的矩形,再如上进行操作。

最后得到如图结果:

文字检测

与行人检测类似,拿出一系列包含正样本和负样本的训练集,如图:

训练完成后,将其应用在新的测试集的图片上,假设在如图所示的图片上,使用一个固定比例的滑动窗口进行滑动,然后进行分类

结果如图:

其中白色区域,表示文本检测系统发现了文本

然后更近一步,将这些分类器的输出应用到放大算子(expansion operator)上,它所做的是获取每个白色方块,然后将白色区域扩大,结果如图:

其实就是对于原图每个像素判断其一定范围内是否存在白色的像素,如果存在,那么就在新图中将整个范围内的像素都变成白色。

可以用一个简单方法来排除那些比例奇怪的矩形,因为我们知道文本周围的框宽度应该远大于高度,所以如果我们忽略瘦高的矩形,然后在宽高比例正常的白色方块周围画上矩形,就会得到还不错的结果。

字符分割

给定如图所示的图片,如何分割出图像中的单个字符?

我们要做的就是再次使用监督学习算法用一些正样本和一些负样本,观察这些样本,判断图块是是否存在文字分割的地方

然后和文字检测一样,使用滑动窗口在需要分割的图像上进行滑动,将每个图块输入到分类器中,然后进行分割。

获取大量数据:人工数据合成

字符识别

人工合成数据

假设我们收集到了一个大的标签数据集如图所示:

我们如何才能得到一个更大的训练集呢?

现代计算机通常有一个庞大的字体库,如果有文字处理软件或通过网络下载,还能获得更多的字体,因此,如果想要更多的训练样本,一个方法是用不同的字符生成字符,然后将其置于任意不同的背景,得到人造数据集

通过引入失真合成数据

我们使用一个真实的样本,然后生成其它数据来扩充训练集。

如图,一个真实图像,我们在上面覆盖了网格线,只是为了便于说明。

接下来要做的就是对这张图进行人工拉伸或者说人工扭曲,这样就可以将该样本变成16个新的样本如图:

采用这种办法,就可以将一个小的标签训练集扩充为一个更大的训练集。

通过引入失真合成数据:语音识别

对于语音识别而言,假设有一些音频片段,然后想从中学习来识别语音片段中出现的单词,假定有一个带标签的训练样本,它是某个人说的一些词,我们想尝试使用一个学习算法来识别那个人说的单词,那么,我们该如何扩充数据集呢?

我们能做的就是:引入额外的语音失真到数据集中。如:加入背景音(蜂鸣噪音、道路上的噪音、机器噪音等)

注:在引入失真合成数据时,如果试图自己完成,则引入的失真应该具有代表性,这些噪音或扭曲是有可能出现在测试集中的,所以对于字符识别例子来说,我们引入的扭曲实际上是合理的。

如果只是随机的无意义的噪音加入到数据中,并没有什么帮助,如对于之前的图片A,将每个像素随机加入一些高斯噪音,即改变每个像素的亮度,如果只是随机的加入一些高斯噪音到每个像素中,就只是完全没有意义的噪音,因此除非觉得有可能在测试集中看到这种像素级的噪音,否则这种纯随机的无意义的噪音可能是无用的。

对于获取更多数据的讨论

  1. 在使用许多时间想办法生成人工训练样本之前,通常最好先确保分类器偏差较低,这样的话,更多的训练数据都会真正起作用,标签的做法是绘制一个学习曲线来确保有一个低偏差、高方差的分类器。而如果分类器偏差较高,则可以尝试持续增加分类器的特征数量或增加神经网络隐藏单元的数量,直到偏差降低,然后再花精力到生成大量的人工训练集上
  2. 在研究机器学习问题时,经常需要问如何获得我们当前拥有的数据的十倍的数据量,需要花费多少时间去实现?问题的答案通常是其实没有那么困难,可能最多花上几天的工作,就可以获取现有的十倍数据,并且通常如果能得到当前数据的十位数据,就可以使算法运行得更好
    • 人工合成数据
    • 自己收集数据或添加标签
    • “众包”(群众外包(Crowd Source))

上限分析:流水线的下一步工作

根据每个组件进行误差分析(上限分析)

应该如何分配资源呢?哪一部分最值得我们投入精力去做或投入时间去心善效果?这便是上限分析要做的事,和其它机器学习系统的开发过程一样,为了决定如何开发这个系统,一个有效的方法是对学习系统使用一个数值评价量度。

假如我们使用字符准确度作为这个量度,给定一个测试样本,那么这个数值就表示我们地测试图像中的文本识别正确的比例,或者也可以选择其它评价量度值。最终可能得到整个系统目前的准确率为72%。

上限分析:

首先,我们关注这个机器学习工作流中的第一个模块:文本检测。然后遍历每个测试集样本,人为地告诉算法每个测试样本中文本的位置,换句话说,我们就是要仿真出如果是100%正确地检测出图片中的文本信息,应该是什么样的?

然后,我们继续运行完成接下来的模块,再用和之前一样的评价量度的指标进行评估,得到整个系统的总的准确率如89%

然后,进入到下一阶段,这时,我们不仅使用正确的文本检测结果,还同时使用标准的字符分割结果,再如上所述进行,最终得到系统准确率如90%

同理,使用正确的三个模块的输出结果,这样以后,理所当然得到100%准确率

然后,我们就知道了对每个模块进行改善后它们各自的上升空间是多大,根据上述过程,对文字样本改善上升空间为17%,对于文本分割上升空间为1%,对于字符检测上升空间为10%

然后根据各自的上升空间衡量需要先做什么或在哪一部分花费更多时间。