2016-03-04 21:42:49 zstu_wangrui 阅读数 1074
  • Python机器学习经典案例实战

    Python在机器学习领域应用是非常广泛的,比如,我们可以使用机器学习进行验证码识别,使用机器学习实现计算机视觉项目,或者,我们也可以使用机器学习技术实现网页分类、文本挖掘、情感分析等等各种各样的事情。机器学习的重点在于算法,而算法的学习相对来说是比较枯燥的,所以,只有在学习的时候让算法跟实例结合,才能够让算法的学习变得不枯燥,并且也才能够更好的将理论运用与实践。

    3927 人正在学习 去看看 韦玮

在一张图片中发现并识别目标、文字、数字是一项具有挑战性的任务。本周将讨论处理该问题的途经与分析如何改善该系统性能。
照片光学字符识别,OCR,Photo optical character recognition。

照片识别

问题描述与(机器学习)流水线

开发一个复杂的机器学习系统,我们需要了解如何配置资源。

Photo OCR 流水线:(包含多个模块)
ocr流水线
1) 文本检测
文本检测
2) 字符分割
字符分割
3) 字符分类
字符分类
4) 字符串校正
例如 C1eaning Cleaning; (1 l)

滑动窗

滑动窗的高宽比可以用于寻找照片中的行人。

行人识别

  1. 行人的高宽比特征明显,通过分类方法很容易方法;
  2. 两个窗体间的距离为步长,或被称为步幅参数(stride parameter);
  3. 窗体的大小是可调整的,取较大的窗体并压缩至分类器规格的大小,在进行识别;
  4. 分类器:
    y=1h×lpixels 有行人照片
    y=0h×lpixels 无行人照片

文字识别:

  • 文字检测:(y=1 文字区域;y=0 无文字区域)
    1. 滑动窗获取有文字的窗体像素
    2. 像素扩展将相近的文字窗体合并为块
    3. 筛选不像正常文字区域的窗体(可能会漏去一些文字)
  • 字符分割:(y=1 字符分割区域;y=0 非字符分割区域)
    分割字符

    1. 滑动窗去照片
    2. 用窗口照片作为识别对象
    3. 确定分割线
  • 字符分类:(y=1,2,,A,B,etc 对应的文字信息)

获取大量的数据与人工数据

“人工数据合成(Artificial data synthesis)”是一种获取大量数据的方法。

人工数据合成:
1.“从无到有”(例如从计算机已有的文字库生成文字)
2. 从少量有标签的训练集扩充为一个大的训练集

数据的合成一般是基于一个低偏差(高方差/需要大量训练集)的机器学习系统(分类器)。针对2个典型应用文字识别语音识别,我们介绍一些人工数据合成的详细内容。

文字识别

  1. “从无到有”生成字符训练集的方法
    从无到有
  2. 从已有训练集扩充为一个大的训练集
    从少变多

语音识别

训练集的合成方法:
原声音 + 噪声(不同)= 新的声音

获取大量数据的讨论

  1. 以后的分类器是一个低偏差的,通过增加训练集有助于提高分类器性能(降低方差),绘制学习曲线是一种有效的方法。
  2. 获取多于 10 倍已有数据的工作量(“头脑风暴”来讨论想法),合成的方法有:
    • 1 人工数据合成
    • 2 手工收集与标记
    • 3 众包“Crowd source”(找人帮你做)

上限分析:流程线上的下一步工作是什么

上限分析可以告诉项目团队,流水线的哪一部分最值得花时间。接下来,我们将通过照片识别与人脸识别 2个应用讲解 上限分析

照片识别

照片识别

上限分析用于调整系统的整体性能。

上限分析

值得注意的事,要使某一模块的准确率达到 100%,可以通过人工的方法替代该模块的工作,使之达到 100% 的准确率。

人工智能:人脸识别

我们以简单的人脸识别应用为例,讨论它的上限分析。

人工智能.人脸识别

人脸识别.上限分析


总结

总结:主要主题

  1. 监督学习:线性回归、逻辑回归、神经网络、支持向量机;
  2. 无监督学习:K 均值、主成分分析、异常检测;
  3. 特殊的应用:推荐系统、大规模机器学习(并行、映射化简);
  4. 开发一个机器学习系统的建议:偏差/方差分析、正规化,决定下一步工作的学习算法评估、学习曲线、误差分析、上限分析。

到了这里,机器学习的基础更新到此为止了,接下来将是进入实战阶段,网上有很多关于数据挖掘与机器学习相关的竞赛,例如 kaggle;同时,有一篇博文中提到的学习轨迹感觉挺不错,我想沿着它走走。最后,我的 MATLAB 也许会止步于此,机器学习方向上,我会开始接触 Python,或者 JAVA,当然,MATLAB 永远是一款数值计算强大的软件,I like it so much.


相关链接:
    kaggle:数据挖掘竞赛
    学习轨迹:“大数据文摘”推荐的博文
    Python:sklearn 是机器学习的宝库呀
    JAVA:Weka,Java 语言开发机器学习系统的利器
    MATLAB:强大的数值分析软件,好像已经能和硬件结果了,还包含”统计与机器学习工具箱”(Statistics and Machine Learning Toolbox)
2017-09-20 09:59:32 kwame211 阅读数 2344
  • Python机器学习经典案例实战

    Python在机器学习领域应用是非常广泛的,比如,我们可以使用机器学习进行验证码识别,使用机器学习实现计算机视觉项目,或者,我们也可以使用机器学习技术实现网页分类、文本挖掘、情感分析等等各种各样的事情。机器学习的重点在于算法,而算法的学习相对来说是比较枯燥的,所以,只有在学习的时候让算法跟实例结合,才能够让算法的学习变得不枯燥,并且也才能够更好的将理论运用与实践。

    3927 人正在学习 去看看 韦玮

图片来自dribbble.com by Justin Mezzell

本系列文章目前已经更新两期,分别是: 机器学习原来如此有趣!全世界最简单的机器学习入门指南、 机器学习原来如此有趣:如何故意欺骗神经网络机器学习原来如此有趣:用深度学习识别人脸

语音识别正在「入侵」我们的生活。我们的手机、游戏主机和智能手表都内置了语音识别。他甚至在自动化我们的房子。只需50美元,你就可以买到一个Amazon Echo Dot,这是一个可以让你订外卖、收听天气预报、甚至是买垃圾袋的魔术盒,而这一切你只需要大声说出:


Aleax,给我订一个pizza!


Echo Dot 在2015年的圣诞假期一经推出就大受欢迎,在亚马逊上面立刻售罄。


但其实语音识别已经存在很多年了,那为什么现在才成为主流呢?因为深度识别终于将语音识别在非受控环境下的准确度提高到了一个足以投入实用的高度。


吴恩达教授曾经预言过,当语音识别的准确度从95%提升到99%的时候,它将成为与电脑交互的首要方式。


下面就让我们来学习与深度学习进行语音室识别吧!


机器学习并不总是一个黑盒

如果你想知道神经机器翻译是如何工作的,你应该猜到了我们可以简单地将一些声音送入神经网络,然后训练它使之生成文本:



这是使用深度学习进行语音识别的最高追求,但是很遗憾我们现在还没有完全做到这一点(至少在笔者写下这一篇文章的时候还没有--我敢打赌,再过几年我们可以做到)


一个大问题是语速不同。一个人可能会很快的说出''Hello!'',而另一个人可能非常缓慢的说''heeeelllllllllllllooooo'!',产生了一个拥有更多数据也更长的声音文件。这两个文件都应该被识别为同一个文本--“Hello!”。而事实证明,把各种长度的音频文件自动对齐到一个固定长度的文本是很难的一件事情。

为了解决这个问题,我们必须使用一些特殊的技巧,并进行一些深度神经网络以外的特殊处理。让我们看看它是如何工作的吧!



将声音转换为比特(Bit)


显然,语音识别的第一步是--我们需要将声波输入到电脑中。


我们应该怎么将声波转换为数字呢?让我们使用我说的「hello」这个声音片段举个例子:


声波是一维的,它在每个时刻都有一个基于其高度的值。让我们把声波的一小部分放大看看:

为了将这个声波转换成数字,我们只记录声波在等距点的高度:



这被称为采样(sampling)。我们每秒读取数千次,并把声波在该时间点的高度用一个数字记录下来。这基本上就是一个未压缩的 .wav 音频文件。


“CD 音质”的音频是以 44.1khz(每秒 44100 个读数)进行采样的。但对于语音识别,16khz(每秒 16000 个采样)的采样率就足以覆盖人类语音的频率范围了。


让我们把“Hello”的声波每秒采样 16000 次。这是前 100 个采样:

每个数字代表声波在一秒钟的16000分之一处的振幅。


数字采样小助手


因为声波采样只是间歇性的读取,你可能认为它只是对原始声波进行粗略的近似估计。我们的读数之间有间距,所以我们必然会丢失数据,对吧?


但是,由于采样定理(Nyquist theorem),我们知道我们可以利用数学,从间隔的采样中完美重建原始声波——只要我们的采样频率比期望得到的最高频率快至少两倍就行。


我提这一点,是因为几乎每个人都会犯这个错误,并误认为使用更高的采样率总是会获得更好的音频质量。其实并不是。


预处理我们的采样声音数据


我们现在有一个数列,其中每个数字代表 1/16000 秒的声波振幅。


我们可以把这些数字输入到神经网络中,但是试图直接分析这些采样来进行语音识别仍然很困难。相反,我们可以通过对音频数据进行一些预处理来使问题变得更容易。


让我们开始吧,首先将我们的采样音频分成每份 20 毫秒长的音频块。这是我们第一个 20 毫秒的音频(即我们的前 320 个采样):


将这些数字绘制为简单的折线图,我们就得到了这 20 毫秒内原始声波的大致形状:


虽然这段录音只有 1/50 秒的长度,但即使是这样短暂的录音,也是由不同频率的声音复杂地组合在一起的。其中有一些低音,一些中音,甚至有几处高音。但总的来说,就是这些不同频率的声音混合在一起,才组成了人类的语音。


为了使这个数据更容易被神经网络处理,我们将把这个复杂的声波分解成一个个组成部分。我们将分离低音部分,再分离下一个最低音的部分,以此类推。然后将(从低到高)每个频段(frequency band)中的能量相加,我们就为各个类别的音频片段创建了一个指纹(fingerprint)。


想象你有一段某人在钢琴上演奏 C 大调和弦的录音。这个声音是由三个音符组合而成的:C、E 和 G。它们混合在一起组成了一个复杂的声音。我们想把这个复杂的声音分解成单独的音符,以此来分辨 C、E 和 G。这和语音识别是一样的道理。


我们需要傅里叶变换(Fourier Transform)来做到这一点。它将复杂的声波分解为简单的声波。一旦我们有了这些单独的声波,我们就将每一份频段所包含的能量加在一起。


最终得到的结果便是从低音(即低音音符)到高音,每个频率范围的重要程度。以每 50hz 为一个频段的话,我们这 20 毫秒的音频所含有的能量从低频到高频就可以表示为下面的列表:



但是把它们画成图表时会更容易理解:

你可以看到,在我们的 20 毫秒声音片段中有很多低频能量,然而在更高的频率中并没有太多的能量。这是典型「男性」的声音。


如果我们对每个20毫秒的音频块都重复这个过程,我们最后会得到一个频谱图(从左到右每一列都是一个29毫秒的音频块)

频谱图很酷,因为你可以在音频数据中实实在在地看到音符和其他音高模式。对于神经网络来说,相比于原始声波,从这种数据中寻找规律要容易得多。因此,这就是我们将要实际输入到神经网络中去的数据表示方式。


从短音频中识别字符


现在我们已经让音频转变为一个易于处理的格式了,现在我们将要把它输入深度神经网络。神经网络的输入将会是 20 毫秒的音频块。对于每个小的音频切片(audio slice),神经网络都将尝试找出当前正在说的声音所对应的字母。

我们将使用一个循环神经网络——即一个拥有记忆,能影响未来预测的神经网络。这是因为它预测的每个字母都应该能够影响它对下一个字母的预测。例如,如果我们到目前为止已经说了「HEL」,那么很有可能我们接下来会说「LO」来完成「Hello」。我们不太可能会说「XYZ」之类根本读不出来的东西。因此,具有先前预测的记忆有助于神经网络对未来进行更准确的预测。


当通过神经网络跑完我们的整个音频剪辑(一次一块)之后,我们将最终得到一份映射(mapping),其中标明了每个音频块和其最有可能对应的字母。这是我说那句「Hello」所对应的映射的大致图案:


我们的神经网络正在预测我说的那个词很有可能是「HHHEE_LL_LLLOOO」。但它同时认为我说的也可能是「HHHUU_LL_LLLOOO」,或者甚至是「AAAUU_LL_LLLOOO」。


我们可以遵循一些步骤来整理这个输出。首先,我们将用单个字符替换任何重复的字符:


· HHHEE_LL_LLLOOO 变为 HE_L_LO


· HHHUU_LL_LLLOOO 变为 HU_L_LO


· AAAUU_LL_LLLOOO 变为 AU_L_LO


然后,我们将删除所有空白:


· HE_L_LO 变为 HELLO


· HU_L_LO 变为 HULLO


· AU_L_LO 变为 AULLO


这让我们得到三种可能的转写——「Hello」、「Hullo」和「Aullo」。如果你大声说出这些词,所有这些声音都类似于「Hello」。因为神经网络每次只预测一个字符,所以它会得出一些纯粹表示发音的转写。例如,如果你说「He would not go」,它可能会给出一个「He wud net go」的转写。


解决问题的诀窍是将这些基于发音的预测与基于书面文本(书籍、新闻文章等)大数据库的可能性得分相结合。扔掉最不可能的结果,留下最实际的结果。


在我们可能的转写「Hello」、「Hullo」和「Aullo」中,显然「Hello」将更频繁地出现在文本数据库中(更不用说在我们原始的基于音频的训练数据中了),因此它可能就是正解。所以我们会选择「Hello」作为我们的最终结果,而不是其他的转写。搞定!


稍等一下!


你可能会想「但是如果有人说Hullo」怎么办?这个词的确存在。也许「Hello」是错误的转写!



当然可能有人实际上说的是「Hullo」而不是「Hello」。但是这样的语音识别系统(基于美国英语训练)基本上不会产生「Hullo」这样的转写结果。用户说「Hullo」,它总是会认为你在说「Hello」,无论你发「U」的声音有多重。


试试看!如果你的手机被设置为美式英语,尝试让你的手机助手识别单词「Hullo」。这不行!它掀桌子不干了,它总是会理解为「Hello」。


不识别「Hullo」是一个合理的行为,但有时你会碰到令人讨厌的情况:你的手机就是不能理解你说的有效的语句。这就是为什么这些语音识别模型总是处于再训练状态的原因,它们需要更多的数据来修复这些少数情况。


我能建立自己的语音识别系统吗?


机器学习最酷炫的事情之一就是它有时看起来十分简单。你得到一堆数据,把它输入到机器学习算法当中去,然后就能神奇地得到一个运行在你游戏本显卡上的世界级 AI 系统...对吧?


这在某些情况下是真实的,但对于语音识别并不成立。语音识别是一个困难的问题。你得克服几乎无穷无尽的挑战:劣质麦克风、背景噪音、混响和回声、口音差异等等。你的训练数据需要囊括这所有的一切,才能确保神经网络可以应对它们。


这里有另外一个例子:你知不知道,当你在一个嘈杂的房间里说话时,你会不自觉地提高你的音调,来盖过噪音。人类在什么情况下都可以理解你,但神经网络需要训练才能处理这种特殊情况。所以你需要人们在噪音中大声讲话的训练数据!


要构建一个能在 Siri、Google Now! 或 Alexa 等平台上运行的语音识别系统,你将需要大量的训练数据 。如果你不雇上数百人为你录制的话,它需要的训练数据比你自己能够获得的数据要多得多。由于用户对低质量语音识别系统的容忍度很低,因此你不能吝啬。没有人想要一个只有八成时间有效的语音识别系统。


对于像谷歌或亚马逊这样的公司,在现实生活中记录的成千上万小时的人声语音就是黄金。这就是将他们世界级语音识别系统与你自己的系统拉开差距的地方。让你免费使用 Google Now!或 Siri,或是只要 50 美元购买 Alexa 而没有订阅费的意义就是:让你尽可能多地使用它们。你对这些系统所说的每一句话都会被永远记录下来,并用作未来版本语音识别算法的训练数据。这才是他们的真实目的!


不相信我?如果你有一部安装了 Google Now! 的 Android 手机,请点击这里收听你自己对它说过的每一句话:


你可以通过 Alexa 在 Amazon 上找到相同的东西。然而,不幸的是,苹果并不让你访问你的 Siri 语音数据。


因此,如果你正在寻找一个创业的想法,我不建议你尝试建立自己的语音识别系统来与 Google 竞争。相反,你应该想个办法,让人们把自己讲了几个小时的录音交给你。这种数据可以是你的产品。

2019-03-17 15:38:25 ziqu5721 阅读数 165
  • Python机器学习经典案例实战

    Python在机器学习领域应用是非常广泛的,比如,我们可以使用机器学习进行验证码识别,使用机器学习实现计算机视觉项目,或者,我们也可以使用机器学习技术实现网页分类、文本挖掘、情感分析等等各种各样的事情。机器学习的重点在于算法,而算法的学习相对来说是比较枯燥的,所以,只有在学习的时候让算法跟实例结合,才能够让算法的学习变得不枯燥,并且也才能够更好的将理论运用与实践。

    3927 人正在学习 去看看 韦玮

18.应用实例:图片文字识别(Application Example: Photo OCR)


18.1 问题描述和流程图

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

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

  1. 文字侦测(Text detection)——将图片上的文字与其他环境对象分离开来

  2. 字符切分(Character segmentation)——将文字分割成一个个单一的字符

  3. 字符分类(Character classification)——确定每一个字符是什么
    可以用任务流程图来表达这个问题,每一项任务可以由一个单独的小队来负责解决:
           在这里插入图片描述

18.2 滑动窗口

       滑动窗口是一项用来从图像中抽取对象的技术。假使我们需要在一张图片中识别行人,首先要做的是用许多固定尺寸的图片来训练一个能够准确识别行人的模型。然后我们用之前训练识别行人的模型时所采用的图片尺寸在我们要进行行人识别的图片上进行剪裁,然后将剪裁得到的切片交给模型,让模型判断是否为行人,然后在图片上滑动剪裁区域重新进行剪裁,将新剪裁的切片也交给模型进行判断,如此循环直至将图片全部检测完。

       一旦完成后,我们按比例放大剪裁的区域,再以新的尺寸对图片进行剪裁,将新剪裁的切片按比例缩小至模型所采纳的尺寸,交给模型进行判断,如此循环。
       在这里插入图片描述
       滑动窗口技术也被用于文字识别,首先训练模型能够区分字符与非字符,然后,运用滑动窗口技术识别字符,一旦完成了字符的识别,我们将识别得出的区域进行一些扩展,然后将重叠的区域进行合并。接着我们以宽高比作为过滤条件,过滤掉高度比宽度更大的区域(认为单词的长度通常比高度要大)。下图中绿色的区域是经过这些步骤后被认为是文字的区域,而红色的区域是被忽略的。
       在这里插入图片描述
       以上便是文字侦测阶段。
       下一步是训练一个模型来完成将文字分割成一个个字符的任务,需要的训练集由单个字符的图片和两个相连字符之间的图片来训练模型。
       在这里插入图片描述
       在这里插入图片描述
       模型训练完后,我们仍然是使用滑动窗口技术来进行字符识别。

       以上便是字符切分阶段。
       最后一个阶段是字符分类阶段,利用神经网络、支持向量机或者逻辑回归算法训练一个分类器即可。

18.3 获取大量数据和人工数据

       如果我们的模型是低方差的,那么获得更多的数据用于训练模型,是能够有更好的效果的。问题在于,我们怎样获得数据,数据不总是可以直接获得的,我们有可能需要人工地创造一些数据。

       以我们的文字识别应用为例,我们可以字体网站下载各种字体,然后利用这些不同的字体配上各种不同的随机背景图片创造出一些用于训练的实例,这让我们能够获得一个无限大的训练集。这是从零开始创造实例。

       另一种方法是,利用已有的数据,然后对其进行修改,例如将已有的字符图片进行一些扭曲、旋转、模糊处理。只要我们认为实际数据有可能和经过这样处理后的数据类似,我们便可以用这样的方法来创造大量的数据。

有关获得更多数据的几种方法:

  1. 人工数据合成

  2. 手动收集、标记数据

  3. 众包

18.4 上限分析:哪部分管道的接下去做

       在机器学习的应用中,我们通常需要通过几个步骤才能进行最终的预测,我们如何能够知道哪一部分最值得我们花时间和精力去改善呢?这个问题可以通过上限分析来回答。

       回到我们的文字识别应用中,我们的流程图如下:
       在这里插入图片描述

       流程图中每一部分的输出都是下一部分的输入,上限分析中,我们选取一部分,手工提供100%正确的输出结果,然后看应用的整体效果提升了多少。假使我们的例子中总体效果为72%的正确率。

       如果我们令文字侦测部分输出的结果100%正确,发现系统的总体效果从72%提高到了89%。这意味着我们很可能会希望投入时间精力来提高我们的文字侦测部分。

       接着我们手动选择数据,让字符切分输出的结果100%正确,发现系统的总体效果只提升了1%,这意味着,我们的字符切分部分可能已经足够好了。

       最后我们手工选择数据,让字符分类输出的结果100%正确,系统的总体效果又提升了10%,这意味着我们可能也会应该投入更多的时间和精力来提高应用的总体表现。
       在这里插入图片描述

参考资料: 吴恩达机器学习课程;黄海广机器学习课程笔记

2017-09-14 13:17:18 cococoolwhj 阅读数 5825
  • Python机器学习经典案例实战

    Python在机器学习领域应用是非常广泛的,比如,我们可以使用机器学习进行验证码识别,使用机器学习实现计算机视觉项目,或者,我们也可以使用机器学习技术实现网页分类、文本挖掘、情感分析等等各种各样的事情。机器学习的重点在于算法,而算法的学习相对来说是比较枯燥的,所以,只有在学习的时候让算法跟实例结合,才能够让算法的学习变得不枯燥,并且也才能够更好的将理论运用与实践。

    3927 人正在学习 去看看 韦玮

深度整理AI学习资料,长期更新

二维码


  1. 机器学习实战 中文文字版,带完整书签,能复制文字出来。还有英文版,中文扫描版,源代码,读书笔记等,非常全面;
    机器学习实战1
    机器学习实战2

  2. 机器学习-实用案例解析,中英文版,带完整书签;
    机器学习-实用案例解析1
    机器学习-实用案例解析2

  3. 机器学习-周志华 老师经典系列,网上流传的基本上都是扫描版,这版本为文字版,可以复制文件出来;
    机器学习周志华

  4. 深度学习与神经网络 中文版,英文原著为 Neural Networks and Deep Learning,带完整书签,可复制文字;
    神经网络与深度学习

  5. 斯坦福-深度学习 基础教程,带书签;
    深度学习

  6. 斯坦福2014机器学习教程中文版(吴恩达)v4.31,2017年9月更新,目前最新版;
    机器学习斯坦福

  7. Python自然语言处理 中文_文字版,可复制文字出来,带完整书签;
    Python自然语言处理

  8. 统计学习方法_李航,经典系列,中文版;
    统计学习方法-李航

  9. 模式识别与机器学习 中文文字版,能复制文字出来;
    模式识别与机器学习

  10. 其他的不一一列举,先放一部分;
    书籍列表


甭急,下载地址在这:
链接: https://pan.baidu.com/s/1miDVldY 密码: s9ch

二维码

你以为你看到的是全部?扫描二维码有惊喜

2018-12-28 11:35:59 SIGAI_CSDN 阅读数 699
  • Python机器学习经典案例实战

    Python在机器学习领域应用是非常广泛的,比如,我们可以使用机器学习进行验证码识别,使用机器学习实现计算机视觉项目,或者,我们也可以使用机器学习技术实现网页分类、文本挖掘、情感分析等等各种各样的事情。机器学习的重点在于算法,而算法的学习相对来说是比较枯燥的,所以,只有在学习的时候让算法跟实例结合,才能够让算法的学习变得不枯燥,并且也才能够更好的将理论运用与实践。

    3927 人正在学习 去看看 韦玮

SIGAI特约作者

谢恩泽

同济计算机研三在读,face++ 研究实习生

主要研究方向为目标检测,语义分割等其中包括文字检测和识别

其它机器学习、深度学习算法的全面系统讲解可以阅读《机器学习-原理、算法与应用》,清华大学出版社,雷明著,由SIGAI公众号作者倾力打造。

 

image.png

 

前言:这篇文章是第一个做弯曲文本的端到端检测+识别。

 

传统的方法将文字检测和文字识别分为两个分开的部分,即输入一张图,先进行文字检测,检测出文字的位置,再进行文字识别,即对检测出的文字抠出来并送入识别网络。这样一方面比较费时间,第二没有共享检测和识别的特征。

 

一  什么是端到端检测识别?

即只需要一个网络,输入一张图片,同时输出检测和识别的结果,相比传统先检测再识别的好处在于

(1)速度更快,因为流程更简单

 

(2)效果更好,由于多任务学习使得网络能提取更为鲁棒的特征,每一个任务都可以有一定程度的提高。

端到端训练文字检测和识别可以使得这两个任务都能得到提高,使得梯度能从这两个分支分别回传到主干网络,能使得定位更加精准并减少错误样本的检测。

 

传统做法大多数分为以下四步

(1)检测出旋转的文字框

 

(2)并做一个仿射变换

 

(3)在feature map上将文字区域抠出来

 

(4)用crnn或者类似sequence的方法识别。

这种方法的缺点在于文字可能检测的不够精准,这样对于识别来说就会造成一定困难,比如文字边缘多框了一些空白区域等。

 

二  弯曲文本的检测和识别

弯曲文本检测:过去的方法主要解决水平文字检测或者倾斜的文字检测,而弯曲文字在自然场景中大量出现,如星巴克标志。

image.png

水平文字检测只需要检测出文字的左上角和右下角,即4个变量[x1,y1,x2,y2]

 

倾斜文字一般有两种方法,1是用4个点表示,即8个变量,[x1,y1,x2,y2,x3,y3,x4,y4],2是用水平矩形+旋转角度表示,需要5个变量,[x1,y1,x2,y2,theta]

 

而弯曲文字往往需要用更多的点才能精准描述。如下图所示。

 

因此,过去的方法无法很好的适应弯曲文字检测的任务。

image.png

传统文字识别的方法是把文字区域当做一个序列,用lstm从左到右扫描文字,得到文字识别结果,代表方法为CRNN,这种方法对于水平的文字效果很好,但是对于弯曲的文字效果却很差。

 

弯曲文本识别的难度在于水平检测框或者四边形检测框 做仿射变换,如下图所示

 

(1)无法精准定位文字区域,水平检测框和四边形检测框中文字区域都只占据很小的一部分,大部分都是背景,而基于分割的方法可以准确的包围弯曲文字区域。

 

(2)水平或者倾斜检测框无法扭正文本,因此基于lstm的CRNN识别方法效果就会很差,而用实例分割的方法可以精准检测文字并识别

image.png

 

三 网络结构介绍

该方法是基于Mask R-CNN的,Mask R-CNN是Facebook提出的通用物体检测分割框架,可以同时对80类物体做检测和分割,其中有三个分支

(1)classification分支,用来对目标分类

 

(2)bounding box regression分支,用来定位物体

 

(3)mask分支,用来对框内的物体做实例分割。如下图所示

image.png

 

这篇文章是基于mask rcnn的,流程图如下。

 

创新点主要是对mask分支进行了改进,其中把mask 分支做了类似于人体关键点的检测,把一个个字符当做整个文字的关键点,即不仅对bounding box内的整个文字区域做instance segmentation,同时对每个字符做分割,这里要注意的是每个字符的标注并不来源于真实数据,而是来自于人造数据集synth800k数据,因为真实数据集中往往只有单词级别的标注,并没有字符级别的标注。

image.png

这篇文章的创新之处主要在于在mask 分支加入了文字识别的分支,详细分析一下mask 分支

 

可以看到mask 分支一共分三部分,第一部分是global word map,第二部分是每个字符的character map,这关系到如何识别,第三部分是字符的关键点,即background map,用来区分背景和字符

image.png

 

(1) global word map 和标准的mask rcnn分割的分支一样,目的是分割出word的区域。

 

(2) character maps 该map的channel数量和要识别的文字类别一致,一般数据集为36(10数字+26字母),即对所有字符的中心做语义分割,这个字符属于哪一类就会在channel对应层上响应最高。

 

(3) bachground map 是定位字符的,和(2)类似,但是不需要区分是哪个字符,只需要区分是不是字符。

识别是通过一种 叫pixel-voting的方法,即通过bachground map去算他在36个字符的fmap上的响应,通过投影的方式,取响应最大的当做类别。

 

可以说这是一种基于语义分割的方法的文字识别。

 

pixel-voting做文字识别

image.png

上图 描述了(2)(3)如何做文字识别的细节。通过background map中的字符位置投影到character map上,去计算在每一层的响应值,哪一层响应最大,就认为这个字属于哪一类。主要是通过pixel-voting的方法。

 

通过这种方法识别的好处在于:

(1)借鉴了语义分割的思路,直接分割出字符的中心区域并判断类别

 

(2)抛弃了基于lstm的序列识别的方法,因此对于无论是水平文字还是弯曲文字识别效果都很鲁棒。

标签生成

训练神经网络需要label,如何准备label呢?

image.png

可以看到,左图中蓝色的水平box是rpn 产生的候选框,红色的多边形框是word的真实框,黄色的box是每个字符的真实 box框,绿色的水平框是红色多边形的最小外接矩形框。 右边:上图是mask rcnn做实例分割的label,下边是根据黄色框进行等比例缩圈得到的不同字符的语义分割的label(不同颜色代表不同字符。)

 

细节:其中大量的字符标注(黄色框)不来源于真实数据集,而是来自人造数据集Synth800k,其中包括了80万张人工合成图。

 

实验结果

image.png

可视化结果:作者在icdar2013,2015和total-text上做了实验,效果还是很不错的,红色框表示fast rcnn分支出的水平box,白点是每个字符的定位。

 

作者对比Textboxes+CRNN这种水平box检测识别的效果,这种方法在弯曲文本上优越性的确更强。

 

可以看到Textboxes检测只能检测水平框,精准度很低,其次这样检测出的结果送给识别网络效果很差,很多地方都识别错了。

image.png

 

实验数据:

作者分别在ICDAR2013,2015和Total-Text这三个数据集上做了实验。

 

ICDAR2013是水平文本,ICDAR2015是多方向文本,Total-Text是弯曲文本,因此这三个数据集代表了不同类型的文字检测识别任务。

 

可以看到所提出的方法在弯曲文字上大幅度超过现有方法,在传统的水平和多方向文字检测识别上效果也领先现有的方法。

image.png

 

总结:

这个方法是一个可以端到端检测和识别弯曲文字的方法,基于目前最好的实例分割模型Mask R-CNN,对于曲形文字的端到端识别基于top-down自顶向下的方法基本是做的很好了。

 

此外该方法有一个缺点,对于中文识别估计效果不好,因为中文类别数太多,他们识别的feature map层数和类别成正比,因此feature map层数会很大,会很拖累速度。

 

不过瑕不掩瑜,该方法是第一个尝试做端到端的弯曲文字检测和识别,创新度非常高,其中在Mask分支通过关键点的思路做文字识别更是首创,值得大家多学习一下。

没有更多推荐了,返回首页