博客已经迁移至Marcovaldo’s blog (http://marcovaldong.github.io/)git
刚刚完毕了Cousera上Machine Learning的最后一周课程。这周介绍了machine learning的一个应用:photo OCR(optimal character recognition,光学字符识别),如下将笔记整理在如下。github
最后几小节介绍机器学习的一个应用——photo OCR(optimal character recognition。光学字符识别),这同样例的内容也可以应用于计算机视觉(computor vision)。photo OCR要解决的问题是怎样让计算机识别出图像中的文字。给定一张图像,photo OCR首先要作的是肯定当中文字的位置,例如如下图所看到的:算法
而后将当中的文字正确转录下来。windows
photo OCR还是机器学习的难点之中的一个。它可以帮助盲人“看到”面前的事物,可以帮助汽车本身主动识别道路上的物体。促进本身主动驾驶技术的实现。markdown
为了实现photo OCR,咱们要作的几个过程例如如下:
- 文本探測(text detection),肯定文本在图像中的位置
- 字符分割(character segmentation),将含有文本的图像片断分割出来,并按一个一个字符切分
- 字符识别(character classification),将图像中的字符准确的识别出来
固然实际的操做可能要复杂得多,但总体上就是这几步,这被称为photo OCR pipeline网络
这一小节介绍photo OCR的一个细节——滑动窗体(sliding windows)。咱们使用的路人探測(pedestrain detection)的样例来引出滑动窗体,下图中含有多个路人,随着路人与相机距离的大小。表明路人的矩形尺寸不一样,但原理同样。机器学习
咱们在路人探測中使用监督式学习,咱们的数据是一个个图像片断,尺寸为
若是有这样的图像片断数千份。那咱们就可以从中训练到一个hypothesis,用于推断新的图像片断中是否含有路人。咱们拿上面的那张图像作test set,找出当中的路人。咱们从图像的最最左上角选择一个尺寸为
而后向右滑动窗体,假定步长为4(固然,步长为1精确度最高,但速度降低,依据实际状况调整)。每滑动一次推断一次。滑动最左側以后。再从最左側向下滑动一个步长再向右滑动。直至滑动到整个图像的最最右下角,就扫描完了整张图像。学习
如下回到photo OCR,此问题的positive examples和negative examples例如如下图所看到的。
而后使用上面讲的滑动窗体去扫描整个图像。找到文本所在的图像片断。
上图是整个过程的一个示意图。如下两张图像中的白色部分相应原始图像中的文本位置,当中右面这张是对左面那张的整合处理(大概应该就是将做图中挨着的白色片断整合成一大块)。接下来是字符分割,咱们仍然使用滑动窗体。下图给出了positive examples和negative examples。注意,咱们要的positive examples是这样的恰优势在两个字符中间的这样的位置,在这样的位置咱们才干准确将字符切分开来。
最后一步是进行字符的识别:
这一小节介绍人工数据合成(artificial data synthesis)。下图给出了实际遇到的数据,咱们应该可以从这些图像(这里咱们使用的都是灰度图像,比彩色的更好一些)片断中准确识别出字符。
另外字符可能会使用多种不一样的字体,那怎样获得不少其它的训练样本呢?咱们可以将不一样字体的不一样字符随机的粘贴到不一样的背景上获得人工合成的训练样本,如下第二张图为示意。
经过这样的方法,咱们可以得到大量与原始数据很是相似的合成数据。
第二种方法是经过将原有的图像片断作扭曲处理来获得新的训练样本。详细例如如下图所看到的:
视频还给出了语音识别经过引入扭曲来人工合成数据的样例,经过对原始录音(original audio)处理,获得如下合成数据:夹杂电话信号很差的杂音的录音(audio on bad cellphone connection)、嘈杂环境下的录音(audio on crowd background)、机器运转环境下的录音(audio on machinery background)。
最后,咱们说所有的合成数据应该都是基于原始数据(即原始数据中必须包括有效信息)的,不能向数据集中加入没有意义的噪声。
在添加不少其它训练数据以前。咱们应该确保模型是low bias的,因为仅仅有这样的模型才干经过增大training set来改善其性能。
好比,对于神经网络,咱们可以经过添加特征数量,模型层数来确保模型是low bias的,而后再增大training set。
视频介绍的最后一个问题是得到数据的时间开销,在实际应用中,咱们应该将其做为一个成原本考虑。详细就不写了。(我认为吧。没啥可写的。给出一张截图)
这一小节介绍上限分析(ceiling analysis)。上限分析可以帮助咱们分析整个pipeline的哪一步更值得咱们去优化,以得到更好的性能。若是咱们在test set上測试咱们的模型,获得72%的accuracy。第一步。咱们用人工去作text detection部分的工做(此时,该部分的accuracy达到100%),此时模型的accuracy提高到89%。第二步,咱们再用人工去完毕character segmentation部分的工做(此时该部分的accuracy也达到100%)。而后模型的accuracy达到90%。第三步。咱们用人工去完毕character recognition的工做。终于模型的accuracy达到100%。咱们获得如下这张表:
分析上面这张表,咱们发现经过对pipeline中三个步骤的提高,咱们可以分别将模型的accuracy添加17%、1%、10%。前面咱们对三个步骤的提高已经达到上限(三个步骤的性能均分别优化到了100%,不能更好),由此获得的三组数据也是上限,这就是上限分析。由此,咱们知道对text detection和character recognition两个步骤的优化可以更大程度的改善整个pipeline的性能。因此咱们要优先考虑优化这两个步骤。
下图给出了面部识别的pipeline,供咱们加深理解。
对该pipeline的上限分析见下图,从这张图咱们知道最值得优化的步骤是face detection。
最后一小节。总结了这门课程的所有内容,见下图。
认真学完了这门课程,咱们就了解了机器学习的一些基本算法和一些技巧,算是勉强入了门。接下来还有不少其它的东西等待着咱们去学习。