当前位置: 首页 > 资讯

【原创】让iPhone学会人脸检测,苹果把深度学习移植到移动端

机器人网       2017-11-17

编者按:硅谷大佬们跟手机杠上了!继前天谷歌发布TF的轻量级版本TensorFlow lite后,今晨,苹果计算机视觉机器学习小组在官网公布了新成果——一个可用于人脸检测的移动端深层神经网络。在文章中,苹果就GPU/CPU利用、内存优化和任务管理三方面对手机如何训练高精度模型做了详细解答,并展示了DCN架构对检测功能精度的提升效果。值得注意的是,该成果是基于RGB图像的面部检测,所以和Face ID人脸识别有区别。

【原创】让iPhone学会人脸检测,苹果把深度学习移植到移动端

以下是论智对苹果原文的编译:

在iOS 10中,苹果开始将深度学习用于人脸识别。随着Vision框架的发布,现在开发者们可以把这个框架和其他计算机视觉算法用于APP。但它并不完美。相信许多用户已经发现了,现有的框架在保护用户隐私和在移动设备上的运营效率等方面还面临诸多挑战,本文就这些挑战进行了诸多探讨,并介绍了一种新算法。

简介

最初,苹果的人脸识别,确切的说,是人脸检测,并不是一个独立的框架,它只是Core Image框架下CIDetector类里的一个API,被应用在一些苹果自带的APP里,如照片(Photos)。CIDetector最早的版本基于Viola-Jones检测算法设计,最近,苹果又把一些计算机视觉(CV)方面的技术进步引入其中,对它做了进一步改进。

随着深度学习的出现和CV技术的落地,人脸检测在精度上取得了重大飞跃。苹果意识到,技术迭代刻不容缓。但是相较于传统计算机视觉,深度学习模型需要更大的内存空间、更大的磁盘空间以及更强的算力。今天的手机,即便是典型的高端手机,它们都不是深度学习模型训练平台的一个可行选择。

为了解决这个问题,业内常用的解决方案是提供一个基于云的API,当用户在设备上进行人脸检测时,它会把图像上传到云服务器做深度学习推理。云服务器能提供拥有足够大可用内存的高性能桌面级GPU,以及非常大的网络模型,当用户受限于本地硬件条件时,他们(甚至是手机用户)可以在云上跑大型深度学习架构。

苹果的iCloud照片库就是一种基于云的照片、视频存储解决方案。由于iCloud涉及用户隐私,加上同步到云的每张图片、每段视频都被做过加密处理,需要对应的Apple ID解密,因此把iCloud服务器作为CV计算平台是不现实的。苹果只能在iPhone上解决模型训练的硬件、算法问题。

当前苹果面临的挑战主要有以下几个:

   深度学习模型需要被封装进手机操作系统,这会占用宝贵的NAND空间;

   深度学习模型需要被加载到RAM中,并在GPU和CPU上进行长时间计算;

   受限于硬件环境,手机端的模型只能专注于CV问题,环境资源由模型和其他应用共享;

   如何在省电不发烫的情况下实现大型照片库的高效处理。

在下文中,苹果详细介绍了这种基于深度学习的人脸检测的算法,以及他们基于上述几点挑战做出的成功尝试。

   如何充分利用GPU和CPU(使用BNNS和Metal);

   针对神经网络推理的内存优化,包括图像加载和缓存;

   如何在不干扰其他任务的前提下实现深度学习。

从Viola-Jones算法到深度学习

早在2014年,苹果就开始研究如何用深度学习的方法来检测图像中的人脸,研究人员发现,深度卷积网络(deep convolutional networks)在物体检测实验中效果喜人,其中最突出的是一种名为OverFeat的经典图片分类、定位物体检测算法,它的一些思路在对象检测上非常有效。

OverFeat最初来自2014年ICLR的一篇论文:OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks。它的主要方法是特征提取算子,并在神经网络的全连接层和卷积层(与输入维度相同的过滤器的有效卷积)之间建立起等价关系。通过实验,研究人员发现固定感受野的二元分类神经网络可被应用到任意大小的图像上,以输出合适大小的图片。如当图片大小为320×320,感受野为32×32,自然步长16个像素时,它的输出图片是20×20。

OverFeat还提供了巧妙的配方,可通过有效减少神经网络步长来产生更密集的输出映射。

苹果依据论文中的一些思路构建了人脸检测算法的初始架构,并建立起一个完整的卷积网络(如图1),其中包含多项任务:

   通过二元分类检测图像中是否存在人脸;

   预测边界框参数的回归,以最佳定位输入中的人脸。

研究人员尝试了多种训练方法,例如,一种简单的操作是创建一个大型数据集,其中的图像尺寸固定为神经网络的最小有效输入,这样网络输出的图像的尺寸也是固定的。因为数据集是理想平衡的,所以它的输出一般包含人脸(positive),一半不包含(negative)。对于每个positive的图像,研究人员再用(x, y, w, h)框出人脸的真正位置,利用OverFeat,也就是苹果口中的训练网络优化,他们无需从头开始训练,只需把优化的目标重新投入之前的任务。

经过训练,神经网络能判断图像中是否包含人脸,不仅如此,如果有,它还能标记出人脸的坐标和大小。

【原创】让iPhone学会人脸检测,苹果把深度学习移植到移动端

图1 经修改的DCN框架用于人脸检测

如上图所示,由于神经网络是完全卷积的,它可以高效处理任意大小的图像并生成2D输出图,框架图中的每个框对应输入图像中的信息,包括对是否有人脸、人脸坐标及人脸大小的预测。

通过这样一个神经网络,苹果可以建立一条人脸检测“流水线”,其中包括一个多尺度的图像金字塔、人脸检测器网络以及一个后处理模块:

   首先,把神经网络应用到多角度图像金字塔的每一层;

   其次,利用人脸检测器提取候选特征;

   最后,依靠后处理模块把检测结果在不同尺度上进行组合,以产生对应图像的预测框列表。

【原创】让iPhone学会人脸检测,苹果把深度学习移植到移动端

图2 人脸检测“流水线”

这种方法使在手机上运行深度卷积网络检测图像更进一步,但神经网络的复杂性和规模还是制约性能的关键瓶颈。要想解决这一难题,苹果不仅需要把神经网络限制在一个简单的拓扑结构中,还要限制它的层数,包括每层通道数量的多少和卷积过滤器内核的大小。而这就引申出一个至关重要的问题:上述方法确实能让神经网络给出令人满意的准确率,但这个过程一点都不简单!它起码会超过20层,同时还包含多个NIN(network-in-network,来自2014年ICLR论文Network In Network)。像这样一个网络,无论是算力还是能耗,手机完全跑不动。事实上,它甚至都无法被加载到内存里。

训练一个简单而紧凑的神经网络,同时让它模拟准确而高度复杂的神经网络行为,这才是当前的最佳解决方案。

于是苹果更换思路,选择了一种名为“师生”的训练方法,它能提供一种机制,能训练第二个薄而深的神经网络(“学生”),使它在准确率和行为上尽可能地接近上述已经训练好的大型复杂神经网络(“老师”)。

“学生”的结构非常简单,它由一些3×3的卷积和池化层简单叠加而成,其架构经过精心设计,能最大限度的利用苹果的神经网络推理引擎(见图1)。

以上就是人脸检测算法的迭代思路介绍,经反复实验,它被证明是可以在移动设备上使用的,不仅能训练出足够精确的模型,同时也能和其他APP共同运行。当然,虽然这个神经网络可行,但在正式被部署到iPhone上前,它还需要大量准备工作。

优化图像管道

在引入深度学习过程中,苹果对由此产生的现实因素进行了诸多考虑,而这也深深影响了Vision框架的搭建。显然,伟大的算法不足以建立一个伟大的框架,除了人脸检测算法,苹果还需要一个高度优化的成像管道。

图像识别需要大内存,为了尽可能地压缩占用空间,在图像处理上做手脚是一种简单的办法。但研究人员显然不想这么做,他们不考虑做任何缩放、颜色转换或指定图像源,无论是手机拍摄的照片、视频,还是光盘上、网页上的图像,人脸检测都应该表现良好。它的运行和图像的格式、呈现无关。

他们关心的是功耗和内存使用情况,尤其是当检测对象是流媒体和图像捕获时。举一个较极端的例子,如6400万像素的全景照片,24位色彩,加上拍摄时间、地点、器材等信息,它的大小应该在200M左右。对于这样大型图像,还有一些长宽比特殊的图像,苹果采用的办法是部分二次采样解码和自动平铺,这两个技术能保证人脸检测的顺利执行。

另一个挑战是色彩空间匹配。苹果拥有大量色彩空间API,为了避免浪费,他们希望能把它应用于人脸检测,这既使开发者省去了手动配色的烦恼,也降低了色彩识别的隐形门槛,让他们能更方便地将CV用于APP。

Vision框架还通过有效处理和重复使用中间图像来不断优化。如人脸检测、人脸特征点检测及其他CV任务都可以在同一缩放比例的中间图像中进行,通过抽象提取算法借口、找到处理的图像或缓存区位置,该框架能创建和缓存中间图像,自动提高进行多个CV任务时手机的性能,无需开发者进行任何操作。

同理,从中心接口的角度看,算法也是Vision框架的一个努力方向。目前Vision中有几种不同的、互相独立的CV算法,为了实现输入分辨率、色彩空间等信息,未来打通、共享算法值得期待。

优化设备性能

如果人脸检测API不支持前台运行和后台驻留,那它会很快被用户抛弃。站在用户体验角度,人脸检测应当运行流畅、低耗电、低发热,同时不影响整个手机系统的响应速度。苹果的移动设备都是多任务设备,虽然计算机视觉技术在某些方面表现出色,但它的引入不应对移动设备的基础性能特征造成显著影响。

为了尽量减少内存占用和GPU使用,苹果实施了几个策略。针对内存,他们通过分析计算图来分配神经网络的中间层,这允许他们将多个不同的层分配到同一个缓冲区。虽然在分配上会有一些生硬,但这种做法的确可以减少内存占用,而且不会影响手机性能和多任务执行,也可以在CPU或GPU上使用。

对于Vision框架,检测器同时运行着5个神经网络(如图2所示,每层金字塔一个)。这5个神经网络共享相同的权重和参数,但它们的输入、输出和中间图像会有区别。为了进一步缩小占用空间,苹果在这5个神经网络组成的联合图上运行基于活跃度的内存优化算法,效果显著。此外,一些权重相同的参数缓冲区也是它们重复利用的,这也有利于内存占用减少。

为了获得更好的性能,苹果利用了神经网络的全卷积性质:所有的尺度都会被动态调整大小以匹配输入图像的分辨率。和将图像拟合在矩形网络视网膜(由void band填充)相比,利用神经网络把图像尺寸调整到合适大小大幅降低了计算次数。

为了确保深层神经网络在后台运行时UI的响应速度和流畅性,苹果为神经网络的每一层单独分割GPU工作项,直到每层的时间消耗少于1毫秒。这使用户能及时切换到优先级更高的任务上,如UI动画,并减少掉帧。

综上所述,这些优化策略能确保用户可以在本地进行低延迟、私密性好的学习推理,无需为手机正在进行每秒上百亿次计算而担忧。

Vision框架教程

如果你想尝试Vision框架,以下是苹果为你准备的教程:

   观看WWDC演示:developer.apple.com/videos/play/wwdc2017/506/

   阅读Vision框架文档:developer.apple.com/documentation/vision

   用户分享的教程:www.raywenderlich.com

重要参考文献及原文地址

1.参考文献1:Sermanet, Pierre, David Eigen, Xiang Zhang, Michael Mathieu, Rob Fergus, and Yann LeCun.OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks

2.参考文献2:Lin, Min, Qiang Chen, and Shuicheng Yan.Network In Network

3.原文地址:machinelearning.apple.com/2017/11/16/face-detection.html

关键词:iPhone,人脸检测,深度学习