本文已参与「新人创作礼」活动,一起开启掘金创作之路。
时至今日,人工智能在移动端的应用也算是非常成熟普遍了,甚至有不少高校开设了人工智能专业,毕业设计都有人脸识别之类的课题,在移动互联网高度成熟发展的今下,人脸识别应用场景更是随处可见,App 登录验证,人脸支付,拍照购物,识物等等。首先我们先了解一下人工智能(Artificial Intelligence)、机器学习(Machine Learning)、深度学习(Deep Learning)概念的 区别和联系.
总结:人工智能是一个很老的概念,机器学习是人工智能的一个子集,深度学习又是机器学习的一个子集。机器学习与深度学习都是需要大量数据来“喂”的,是大数据技术上的一个应用,同时深度学习还需要更高的运算能力支撑,如GPU。
机器学习最成功的应用领域是计算机视觉,虽然也还是需要大量的手工编码来完成工作。人们需要手工编写分类器、边缘检测滤波器,以便让程序能识别物体从哪里开始,到哪里结束;写形状检测程序来判断检测对象是不是有八条边。我们本次的预研聚焦于机器学习在Android 开发中的工程应用方案选型,具体为人脸识别和活体检测在移动端App(Android)的工程应用实现,文中的内容大部分也适合iOS 平台,部分特性需要区分平台。
Android 系统相关支持
本片段包含以下方面:
- Android Neural Networks API 概要
- Android Neural Networks API 运行时
- TensorFlow Lite 简要说明
- MLKIT
Neural Networks API 概要
Android Neural Networks API (NNAPI) 是一个 Android C API,专为在 Android 设备上运行计算密集型运算从而实现机器学习而设计。NNAPI 旨在为更高层级的机器学习框架(如 TensorFlow Lite 和 Caffe2)提供一个基本功能层,用来建立和训练神经网络。搭载 Android 8.1(API 级别 27)或更高版本的所有 Android 设备上都提供该 API。
在设备上进行推断具备诸多优势:
- 延迟:您不需要通过网络连接发送请求并等待响应。例如,这对处理从相机传入的连续帧的视频应用至关重要。
- 可用性:即使在网络覆盖范围之外,应用也能运行。
- 速度:专用于神经网络处理的新硬件提供的计算速度明显快于单纯的通用 CPU。
- 隐私:数据不会离开 Android 设备。
- 费用:所有计算都在 Android 设备上执行,不需要服务器场。
开发者还应在以下几个方面做出权衡取舍:
-
系统利用率:评估神经网络涉及大量的计算,而这可能会增加电池电量消耗。如果您担心自己的应用耗电量会增加(尤其是对于长时间运行的计算),应考虑监控电池运行状况。
-
应用大小:应注意模型的大小。模型可能会占用数 MB 的空间。如果在您的 APK 中绑定较大的模型会对用户造成过度影响,那么您可能需要考虑在应用安装后下载模型、使用较小的模型或在云端运行计算。NNAPI 未提供在云端运行模型的功能。
了解 Neural Networks API 运行时
NNAPI 应由机器学习库、框架和工具调用,这样可让开发者在设备外训练他们的模型,并将其部署在 Android 设备上。应用一般不会直接使用 NNAPI,而会使用更高层级的机器学习框架。这些框架进而又可以使用 NNAPI 在受支持的设备上执行硬件加速的推断运算。
根据应用的要求和 Android 设备的硬件功能,Android 的神经网络运行时可以在可用的设备上处理器(包括专用的神经网络硬件、图形处理单元 (GPU) 和数字信号处理器 (DSP))之间高效地分配计算工作负载。
对于缺少专用供应商驱动程序的 Android 设备,NNAPI 运行时将在 CPU 上执行请求。
TensorFlow Lite
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算法。
实现方案对比
1. 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的实现会有多大的不同。
这些都是大问题。在手机端如果不能做到快速,体积小 是很难实际应用的,准确度还是其次,特别还有低端手机用户的产品不得不为这部分用户考虑更优方案
2.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架构!
3.MobileFaceNet 方案
MobileFaceNets是中国北京Watchdata Inc.研究人员的一项杰出工作。他们提出了一个非常有效的CNN模型,专门为移动设备上的高精度实时人脸验证而设计。他们实现了令人印象深刻的速度和非常高的精度而模型只有4.0 MB。他们获得的精度与其他较重的模型(如FaceNet)非常相似。
关于活体检测
人脸识别的基础服务是检测出人脸并和特定的底照对比相似度,人脸识别在实际的场景应用中还有非常重要的一环就是活体检测,否则大量的攻击方案可以轻松破解人脸识别,一般的活体检测都会有要求检测对象在相应的时间内跟随做眨眼,点头,张嘴等动作组合,同时配合虹膜,红外,眼纹等相关技术一起验证,但是对于Android 设备由于低版本的系统特性和硬件配置五花八门,要在移动端手机设备做复杂的离线活体检测要花费在兼容性的代价非常高,如果厂商生产的特定的定制硬件设备要实现相关功能还是问题不大。
在2018年315晚会相关技术方案商纷纷躺枪, 人脸识别技术被曝存在安全隐患 。在晚会现场可以看到,主持人是使用了一项 AI 技术(仅在手机网页或应用程序上就能实现),把静态的照片转化成动态照片,从而骗过登录系统。
做过安全的人都知道,绝对的安全等于无限的成本。AES加密也能被很快破解,但商用256位足够了,花费破解的成本比破解后的利益还大。 首先,人脸识别在用途上,通常是作为交叉验证增强安全性,只会比以往单用密码更安全,并且还存在其他验证手段与人脸识别形成多重验证。其次,从face2face的技术原理来讲,需要收集很多的被模仿人的人脸数据,再加上比较先进的人脸识别技术支撑,才可以模仿该人脸。 从防范攻击上来讲,被模拟的视频需要通过非常高的技术手段才能够传输到应用软件里面去,有这种技术力量,任何系统都存在风险;而直接通过视频或者图片攻击,完全可以被现在的红外或者一些动作判断的活体手段所识别出来。
对于大部分的应用,限于移动设备的硬件配置和设备特性参差不齐,眨眼,点头,张嘴等动作组合已经可以防范大部分的非金融应用场景了。
一个离线人脸识别活体检测实现封装 FaceVerificationSDK
Offline Android Face Detection & Recognition SDK And Alive Detect 离线版Android人脸检测,人脸识别和(动作,近红外)活体检测,More :github.com/AnyLifeZLB/…
Demo 体验下载(支持微信,QQ直接安装)
下载链接失效请联系请前往github: github.com/AnyLifeZLB/…
2023-11-19