论文部分内容阅读
虽然在任意给定的图像中查找人脸的存在和位置是一项艰巨的任务,但是这方面工作在过去的20年中得到了越来越多的关注。这类研究的任务主要是检测任意物体的特定特征来解决计算机视觉中的识别问题。尽管人们已经取得了大量的研究成果,比如目前的检测方法在保持特定条件不变的情况下效果良好,但是在现实世界中就不适用了,因为光在真实环境下“工作”方式不同,经常会出错,而且目标的位置也不是固定的。之前的方法在目标检测和识别算法不太实用,而且计算复杂,所以在该领域,目前已经做了许多研究来优化这些算法。面部识别是物体识别中的一个非常重要的分支,因为它有很多方面的应用,特别是在安保和监控领域。在如今这个对安全十分看重的世界里,政府机构非常关心在这个领域中,什么样的监控任务可以自动化,然后在这个领域投入巨资。这些任务包括使用静态或动态摄像头跟踪人物在视频中的移动,以及人脸检测,因为这是面部识别系统是第一步工作。面部识别在消费领域也有很多应用,例如数码相机的脸部自动对焦,Wii风格游戏和头部追踪摄像头。为了使大多数这些应用得以实现,检测必须实时进行。这无疑在已经复杂的问题上又增加了一层障碍。我使用的是由Paul Viola和Michel Jones提出的人脸检测方法-“Robust实时人脸检测”,该方法目前应用于开放式计算机视觉库(OpenCV)。基于简单的特征,解码基本的图像属性。单独来说,这些特征不够特殊,但可以被快速计算。当这些获得的特征组合在一起时,它们可以准确地检测面部。该算法还运用于机器学习技术来构建一套能够快速检测人脸的重要特征组。此类工作的第一个贡献是一种被称为积分图像的新图像呈现技术,这项技术能非常快速进行特征评估。由于受到Papa Georgiou等人一些研究工作的启发,已应用的检测系统工作不直接基于图像强度。像这些学者一样,我也使用了一系列基于哈尔基础函数的特征组。为了在众多尺度上超快速地计算这些特征,我们使用积分图像显示技术处理图像(积分图像非常类似于计算机图形中用于纹理映射的求和区域表)。积分图像可以从每像素仅有几个操作的图像中得到计算。一旦积分图像被计算出来,这些类Harr的特征中的任何一个都可以在不同时间的任何尺度或位置进行计算。第二个贡献是该算法是通过使用AdaBoost选择少量重要特征来组装分类器的方法。在这个图像子窗口中,类哈尔特征的总数非常大,远高于像素数量。为了确保快速分类,学习过程必须排除大部分可用功能,并关注一小组关键功能。特征选择是通过对AdaBoost过程的简单修改来实现的:弱学习器被限制,使得每个弱分类器只依赖于一个特征。因此,每个选择新的弱分类器的过程都可以被视为特征选择过程。AdaBoost提供了 一个有效的学习算法,而且其泛化性能十分强大。这种方法的第三个主要贡献是在串联结构中将更复杂的分类器成功组合,通过集中计算图像中有意义的区域,这使得检测器的速度显着提高。普遍认为焦点关注法可以快速确定图像中物体可能出现的位置。更复杂的运算只能在这些有效的区域反复进行。这种方法的测量的关键是锁定过程的“错误否定”率,必须在所有或几乎所有对象实例是由锁定过滤器选定的情况下使用。开放式计算语言(OpenCL)的图形处理单元(GPU)可实现高检测率。GPU被设计用于快速操作和改变内存,来加速用于嵌入式系统,移动电话,个人计算机,工作站和游戏控制台中的显示输出设备中帧缓冲器的图像形成。技术领先的公司是英特尔,AMD和NVIDIA。使用基于NVIDIA和AMD GPU的ALU的计算能力原因是想在并联独立的数据流上执行(SIMD)单指令流。这个概念是为了使具有指令向量寄存器的CPU在这些寄存器上运行。一个128位向量寄存器,最多可以保存四个单精度浮点值。在这两个寄存器上运行的加法指令执行四个独立的并行加法。与之不同的是,GPU不使用向量寄存器,而是使用在不同数据集上都执行相同的指令流的硬件线程。NVIDIA将这种方法称为“单指令流,多线程(SIMT)”。需要保持AL持续U繁忙的线程数量远大于向量寄存器内的元素数量。因此,GPU性能高度依赖于数据级在任意应用程序中的并行性。为了使对数据级并行性的要求得到简化,GPU可以通过运行并行计算的不同独立任务来实现任务级并行,所有现代GPU上都可以使用条件语句。一些最近的GPU也支持通过并行执行独立GPU程序来进行任务级并行的利用。为了完全利用GPU的计算能力,每个独立任务又需要涉及数据级的高度并行。任务级并行性使GPU能够加速计算,这使得程序员在扩展应用程序集时更加灵活。GPU比CPU更强大,因为GPU具有更多相对普通的处理内核。我们不会在所有情况下使用它们,因为它们是需要集体工作的类型,这种工作状态下数量能够很大程度提升性能。GPU一般有成千上万的相对较慢的内核,这些内核被分到几个同步执行的组,而CPU往往有两到二十个可以完全独立运行的相对较快的内核。如果你进行一些能够并行计算的密集型计算,使用GPU进行运算是最好的选择。大多数主流超级计算机都采用GPU进行运算,许多机器学习算法可以运行得更快(特别是深度学习)。CPU和GPU之间主要哲学区别也对其各自领域的计算未来产生重要影响。尽管你可能听到了摩尔定律仍然存在,适用于大部分情况,所以每隔几年我们就会因晶片缩小和其他进步而使芯片中的晶片数量增加约一倍。CPU软件尽管能够在大约十年的时间实现多核CPU并行性,但大部分仍然针对单线程工作负载进行了优化。因此,像英特尔这样的CPU制造商倾向于使用额外的晶片在他们现有的内核和附加缓存中增加智能,使非最佳的代码运行得更快。像Nvidia这样的GPU制造商正好相反-GPU的软件模型基本上是并行和多线程的,所以这些额外的晶体管大部分用于添加更多(相对较慢的)内核。实际效果是,在优化代码方面,CPU每年大约可以有20%的提升(以原始FLOPS测量),而GPU至少40%。加剧这种差距的原因是,GPU倾向于利用最快的内存技术来满足所有计算单元,因此GPU内存可能比CPU内存快一个数量级以上,这非常适合进行如数据库分析这样内存/IO绑定的工作。大多数GPU可以并行执行许多最简单的整数和具有许多核心程序(如多个数据,多个参数,多个指令,多个CPU内核)的单精度浮点运算的SIMD指令。它们(积分)的时钟还与GPU时钟同步,所以内存不会成为执行指令的瓶颈,并可像整个L2或L3缓存一样充当整体。因此,在理想的情况下(实际不是理想的),他们可以实现1到4000 GFlops的运行性能(取决于GPU有多少内核,例如有256核心的AMD HD 7970 GHZ可以做4000 GFlops),而标准通用 CPU(如 12核 Intel Core i7-5930K)只能处理 63GFlops。如果只是进行数学计算,你会发现即使是单个CPU核心,GPU的性能也比标准CPU高3倍。但是如果我们回到正常类型的指令,比如循环,堆栈操作,内存操作,尤其是随机访问大量内存,IO操作,只有一个或两个或三个参数(不是数百个参数)的数学指令,情况则会发生很大变化,正常的CPU每个内核都会有时会超过GPU的内核100 倍。并行计算需要一个由’OpenCL’框架给出的用于基于任务和基于数据的并行性的标准接口。OpenCL是一种框架,用于编写跨异构平台之间运行的项目,这个框架包括中央处理单元(CPU),图形处理单元(GPU),数字信号处理器(DSP),闸可编程门阵列(FPGA)以及其他处理器或硬件加速器等异构平台执行的程序,可以为基于任务和基于数据的并行性的并行计算提供一个标准接口。定义一个用于编写编程代码的类C语言,在OpenCL设备(GPU)上执行的函数被称为“内核”。一个计算设备由多个计算单元组成,而这些计算单元又由多个处理单元(PE)组成。单个内核执行可以并行运行在全部或者多个PE上。OpenCL极大地提高了游戏,娱乐,科学和医疗软件,专业创意工具,视觉处理以及神经网络培训和推演等众多市场应用的速度和响应能力。