Loading

「吴恩达机器学习」19.应用实例:图片文字识别

本章主要通过一个应用实例——图片文字识别(Photo OCR),来讲解一个完整的机器学习问题中的相关概念。

Problem description and pipeline

本节主要讲解了什么是OCR,以及机器学习中流水线/管道(pipeline)的概念。

The Photo OCR problem

OCR(Optical Character Recognition,光学字符识别),从一张给定的图片中识别文字。

Photo OCR pipeline

OCR的整个工作流程如下:

  1. 文字检测:将图片上的文字与其它环境对象分离开来;
  2. 字符切分:将文字分割成一个个单一字符;
  3. 字符分类:识别每一个字符。

上面的过程用流程图表示:

graph LR A[Image] --> B[Text detection] B --> C[Character segmentation] C --> D[Character recognition]

这就是机器学习中管道的概念,也可以理解为流水线,把一个完整的机器学习问题划分为不同的模块,分别实现。

Sliding windows

本节主要讲解滑动窗口的概念。

Pedestrian detection

在讲解OCR问题中的文字检测之前,我们先介绍一个更为简单的问题——行人检测,然后再回到文字检测问题。

行人检测之所以更简单,是因为虽然行人离摄像头距离不一致,导致会有不同的长度和宽度,但是长宽比确是大概一致的,所以我们可以用一个固定长宽比的矩形来检测行人。

Supervised learning for pedestrian detection

在行人检测中,特征值\(x\)为82x36像素点的图像,正样本代表行人,负样本代表非行人。

Sliding window detection

根据上面的数据集训练出行人检测的监督学习系统之后,我们就需要在一个完整的图像上面进行行人检测。首先,先选好一个固定大小的矩形,从左上角开始,向右进行滑动。每滑动一次,就会切割出一个矩形,然后我们就可以把这个矩形交给模型进行判断,判定该矩形是否为行人。以此类推,直到窗口滑动到图像的右下角,即可结束,这就是滑动窗口的过程。

接着,我们还需要等比例放大矩形(因为行人具有不同的长宽),然后再进行一次滑动窗口的整个流程。

滑动窗口中两个窗口的距离称为步长(step-size),理论上步长为1像素自然是最为准确的,但是这样计算量会太大,所以我们通常会选择一个合适的步长,比如4像素或8像素等。

Text detection

接下来再将滑动窗口应用到文字检测上。

在文字检测问题中,正样本带表有文字字符,负样本代表无文字字符。

然后,运用滑动窗口识别字符,一旦完成了字符的识别,我们将识别出的区域进行扩展,然后把重叠的区域进行合并。接着以宽高比作为过滤条件,过滤掉高度比宽度更大的区域(这里认为单词的长度通常比高度要大)。

下图中红色区域是被认定为文字的区域,绿色是被忽略的区域:

1D Sliding window for character segmentation

同样的,我们也可以在字符切分上使用一维的滑动窗口,正样本代表需要进行分割,负样本代表不需要。

Getting lots of data: Artificial data synthesis

对于低偏差的模型,采用大量的数据进行训练,是能够得到一个较好的结果的。而得到大量的数据,除了直接获取之外,还有人工合成的方法。

人工合成的方法主要有两种:

  1. 从零创造数据;
  2. 对一个小数据集进行修改,得到大量数据。

Artificial data synthesis for photo OCR

对于文字字符识别问题来说,真实的数据集可能如下左图所示。我们就可以通过各种字体,再加上不同的随机背景图片,就能够创造出一个非常大的训练集(如下右图)。

Synthesizing data by introducing distortions

或者,我们也可以通过引入失真,或者说加入不同的噪声,来生成不同的数据。

这种方法同样适用于语音识别任务,我们可以对一段“干净”的语音,加入不同的背景噪声,得到不同的数据。

注意,通常将纯随机/无意义的噪声引入数据集对模型是没有帮助的,引入的噪声应该是在测试集中有可能出现的噪声,这才是有助于提升模型效果的。

Discussion on getting more data

  1. 在花费精力引入大量数据之前,先确保模型是低偏差的(绘制学习曲线)。E.g. 不断增加特征值数量,或者神经网络中隐藏单元数量,直到拥有低偏差的模型。
  2. 问自己一个问题:“获得目前数量十倍的数据需要做多少工作?”
    • 人工数据合成
    • 自己收集/打标签
    • “数据众包”(即通过专门的打标签平台把任务发放出去)

Ceiling analysis: What part of the pipeline to work on next

在机器学习任务中,开发人员的时间是非常宝贵的,所以我们需要通过上限分析决定哪一部分最值得我们花费时间精力去改善。

Estimating the errors due to each component (ceiling analysis)

以前面OCR的工作流为例:

graph LR A[Image] --> B[Text detection] B --> C[Character segmentation] C --> D[Character recognition]

工作流中每一部分的输出都是下一部分的输入,因此每一部分的准确率提高了,都会影响整个系统,所以为了判断哪一部分更值得我们花费时间精力,我们需要采用控制变量的思想来进行上限分析。

比如我们另文字检测部分输出的结果100%正确(人工输入100%正确的数据给字符分割),发现系统的总体准确率从72%提升到89%。以此类推,我们分别往字符分割,字符识别模块输入100%准确的数据,然后计算整个系统的准确率,得到下面的表格:

Component Accuracy
Overall system 72%
Text detection 89%
Character segmentation 90%
Character recognition 100%

从上表我们可以看出,假如文字检测部分的准确率为100%,那么整个系统就能得到89%的准确率,比起之前的72%提升了17%,所以我们应该重点研究文字检测部分。

Another ceiling analysis example

我们以人脸识别作为另外一个例子讲解上限分析。

同样地,我们可以按照模块分别进行分析,计算系统总体准确率如下:

Component Accuracy
Overall system 85%
Preprocess (remove background) 85.1%
Face detection 91%
Eyes segmentation 95%
Nose segmentation 96%
Mouth segmentation 97%
Logistic regression 100%

从上表可以发现,我们最不应该花时间提升的就是“Preprocess(remove background)”模块,因为即使这个模块达到了100%的准确率,最终效果也只提升了0.1%,对整个模型效果提升不大;同时,值得研究的部分是“Face detection”和"Mouth segmentation"模块。

上限分析能够让我们找到最应该花费时间精力投入的地方,而不是浪费时间研究一些对总体效果提升不大的模块。

posted @ 2021-12-28 22:31  活用数据  阅读(219)  评论(0编辑  收藏  举报