PeterHuang0 2020-05-26
将介绍一种机器学习的应用实例:照片OCR技术,介绍它的原因:
(1)首先,展示一个复杂的机器学习系统是如何被组合起来的;
(2)接着,介绍一下机器学习流水线的有关概念以及如何分配资源来对下一步计划作出决定;(适用于个人或者团队开发机器学习应用)
(3)最后,介绍一下照片OCR问题,展现机器学习中有用的想法和概念,其中之一就是应用在计算机视觉问题中,另一个是人工数据合成的概念。
照片OCR的全称为照片光学字符识别,它注重的问题是如何让计算机读出图片中的文字信息(方便以后输入文字即可查找照片),它有以下几个步骤:
(1)首先,给定某张图片,将图像扫描一遍; (2)然后,找出照片中的文字信息,找出文字后,重点关注这些文字区域,并对区域中的文字进行识别; (3)正确读取中照片中的文字后,将这些文字内容显示并记录下来。
三个步骤:
文字检测、字符分割、字符分类(可以含有修正系统,修正部分单词);
在复杂的机器学习系统中,流水线的概念已经渗透到各种应用中,上图就是照片OCR流水线的具体运作流程,接下来将继续介绍流水线的有关内容。(不同模块可以分别、并行完成)
讨论一种滑动窗口分类器的方法。
图像OCR流水线的第一步是文字识别,文字识别在计算机视觉中是比较难的问题,因为根据找到的文字区域和它们对应的矩形具有不同的长宽比例,如下图:
不同的长宽比例具有一定难度,所以先来讨论一下行人检测的问题:
在行人检测中,找出图片中的行人,如下图:
这个问题与文字识别问题的简单的地方在于要识别的东西具有相似的长宽比,仅用一个固定长宽比的矩形就行了,所以为建立一个行人检测系统,需要这样做:
例如,把长宽比设为82*36,然后从数据集中收集一些正样本(y=1,包含行人的照片)和负样本(y=0,不包含行人的照片),接着可以在网络中训练或者使用其他学习算法向其中输入一个82*36的图块来对y进行分类,来划分每个图块是否包含一个行人。
所谓的滑动窗口分类器是:首先在图片中选取一个矩形块,比如一个82*36的图块,把这个图块传递给分类器,来检测图片中是否有行人,若有返回y=1,若没有返回y=0,接下来把绿色矩形块稍稍移动一点,接续刚才的操作,然后继续向右滑动窗口,直到这个矩形块在整个图片各个位置都过一遍,滑动窗口每次移动的距离是一个参数,称为步长/滑动参数。
....
如果选择的矩形块小了,则再用大一点的矩形块再做一次滑动的过程。
这就是如何训练一个监督学习分类器,然后使用一个滑动窗口分类器,来找出图中的所有行人。
接下来回到文本检测的这个例子中来:
与行人检测类似拿出一系列包含正样本和负样本的训练集,正样本是对应含有文字的图块,负样本是对应没有文字的图块。
使用了滑动窗口的文本检测系统,通过找出这些包含文字的矩形,将这些区域剪切出来
然后进入流水线的下个阶段,也就是识别文本。
流水线的第二步是字符分割,给定如下所示的图:
如何分割出图中的单个字符,要再次使用监督学习算法,用些正样本(存在分割线)和负样本。(也需要进行滑动窗口操作)
现在观察这些图块,然后判断出图块中是否文字分割的地方,所以对于初始的正样本,即左边的图片,确实存在两个字符分割的地方,而右边的图片不能表示两个字符的分割。所以,要训练一个分类器尝试将正负样本进行区分,训练完这些分类器后,可以将它们运行在文字检测系统输出的这些文本中,同样用到滑动窗口分类器,如下图:
慢慢的向右移动,最后可以将图像中的文本全部分割成单个字符:
这就是OCR识别流水线的全部过程以及使用滑动窗口这样的思想,来组合这些不同的组件,开发出图片OCR系统。
之前提及:一个最可靠得方法得到高性能机器学习系统得方法是使用一个低偏差机器学习算法,并且使用庞大得训练集去训练他。但是我们从哪获取这么多得训练集数据?
(1)自己创造数据(从零生成新数据);
(2)已经有小的标签训练集,然后以某种方式扩充训练集。
这里继续使用字符识别的例子进行讨论:
假如收集到一个大的标签数据集,如下图:
目标是输入一个图像块后识别出图像块中央的字符,这里的所有例子都是真实图像,那么怎样才能得到一个更大的训练集呢?
一个方法是用不同的字体生成符,然后将其粘贴到任意不同的背景中,这样做了之后,就会得一个人造训练集,如下图:
可以看到上述图中的合成数据,它实际上与真实的数据非常相似,那么使用合成数据实际上能为人工训练合成提供无限的训练数据样本。
在这个人工数据合成的例子中,基本上是从零开始生成新数据。
接下来介绍另一种生成人工数据的方法:使用现有的样本生成数据。
例如,下图是一张字符A的图像,它取自一张真实图像,而不是合成图像:
接下来对这个字母这张图进行人工拉伸,这样可以把A编程16个新的样本,采用这种方法就能够将一个小的标签数据集扩充为一个更大的训练集:
这里举另一个不同领域的例子:语音识别。
假定有一些音频片段,想从中学习来识别语音片段中出现的单词,如果有一个带标签的训练样本(某人从one数到five的语音片段),想尝试应用一个学习算法来识别那个人说的单词,那么如何扩充数据集呢?
可以做的是引入额外的语音失真到数据集中,这里将加入不同的背景音来模拟手机通话信号不好的情况,因此,只需要花功夫收集一个标签样本,通过人工添加失真(引入不同的背景音),很容易将一个样例扩充为更多的样本。
应该注意:选择失真时,应该认真考虑一下,哪一种失真应该添加,是有意义的。怎样才能使得生成的数据带有一定代表性。
图二中,添加的失真就没有意义,添加了高斯噪声,改变了亮度信息等。
标准的做法是绘制一个学习曲线来确保有一个低偏差、高方差的分类器。如果分类器的偏差太高,那么可以尝试持续增加分类器的特征数量或增加神经网络隐藏单元数,直到偏差值降低。再花费时间到生成大量的人工训练集上。
1.人工数据合成方法(上面两种) 2.自己收集或是添加标签 3.“众包”(众包数据标记)---雇人
这一节中,我们探讨了人工数据合成的两种方法,希望能记住一点是:加假如遇到一个机器学习问题有两件事是值得做的,一个是用学习曲线做一个合理检验,另一个是问一下要花费多少资源才能获得当前数据的10倍。
将介绍关于上限分析的内容,当在设计某个机器学习系统工作流时,这种方式通常能提供一个很有价值的信号来指导工作流中的哪一部分最值得花时间去研究。
为了讲解上限分析,这里继续使用照片OCR工作流的例子:
这些模块中,哪一块最值得投入精力去做?假设当前得到整个系统目前地准确率为72%,下面是上限分析的主要思想:
1.首先,关注机器学习工作流中的第一模块(文本检测),遍历整个测试集,人为地直接给出正确答案或标签来给工作流的文本检测部分,然后用这些正确的标签传给工作流的下一阶段,度量整个系统的准确率提高到89%;
2.同前面一样,找出测试集,现在不仅用正确的文本检测结果,还同时用标准的字符分割结果,人为地把文本标记成单个字符,然后度量整个系统的准确率提高到90%;
3.最后执行字符识别模块,同样是人工给出这一模块的正确标签,然后度量整个系统的准确率提高到100%;
进行上限分析的好处就是理解了,如果对每一个模块进行改善,它们各自的上升空间有多大,可以从上述得到结论:
如果在现有的系统基础上花费时间和精力改善文本检测模块的效果,可以提高系统17%的性能;而花费精力改善字符分割模块,性能只提高了1%;同样地,如果花费精力改善字符识别模块,系统性能提高了10%。这就估计出了性能的上限,通过这种分析,可以知道提升每个模块的潜在效果如何。
下面再用一个人脸识别例子来阐述上限分析的思想:
假设用图片做人脸识别,希望能辨识图片中人,想通过这个例子展现一个工作流,给出上限分析,假设对给出的图片给出如下的工作流:
还是假设当前得到整个系统目前地准确率为85%。
第一步,人为地去掉图片背景,准确率提高到85.1%;第二步,遍历测试集,给出正确的脸部识图案,准确率提高到91%;第三步,依次运行眼睛、鼻子和嘴巴的分割,准确率分别提高到95%、96%和97%;第四步,最终给出正确的标签,准确率提高到100%。可能最值得关注的是脸部识别的这个步骤,性能提高了5.9%,这样就能很清楚看到不同步骤系统性能的上升程度。
总结一下:工作流是非常常用却又很复杂的机器学习应用,当在开发某个大型机器学习应用的时候,作为一个开发者,时间是很宝贵的,应该花在值得去研究的模块,所以上限分析是很好的方法,可以帮助判断哪个模块是值得花精力去改善的。
在整个机器学习课程中,花了很长时间来讲监督学习算法:
比如线性回归、逻辑回归、神经网络以及支持向量机,这些问题中,会有带标签的数据和样本;
同样,也花了很长时间讲无监督学习算法:
比如K-Means算法、主城分分析法(PCA)以及异常检测算法,在这些问题中,只有无标签数据,当然有时候异常检测算法可以用有标签数据对算法进行评估;也用了一些时间来讲一些特定的应用和话题:比如推荐系统以及大规模机器学习系统(包括MapReduce思想),滑动窗口分类器解决计算机视觉的应用。
最后,也花了时间从各个不同的方面给出了如何构建机器学习系统的建议:
讨论了偏差和方差以及如何使用正则化解决一些方差问题、讨论了在开发机器学习系统时如何合理分配时间、讨论了学习算法的评价方法、召回率和F1-score这样的评价指标、讨论了实践方面的评测方法:比如训练集、交叉验证集和测试集;还花了很多时间介绍了如何调试算法,讲了一些诊断方法:比如学习曲线、误差分析和上限分析的内容。
机器学习是一门在科学、技术和产业方面都有深远影响的学科,我们要做的不仅是认识这些工具和算法,更重要的是怎样有效地使用它们来构建强大的机器学习系统。