彭葉斌
(上海傳英信息技術有限公司 上海市 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)