Application example:Photo OCR(应用的举例:照片的光学字符识别)

前言

     在前面,我们给大家介绍了很多的机器学习算法,有关于监督学习的线性回归、逻辑回归、神经网络、支持向量机SVM,还有关于无监督学习的聚类问题(K-means)、降维(PCA)、异常检测。在这一章将给大家介绍一个关于机器学习的应用例子,Photo OCR(Optical Character Recognition),这也是这个课程的最后一章内容,希望大家在学完整个课程后能多把这些用到实际中,这样才能对所有的算法有更好的理解,由于本人也是初学者,所以可能对整个课程的理解有些还不够成熟,在以后有了更好的理解,我会对有些内容进行修改。

      最后,如果有理解不对的地方,希望大家不吝赐教,谢谢!

第十六章 Application example:Photo OCR(应用的举例:照片的光学字符识别)

16.1 问题的描述和流水线过程

      我们先对Photo OCR进行一个简单的介绍,简单的说就是在一张图片中对文字进行识别出来,如图1所示,,我们有一张照片,照片中有些地方是文字,OCR的问题就是把这些文字检测出来,并成功表示出文字的信息。

                                                                         图1 The Photo OCR problem

     关于Photo OCR的过程,我们可以称之为pipeline(流水线)工作,我们是把整个任务分成几个部分,第一步我们对文字进行检测如图2所示,把照片中的文字检测出来,第二部把检测出来的文字进行分割,如图3所示,这样才能对单个字母进行学习分类,第三部对分割后的每个字母进行分类,如图4所示,得到正确的文字信息。

                                                                                  图2 第一步:检测文字

扫描二维码关注公众号,回复: 6514240 查看本文章

                                                                                图3 第二步:对文字进行分割

                                                                     图4 第三步:对单个文字进行分类提取信息

       整个过程我们就称为pipeline,如图5所示,像一条流水线一样,每个部分可以分配给不同的人来完成,这样也可以提高整个系统的效率,当然你也可以一个人完成。

                                                                       图5 Photo OCR pipeline

16.2 滑动窗口

      对于第一步文字检测环节,我们需要给大家介绍下滑动窗口,在图1中,我们用来框住文字的矩形框就是滑动窗口,只是文字矩形框长宽不好约束,我们用检测行人的例子给大家介绍下矩形框的用法。如图6所示,道路上有几个行人,我们用矩形框进行检测出行人,由于行人的长宽比例比较固定,所以我们可以用相应比例的矩形框进行扫描检测出行人,也就是滑动窗口。

                                                                                     图6 行人的检测

    当用矩形的滑动窗口扫描时,我们会得到很多的和矩形框大小一样的图片,在这之前,我们可以先对大量已知的和滑动框大小一样的图片进行学习,即我们有一组已知的图片,如图7所示,我们有两类图片,即一类是我们需要得到的目标图片行人的图片,我们用y=1表示,还有一类即是非行人的图片,我们用y=0表示,这其实就是监督学习的问题,我们可以用逻辑回归或者神经网络的学习算法来对此进行学习,然后再根据滑动框得到的图片进行判断。

                                                                                      图7 用来学习的图片

     我们的滑动框在进行滑动时,我们有一个步长,即每次滑动的距离,一般是4个像素,然后从左上角开始依次向后滑动,完成对整个图片的扫描。最后检测出行人,如图8所示,注意每个滑动框的大小不一定是一样的,但比例一样,因为每个行人的比例差不多,在前面我们也说了,所以可以用长宽比例一样的矩形滑动框。

                                                                         图8 最后检测出来的结果

      同样对于文字的检测,如图9所示,我们希望通过图9那样大小的一些滑动框检测出每个文字来。

                                                                             图9 用滑动框来检测文字

      我们也会用一些已知的图片进行学习,如图10所示,我们有两类图片,目标图片用y=1表示,非目标图片用y=0表示。

                                                                                 图10 用来学习文字的图片

      对此进行学习,然后再对图1的图片进行检测,我们会得到图11所示的结果,对于背景是用黑色表示的,而检测出的文字就是白色的,我们会发现文字的地方确实是白色的,但不是一个整体,由于我们需要用一个矩形滑动框来进行框住,所以我们需要对白色的地方进行一些平滑模糊啥的把附件的像素也变成白色,使其成为一个整体,如图12所示,再根据文字一般是比较宽的,所以对于有些窄的白色,我们就可以之间舍去了,但是根据这样检测的结果,我们会发现有些地方还是没有检测出来的,比如有些在玻璃上的文字就没被检测出来。

                                                                                         图11 检测的结果

                                                                                    图12 处理后的检测结果

     上面给大家介绍了如何用滑动窗来检测出文字,下面给大家介绍如何对检测出来的文字进行分割,我们同样有两组图片,如图13所示,即我们用来学习的正类图片数据,用y=1表示,可以发现每张图片中间都可以很容易地用一条线来进行分割,还有一类则是我们的负类图片数据,如图14所示,用y=0表示。现在我们有一组文字,如图15所示,我们依旧是用滑动框进行检测,以一定的步长向后依次滑动。

                                                                               图13 用来分割的正类图片数据

                                                                             图14 用来分割的负类图片数据

                                                                          图15 用滑动窗口对文字进行检测分割

    分割后的文字,我们就可以对此一一检测分类,提取其信息。

16.3 获取大量的数据:人工合成数据

       在前面章节我们就要说到,拥有大量的数据对一个学习系统有很大的帮助,对于数据的获取我们可以通过不断地去寻求新的数据,其实我们还有一个办法就是对已有的部分数据,我们可以对此进行人工合成造就出大量更多的数据。

       所以对于最后一步的提取文字信息,如图16所示,有分割好的每个图片进行特征识别得到正确的信息,对于我们的学习系统,我们就需要拥有大量的数据,这样才能更好的学习,使识别正确率更高。

                                                                                       图16 特征识别

     我们真正得到的数据是这样的,如图17所示,每个文字背景都比较复杂,所以比如我们通过一些网站得到的字体库是图18那样的,我们对此就需要把这些文字加上一些复杂的背景,尽可能地接近我们实际中的文字,我们最后加上了复杂背景后的图片如图19所示,这就是我们人工进行合成数据。

                                                                                        图17 真实的数据

                                                                                    图18 字体库得到的数据

                                                                                图19 人工合成后的数据

     对于合成数据,我们除了加上复杂的背景外,我们还可以对数据进行扭曲,由于实际中的数据并不是那么规规矩矩的,所以我们通过对数据扭曲,也同样可以得到比较接近实际数据的合成数据,如图20所示,在这样为了更好的看出扭曲的效果,我们对数据加上网格。

                                                                           图20 对数据进行扭曲

       上面关于怎样对文字数据进行人工合成大量数据已经给大家介绍完了,然而有时候我们的数据是语言数据,比如一段语言,我们需要检测出我们所说的每个单词,假设我们现在已经有了一段语言数据,我们需要人工合成其他的数据,则我们可以夹杂上不同的噪声,这样就有了大量的数据了。

        还有就是我们对数据进行加噪声,我们要加的是随机噪声,而不能是高斯噪声,因为加高斯噪声对于整个数据并没有太大的改变,如图21所示,所以没啥意义。

                                                                                  图21 对数据加高斯噪声

        关于在人工合成大量数据之前,我们需要思考两个问题。第一个问题就是,增加大量的数据是否对整个系统有帮助?所以我们需要用学习曲线来判断,前面我们也介绍过学习曲线,在保证系统是低偏差高方差的前提下,我们才会去考虑增加大量的数据。第二个问题就是,人工合成大量的数据需要花费多长的时间,在做任何事之前,我们都需要预估要多长的时间,值不值得做这件事,假设我们本来的数据有m=1000,我们合成一个数据需要大概10秒,我们现在需要合成10,000组数据,则我们需要100,000秒,也就两三天的时间,我们就可以得到如此多的数据,而且会对系统的效果提高不少,所以说是非常值得的。

16.4 上限的分析

       在前面也给大家介绍了Photo OCR整个过程的流程,我们称之为流水线工作,假设我们最好学习的结果不怎么好,我们需要对整个过程的哪部分来提高了?还是都需要改进?这个时候我们就提出了一个新的概念:上限的分析,首先对于图5整个过程我们正常流程走下来,我们可以任意定一个判断整个系统正确性的变量,比如我们用最后正确的检测率来表示整个系统的性能好坏,假设正确为72%,当我们对于第一步文字检测环节,我们进行如下操作,把已经检测好的文字作为这个环节的输入,即保证此环节没有任何误差,这个时候我们再对最后的结果进行检测正确性,发现提高到了89%,依次对文字分割环节进行操作,让文字已经分割好作为他的输入,这样再进行检测最后的正确性,发现提高到了90%,继续这样检测每一个环节,我们可以得到如图22所示的结果。我们会发现保证了文字检测环节的正确率,整体系统的正确性提高了17%,而保证文字分割的正确率,整体正确性才提高了1%,由此可见,对于文字检测环节的改善我们可以多派人手和多花时间在这一块上,使他做的更好,而对于文字的分割就不需要花费太多的人力和时间,同样的对于特征的识别环节使整体正确性提高了10%,也是值得花人力和时间去做的一块。所以在对系统进行了上限分析后,我们再对此进行合理安排,使整个学习都更有效率,比较时间对于一个研究者来说是非常宝贵的,不能浪费时间。

                                                                   图22 检测每一步操作后的正确性

猜你喜欢

转载自blog.csdn.net/qq_36417014/article/details/84722438