问题描述

Photo OCR问题目标是检测数码相片中的文字,这个问题到目前为止还是一个比较困难的问题,显然这周的课程并不是教你写一个系统来实现这个目标,而是通过尝试解决这个问题了解一般机器学习问题的处理思路。其中包括:

  • 了解复杂的机器学习系统是怎么组合起来的
  • 了解在机器学习生产线(pipeline)上怎么决定接下来做什么
  • 怎么获取大量的数据
  • ……

针对OCR问题,可以分成这几个步骤:检测照片中哪些地方有文字,排除不太可能是文字的区域,选取文字区域将文字按照字母进行分割,然后识别相应的字母。流水线差不多这样:

20170414_1

Sliding windows

首先根据一般的照片中行人的识别来看怎么运用Sliding windows方法获取照片中有行人的区域。

在一张照片中,虽然距离照相机远近不同,行人的大小会不一样,但是由于行人都是站立姿势,所以高度和宽度的比例基本是一样的,所以可以考虑使用一个高宽比固定的矩形来框住相片的一个部分,然后检测这个部分中有没有行人,然后将矩形向右边移动一定的步长(这个步长不是矩形的宽度,而是基本上小于矩形的宽度,防止第一个矩形切到了人的左侧,后面一个矩形切到右侧造成这个人在两个矩形中都没有检测出来的情况)继续监测,一行检测完毕之后将矩形向下移动一定的步长,执行同样的步骤,直到整张照片检测完毕。并且由于行人大小不一定相同,按照一定大小检测完后,还需要尝试其他大小的矩形重新检测这张照片。这就是Sliding windows方法的基本想法。

按照这个思路可以得到照片中有文字的区域,然后想办法排除很可能不是文字的区域(学习算法误判为文字),这就完成了整个生产线的第一步。

获取文字区域之后需要分割单词中的字母然后进行各个单词的识别。

获取大量数据

在高方差的情况下,大量的数据往往能使机器学习算法获得更好的效果,然而问题是很难获取很多别人已经标记好了的数据,自己标记数据又要花很多时间,所以一个办法就是自己造数据作为训练集。

以字母识别为例,往往字母图片的背景有很多噪音,我们可以尝试将正常的字母图案加上相似的噪音,然后观察自己造出来的图案是不是和原始数据中的图案类似。造数据有很多种方式,但是目标就是需要尽可能与原始的数据相似,否则对机器学习的算法并没有什么帮助。因为机器学习算法本质是从众多的现象中找出一个规律,使用相同的数据其实只是加强了这个训练样本的影响力,如果把所有的训练样本都原封不动的复制一遍,除了会让算法跑的慢一点对整体效果并没有什么促进作用。而造出来的数据之所以有作用是因为我们制造的数据需要与原始数据特征相似,简单来说是加强了这个规律的影响力,让机器学习算法能更好的找出这个特征。而与原始数据差别很大的数据,至少对于这个机器学习问题来讲,是起到了一个混淆的作用,因为模糊的原本的特征,反而不太容易找到原始数据中的那个规律。

在获取大量数据之前,首先需要考虑下算法是不是真的受限于训练集的大小了,具体的分析方式在第六周课程有提到过。

天花板分析

在机器学习生产线上,待解决的问题有很多,然而个人或者团队的精力是有限的,所以我们需要分析把主要精力放在哪一个模块上,一种分析方式就是假设这个模块发挥到了极致,准确率100%,对整体性能提升能有多大的影响。回到之前的OCR问题的例子,这个问题有三个小的模块:文字区域检测,字母分割,字母识别。

现在假设目前整体的准确率是72%,然后团队经过不懈的努力,把文字区域检测这部分效果提到了100%(实际上是人工把训练集跑了一遍,给所有样本打上了正确的标记,或者是其他方法,这个不重要),然后看整体的准确率达到了89%。类似的,在字母检测和字母识别达到100%的情况下,整体准确率分别到了90%和100%。从这些数据我们可以得到,就算每个模块做到完美,对整体效果的影响力分别是多大,在这里三个模块对整体的影响分别是17%,1%和10%,所以很容易得到结论,应该把主要的精力放在文字区域检测这个模块上。

不过我感觉做法应该是看模块1,2,3分别到达100%时,其他模块不变的情况下对整体效果的提升,而课程中讲的是模块1完美之后,模块2完美前后的对比。感觉这两个方式有些不一样。

参考

  1. 机器学习 Coursera公开课 by斯坦福大学
  2. 18_Application_Example_OCR
  3. Lecture18.pdf

所有笔记链接