时间:2024-05-04
彭叶斌
(上海传英信息技术有限公司 上海市 201203)
人脸解锁技术在安防,高校管理和金融等行业中使用越来越多[2][3],而在智能终端快速发展的今天,添加终端锁是一个保障用户信息安全的必要手段。现在的终端解锁方式主要有密码锁、图案锁、指纹解锁,这些解锁方式都各有优缺点。比如密码解锁和图案解锁的解锁步骤比较耗时,指纹解锁当手指出汗或者有水时又很难解锁,人脸解锁的新技术就很好的改善了这些问题。随着智能平台在安防、终端等场景应用越来越普及。基于Android 平台的人脸解锁应用使用越来越广泛,人脸解锁速度的快慢会影响用户的体验。目前学术界、智能终端行业中对人脸解锁方案的优化主要集中在算法方面[4][3]。
人脸解锁流程一般分为4 个阶段:启动解锁,图像数据采集,SDK 人脸匹配和结束解锁,如图1 所示。
(1)启动解锁:按下电源键到人脸解锁应用打开相机。
(2)图像数据采集:人脸解锁应用打开相机到获取到相机的图像数据。
(3)SDK 人脸匹配:把采集的图像数据调用SDK 进行人脸特征点对比识别人脸。
(4)结束解锁:比对成功后,系统界面解锁流程。
影响人脸解锁性能主要有两方面的因素:图像数据采集和SDK人脸匹配。图像数据采集是指相机打开图像传感器到获取到图像数据的过程。这个过程的速度与平台的CPU 性能、相机传感器的启动速度关系比较大。相同的硬件平台和SDK 人脸算法库,不同的图像传感器,人脸解锁性能差异可能会比较大。主要原因是不同的图像传感器启动时需加载的参数不一样,比如有的传感器厂商的传感器需要加载2000 多个寄存器,写这些寄存器需要300 毫秒左右,对人脸解锁性能影响较大。Android 智能终端中通常有比较多的相机应用,比如人脸解锁应用、终端自带的系统相机应用和用户下载安装的一些三方相机应用如美图秀秀等。它们在相机驱动中使用的是同一套初始化参数,图像传感器启动慢,影响人脸解锁性能。人脸解锁应用相比其它的相机应用,启动速度要求比较高,只需要灰度图像。所以可以针对人脸解锁应用做一个轻量级的相机驱动,只需加载核心参数即可。但是目前的Android 框架,相机驱动服务在打开相机传感器时无法获取到应用相关信息,所以无法针对人脸解锁应用定制轻量级的相机驱动。如果能够在相机驱动中获取到人脸解锁应用的信息,则可以对人脸解锁应用设置一个快速模式,在图像传感器驱动中只加载核心参数和提升I2C 传输速率,从而有效地提升人脸解锁速度。
Android8.0 开始相机驱动中会有独立的Server,比如MTK 平台相机驱动的Server 是CameraHalServer[5]。相机驱动的CameraHal Server 与相机框架Server 即CameraServer 之间通过HIDL(Hardware Interface Definition Language)进行通信。因为Android 相机框架CameraServer 是可以获取到相机应用信息(如应用包名)的,基于这个特性,本文提出一种有利于提升人脸解锁速度的相机优化框架:
(1)新建一个相机代理Server 如CamAgentServer,Camera Server 把获取到的相机应用信息通过HIDL 传递给CamAgentServer保存。
(2)CameraHalServer 打开图像传感器前,先通过HIDL 获取CamAgentServer 中保存的相机应用信息。如果是人脸解锁应用,则设置图像传感器参数加载模式为快速模式。
(3)CameraHalServer 把快速模式标志设置给当前需要打开的传感器驱动,由传感器驱动文件通过IO 控制命令设置给内核传感器驱动文件。
(4)在内核传感器驱动文件中如果是快速模式则加载核心参数并配置传感器所能支持的最大I2C 传输速率,如果不是快速模式则加载普通参数。
Android Camera 软件框架可以分为四层:应用层、框架层、库层(HAL 层)和内核层(Kernel 层)[1],如图2 所示。
(1)应用层:面向客户的层次,实现相机业务逻辑功能和UI显示;
(2)框架层:实现应用和底层硬件逻辑分离,为应用开发者提供API 接口;
(3)HAL 层:硬件抽象层,将硬件行为与功能进行封装,为框架层提供接口;
(4)Kernel 层:Kernel 层即为内核层,硬件驱动实现,图像数据采集和传输等。
如图2 所示为 Android Camera 原生框架流程,人脸解锁应用打开相机分为3 个步骤:
(1)人脸解锁应用调用框架打开相机。
(2)CameraServer 接收到open 命令后通 过HIDL 接口与CameraHalServer 进行通信。
(3)CameraHalServer 通过IO 命令打开图像传感器加载初始化参数,完成传感器的启动。
因为相机驱动打开过程中,图像传感器无法区分是人脸解锁应用还是其它相机应用,所以目前普遍的实现方案是图像传感器只使用一套初始化参数,导致图像传感器启动耗时较长。
如图3 所示为Android Camera 优化后的框架流程:
(1)人脸解锁应用(FACE ID)调用框架打开相机。
(2)新建一个相机代理服务CamAgentServer,提供设置相机应用信息和获取相机应用信息的HIDL 接口。
(3)如图3 的步骤2,CameraServer 接收到应用信息后通过HIDL 调用CamAgentServer 设置相机应用信息的接口,把相机应用信息保存在CamAgentServer 中。
(4)如图3 的步骤3,CameraServer 调过HIDL 调用Camera HalServer 去打开图像传感器。CameraHalServer 接收到命令后先执行步骤4,即CamAgentServerEngine 调用CamAgentServer 获取相机应用信息的接口,获取当前应用信息。如果是人脸解锁应用,则设置图像传感器参数加载模式为快速模式。如果不是人脸解锁应用,则设置图像传感器参数加载模式为普通模式。
(5)如图3 的步骤5,CameraHalServer 和内核驱动中新增一个传感器参数加载模式接口,步骤4 中把传感器参数加载模式通过IO 命令传递给内核的传感器驱动文件。
在内核的驱动文件Image Sensor 中把传感器参数分为核心参数和基础参数。其中核心参数是指针对人脸解锁应用定制的传感器参数(OTP,AWB,Colour 等去除后的参数),而基础参数则为原来的寄存器参数。如果是快速模式,则选择传感器参数为核心参数,并且设置I2C 传输速率为传感器所能支持的最大传输速率。如果是普通模式,则选择传感器参数为基础参数。
优化后的人脸解锁的流程图如图4。
图1:人脸解锁流程
图2:Android Camera 原生框架控制流程
图3:Android Camera 优化后框架控制流程
图4:优化后的人脸解锁流程
通过把传感器参数分为核心参数和基础参数,在人脸解锁时加载核心参数可以减少传感器写参数的时间。其次通过提升传感器I2C 传输速率,可以减少写寄存器参数的时间。如使用1000Kbit/s的传输速率相比400Kbit/s 的传输速率可以减少50~100ms 的启动时间。通过上述优化方案可以减少不同图像传感器因为加载参数差异较大带来的性能差异,从而有效的改善人脸解锁的性能体验。
如表1 所示,我们通过两款不同的芯片,选择2 颗不同的图像传感器做人脸识别的性能优化,对比优化前后的数据可以看出采用优化方案后性能分别减少了201ms 和176ms,优化率分别为33%和22%,优化效果比较明显。
表1:实测人脸解锁性能提升数据(单位ms)
我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!