机器学习笔记-16(应用范例:照片OCR)

这里是第十八部分,应用范例:照片OCR。

OCR是啥? 全称为Optical character recognition(光学字符识别),也就是一项从图像的光学信息进行字符识别的技术。

那么,就直接进行问题描述吧。咱们现在的问题是如果从一个照片中提取出含字符的区域,并进行识别。

The Photo OCR problem

照片OCR问题

为了解决这个问题,咱构建了一个流水线结构。把整个处理过程依次分为了 文本检测->字符切分->字符分类 三个部分。每一模块的输出作为下一个模块的输入,也就形成了流水线一般的处理结构。下图给出了每一模块的具体处理任务。

Photo OCR pipeline

照片OCR流水线处理结构

Photo OCR pineline

OCR流水线结构

有了流水线构架,现在就来讨论每一个部分的具体实现吧。首先要讲到的是文本检测是如何进行处理的。在说到具体方式时,咱先使用另一个例子来进行辅助说明其实现思想,那就是行人检测。

Pedistrian detection

行人检测

在一张照片中识别出行人该如何进行实现呢?其实方法是很容易理解的。首先,咱利用机器学习算法,例如逻辑回归或者神经网络什么的监管学习,对一系列行人的正负样本进行学习。如下图所示。特征x为82*36像素的图片块,y=1和y=0分别代表了正负样本。咱利用这些样本先对行人分类器进行一系列的训练。

Supervised learning for pedestrian detection

行人检测的监管学习

接下来就是检测工作的核心部分了,那就是使用名为Sliding Window(滑动窗口)的方法。咱先定义一个矩形识别窗,一开始不必很大。然后让这个窗口在照片上迭代移动,需要注意的是每次移动相对前一位置的距离越细密,运算量越大,所以这个距离还是要注意控制好的,每移动一个位置,便把该区域的图像信息进行一次分类处理,判断是否为行人。如果使用某一长宽比例下的窗口,移动到图片的最后还是木有发现行人的话,就改变窗口的长宽进行下一次全图迭代分类,直至使用不同比例的窗口发现全部行人。

Sliding windows detection

滑动窗口检测

有了这种方法之后,咱就可以把它使用到文本检测上来了,跟上面行人检测的方法一样。先对字符图像进行学习,然后使用移动窗口来识别。这里俺要废话一下,很多时候进行图像处理的时候,都会对彩色的照片进行灰度变换,因为有些时候色彩数据并不能帮助我们得到更多信息,例如当前这个例子,而且在进行了这种处理之后还会有助于提升运算速度,当然凡事无绝对,例如需要分析发色/肤色信息的时候。

Text detection

文本检测

Text detection

文本检测的监管学习

通过滑动窗口技术,咱对图片信息进行重新绘制。利用区域灰度来表示该位置为字符的概率,白色的区域说明该位置有字符的概率极大,灰色的小概率,黑色就代表没字符。然后咱会发现这重新绘制后的照片变成了下面那个样子。但是根据窗口的长宽比例情况,字符都落单了。所以咱要对靠近的字符进行区域扩展,然后得到一个大的字符区。这样一个字符检测的任务就算基本完成了。

Text detection

利用滑动窗口重绘信息

第二模块是字符切分,依然是用滑动窗口的方法,这里分类器要学习的不是单个字符,而是学习两字符的间隔部分,从而指导切割工作。

1D Sliding window for character segmentation

使用一维滑动窗口的文本切分

最后,就是字符分类器的问题,这个就不用多说了吧。。

Photo OCR pipeline

照片OCR流水线

Character recognition

字符检测

说完OCR的实现,后面的两节便是相关扩展了。之前,咱就知道在低偏差的模型下,喂数据越多,相关模型的性能就会越棒。那应该怎么搞到大量的数据样本呢?课程的第三节就是讲的这个问题,解决这一问题的方法就是人工数据合成。嘛~ 没有数据,咱就自己造。主要走两个方向:一个是白板合成(从头开始合成),另一个是在原样本上进行变化以形成新样本。白板合成记得别做得太假就行,然后是在原样本上的变化方法,图片一般是扭曲,音频是加入噪声(背景噪声,差劲的电话连接质量),然后类推吧。不过有点要提示,为数据加入纯随机/无意义的”噪声”通常是木有任何帮助的,请仔细考虑。

Artificial data synthesis for photo OCR

对照片OCR的样本进行人工数据合成(白板合成)

Synthesizing data by introducing distortions

对照片进行细微扭曲

SynthesIzing data by introducing distortions

对人工合成数据的注意要点

要使用大量数据帮助提升性能的前提是需要有个低偏差的模型(通过学习曲线辅助判断),可以通过提高特征数或神经网络中的隐藏单元数量来达到这一点。但除此之外,你还需要问清楚自己一个问题”为了获得比当前多十倍的数据,咱需要做多少工作?”,如果很费劲,那就失去了意义。获得大量数据有几个方法,人工数据合成、自己采集/标注数据和花钱让别人干这活(例如Amazon Mechanical Turk)。分析一下这几个方法的耗费(时间/金钱/人力),再来做决定吧。

Discussion on getting more data

如何获得更多的数据

那么,接着再来讨论上限分析。Andrew Ng教授认为对于开发人员来说最重要的资源就是时间了,为了合理地利用好宝贵的时间,不浪费,一个科学的分析体系是非常重要的。在前面说到的流水线架构下,使用上限分析可以帮助咱合理分配资源在每个模块上。这个方法其实也不算麻烦,先得到总系统的精确度,在流水线上依次对每个模块进行人工辅助,让当前模块达到100%精确度,然后再计算此时的总系统精确度看看提升了多少,如果提升大,那么请花多资源在这一模块上,提升其精确度,相对应的提升小,那么就分少一点资源给它吧,反正对总体帮助不大。一个OCR例子。

Estimating the errors due to each component

上限分析(OCR)

再来face recognition例子。

Another ceiling analysis example

上限分析(人脸识别)

这已经是整个课程的最后一节了,对于机器学习来说,咱总算是入门了!感谢Coursera这一个平台!最感谢的还是Andrew Ng教授!而且现在咱才知道他还是Coursera的联合创始人~ 不愧是大牛啊!

“机器学习笔记-16(应用范例:照片OCR)”的一个回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注