小言_互联网的博客

吴恩达机器学习(二十三)—— 应用实例:图片文字识别

293人阅读  评论(0)

  学习图片文字识别的应用实例要做的事情:

  1. 展示一个复杂的机器学习系统是如何组合起来的;
  2. 介绍机器学习流水线(machine learning pipeline)的有关概念以及如何分配资源来对下一步的计划作决定;
  3. 通过介绍photo OCR(photo Optical Charater Recognition 照片光学字符识别)问题,明白如何将机器学习应用到计算机视觉中及人工数据合成的概念。

1. 问题描述和流水线

  图像文字识别应用所作的事是,从一张给定的图片中识别文字,如下图所示,这比从一份扫描文档中识别文字要复杂的多。


  为了完成这样的工作,需要采取如下步骤:

  • step1:给定某张图像,将图像扫描一遍,找出图像中的文字信息,进行文字检测(Text detection);
  • step2:重点关注这些文字区域,并对区域内文字内容进行识别。对文字区域的矩形轮廓进行字符分割(character segmention),试着将其分割成独立的字符;
  • step3:在成功将字段分割成独立字符后,运行一个分类器,输入这些可识别的字符进行字符识别(character recognition),识别出字母分别是什么。

2. 滑动窗口

  滑动窗口是一项用来从图像中抽取对象的技术。

  假使我们需要在一张图片中识别行人,首先要做的是用许多固定尺寸的图片来训练一个能够准确识别行人的模型。然后我们用之前训练识别行人的模型时所采用的图片尺寸在我们要进行行人识别的图片上进行剪裁,接着将剪裁得到的切片交给模型,让模型判断是否为行人。然后在图片上滑动剪裁区域重新进行剪裁,将新剪裁的切片也交给模型进行判断,如此循环直至将图片全部检测完。一旦完成后,我们按比例放大剪裁的区域,再以新的尺寸对图片进行剪裁,将新剪裁的切片按比例缩小至模型所采纳的尺寸,交给模型进行判断,如此循环。
  行人检测(pedestrian detection)例子的具体实现步骤,如下所示。
  第一步:应用监督学习的方法,来对一个图块进行处理,判断其是否包含有行人。假定我们要在一张图像中识别行人,首先要做的就是用许多固定尺寸的图像来训练一个能够准确识别行人的模型。


  第二步:滑动窗口检测。首先在图像中选取一个矩形块,比如 82 × 36 82\times36 82×36的绿色矩形块,把这个图块传递给我们的分类器来检测图块中是否有行人,依次移动我们的矩形块进行分类判断。


  矩形块移动的距离是一个参数,一般称之为步长(或滑动参数),如果一次移动一个像素,那么步长就为1。一般情况下,1这个步长表现最好,但计算成本较高,将步长设为4像素、8像素比较常见。全部检测完后,按比例放大矩形块,再以新的尺寸对图像进行剪裁,并将其按比例缩小至 82 × 36 82\times36 82×36,传递给模型判断,如此循环。


  经过一系列过程后,我们的算法便能够检测出图中各个地方是否出现行人,如下图所示。


  滑动窗口技术也被用于文字识别(text recognition),文字识别例子的具体实现步骤,如下所示。
  第一步:应用监督学习的方法,用许多固定尺寸的图像来训练模型能够区分字符和非字符。

  第二步:滑动窗口检测。在原始图像上运行算法,使用一个固定比例的滑动窗口分类器识别字符。完成字符识别后,我们将识别得出的区域进行一些扩展,然后将重叠区域进行合并。接着我们以宽高比作为过滤条件来过滤掉高度比宽度更大的区域(认为单词长度比高度大),红色的框是认为的文字区域,绿色的叉是被过滤掉的区域。


  第三步:训练一个模型来完成将文字分割成一个个字符的任务,需要的训练集为单个字符的图片和两个相连字符之间的图片。使用监督学习算法,通过找到的一些正样本和负样本训练分类器以决定图块中的两个字符间是否有一条分界线。


  第四步:模型训练完后,使用滑动窗口技术来进行字符识别,判断是否需要在矩形中间画一条线分开这两个字符。


  第五步:利用神经网络、支持向量机或者逻辑回归算法训练一个分类器进行字符分类,通过输入分割好的单个字母图像,然后将字母分类为26个字母A-Z中的一个。

3. 获取大量数据:人工数据合成

  一个最可靠的得到高性能机器学习系统的方法是使用一个低偏差机器学习算法,并且使用庞大的训练集去训练它,那么这个庞大的训练集怎么获得呢?可以利用人工数据合成技术。
  人工数据合成主要有两种形式:第一种是自己创造数据;第二种是我们已有小的标签数据集,然后以某种方式扩充训练集。
  以我们的文字识别应用为例,假设输入一张图像数据,想识别出是什么字母,怎样去获取一个更大的训练集呢?
  一种方法是我们可以去字体网站下载各种字体,然后利用这些不同的字体配上各种不同的随机背景图片创造出一些用于训练的样本,再利用一点模糊算子或者仿射变换,这让我们能够获得一个无限大的训练集。
  另一种方法是使用现有的样本生成数据,来扩充训练集。利用已有的数据,然后对其进行修改,例如将已有的字符图片进行一些扭曲、旋转、模糊处理。在引扭曲的方法中,有一点需要注意,及所选择要引入的干扰或者变形要能代表我们可能会在测试集中看到的噪声源或干扰项。只要我们认为实际数据有可能和经过这样处理后的数据类似,我们便可以用这样的方法来创造大量的数据。
  有关获得更多数据的几种方法: 1. 人工数据合成;
                 2. 自己收集数据或者添加标签;
                 3. 众包(在网站上以相对低廉的价格雇佣很多人为自己标记数据)。

4. 上限分析:流水线的哪个模块最有改进价值

  在机器学习的应用中,我们通常需要通过几个步骤才能进行最终的预测,我们如何能够知道哪一部分最值得我们花时间和精力去改善呢?这个问题可以通过上限分析来回答。
  为了决定如何开发这个系统,一个有效的方法是对学习系统使用一个数值评价度量。假如我们用字符准确度作为这个度量,给定一个测试样本图像,那么这个数值就表示我们对测试图像中的文本识别正确的比例。
  在文字识别应用中,流程图如下所示。


  流程图中每一部分的输出都是下一部分的输入。上限分析中,我们选取一部分,手工提供100%正确的输出结果,然后看应用的整体效果提升了多少。
  假使我们的例子中总体效果为72%的正确率,如果我们令文字检测部分输出的结果100%正确,发现系统的总体效果从72%提高到了89%,这意味着我们很可能会希望投入时间精力来提高我们的文字检测部分。
  接着我们手动选择数据,让字符分割输出的结果100%正确,发现系统的总体效果只提升了1%,这意味着我们的字符分割部分可能已经足够好了。
  最后我们手工选择数据,让字符分类输出的结果100%正确,系统的总体效果又提升了10%,这意味着我们可能也会应该投入更多的时间和精力来提高应用的总体表现。
  上限分析的一个好处就是,我们明白了如果对每一个模块进行改善,它们各自的上升空间是多大,我们是否需要投入大量精力去改善此模块。


转载:https://blog.csdn.net/HUAI_BI_TONG/article/details/115796065
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场