彭葉斌
(上海傳英信息技術有限公司 上海市 201203)
人臉解鎖技術在安防,高校管理和金融等行業(yè)中使用越來越多[2][3],而在智能終端快速發(fā)展的今天,添加終端鎖是一個保障用戶信息安全的必要手段?,F(xiàn)在的終端解鎖方式主要有密碼鎖、圖案鎖、指紋解鎖,這些解鎖方式都各有優(yōu)缺點。比如密碼解鎖和圖案解鎖的解鎖步驟比較耗時,指紋解鎖當手指出汗或者有水時又很難解鎖,人臉解鎖的新技術就很好的改善了這些問題。隨著智能平臺在安防、終端等場景應用越來越普及?;贏ndroid 平臺的人臉解鎖應用使用越來越廣泛,人臉解鎖速度的快慢會影響用戶的體驗。目前學術界、智能終端行業(yè)中對人臉解鎖方案的優(yōu)化主要集中在算法方面[4][3]。
人臉解鎖流程一般分為4 個階段:啟動解鎖,圖像數(shù)據(jù)采集,SDK 人臉匹配和結束解鎖,如圖1 所示。
(1)啟動解鎖:按下電源鍵到人臉解鎖應用打開相機。
(2)圖像數(shù)據(jù)采集:人臉解鎖應用打開相機到獲取到相機的圖像數(shù)據(jù)。
(3)SDK 人臉匹配:把采集的圖像數(shù)據(jù)調用SDK 進行人臉特征點對比識別人臉。
(4)結束解鎖:比對成功后,系統(tǒng)界面解鎖流程。
影響人臉解鎖性能主要有兩方面的因素:圖像數(shù)據(jù)采集和SDK人臉匹配。圖像數(shù)據(jù)采集是指相機打開圖像傳感器到獲取到圖像數(shù)據(jù)的過程。這個過程的速度與平臺的CPU 性能、相機傳感器的啟動速度關系比較大。相同的硬件平臺和SDK 人臉算法庫,不同的圖像傳感器,人臉解鎖性能差異可能會比較大。主要原因是不同的圖像傳感器啟動時需加載的參數(shù)不一樣,比如有的傳感器廠商的傳感器需要加載2000 多個寄存器,寫這些寄存器需要300 毫秒左右,對人臉解鎖性能影響較大。Android 智能終端中通常有比較多的相機應用,比如人臉解鎖應用、終端自帶的系統(tǒng)相機應用和用戶下載安裝的一些三方相機應用如美圖秀秀等。它們在相機驅動中使用的是同一套初始化參數(shù),圖像傳感器啟動慢,影響人臉解鎖性能。人臉解鎖應用相比其它的相機應用,啟動速度要求比較高,只需要灰度圖像。所以可以針對人臉解鎖應用做一個輕量級的相機驅動,只需加載核心參數(shù)即可。但是目前的Android 框架,相機驅動服務在打開相機傳感器時無法獲取到應用相關信息,所以無法針對人臉解鎖應用定制輕量級的相機驅動。如果能夠在相機驅動中獲取到人臉解鎖應用的信息,則可以對人臉解鎖應用設置一個快速模式,在圖像傳感器驅動中只加載核心參數(shù)和提升I2C 傳輸速率,從而有效地提升人臉解鎖速度。
Android8.0 開始相機驅動中會有獨立的Server,比如MTK 平臺相機驅動的Server 是CameraHalServer[5]。相機驅動的CameraHal Server 與相機框架Server 即CameraServer 之間通過HIDL(Hardware Interface Definition Language)進行通信。因為Android 相機框架CameraServer 是可以獲取到相機應用信息(如應用包名)的,基于這個特性,本文提出一種有利于提升人臉解鎖速度的相機優(yōu)化框架:
(1)新建一個相機代理Server 如CamAgentServer,Camera Server 把獲取到的相機應用信息通過HIDL 傳遞給CamAgentServer保存。
(2)CameraHalServer 打開圖像傳感器前,先通過HIDL 獲取CamAgentServer 中保存的相機應用信息。如果是人臉解鎖應用,則設置圖像傳感器參數(shù)加載模式為快速模式。
(3)CameraHalServer 把快速模式標志設置給當前需要打開的傳感器驅動,由傳感器驅動文件通過IO 控制命令設置給內核傳感器驅動文件。
(4)在內核傳感器驅動文件中如果是快速模式則加載核心參數(shù)并配置傳感器所能支持的最大I2C 傳輸速率,如果不是快速模式則加載普通參數(shù)。
Android Camera 軟件框架可以分為四層:應用層、框架層、庫層(HAL 層)和內核層(Kernel 層)[1],如圖2 所示。
(1)應用層:面向客戶的層次,實現(xiàn)相機業(yè)務邏輯功能和UI顯示;
(2)框架層:實現(xiàn)應用和底層硬件邏輯分離,為應用開發(fā)者提供API 接口;
(3)HAL 層:硬件抽象層,將硬件行為與功能進行封裝,為框架層提供接口;
(4)Kernel 層:Kernel 層即為內核層,硬件驅動實現(xiàn),圖像數(shù)據(jù)采集和傳輸?shù)取?/p>
如圖2 所示為 Android Camera 原生框架流程,人臉解鎖應用打開相機分為3 個步驟:
(1)人臉解鎖應用調用框架打開相機。
(2)CameraServer 接收到open 命令后通 過HIDL 接口與CameraHalServer 進行通信。
(3)CameraHalServer 通過IO 命令打開圖像傳感器加載初始化參數(shù),完成傳感器的啟動。
因為相機驅動打開過程中,圖像傳感器無法區(qū)分是人臉解鎖應用還是其它相機應用,所以目前普遍的實現(xiàn)方案是圖像傳感器只使用一套初始化參數(shù),導致圖像傳感器啟動耗時較長。
如圖3 所示為Android Camera 優(yōu)化后的框架流程:
(1)人臉解鎖應用(FACE ID)調用框架打開相機。
(2)新建一個相機代理服務CamAgentServer,提供設置相機應用信息和獲取相機應用信息的HIDL 接口。
(3)如圖3 的步驟2,CameraServer 接收到應用信息后通過HIDL 調用CamAgentServer 設置相機應用信息的接口,把相機應用信息保存在CamAgentServer 中。
(4)如圖3 的步驟3,CameraServer 調過HIDL 調用Camera HalServer 去打開圖像傳感器。CameraHalServer 接收到命令后先執(zhí)行步驟4,即CamAgentServerEngine 調用CamAgentServer 獲取相機應用信息的接口,獲取當前應用信息。如果是人臉解鎖應用,則設置圖像傳感器參數(shù)加載模式為快速模式。如果不是人臉解鎖應用,則設置圖像傳感器參數(shù)加載模式為普通模式。
(5)如圖3 的步驟5,CameraHalServer 和內核驅動中新增一個傳感器參數(shù)加載模式接口,步驟4 中把傳感器參數(shù)加載模式通過IO 命令傳遞給內核的傳感器驅動文件。
在內核的驅動文件Image Sensor 中把傳感器參數(shù)分為核心參數(shù)和基礎參數(shù)。其中核心參數(shù)是指針對人臉解鎖應用定制的傳感器參數(shù)(OTP,AWB,Colour 等去除后的參數(shù)),而基礎參數(shù)則為原來的寄存器參數(shù)。如果是快速模式,則選擇傳感器參數(shù)為核心參數(shù),并且設置I2C 傳輸速率為傳感器所能支持的最大傳輸速率。如果是普通模式,則選擇傳感器參數(shù)為基礎參數(shù)。
優(yōu)化后的人臉解鎖的流程圖如圖4。
圖1:人臉解鎖流程
圖2:Android Camera 原生框架控制流程
圖3:Android Camera 優(yōu)化后框架控制流程
圖4:優(yōu)化后的人臉解鎖流程
通過把傳感器參數(shù)分為核心參數(shù)和基礎參數(shù),在人臉解鎖時加載核心參數(shù)可以減少傳感器寫參數(shù)的時間。其次通過提升傳感器I2C 傳輸速率,可以減少寫寄存器參數(shù)的時間。如使用1000Kbit/s的傳輸速率相比400Kbit/s 的傳輸速率可以減少50~100ms 的啟動時間。通過上述優(yōu)化方案可以減少不同圖像傳感器因為加載參數(shù)差異較大帶來的性能差異,從而有效的改善人臉解鎖的性能體驗。
如表1 所示,我們通過兩款不同的芯片,選擇2 顆不同的圖像傳感器做人臉識別的性能優(yōu)化,對比優(yōu)化前后的數(shù)據(jù)可以看出采用優(yōu)化方案后性能分別減少了201ms 和176ms,優(yōu)化率分別為33%和22%,優(yōu)化效果比較明顯。
表1:實測人臉解鎖性能提升數(shù)據(jù)(單位ms)