Machine Learning-Photo OCR(图片文字识别)

点击量:1106

今天来总结一下Coursera Machine Learning最后一周week 11的内容:图像文字识别(photo OCR),这个问题是机器学习在计算机视觉(computer vision)领域里的一个很常见的应用。本章我们会介绍如何使用机器学习算法解决这个问题,以及什么是人工数据合成(artificial data synthesis)。

The Photo OCR problem
Photo OCR全称是:photo optical character recognition,照片光学字符识别,意思就是从照片里识别字符信息,比如我们有如下图片:

那么OCR解决的问题就是把照片中红框内的文字识别出来。

Photo OCR pipeline
这是一个较为复杂的机器学习应用,我们可以把它分为几个小模块,然后组成一个流水线(pipeline)来解决问题。具体地,分为以下几个步骤:

  • 文字区域检测(text detection),找到图片中属于文字的部分,并把它抠出来:
  • 字符分割(character segmentation),把上一步得到的图片分割成包含单个字符的小图片:
  • 字符分类(character classification),使用机器学习算法识别单个字符图片:

Sliding Window
文本区域检测采用的是一种被称为“滑动窗口”(sliding window)的算法。我们先以行人检测(pedestrian detection)为例,因为行人的长宽比例一般是固定的,比较简单。假设有如下一张图片,我们需要识别图中的行人,那该怎么做呢?

  • 首先,我们通过监督学习的方法对足够量的正反例样本数据进行学习,如下图左边所示,我们选取像素大小固定为(82 \times 36)的行人图像作为正例,没有行人的图像作为反例,最终学习得到一个能够识别行人的分类器。
  • 得到分类器之后,我们把要识别的图像分割成一个个类似于窗口一样的小图像,然后从左到右,从上到下不断移动窗口,直到覆盖整个图像。我们把滑动窗口扫过的小图像都丢到分类器里去,如果是行人则输出。那这里有一个问题:“行人的大小是不固定的,那我们该如何界定滑动窗口的大小呢?”。这里采用的就是蛮力方法,会尝试多个不同大小的滑动窗口,直到得到满意的效果。如果窗口的大小是大于(82 \times 36),那么会把它压缩到这个尺寸。
  • 那么回到文本区域检测这个问题上来,它跟行人检测的原理是一样的,先构建一个字符分类器:

    然后使用滑动窗口把符合条件的图像挖出来,如果分类器判断这一块图像是文本则把它的像素设成白色,这样就得到如下图左边所示的图像:

    但是左图并不符合我们的要求,我们希望得到一个区域块,而不是分散的单个字符。所以要通过一个叫做“展开器(expansion operator)”的东西把左图的白色区域补全,最终得到右图较为完整的区域块。这个展开器的原理也很简单,就是在区域块周边一定范围内检查是否有白色的像素,如果有则把他们连接在一起。OK,文本检测讲完了,再介绍下如何进行文本分割。

    文本分割的原理和文本检测是一模一样的,具体地,我们先学习得到一个分类器,用于识别字符中间是否有一条分界线可以分割字符,然后在文本区域内使用滑动窗口,把扫过的小图像放到分类器里去,如果预测结果是(y=1)则表示两个字符中间有分界线,那么就画一条竖线把他们分隔开来,这样就能达到分割字符的目的了。

    人工数据合成(Artificial Data Synthesis)
    我们知道机器学习算法的效果很大程度上取决于训练数据量的多少,那么对于字符识别而言,我们该如何获得大量的标签数据呢?

  • 创造新数据
    我们可以以现有字库为基础,把不同字库里的字符放到一个随机背景上,得到新的数据。

    如此操作之后,我们就能得到几乎和原始数据一样的人工合成数据:
  • 在原有数据的基础上引入人工扭曲(Synthesizing data by introducing distortions)
    我们可以在原有标签数据上引入随机噪声和扭曲,过程如图所示:这样我们就把数据集扩大了16倍。但是,要知道纯粹地添加无意义的背景噪音是没有价值的,比如这样只是改变了背景的明暗度:
  • 要记得一点,在你想要获得更多的人工训练数据之前,要先确保你的算法已经是一个低偏差(low-bais)的分类器,因为只有这样增加训练的数据量才能提高性能。

    上限分析(ceiling analysis)
    我们如何知道流水线(pipeline)中的每一个模块对系统性能有多大的影响呢?如果这个模块对整体性能的影响越大,那么它就越值得我们花时间去改进。我们采用的方法是上限分析,其实很简单:对流水线中的每一个模块,我们通过人工标注的方式使得该模块的准确率达到100%,然后我们再来看当这个模块的识别率到达最大值时,整个系统的性能提升了多少。具体的,假设我们得到如下的表格:

    Component Accuracy of Component set up to Overall System Accuracy Improvements
    nil 0 72% 0%
    Text Detection 100% 89% 17%
    Character Segmentation 100% 90% 1%
    Character Secognition 100% 100% 10%

    那么我们发现Text Detection和Character Secognition对系统性能影响最大,于是我们就应该投入更多的时间以提高这两块的准确率,从而才能更有效地提升系统的整体性能。

    发表评论

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