NNAPI 支持通过将 Android 设备中的数据应用到先前训练的开发者定义的模型来进行推断。推断的示例包括为图像分类、预测用户行为以及选择针对搜索查询的适当响应。
在设备上进行推断具备诸多优势:
- 延迟:您不需要通过网络连接发送请求并等待响应。例如,这对处理从相机传入的连续帧的视频应用至关重要。
- 可用性:即使在网络覆盖范围之外,应用也能运行。
- 速度:专用于神经网络处理的新硬件提供的计算速度明显快于单纯的通用 CPU。
- 隐私:数据不会离开 Android 设备。
- 费用:所有计算都在 Android 设备上执行,不需要服务器场。
开发者还应在以下几个方面做出权衡取舍:
-
系统利用率:评估神经网络涉及大量的计算,而这可能会增加电池电量消耗。如果您担心自己的应用耗电量会增加(尤其是对于长时间运行的计算),应考虑监控电池运行状况。
-
应用大小:应注意模型的大小。模型可能会占用数 MB 的空间。如果在您的 APK 中绑定较大的模型会对用户造成过度影响,那么您可能需要考虑在应用安装后下载模型、使用较小的模型或在云端运行计算。NNAPI 未提供在云端运行模型的功能。
了解 Neural Networks API 运行时
NNAPI 应由机器学习库、框架和工具调用,这样可让开发者在设备外训练他们的模型,并将其部署在 Android 设备上。应用一般不会直接使用 NNAPI,而会使用更高层级的机器学习框架。这些框架进而又可以使用 NNAPI 在受支持的设备上执行硬件加速的推断运算。
根据应用的要求和 Android 设备的硬件功能,Android 的神经网络运行时可以在可用的设备上处理器(包括专用的神经网络硬件、图形处理单元 (GPU) 和数字信号处理器 (DSP))之间高效地分配计算工作负载。
对于缺少专用供应商驱动程序的 Android 设备,NNAPI 运行时将在 CPU 上执行请求。
TensorFlow Lite 是一组工具,可帮助开发者在移动设备、嵌入式设备和 loT 设备上运行模型,以便实现设备端机器学习。
主要特性
- 通过解决以下 5 项约束条件,针对设备端机器学习进行了优化:延时(数据无需往返服务器)、隐私(没有任何个人数据离开设备)、连接性(无需连接互联网)、大小(缩减了模型和二进制文件的大小)和功耗(高效推断,且无需网络连接)。
- 支持多种平台,涵盖 Android 和 iOS 设备、嵌入式 Linux 和微控制器。
- 支持多种语言,包括 Java、Swift、Objective-C、C++ 和 Python。
- 高性能,支持硬件加速和模型优化。
- 提供多种平台上的常见机器学习任务的端到端示例,例如图像分类、对象检测、姿势估计、问题回答、文本分类等。
了解完这些内容后我们可以跟随官方Demo进行练习了,熟悉一下基本流程和处理方式
人脸识别系统是如何工作的?
- 在输入图像上检测人脸。
- 使用检测到的脸部特征点对脸部进行旋转变形(以便所有裁剪的面部的眼睛位置都相同)。
- 对人脸进行裁剪,并适当调整大小以满足深度学习识别模型。在这一步中还进行了一些图像预处理操作(例如,对脸部进行规范化和白化)
- 最“有趣的部分”,深度神经网络。我们将更过关注这一步。
其主要思想是,深度神经网络DNN以面孔F作为输入,并给出D=128维(浮点数)向量作为输出。这个向量E被称为嵌入。这样两个面孔F1和F2之间的相似性可以简单地计算为嵌入E1和E2之间的欧几里德距离。
公式我们现在可以通过计算相似度来比较两个面孔F1和F2,然后对照某个阈值进行检查。如果较低,我们可以说两张脸来自同一个人。
关于更多细节,这里有一篇来自Satya Mallick的文章,它更详细地解释了基本原理、如何将一个新的人脸注册到系统中,并介绍了一些重要的概念,如三元组丢失和kNN算法。
人脸识别步骤Adrian方案
在这篇很棒的文章中,Adrian Rosebrock使用python,OpenCV的face_recognition以及OpenFace项目的nn4.small2预训练模型来解决这个问题,他在MacBook Pro中实现了大约14 FPS的吞吐量。在8核3.70GHz的CPU上,该模型的性能大约为58.9ms/帧。在这个“深漏斗”数据集上,这个模型公布的准确度约为93%LFW。
这可能是我们的移动应用程序的一种方法,使用OpenCV SDK for Android,但是:
- 它在手机上够快吗?
- 它能装进智能手机的内存吗?(nn4.small2模型文件大小超过30 MB)
- 准确度呢?Adrian自己在帖子中说,他的实现在准确度方面有一些局限性和缺点。
- 如果我选择这个方案的话,我不确定Android和iOS的实现会有多大的不同。
这些都是大问题。在手机端如果不能做到快速,体积小是很难实际应用的,准确度还是其次
FaceNet方案
FaceNet是谷歌研究人员于2015年开发的一种人脸识别系统,在一系列人脸识别基准数据集上取得了最先进的结果(LFW上的99.63%)。这个方案引入了三元组损失的新概念。
在这篇精彩的文章中,Jason Brownley描述了如何在Keras中使用FaceNet开发一个人脸识别系统。尽管使用的模型很重,但它的高精度很吸引人去尝试使用它。另外,由于FaceNet是一项非常热门的工作,因此有许多非常好的实现,以及预先训练的模型。或许,通过训练后量化,可以降低模型的大小,而其在移动系统上也足够快……
所以,我决定试一下David Sandberg的FaceNet实现并把它转成TensorFlow Lite。我选择这个实现是因为它做得非常好,已经成为FaceNet的一个事实标准。我原以为这将是一项容易的任务,但我遇到了几个困难。我有一篇文章解释了我是如何做到的。
在TensorFlow Lite上建立FaceNet模型后,我用Python进行了一些测试,以验证它是否可以工作。我准备了一些脸的照片,裁剪出来,计算出它们的嵌入量。这些嵌入量的值与原始模型计算出来的值是匹配的。我还注意到,在我的笔记本电脑CPU上,Lite版的执行速度更快、更轻便。
由于所有这些都是有希望的,我最终在我的Android Studio项目中导入了Lite模型,看看发生了什么。我发现这个模型运行得很好,但是在我的Google Pixel 3上进行推理大约需要3.5秒。那么现在可以回答一开始的问题了。
使用TFLite FaceNet,我们可以:
- 在手机上离线比较人脸
- 这种比较保证是准确的
- 作为基线,执行时间大约需要3.5秒。
虽然不是实时的,但如果用户愿意稍等一段时间,也有许多有用的应用程序可以通过这种方式完成。
但是…现在作为用户,我们什么都想要,我们现在就想要,不是吗?那么还有其他选择吗?
好吧,如果我们想要速度和轻便,我们应该尝试一下Mobile DNN架构!
使用MobileFaceNet
MobileFaceNets是中国北京Watchdata Inc.研究人员的一项杰出工作。他们提出了一个非常有效的CNN模型,专门为移动设备上的高精度实时人脸验证而设计。他们实现了令人印象深刻的速度和非常高的精度而模型只有4.0 MB。他们获得的精度与其他较重的模型(如FaceNet)非常相似。
这个优秀的MobileFaceNet实现,它来自SiriusAI。注意:为了转换模型,这个 issues 的答案非常有用。生成的文件非常轻量,只有5.2MB,非常适合移动应用程序。有了Lite模型之后,我们就可以写移动代码来进行部分验证了
一个实现封装FaceVerificationSDK
Offline Android Face Detection & Recognition SDK And Alive Detect 离线版Android人脸检测,人脸识别和活体检测
网友评论