斯坦福大学《Machine Learning》第11周学习笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/junjun150013652/article/details/80960583

Application Example: Photo OCR

Photo OCR

Problem Description and Pipeline问题描述和流水线

机器学习的应用实例:照片OCR技术

第一  一个复杂的机器学习系统 是如何被组合起来的 

第二  机器学习流水线(machine learning pipeline)的有关概念 以及在决定下一步做什么时 如何分配资源 

最后  机器学习的诸多 有意思的想法和理念 其中之一是如何将机器学习 应用到计算机视觉问题中 第二是有关 人工数据合成(artificial data synthesis)的概念 

照片OCR表示 照片光学字符识别(photo optical character recognition)主要解决的问题是让计算机 读出照片中拍到的文字信息 它有如下几个步骤 

首先 给定某张图片 找出文字区域

然后 通过得到的文字区域的 矩形轮廓 我们可以进行字符切分 

最后 在成功将字段分割为 独立的字符后 我们可以运行一个分类器 输入这些可识别的字符 然后试着识别出 每一个字母

应用:盲人相机 汽车导航 

实际上有很多照片OCR系统 会进行更为复杂的处理 比如在最后会进行拼写校正 所以比如说 假如你的字符分割 和分类系统告诉你 它识别到的字是 “C 1 e a n i n g” 那么  很多拼写修正系统 会告诉你 这可能是单词 “Cleaning”的拼写 你的字符分类算法 刚才把字母 l 识别成了数字 1 那么像这样的一个系统 我们把它称之为机器学习流水线(machine learning pipeline) 

具体来说 这幅图表示的 就是照片OCR的流水线 我们有一幅图像 然后传给文字检测系统 识别出文字以后 我们将字段分割为独立的字符 最后我们对单个的字母进行识别 

Sliding Windows滑动窗口

照片OCR流水线中的组件是如何工作的 下面介绍一种叫 滑动窗(sliding windows)的分类器 

为了更好地介绍 图像的检测 我们从一个简单一点的例子开始 我们先看这个探测行人的例子 等下再把我们从行人检测中 得出的想法 应用到文字检测中 

在行人的问题中 不同矩形的宽高比都是一样的 但对文字检测的问题 高度和宽度的比值 对不同行的文字就是不同的了 虽然在行人检测的问题中 行人可能会与相机 处于不同的距离位置 因此这些矩形的高度 也取决于他们离相机的距离远近 但这个比值应该是一样的 为了建立一个行人检测系统 以下是具体步骤 假如说我们把 宽高比标准化到 82比36这样一个比例 我们可以把这个比值 进行圆整 比如化为 80比40之类的 但82比36也可以 

接下来我们要做的 就是到街上去收集一大堆正负训练样本 训练一个学习算法 输入这些图片 82×36维的图像块 然后对 y 进行分类 把图像块分成"有行人" 和"没有行人"两类 

我们想来试试看在这张图片中找行人 我们要做的是 首先对这个图像取一小块长方形如图绿色框 比如这是一个 82×36的图像块 我们将这个图像块 通过我们训练得到的分类器 来确定 这个图像块中是不是有行人 然后我们滑动绿色框  然后得到一个新的图像块 并同样把它传入我们的分类器 看看这里面有没有行人....从左到右再换行直到右下角

滑动的大小称为步长(step size) 有时也称为 步幅参数(stride parameter) 每移动一个像素 就是说你是用的步长 或者说步幅是1 步长越小 计算量越大 表现得也越好

然后增大滑动框重复以上步骤 但是我传递给分类器的图像都是经过压缩的82×36的图像块 然后继续放大矩形框完成整个过程

接下来我们转向 文字识别的例子 让我们来看看 对于照片 OCR 流水线中 要检测出文字 需要怎样的步骤 

跟行人检测类似 首先收集正负样本并训练出学习算法  然后测试集图片中 我们以这幅图片为例 

运行矩形框算法  最终得到的结果 是左边的 白色的区域表示 我的文字检测系统已经发现了文字 并且不同的灰度 就表示分类器给出的 输出结果的概率值 比如有些灰色的阴影 这就表示分类器 似乎发现了文字 但并不十分确信 而比较白亮的区域 则表示分类器 预测这个区域有文字 有比较大的概率 

继续在图像中 有文字的各区域 都画上矩形窗 所以我们还需要完成一步 我们取出分类器的输出 然后输入到一个 被称为"展开器"(expansion operator)的东西 展开器的作用就是 它会取过这张图片 对每一个白色的小点 都扩展为一块 白色的区域 

我们现在可以根据 右边的这张图 锁定那些连接部分 也就是这些连续的白色区域 然后围绕着它们画个框就行了 具体来讲 如果我们分析这些白色区域 我们可以简单地 凭直觉来判断那些 又高又瘦的白块并抛弃掉 这个例子漏掉了一些文字 但是效果还不错 

流水线的第二步是字符分割  同样地 我们还是使用 一种监督学习算法 用一些正样本 和一些负样本 而我们要做的 就是看看这些图片 是不是 在两个字符之间 有一条分界线 

训练好这个分类器以后 我们就要把这个分类器 应用到我们文字中 我们还是通过滑动矩形窗的方式来分割文字

流水线的最后一步 是字符分类 这一步 根据之前你已经学到的 监督学习算法 将图像按字母分类 等等

Getting Lots of Data and Artificial Data获取大量数据和人工数据

要想获得一个比较高效的 机器学习系统 其中一种最可靠的办法是 选择一个低偏差的学习算法 然后用一个巨大的训练集来训练它 

但你从哪儿得到那么多的训练数据呢? 

其实在机器学习中 有一个很棒的想法 叫做“人工数据合成”(artificial data synthesis) 它包含两种不同的变体 第一种是 我们白手起家 来创造新的数据 第二种是 我们已经有了一小部分 带标签的训练集 我们可以扩大这个训练集 

对于之前的照片OCR流水线问题 我把这些图像都视为灰度图像 而不是彩色图像 实际上用彩色的图像 对这个问题的解决也起不了多大作用 获得一个更大的训练集的方法如下

1.从文字处理软件或者网络获取字体库  然后采集同一个字符的不同种字体 然后将这些字符 加上不同的随机背景 然后应用某个模糊操作 模糊的意思是 让图像变形  比如均匀 等比例缩放 或者一些旋转操作等等 在完成这些操作后 你就得到了这个合成后的训练集 要完成这项工作 还是需要仔细考虑 才能得到比较真实的合成数据 如果你搞得很草率的话 你获得的合成数据很可能就不是那么好 

2.使用 你已经有的样本 我们选取一个真实的样本 然后你添加别的数据 来扩大你的训练集 比如在图像上加了一些 灰色的网格 或者进行人工扭曲 或者人工变形 这样从一个图像A 就能生成 很多种新的样本 同样地 要把这个概念投入应用 要考虑 什么样的变形是合理的

3. 另一种很好的办法是 我们称之为"众包" (crowd sourcing) 的办法 现在已经有一些网站 或者一些服务机构 能让你通过网络 雇一些人替你完成 标记大量训练数据的工作 通常都很廉价  可能“亚马逊土耳其机器人”(Amazon Mechanical Turk) 就是当前最流行的 一个众包选择 

如果你要解决某个机器学习问题 通常有两件事情值得好好考虑 第一是用学习曲线 进行合理性检查 保证使用更多的数据能有效果 第二点是 自己坐下来 认真地想一想 想要得到现有数据的 10倍数据量 需要花费多少工作量 有时候你会非常惊讶于 你算出来的结果 也许只需要几天 几个星期的时间 就能让你的学习算法 的表现有巨大的提高

Ceiling Analysis: What Part of the Pipeline to Work on Next 

为了介绍上限分析 我将继续使用之前用过的 照片OCR流水线的例子 在之前的课程中 我讲过这些方框 文字检测 字符分割 字符识别 哪一个方框最值得 你投入精力去做 投入时间去改善效果 

假设 整个系统的估计准确率为72% 

首先我们人为的将第一个模块 文字检测 给出全部正确结果 然后传递给下两个模块字符分割 字符识别 整个系统准确率 提高到89% 

然后我们将第一个模块文字检测 和第二个模块字符分割 都给出标准的结果 然后传递给下一个模块字符识别 整个系统准确率提高到90% 

最后我们还是执行最后一个模块 字符识别 同样也是人工给出这一模块的正确标签 这样做以后 我应该理所当然得到100%准确率 

进行上限分析的 一个好处是 我们现在就知道了 如果对每一个模块进行改善 它们各自的上升空间是多大 

所以 我们可以看到 如果我们拥有完美的文字检测模块 那么整个系统的表现将会从 准确率72%上升到89% 因此效果的增益是17% 这就意味着 如果你在现有系统的基础上 花费时间和精力改善文字检测模块的效果 看起来这还挺值得 

而相对来讲 如果我们取得完美的字符分割模块 那么最终系统表现只提升了1% 这便提供了一个很重要的信息 这就告诉我们 不管我们投入多大精力在字符分割上 系统效果的潜在上升空间 也都是很小很小 所以通过上限分析我们知道了 即使你把字符分割模块做得再好 再怎么完美 你的系统表现 最多也只能提升1% 

最后 如果我们取得完美的字符识别模块 那么整个系统的表现将提高10% 也是值得花时间的

一个真实的故事 有两个工程师 为了开发某个 计算机视觉的应用系统 大概花了一年半的时间 就为了得到一个 更好的背景移除效果 事实上他们确实研究出了非常复杂的算法  貌似最后还发表了一篇文章 但最终他们发现 所有付出的这些劳动 都不能给他们研发系统 的整体表现带来 比较大的提升 而如果要是之前 他们组某个人做一下上限分析 他们就会提前意识到这个问题 

如果要解决某个机器学习问题 最好能把问题 分成多个模块 然后做一下上限分析 这通常是一个更可靠 更好的方法 来为你决定 该把劲儿往哪儿使 该提高哪个模块的效果 这样我们就会非常确信 把这个模块做好就能提高 整个系统的最终表现

参考资料

https://www.coursera.org/learn/machine-learning/

猜你喜欢

转载自blog.csdn.net/junjun150013652/article/details/80960583