Andrew Ng机器学习coursrea课程学习笔记(第11周)

应用案例:照片OCR(Application Example:Photo OCR)

1.问题描述与流水线(Problem Description and Pipeline)

照片OCR问题:

照片OCR,表示照片光学字符识别(photo optical character recognition)。这种照片OCR技术,主要解决的问题是让计算机读出照片中拍到的文字信息。如下图所示:

Andrew Ng机器学习coursrea课程学习笔记(第11周)_第1张图片
image

机器学习流水线案例:(照片OCR)

照片OCR技术,包括三个主要流程:

  1. 文本检测:找出照片中包含的文字区域。
  2. 字符分割:将文本区域进一步分割,分割成一个一个的字符。
  3. 字符分类:识别每个字符区域,并输出该字符。

最后,将输出的每个字符连在一起,就实现了照片OCR(照片文本识别)的功能。

我们将该系统进行分解成多个流程,像这样的一个系统,我们把它称之为机器学习流水线(Machine Learning Pipeline),用以下图表示:

应用流水线设计机器学习系统的好处:

  • 在很多复杂的机器学习系统中,这种流水线形式都非常普遍,在流水线中会有多个不同的模块 。
  • 如果你有一个工程师的团队,在完成同样类似的任务,那么通常你可以让不同的人来完成不同的模块。

2. 滑动窗(Sliding Window)

本节将讨论滑动窗(sliding windows)的分类器,并如何利用滑动窗分类器,实现照片OCR技术。

滑动窗分类器案例:(行人检测):

在一张图片中,人一般有相似的宽高比, 因此可以使用一个固定宽高比的矩形来分离出你希望找到的行人。如下图所示

Andrew Ng机器学习coursrea课程学习笔记(第11周)_第2张图片
image

为了建立一个行人检测系统,以下是具体步骤:

假如说我们把矩形宽高比标准化到 82比36这样一个比例。

  1. 构造行人检测分类器:街上去收集一大堆正负训练样本,包括有行人的和没有行人的图像样本(82×36大小)。得到大规模训练样本后,使用监督学习算法,构建一个分类器:有行人和没有行人。
  2. 检测:在需要检测的图片上取一小块矩形框(窗口)82×36的图像块(初始位置可以为最左上区域),使用行人检测分类器进行预测。
  3. 滑动窗口:然后滑动矩形框(窗口)几个像素点,又得到82×36的图像块,使用行人检测分类器进行预测。不断重复步骤3,直到矩形框滑动到最末端。(类似于遍历检测方法)
    • 每次滑动窗口的大小是一个参数,通常被称为 步长(step size),有时也称为步幅参数(stride parameter)
  4. 调整窗口大小:但这个矩形框(窗口)是非常小的,只能探测到某种尺寸的行人,接下来我们要做的,用更大一些的矩形框(窗口),传入分类器运行 ,并同样的滑动矩形框。

因此整个步骤就是:先训练一个分类器,然后用一个滑动窗分类器(滑动窗检测器)来找出图像中出现的行人 。

文本检测:(利用窗口滑动分类器)

文本检测为照片OCR系统流水线设计中的第一个模块。

文本检测与行人检测的区别:

  • 文本矩形区域会呈现不同的宽高比 。

具体步骤:

  1. 构建字符检测分类器:(类似行人检测),需要收集许多带字符,和不带字符的图片,使用监督学习算法,构建字符检测分类器:有字符,和没有字符。

  2. 使用滑动窗口分类器,检测出可能有字符的区域,如下图所示。

    Andrew Ng机器学习coursrea课程学习笔记(第11周)_第3张图片
    image
  3. 使用"展开器"(expansion operator)扩展白色区域,使单个字符区域连成一个文本区域,并剔除异常白色区域(比如异常的高宽比,高远远大于宽)。

    Andrew Ng机器学习coursrea课程学习笔记(第11周)_第4张图片
    image
  4. 最后,就得到了文本区域,实现了文本检测的功能。

字符分割:(利用一维滑动窗分类器)

字符分割是照片OCR系统流水线设计中的的第二个模块。

设计一维滑动窗口,如下收集样本:

Andrew Ng机器学习coursrea课程学习笔记(第11周)_第5张图片
image
  • 左边代表正样本,即可以分割,我们在中间画一条分割线即可
  • 右边的代表负样本,即,不能分割。

通过监督学习算法,对其进行训练,得到分割检测分类器,然后,在得到的文本区域,滑动一维滑动窗口,利用分割检测分类器检测为正样本的窗口,在窗口中间进行分割,从而实现字符分割。

字符识别

字符识别是照片OCR系统流水线设计中的最后一个模块。

字符(这里指的是英文字符识别)包括26个英文字母,以及有限的数字及标点,使用一种标准的监督学习算法,即可得到字符识别分类器。(相对简单)

3.获取大量数据和人工合成数据(Get Lots of Data and Artificial Data)

获得高效机器学习系统的最可靠方法之一:

  • 选择一个低偏差的学习算法,然后用一个巨大的训练集来训练它。

那么,如何获取大量的数据?

  • 人工数据合成是其中一个不错的方法。

人工合成数据案例一:(字符识别)

照片OCR流水线中的字符识别问题中,我们就需要大量的数据(字符),我们可以采用人工合成的方法获取。

人工字符图像合成的步骤:

  1. 获取原始数据:如计算机中有很多现成的字库,有不同字体的字符,我们可以从中得到,其次,网络上,也有许多现成的字符库,也可以供我们选择。我们就可以获得一部分数据。

  2. 人工合成数据:对原始字符图像引入扭曲变形(distortions)的操作就可以获得大量不同的样本,事实上,这些扭曲变形的失真字符,很接近实际的字符。如下图所示:(以字符"A"为例)

    Andrew Ng机器学习coursrea课程学习笔记(第11周)_第6张图片
    image

人工合成数据案例一:(语音识别)

  1. 得到原始语音(纯净的音频,无噪声)。
  2. 对原始语言进行处理,模拟通话不流畅的情况。
  3. 加入喧杂的背景音效(如在马路上,在工厂)。

引入变形的方法的注意事项:

  • 选择要引入的干扰或变形,要能代表你可能会在测试集中看到的噪音源或干扰项。

所以,对于字符识别这个例子 这种扭曲的方法,事实上还是很合理的,因为像这种扭曲的图像A的情况,我们确实有可能在测试集中会遇到,比如胖胖的A 等,我们可以想象会遇到这种写法 。

无效的变形的方法:

  • 例如对于字符识别,加入随机高斯噪声,对于训练是没有太大的帮助的。

对获取大数据的讨论:

获取大型数据的前提:(重点)

  • 有一个低偏差的机器学习模型,否则获取大型数据是没有意义的

如何获取大数据(得到当前10倍大小的数据集)?

  • 人工数据合成。
  • 自己收集并标签。(事实上并不是很费时间,对于10000个数据,自己对数据贴标签,一般4天就能完成。)
  • 众包 (crowd sourcing): 现在已经有一些网站或者一些服务机构,能让你通过网络雇一些人替你完成标记大量训练数据的工作,通常都很廉价。(如Amazon Mechanical Turk网站)

4.上限分析:应该重点关注流水线的哪个模块(Ceiling analysis:What part of the pipeline to work on next)

开发机器学习系统时最宝贵的资源:时间

作为一个开发者,需要正确选择下一步的工作,或者也许你有一个开发团队,或者一个工程师小组,共同开发一个机器学习系统,同样,最宝贵的还是开发系统所花费的时间 。避免花费徒劳的时间,或者性价比不高的事情。

上限分析(ceiling analysis):当你自己或你跟你的团队在开发机器学习系统的流水线时,这种方式通常能,提供一种很有价值的信号,或者说很有用的导向,告诉你流水线中的哪个部分最值得你花时间 。

上限分析案例一(照片OCR):

照片OCR系统流水线结构如下:

\bbox[border:2px solid black;padding:4px ] { \text{图片} } \rightarrow \bbox[border:2px solid blue;padding:4px ] { \text{文本检测} } \rightarrow \bbox[border:2px solid blue;padding:4px ] { \text{字符分割} } \rightarrow \bbox[border:2px solid blue;padding:4px ] { \text{字符分类} }

当构建好系统之后,需要提高系统的性能,但是,我们应该在哪个模块花费更多的时间去提高?

  • 这个时候,可以采用上限分析。
  1. 首先,对系统进行测试,假设得到系统的准确率为72%;
  2. 然后我们人工对图片进行文本检测,得到100%正确的文本区域,再进行后续步骤,得到系统的准确率为89%;
  3. 然后人工进行字符切割,得到100%正确的字符区域,进行后续步骤得到系统的准确率为90%;
  4. 如果人工进行字符分类,得到的100%结果,那么系统的准确率肯定为100%,无需测试。
  5. 对比上一个阶段,准确率的提升,并构建下表:

\begin{array}{c|lcr} \text{模块} & \text{系统准确率} &\text{提高} \\ \hline \text{整个系统}& \text{72%} \\ \text{文本检测} &\text{89%}& \text{17%} \\ \text{字符分割}&\text{90%} & \text{1%}\\ \text{字符分类}&\text{100%}& \text{10%} \\ \end{array}

从表中可以看出来,

  • 人工进行字符切割,准确率只提高了1%,说明,字符分割模块可以提高的空间,只有1%,该算法已经表现的很好了,不应该花费太多的时间再提高字符分割算法上,因为,再怎么提高,也不会超过1%。
  • 而文本检测的算法提升空间有17%,字符分类的算法提升空间有10%,所以,我们应该花费更多的时间,在提高字符分割和字符分类算法上。

上限分析概念

  • 通过这样的分析,就能总结出,改善每个模块的性能,系统的上升空间是多少,或者说如果其中的某个模块变得绝对完美时,你能得到什么收获,这就像是给系统表现加上了一个提升的上限值。

上限分析案例二(人脸识别):

人脸识别系统流水线结构如下图:

Andrew Ng机器学习coursrea课程学习笔记(第11周)_第7张图片
image

测试系统的不同模块,得到系统准确度,如下表:
\begin{array}{c|lcr} \text{模块} & \text{系统准确率} &\text{提高} \\ \hline \text{整个系统}& \text{85%} \\ \text{预处理(移除背景)} &\text{85.1%}& \text{0.1%} \\ \text{人脸检测}&\text{91%} & \text{5.9%}\\ \text{眼睛分割}&\text{95%}& \text{4%} \\ \text{鼻子分割}&\text{96%}& \text{1%} \\ \text{嘴巴分割}&\text{97%}& \text{1%} \\ \text{逻辑回归}&\text{100%}& \text{3%} \\ \end{array}
如上表所示:

  • 预处理(移除背景)提高的空间只有0.1%,这是个很明显的信号,它告诉你即便你把背景分割做得很好,完全去除了背景图案,但整个系统的表现也并不会提高多少,所以似乎并不值得花太多精力在预处理或者背景移除上。
  • 脸部检测提高上限为5.9%,还是有很大的提升空间的,是需要花时间提高的模块。同理,眼睛分割,逻辑回归这块,也是需要花时间去提高模块性能的。

总结一下 :

  • 流水线是非常常用却又很复杂的机器学习应用
  • 在开发某个机器学习应用的时候,作为一个开发者,时间是相当宝贵的,所以真的不要花时间去做一些到头来没意义的事情 。
  • 上限分析,在判断应该改进哪个模块上,是个很有用的工具,当你真的把精力花在那个模块上 并且改进了它 它真的会让整个系统的表现 有一个显著的提高。(上限分析通常比直觉可靠)

课程总结

到目前为止,Adrew Ng的机器学习就结束了,现在,总结一下知识点:

监督学习算法:

  • 线性回归(Linear regression)
  • 逻辑回归(Logistics regression)
  • 神经网络(Neural networks)
  • 支持向量机(SVMs)

非监督学习算法:

  • K-means聚类
  • 主成分分析(PCA)
  • 异常检测(Anomaly detection)

特殊应用/主题:

  • 推荐系统(Recommender system)
  • 大规模数据机器学习(Large scale machine learning)

构建机器学习系统的建议:

  • 偏差/方差,正则化(Bias/Variance,regularization)
  • 下一步应该做什么?(decide what to work on next)
  • 学习算法的评估(evaluation of learning algorithm)
  • 学习曲线 (learning curves)
  • 误判分析(error analysis)
  • 上限分析(ceiling analysis)


全文参考 :coursera机器学习课程(Andrew Ng讲授)相关视频及讲义

你可能感兴趣的:(Andrew Ng机器学习coursrea课程学习笔记(第11周))