刚刚完成了Cousera上Machine Learning的最后一周课程,这周介绍了machine learning的一个应用:photo OCR(optimal character recognition,光学字符识别),下面将笔记整理在下面。

Photo OCR

Problem Description and Pipeline

最后几小节介绍机器学习的一个应用——photo OCR(optimal character recognition,光学字符识别),这一例子的内容也可以应用于计算机视觉(computor vision)。photo OCR要解决的问题是如何让计算机识别出图像中的文字。给定一张图像,photo OCR首先要做的是确定其中文字的位置,如下图所示:

11_1

然后将其中的文字正确转录下来。photo OCR仍是机器学习的难点之一,它可以帮助盲人“看到”面前的事物,可以帮助汽车自动识别道路上的物体,促进自动驾驶技术的实现。

为了实现photo OCR,我们要做的几个步骤如下:

  • 文本探测(text detection),确定文本在图像中的位置
  • 字符切割(character segmentation),将含有文本的图像片段切割出来,并按一个一个字符切分
  • 字符识别(character classification),将图像中的字符准确的识别出来

当然实际的操作可能要复杂得多,但总体上就是这几步,这被称为photo OCR pipeline。

11_2

Sliding Windows

这一小节介绍photo OCR的一个细节——滑动窗口(sliding windows)。我们使用的路人探测(pedestrain detection)的例子来引出滑动窗口,下图中含有多个路人,随着路人与相机距离的大小,代表路人的矩形尺寸不同,但原理一样。

11_3

我们在路人探测中使用监督式学习,我们的数据是一个个图像片段,尺寸为$82\times36$(实际尺寸根据需要选择),下图给出了分类为$y=1$的positive example和分类为$y=0$的negative example。假设有这样的图像片段数千份,那我们就可以从中训练到一个hypothesis,用于判断新的图像片段中是否含有路人。我们拿上面的那张图像做test set,找出其中的路人。我们从图像的最最左上角选择一个尺寸为$82\times36$的图像片段,成为窗口,判断其中是否有路人。然后向右滑动窗口,假定步长为4(当然,步长为1准确度最高,但速度下降,根据实际情况调整),每滑动一次判断一次。滑动最左侧之后,再从最左侧向下滑动一个步长再向右滑动,直至滑动到整个图像的最最右下角,就扫描完了整张图像。

11_4

11_5

11_6

11_7

下面回到photo OCR,此问题的positive examples和negative examples如下图所示。然后使用上面讲的滑动窗口去扫描整个图像,找到文本所在的图像片段。

11_8

11_9

上图是整个过程的一个示意图,下面两张图像中的白色部分对应原始图像中的文本位置,其中右面这张是对左面那张的整合处理(大概应该就是将作图中挨着的白色片段整合成一大块)。接下来是字符切割,我们仍然使用滑动窗口,下图给出了positive examples和negative examples。注意,我们要的positive examples是这种恰好处在两个字符中间的这种位置,在这种位置我们才能准确将字符切分开来。

11_10

最后一步是进行字符的识别:

11_11

Getting Lots of Data and Artificial Data

这一小节介绍人工数据合成(artificial data synthesis)。下图给出了实际遇到的数据,我们应该能够从这些图像(这里我们使用的都是灰度图像,比彩色的更好一些)片段中准确识别出字符。另外字符可能会使用多种不同的字体,那如何得到更多的训练样本呢?我们可以将不同字体的不同字符随机的粘贴到不同的背景上得到人工合成的训练样本,下面第二张图为示意。通过这种方法,我们可以获得大量与原始数据很相似的合成数据。

11_12

11_13

另外一种方法是通过将原有的图像片段做扭曲处理来得到新的训练样本,具体如下图所示:

11_14

视频还给出了语音识别通过引入扭曲来人工合成数据的例子,通过对原始录音(original audio)处理,得到以下合成数据:夹杂电话信号不好的杂音的录音(audio on bad cellphone connection)、嘈杂环境下的录音(audio on crowd background)、机器运转环境下的录音(audio on machinery background)。最后,我们说所有的合成数据应该都是基于原始数据(即原始数据中必须包含有效信息)的,不能向数据集中添加没有意义的噪声。

在增加更多训练数据之前,我们应该确保模型是low bias的,因为只有这样的模型才能通过增大training set来改善其性能。例如,对于神经网络,我们可以通过增加特征数量,模型层数来确保模型是low bias的,然后再增大training set。

视频介绍的最后一个问题是获得数据的时间开销,在实际应用中,我们应该将其作为一个成本来考虑,具体就不写了。(我觉得吧,没啥可写的,给出一张截图)

11_15

Ceiling Analysis: What Part of the Pipeline to Work on Next

这一小节介绍上限分析(ceiling analysis)。上限分析可以帮助我们分析整个pipeline的哪一步更值得我们去优化,以获得更好的性能。假设我们在test set上测试我们的模型,得到72%的accuracy。第一步,我们用人工去做text detection部分的工作(此时,该部分的accuracy达到100%),此时模型的accuracy提升到89%。第二步,我们再用人工去完成character segmentation部分的工作(此时该部分的accuracy也达到100%),然后模型的accuracy达到90%。第三步,我们用人工去完成character recognition的工作,最终模型的accuracy达到100%。我们得到下面这张表:

11_16

分析上面这张表,我们发现通过对pipeline中三个步骤的提升,我们可以分别将模型的accuracy增加17%、1%、10%。前面我们对三个步骤的提升已经达到上限(三个步骤的性能均分别优化到了100%,不能更好),由此得到的三组数据也是上限,这就是上限分析。由此,我们知道对text detection和character recognition两个步骤的优化能够更大程度的改善整个pipeline的性能,所以我们要优先考虑优化这两个步骤。

下图给出了面部识别的pipeline,供我们加深理解。

11_17

对该pipeline的上限分析见下图,从这张图我们知道最值得优化的步骤是face detection。

11_18

Conclusion

Summary and Thank you

最后一小节,总结了这门课程的所有内容,见下图。

11_19

认真学完了这门课程,我们就了解了机器学习的一些基本算法和一些技巧,算是勉强入了门。接下来还有更多的东西等待着我们去学习。