一种用于人脸检测的设备上的深度神经网络
欢迎大家前往云加社区,获取更多腾讯海量技术实践干货哦~
译者:QiqiHe
苹果公司开始在iOS 10中使用深度学习进行人脸检测。随着Vision框架的发布,开发人员现在可以在他们的应用程序中使用这种技术和许多其他计算机视觉算法。本文讨论这些挑战并描述了人脸检测算法。
引言
苹果首先通过CIDetector类在Core Image框架的公共API中发布了人脸检测。这个API也被Apple应用程序内部使用,例如Photos。 CIDetector的最早版本使用了基于Viola-Jones检测算法的方法[1]。我们根据CIDetector对传统计算机视觉方面的进展进行了后续改进。
随着深度学习的出现,以及其在计算机视觉问题中的应用,人脸检测精度的最新进展发生了巨大的飞跃。我们必须彻底重新思考我们的方法,以便我们能够利用这种模式转变。与传统的计算机视觉相比,深度学习的学习模型需要更多的内存,更多的磁盘存储以及更多的计算资源。
像今天的手机一样,典型的高端手机并不是一个可行的深度学习视觉模型平台。大多数行业通过基于云的API提供深度学习解决方案来解决这个问题。在基于云的解决方案中,使用深度学习推理将图像发送到服务器进行分析以检测人脸。基于云的服务通常使用功能强大的桌面级GPU,并提供大量内存。非常大的网络模型以及潜在的大型模型可以在服务器端运行,从而允许客户端(可能是手机)利用大型深度学习体系结构,这在本地运行是不切实际的。
苹果的iCloud照片库是一个基于云的照片和视频存储解决方案。但是,由于苹果对用户隐私的强烈承诺,我们无法将iCloud服务器用于计算机视觉计算。发送到iCloud照片库的每张照片和视频在发送到云存储设备之前都会在设备上进行加密,并且只能通过注册到iCloud帐户的设备进行解密。因此,为了给我们的客户提供基于深度学习的计算机视觉解决方案,我们必须直接解决在iPhone上运行深度学习算法所面临的挑战。
我们面临着几个挑战。深度学习模式需要作为操作系统的一部分,占用宝贵的NAND存储空间。它们还需要加载到RAM中,并且在GPU和/或CPU上需要大量的计算时间。与基于云计算的服务不同,云计算的资源只能专注于视觉问题,设备上的计算必须与其他正在运行的应用程序共享这些系统资源。最后,计算必须足够高效,以在相当短的时间内处理一个大的照片库,但没有显着的功耗或热量增加。
苹果的iCloud照片库是一个基于云的照片和视频存储解决方案。但是,由于苹果对用户隐私的强烈承诺,我们无法将iCloud服务器用于计算机视觉计算。发送到iCloud照片库的每张照片和视频在发送到云存储设备之前都会在设备上进行加密,并且只能通过注册到iCloud帐户的设备进行解密。因此,为了给我们的客户提供基于深度学习的计算机视觉解决方案,我们必须直接解决在iPhone上运行深度学习算法所面临的挑战。
我们面临着几个挑战。深度学习模式需要作为操作系统的一部分,占用宝贵的NAND存储空间。它们还需要加载到RAM中,并且在GPU和/或CPU上需要大量的计算时间。与基于云计算的服务不同,云计算的资源只能专注于视觉问题,设备上的计算必须与其他正在运行的应用程序共享这些系统资源。最后,计算必须足够高效,以在相当短的时间内处理一个大的照片库,但没有显着的功耗或热量增加。
本文的其余部分讨论了我们的基于深度学习的人脸检测的算法,以及我们如何成功地应对挑战,以实现最新的精度。我们讨论:
- 我们如何充分利用我们的GPU和CPU(使用BNNS和金属)
- 用于网络推理、图像加载和缓存的内存优化
- 我们如何以不妨碍iPhone预期的其他同时执行任务的方式来实现网络。
从Viola-Jones走向深度学习
在2014年,当我们开始研究深度学习方法来检测图像中的人脸时,深度卷积网络(DCN)刚刚开始在物体检测任务上产生有希望的结果。其中最突出的是一种名为“OverFeat”的方法[2],该方法推广了一些简单的想法,这些想法表明DCN在为对象扫描图像方面非常有效。
OverFeat在一个神经网络和卷积层之间的完全连通的层之间的等价性,与输入的同样的空间维度的过滤器的有效卷积是相等的。这项工作表明,一个固定的接受领域的二元分类网络(例如32x32,自然跨度为16像素)可以有效地应用于任意大小的图像(例如,320x320),以产生适当大小的输出映射(在这个例子中是20x20)。 OverFeat文件还提供了巧妙的配方,通过有效地减少网络步幅来产生更密集的输出映射。
我们基于OverFeat论文的一些见解构建了我们的初始架构,从而形成了一个完整的卷积网络(参见图1),其中包含以下多任务目标:
- 二进制分类来预测输入中面部的存在与否,以及
- 预测边界框参数的回归,以最佳地定位输入中的面部。
我们尝试了几种培训这种网络的方法。例如,简单的训练过程是创建一个固定大小的图像块的大数据集,该图像块对应于网络的最小有效输入,使得每个块产生来自网络的单个输出。训练数据集是理想的平衡,所以一半的图块包含一个面(正类),另一半不包含面(负类)。对于每个正图块,我们提供了真正的位置(x,y,w,h)。我们训练网络来优化前面描述的多任务目标。一旦训练完毕,网络就能够预测一个图块是否包含一个人脸,如果是的话,它还提供该图块中人脸的坐标和比例。
图1.修改后的面部检测DCN体系结构
![](https://ask.qcloudimg.com/draft/1126608/df1lfht3gl.png)
由于网络是完全卷积的,因此可以高效地处理任意大小的图像并生成2D输出图。地图上的每个点对应于输入图像中的图块,并且包含来自网络的关于该图块中是否存在人脸以及其在输入图块内的位置/比例的预测(参见图中的DCN的输入和输出1)。
给定这样一个网络,我们可以建立一个相当标准的处理流水线来执行人脸检测,包括一个多尺度图像金字塔,人脸检测器网络和一个后期处理模块。我们需要一个多尺度的金字塔来处理各种尺寸的面孔。我们将网络应用到金字塔的每个级别,并从每一层收集候选检测。 (见图2)。后处理模块然后将这些候选检测结果跨度进行组合,以产生对应于网络对图像中的脸部的最终预测的边界框的列表。
图2.人脸检测工作流程
![](https://ask.qcloudimg.com/draft/1126608/dd55uslab0.png)
这一策略使我们更接近于在设备上运行深度卷积网络,以彻底扫描图像。但网络复杂性和规模仍然是性能的关键瓶颈。克服这一挑战不仅意味着将网络限制在一个简单的拓扑结构中,而且还要限制网络层数,每层信道数量和卷积滤波器的内核大小。这些限制提出了一个至关重要的问题:我们生产可接受的准确性的网络不是什么简单的东西,大多数都超过20层,由几个网络中的网络模块组成。在前面描述的图像扫描框架中使用这样的网络将是完全不可行的。他们导致了不可接受的性能和用电量。事实上,我们甚至无法将网络加载到内存中。当时的挑战是如何训练一个简单而紧凑的网络,以模拟准确但复杂的网络的行为。
我们决定采用一种非正式的“师生”培训方式[4]。这种方法为我们提供了一个机制来训练第二个薄而深的网络(“学生”),使得它非常接近我们已经培训的大型复杂网络(“老师”),即如前所述的输出。学生网络由一个简单的3x3卷积和层叠重复结构组成,其架构经过精心设计,可以最好地利用我们的神经网络推断引擎。 (见图1)
现在,最后,我们有一个用于面部检测的深度神经网络的算法,对于设备上的执行是可行的。我们迭代了几轮训练,以获得足够精确的网络模型来启用所需的应用程序。虽然这个网络是准确可行的,但仍然有大量的工作要做,以便在数百万用户设备上部署。
优化图像管道
对深度学习的实际考虑因素深深地影响了我们为开发人员设计的易于使用的框架,我们称之为Vision。很明显,伟大的算法不足以创建一个伟大的框架。我们必须有一个高度优化的成像管道。
我们不希望开发人员考虑缩放,颜色转换或图像源。无论是用于实时相机捕捉流,视频处理还是从光盘或网络处理图像,人脸检测都应该运行良好。它应该工作,不管图像的表示和格式。
我们关心的是功耗和内存使用情况,尤其是流媒体和图像捕获。我们担心内存占用,比如64兆像素全景所需的大内存。我们通过使用部分二次采样解码技术和自动平铺技术来解决这些担忧,即使在非典型的高宽比下,也可以在大图像上执行计算机视觉任务。
另一个挑战是色彩空间匹配。苹果公司拥有广泛的色彩空间API,但我们不希望让开发人员承担色彩匹配任务。视觉框架处理颜色匹配,从而降低成功采用计算机视觉到任何应用程序的门槛。
Vision还通过有效处理和重复使用中间体来优化。人脸检测,人脸标志检测以及其他一些计算机视觉任务可以从相同的缩放中间图像中工作。通过将算法的接口抽象出来,找到要处理的图像或缓冲区的所有权位置,Vision可以创建和缓存中间图像,以提高多个计算机视觉任务的性能,而无需开发人员进行任何工作。
另一面也是如此。从中心接口的角度来看,我们可以将算法开发推向方向,以便更好地重用或共享中间体。 Vision承载了几种不同的,独立的计算机视觉算法。为了使各种算法能够很好地协同工作,实现使用输入分辨率和颜色空间,尽可能多的算法共享。
优化设备上的性能
如果我们的人脸检测API无法在实时应用程序和后台系统进程中使用,那么易用性的快感将很快消失。用户希望在处理照片库进行人脸识别或在拍摄后立即分析照片时,能够流畅地运行人脸检测。他们不希望电池耗尽或系统的性能缓慢爬行。苹果的移动设备是多任务设备。因此背景计算机视觉处理不应该显着地影响系统的其余部分的特征。
我们实施了几种策略来最大限度地减少内存占用和GPU使用。为了减少内存占用,我们通过分析计算图来分配神经网络的中间层。这允许我们将多个图层别名到同一个缓冲区。虽然是完全确定性的,但这种技术可以减少内存占用,而不会影响性能或分配碎片,并且可以在CPU或GPU上使用。
对于Vision,检测器运行5个网络(每个图像金字塔比例一个,如图2所示)。这5个网络共享相同的权重和参数,但其输入,输出和中间层具有不同的形状。为了进一步减少占用空间,我们在由这5个网络组成的联合图上运行基于活性的内存优化算法,大大减少了占用空间。此外,多个网络重复使用相同的权重和参数缓冲区,从而减少内存需求。
为了获得更好的性能,我们利用了网络的完全卷积性:所有的尺度都被动态调整大小以匹配输入图像的分辨率。与将图像拟合在方形网络视网膜(由空白带填充)相比,将网络适合图像的大小允许我们大大减少总操作的数量。由于操作的拓扑结构并没有因分配器其余部分的重构和高性能而改变,所以动态整形不会引入与分配有关的性能开销。
为了确保在深层神经网络在后台运行时的UI响应性和流畅性,我们为网络的每一层分割GPU工作项,直到每个单独时间少于一毫秒。这使驱动器能够及时将情境切换到更高优先级的任务,如UI动画,从而减少并有时消除丢帧。
综合起来,所有这些策略确保我们的用户可以享受本地,低延迟,私密的深度学习推断,而不必意识到他们的手机每秒钟运行数百亿次浮点运算的神经网络。
使用视觉框架
我们是否已经完成了我们设定的目标,即开发一个高性能,易于使用的人脸检测API?你可以试试Vision框架并为自己判断。以下是如何开始:
观看WWDC演示:Vision Framework: Building on Core ML.
在iOS 11教程中试用Core ML和Vision:机器学习。 [5]
引用文献
[1] Viola, P. and Jones, M.J. Robust Real-time Object Detection Using a Boosted Cascade of Simple Features. In Proceedings of the Computer Vision and Pattern Recognition Conference, 2001.
[2] Sermanet, Pierre, David Eigen, Xiang Zhang, Michael Mathieu, Rob Fergus, and Yann LeCun. OverFeat: Integrated Recognition, Localization and Detection Using Convolutional Networks. arXiv:1312.6229 [Cs], December, 2013.
[3] Lin, Min, Qiang Chen, and Shuicheng Yan. Network In Network. arXiv:1312.4400 [Cs], December, 2013.
[4] Romero, Adriana, Nicolas Ballas, Samira Ebrahimi Kahou, Antoine Chassang, Carlo Gatta, and Yoshua Bengio. FitNets: Hints for Thin Deep Nets. arXiv:1412.6550 [Cs], December, 2014.
[5] Tam, A. Core ML and Vision: Machine learning in iOS Tutorial. Retrieved from https://www.raywenderlich.com, September, 2017.
原文链接:https://machinelearning.apple.com/2017/11/16/face-detection.html
原文作者:Computer Vision Machine Learning Team
此文已由作者授权云加社区发布,转载请注明原文出处