隨着人臉識別的日益普及,它的應用場景越來越廣。近幾年面市的門禁機、考勤機、校園班牌等終端,紛紛集成了人臉識別功能。但與此相對,相應場景下“服役”多年的老舊設備,由於早期產品設計往往沒有攝像頭,並且老舊設備算力也不足以支撐人臉識別算法的運行。但如果將這些老舊設備全盤替換,不僅成本昂貴還需要解決系統迭代兼容性問題。
那么如何低成本讓老舊設備煥發新生機?近期,筆者從市場上了解到,虹軟視覺開放平台聯合多家產業鏈合作伙伴,推出了一款可外接的AI攝像頭模組,內置芯片和高精度算力,能夠在原設備基礎上輕松升級實現人臉識別。
一、什么是A I 攝像頭模組?
首先要介紹一下虹軟視覺開放平台,它是業內知名的免費視覺AI算法提供方,開放了人臉識別、活體檢測、人臉屬性分析、人證核驗等一系列算法SDK。支持免費商用,而且能夠離線運行,在一些對信息安全要求高,或者不具備聯網條件的封閉場景下,都非常適用。
該AI攝像頭模組概況來說,是一款能夠急速上手的軟硬一體化小型開發機,可以讓AI算法落地更標准化,更小巧化。
軟件上,模組集成了虹軟視覺開放平台ArcFace人臉識別算法及相應配套應用軟件服務。算法能力上除了人臉比對、識別、屬性檢測、人證核驗等多種基礎功能外,還支持大面積遮擋下的人臉識別,抵御攻擊方面具備RGB/IR活體檢測雙重保障,支持離線激活使用,同時自帶圖像質量檢測功能,自動過濾畫面模糊或小角度的人臉圖像,提升識別准確率和識別速度。
硬件上,模組集成了UVC攝像頭和RV1109芯片,通過USB接口對外輸出視頻流數據,只需要將模組插入相應設備,即可工作。其中,自帶RV1109芯片平台提供算力這點非常重要,不僅解決了老設備算力不足的問題,而且RV1109芯片性價比非常高,很適合門禁、閘機的改造。
同時,該AI攝像頭模組除了支持跨Android、 Windows、Linux等多系統運行,算法計算結果以JSON標准化輸出,標准化接口可供平台移植、拓展業務。
此外,這款AI攝像頭模組可通過硬件適配參數調節,適配不同分辨率的設備,適用場景也非常豐富,像人員注冊、人臉識別開門、考勤打卡、門禁權限管理、識別記錄查詢等功能,老設備都可以通過外接AI攝像頭模組來實現。
二、項目開發詳細介紹
從虹軟商務獲取了其產業鏈伙伴的AI鏡頭模組,虹軟已經把模組的服務軟件部署進去了,同時也提供了Windows及Android的客戶端Demo,如果沒有特殊需求,安裝客戶端之后基本能做到即插即用。在我個人的開發過程中,因為項目本身有定制化需求,所以沒有用虹軟開放平台官方提供的客戶端APK,而是自己做了Android的上位機開發。簡單來說,項目首先需要獲取UVC視頻流,將視頻圖像顯示在Android上位機上;其次利用RNDIS將模組和Android上位機建立通信;最后通過Arc服務獲取到算法處理結果,並將結果顯示到Android上位機,以下是我的開發過程。
2.1 USB攝像頭SDK封裝
獲取USB攝像頭視頻流需要借助第三方框架,我在Github上找到了一個開源的框架:https://github.com/saki4510t/UVCCamera, 把項目代碼clone到本地,使用AndroidStudio打開項目代碼;修改“Application.mk文件,運行“ndkBuild”;編譯成功后,得到“arm64-v8a”和“armeabi-v7a”兩個架構的so包,並編譯出jar包;或者執行assembleRelease任務,編譯出libuvccamera-release.aar包,供后續項目使用,如下圖所示:
2.2 集成USB攝像頭SDK
新建Android項目,將“libuvccamera-release.aar”開發包添加到項目libs文件夾中,修改build.gradle文件,編譯項目,這樣開發包就集成好了,如下圖所示:
2.3 AI攝像頭模組獲取
虹軟AI攝像頭模組類似於一個軟、硬件結合的小型開發機。軟件上,模組集成了人臉識別算法及應用軟件,通過RNDIS(RNDIS是指Remote NDIS,基於USB實現RNDIS實際上就是TCP/IP over USB,就是在USB設備上跑TCP/IP,讓USB設備看上去像一塊網卡)服務和Android上位機通信;硬件上,模組集成了UVC攝像頭,通過USB接口對外輸出視頻流數據,只需要將模組插入Android上位機,即可工作。
2.4 實現UvcCameraHelper獲取UVC視頻流
2.4.1 獲取到UsbDevice
我自己實現了一個UvcCameraHelper類,用來管理USB攝像頭的生命周期。不同於集成好的Android設備攝像頭,AI攝像頭模組作為一個外接設備,需要使用“USBMonitor.java”類遍歷獲取,attach到對應的USB設備后,請求USB權限,如果權限通過,會有一個onConnect回調,表示USB設備已連接,可以進行下一步操作了,具體如下圖所示:
如上圖,onConnect方法回調成功以后,就可以對UsbDevice進行下一步操作了。
2.4.2 開啟USB攝像頭
拿到UsbDevice后,借助UVCCamera類,就可以開啟USB攝像頭了,調用UVCCamera.open()和UVCCamera.startPreview()方法后,攝像頭開啟成功,使用TextureView作為顯示視頻圖像數據,就可以在Android上位機實時顯示攝像頭圖像數據了,具體實現如下圖所示:
2.5 接入AI攝像頭模組
2.5.1 實現網絡通信
AI攝像頭模組里面集成了Arc服務,用於檢測、識別人臉,並將人臉結果對外輸出。將 AI模組插入Android上位機USB接口上,Arc服務就會自啟動了。
通過RNDIS,我在Android端實現了一套Http和WebSocket通信服務,用來和AI模組進行數據傳輸。如下圖所示,使用Retrofit作為網絡通信框架:
如下圖所示,創建API服務,和AI模組進行網絡數據交互:
如下圖所示,創建WebSoket服務,用於接收AI模組人臉識別數據:
通過以上步驟,就完成了AI攝像頭模組和Android上位機網絡通信功能。
3.5.2 網絡數據交互
Arc服務包含設備激活、人員注冊、設置參數等API。
如下圖所示,調用激活接口,激活AI模組,才能夠進行后續操作:
如下圖所示,調用注冊人員接口,將人臉庫注冊到AI模組中,用於后續人臉識別:
AI攝像頭模組集成了人臉識別算法及算法核心業務,將模組攝像頭對准人臉,開始識別人臉,並最終將人臉識別結果輸出。如下圖所示,我實現了一個WebSocket服務,用於接收人臉識別結果數據:
2.5.2 數據顯示
拿到人臉識別結果數據,包括人臉框,人臉ID,人臉圖片等。如下圖人臉識別結果數據結構:
通過自定義View,使用Paint和Canvas類,繪制人臉框Rect數據;根據type類型判斷識別結果,包括識別成功、識別失敗等,並將人員信息顯示在UI上。
到這里,AI模組和Android上位機就接入好了。
三、注意事項
l 由於虹軟SDK只包含arm64-v8a和armeabi-v7a的so包,在編譯USB攝像頭SDK的時候,只能編譯對應架構的so包;
l 需要選擇對應的USB設備ID,才能正常開啟USB攝像頭,注意不要選錯;
l AI模組連接過程中可能會斷開,需要做一些重連操作。
了解更多人臉識別產品相關內容請到虹軟視覺開放平台哦