机器学习笔记041 | 机器学习的流水线和资源分配

一个复杂的机器学习系统是如何组合起来的呢?机器学习的资源应该如何分配呢?
下面我们通过图片光学字符识别(photo optical character recognition,Photo OCR)技术来进行一个简单的介绍。
1 机器学习流水线(machine learning pipeline)
什么是 Photo OCR 呢?
例如有这样的一个图片:

我们想要识别出来其中的一些字符,并解析其含义:

这个过程就是 Photo OCR 。
举个例子,如果能够识别街道路牌上的信息,汽车不就可以自动导航了么?这就是 Photo OCR 的其中一个应用。
这个过程中,其实需要解决三方面的问题。
文字侦测(Text detection):

字符分割(Character segmentation):

字符识别(Character recognition):

具体来说,就是我们有一副图像,传递给文字侦测系统,识别出文字之后,将文字分割成独立的字符,然后对单个字符进行分类识别。
这样一个过程,被称为机器学习流水线(machine learning pipeline) :

2 滑动窗口(Sliding Windows)分类器
那么文字是怎么被检测出来的呢?
在此之前,我们先看看一个行人检测的例子。
行人的宽高比大致是相似的,例如我们有一些些 82 × 36像素的图片:

通过这些数据,我们可以训练出来一个分类系统,识别哪些是行人:

图中的绿框是怎么找到这些个行人的呢?
滑动窗口(Sliding Windows)方法,其实就是通过这样一个从左到右、从上往下滑动的绿色的窗口,检查其中的目标是否符合要求,例如是否为行人:

如果满足,则进行标记。
当然,这个绿框的大小和每次滑动的距离,是可以设置的。
类似的,对于文字的检测,我们也要先通过数据训练出来一个文字识别的模型:

然后我们对于我们需要识别的图片:

利用滑动窗口来识别哪些是文字,并做出标记,例如下图中标记为白色的部分:

下一步就是将白色部分周边也设置为白色,这样我们就得到了连续的数据:

对于文字来说,宽度应该比高度要大,所以我们会选择到红框的部分:

也就是侦测到了这些文字:



玻璃门上的文字由于太小,可能就没有被识别到了:

下一步,就是通过滑动窗口,识别字符之间的间隔。我们可以通过这样的样本训练字符分割模型:

然后通过滑动窗口检查文字,如果符合要求,就将每个字符分割开来:

最后就是字符的分类了识别了。
3 人造数据
想要让机器学习达到比较高的准确率,大量的数据是必不可少的。
那么我们从哪里得到那么多的训练数据呢?
对于字符识别来说,其实非常简单,下面我们将说说人造数据的两种方式。
不过有一点需要提醒:在制造大量数据之前,首先保证我们有一个低偏差的分类器,否则的话,即使获得了大量的数据,算法的表现依然不能有效的提高。
方式一:人工合成
现在的计算机通常有很多种字体库,我们可以很容易收集到一些字体:

然后通过添加背景、模糊、等比例缩放、旋转等操作方式,人工合成一些字体的图片:

你会发现这和真实的数据其实是非常相似的:

方式二:增加噪音
我们选择一个真实的样本,然后添加一些噪音,通过这样的方式可以扩大训练集。
例如一个样本 A ,经过人工的变形和扭曲,就可以变成 16 钟新的样本:

需要注意的是,我们处理后的结果,应该是现实情况下可能出现的,否则的话就距离真实数据太远了。
5 上限分析(Ceiling Analysis)
在开发机器学习系统时,最宝贵的资源是开发者的时间。
如果我们开发好了一个 Photo OCR 系统,发现准确度只有 72% ,效果不如人意。
那么我们应该如何去改善呢?

对于这个流水线上的组件,哪一个方框才最值得化时间呢?
我们不能光凭直觉去行事,而应该通过数据来判断,把时间花在哪里性价比最高。
假定每一个组件都能够完美实现,然后看在这个完美实现的情况下,系统整体的预测准确率是多少。
例如文字侦测(Text detection),应该识别出来 4 块,但是实际上这里没有被识别出来:

但是我们可以人工干预,把这里识别出来。
又例如,字符识别(character recognition)的时候,把 I 识别成了 1,我们也可以人工干预来假定达到了完美实现的效果。
那么每一个部分的完美实现,能够给系统整体带来多大的提升呢?

显然,从上图可以看出来,文字检测(Text detection)还有 17% 的可提升空间,而字符分割只有 1% 的可提升空间。
同样的时间和精力,你是更愿意花在那 17% 的提升空间上,还是那 1% 的提升空间上呢?
这其实就是上限分析(Ceiling Analysis)要告诉我们的事情。
文章转载自公众号:止一之路