吴恩达机器学习Coursera-week11

Photo OCR

在此章的课程中,Andrew主要是想通过OCR问题的解决来阐释在实际项目中我们应该如何定义问题,并将一个大问题分解为多个小问题,并通过pipeline的方式将对这些小问题的解决方案串联起来,从而解决这个大问题。我认为这是解决实际问题的一个经典的方法论,有助于我们在实际工作和生活中更好地思考问题,分解问题,并最终解决问题。

Problem Description and Pipeline

此小节主要是通过Photo OCR(Optical Character Recognition)问题来阐释什么是pipeline. OCR简单说就是识别图片中的文字的问题。那么要解决这个问题,实际我们可以分解为三个小一点的问题,即 1,识别出有文字的区域;2,分割字符;3,识别字符。如下图所示:


1.1- Photo OCR pipeline

每一个问题可能都需要一个功能模块去解决,而不同的模块又可以分给不同的工程师去解决,从而可以通过team work的方式来解决一个实际的问题。如下图所示:


1.2- pipleline

Sliding Window

文字区域识别是一个相对较难的问题,因为文字识别区域会有非常多的变化,宽高比都不固定,所以Andrew先以人物识别为例讲述如何进行识别(因为人物,尤其是站立的人物,其宽高比是基本固定的)。那么,我们自己想象一下该如何去识别呢?(我最开始的想法是只要有人出现这个图片就判定为1,没有人就判定为0,但问题是这并没有圈定人物区域,直到看到课程中讲到滑动窗口的概念才恍然大悟)。先看看Andrew在课程中讲述的如何识别人物,如下图所示:


1.3-supervised learning for pedestrian detection
  • 我们需要首先收集样本,Andrew的例子中样本是固定的82x36分辨率的图片,有人物的标记为1,没有人物的标记为0
  • 通过有监督学习,我们就有了一个模型可以识别类似图片中是否有人

之后,就是我们要说的滑动窗口(sliding window)了


1.4-sliding window detection
  • 我们可以用同样宽高比例的方框,从图片一角开始滑动,每次滑动所取的区域图片都可以利用我们之前训练的模型来识别是否有人,这样从头到尾的滑动一遍之后,我们就知道那个区域有人,哪个区域没有人。
  • 滑动的距离被定义为step-size或者stride,可以是一个像素,也可以是多个像素。step-size越小则最后可能识别错误的可能越小
  • 由于远近的关系,图片中有的人物会比较大,有的会比较小,所以我们可能需要不同尺寸的矩形框去扫描。但是需要注意的是即使使用了不同尺寸我们也可以保持同样的宽高比,然后再将原尺寸矩形框通过拉伸或者压缩使得其符合82x36的分辨率,然后再使用模型进行识别。

针对文字识别,我们可以使用类似的方法进行滑动窗口识别,同样我们需要先训练一个模型,针对有文字的图片标记为1,没有文字的标记为0,这样训练出一个模型。


1.5-training text detection model

之后再利用滑动窗口的方法对要识别的图像进行滑动扫描,如下图:


1.6-sliding window for text detection
  • 在文字识别的时候先使用较小的矩形框进行滑动识别,并根据框中是否有文字的概率来选择不同的灰度进行置灰,当有文字的概率越高,灰度越小(左下图中白色两点),相反越黑。
  • 然后我们通过expansion,将白色方框区域进行拓展使其连成一片区域。
  • 最后将符合我们宽高比的区域进行框选即可

下一步,是将有文字的区域送人下一个pipeline,进行文字分割,首先也要有一个模型,来训练其识别字符的分割线,如下图所示:


1.7-1D sliding window for character segmentation
  • 训练分割字符的模型,将中间可分割的图片标记为1,不可分割的图片标记为0,从而训练出一个模型。
  • 然后再利用滑动窗口在我们之前框出的文字区域进行滑动识别,从而分割字符

分割好之后,就是利用我们之前课程讲过的文字识别的模型进行文字识别即可。

Getting lots of data and artificial data

此小节主要讲了如何获得大量数据,其中一个技巧就是人造数据,通过合成,distortion等方法我们可以生成一些“假”的数据,但是这些数据却能大幅提升我们模型的性能。

Andrew首先举了一个字符识别的例子,如下图:


1.8-artificial data synthesis for photo OCR
  • 这里是通过把不同font的字符放到不同的背景中合成新的样本

还有不同的方式来人工生成的数据,是通过引入distortion来生成新的样本,如下图:


1.9-introducing distortions

另外,不同的领域合成数据的方式是不同的,比如在语音识别领域,我们是通过引入不同的背景噪音来合成新的样本数据,如下:


2.0-introducing noise background for voice recognition

最后,关于数据作者强调了如下两点:


2.1-about data
  • 即在增加数据之前首先要确认你已经有了一个low bias的模型,其实也就是我们之前课程所说的要先看看我们模型目前面临的是一个什么问题,是high bias问题还是high variance问题,只有当我们解决了high bias问题之后,才需要考虑增加数据量的问题。
  • 通常在项目中我们需要问下“要获取10倍的数据量需要投入多少资源(人力和时间)”,通常,很可能我们不需要花费太多的时间就可以获取到10倍的数据量,从而大幅提升我们的模型的性能。
  • 作者还介绍几种获取大量数据的方法,除了之前讲到的人工合成数据,自己标记之外,还可以找相应的众包网站,去雇佣其它人来进行标记。

Ceiling Analysis

所谓Ceiling Analysis(上限分析)实际是分析Pipeline中每个module队算法的影响度的分析,即哪个模块对算法的改进最有用,然后我们把我们的精力资源投入到那个产出更高的模块。具体做法如下:


2.2-ceiling analysis
  • 我们首先使用我们现有的model在测试集中测试下错误率,本例是72%
  • 然后我们将text detection模块的输出数据均使用100%正确的数据(比如人工检查圈选),然后再用模型跑一下测试集,这时候我们会得到一个新的错误率,本例是89%, 这样我们就知道当我们改进我们text detection模块时,我们最多可以让系统性能提升17%(89%-72%)
  • 同样道理,我们可以接着讲character segmentation输出的数据全部设置为正确的输出,再看总的error rate,这次是90%,说明改进character segmentation对系统整体性能的提升非常有限,只有1%,那么我们可以不必花精力在这个模块上了。
  • 以此类推,可以看到character recognition模块对于系统的整体提升可以有10%的贡献度

之后,Andrew又举了一个更复杂的例子,但是大同小异


2.3-another ceiling analysis example

总的来说,我们在一个项目的pipeline中,要通过ceiling analysis来分析究竟哪个模块的改善对于我们系统的整体性能提升有的大的帮助,然后将我们resource投入到哪些可能带来最大改善的模块中更加有意义。

至此,我们机器学习的课程就全部完结了,非常感谢Andrew,他的课程真的非常棒!

你可能感兴趣的:(吴恩达机器学习Coursera-week11)