引言
人工智能早已不是什么新鮮的事物,人臉識別是當(dāng)前比較熱門的技術(shù)足删,在國內(nèi)也越來越多的運(yùn)用,例如刷臉打卡锁右,刷臉APP失受,身份識別,人臉門禁等咏瑟。人臉識別技術(shù)為我們的生活帶來了一些便利拂到,但是也存在很明顯的缺陷,那就是活體的問題码泞。想象一下如果人臉門禁普及到家庭中兄旬,如果一個(gè)人拿著你的照片就能進(jìn)入你的房間,那門禁豈不是形同虛設(shè)余寥,因此活體檢測是一個(gè)必不可少的部分领铐。
那么如何在Android平臺上實(shí)現(xiàn)活體檢測這一功能呢,本文將借助虹軟提供的SDK進(jìn)行介紹宋舷。
本文將實(shí)現(xiàn)視頻模式與圖像模式的人臉檢測绪撵。
1.進(jìn)入http://ai.arcsoft.com.cn/product/arcface.html網(wǎng)站,注冊賬號并登錄
2.選擇需要下載的SDK版本填寫下載申請祝蝠,并提交
點(diǎn)擊提交后獲得APPID和SDKKey音诈,點(diǎn)擊下載鏈接下載SDK壓縮包,AppID與SDKKey在后面激活時(shí)會用到绎狭,所以可以先保存下來细溅。
下載成功后我們拿到的包結(jié)構(gòu)應(yīng)該是如下所示,紅框標(biāo)出的三個(gè)庫為引擎庫儡嘶,也就是我們后面需要用到的庫喇聊。
包和key都已經(jīng)到手,那么該如何使用這個(gè)包蹦狂,來實(shí)現(xiàn)我們想要的活體檢測呢承疲?我發(fā)現(xiàn)在下載的包中有一個(gè)samplecode邻耕,這個(gè)示例代碼雖然簡單,但是也能足夠?qū)崿F(xiàn)我想要的效果了燕鸽,因此在這里偷一下懶,直接使用虹軟提供的示例代碼來進(jìn)行本次項(xiàng)目的說明啼辣。
打開示例代碼的工程啊研,我們可以看到目錄結(jié)構(gòu)如下,lib目錄下存放jar包鸥拧,jnilibs下存放so包党远,后面如果我們自己要寫一個(gè)新的工程就要這樣做了。
說完了庫接下來說一下每個(gè)類的作用富弦,Constants是用來寫我們在官網(wǎng)獲得的SDKKey與APPID沟娱,首先我們將官網(wǎng)上得到的Key 根據(jù)名稱一個(gè)個(gè)的替換上去,注意一定要一一對應(yīng)腕柜。
DrawUtils是用來畫人臉框的工具類济似,ImageUtil是圖像的工具類,提供了NV21轉(zhuǎn)換以及YUV轉(zhuǎn)換的方法盏缤,挺好用的但是和我們的主題并不相關(guān)砰蠢,這里就不介紹了。接下來就是重頭戲了唉铜,我們開始使用虹軟的SDK台舱,我們在第一次使用引擎之前必須需要先激活引擎,在MainActivity我們可以找到潭流。具體的調(diào)用流程可以參照下圖竞惋。
如果提示激活失敗,可以根據(jù)提供的errorCode到開發(fā)文檔中對比錯(cuò)誤碼定位問題灰嫉,一般都是因?yàn)榧せ顣r(shí)沒聯(lián)網(wǎng)或者沒有給與權(quán)限的問題導(dǎo)致的拆宛,也有APPID與Key填反或者填錯(cuò)的大馬虎的存在。當(dāng)點(diǎn)擊激活按鈕時(shí)熬甫,界面toast提示活體引擎激活成功胰挑,說明我們填寫和調(diào)用都沒問題,接下來我們就可以開始使用引擎了椿肩。
先從圖片模式下的活體檢測開始瞻颂,首先我們要明確一個(gè)問題,既然是活體檢測郑象,那么圖片怎么樣檢測活體呢贡这?圖片模式下的活體(以下是我個(gè)人的理解,如果有問題歡迎指正)厂榛,就是指以圖片為輸入源盖矫,檢測圖片內(nèi)的人是否為真人丽惭。像圖片內(nèi)是相片或者拍攝的屏幕等方式的,都無法通過活體檢測辈双,為了說的更清晰一些责掏,下面給出三種情況的典型例子。?
圖一為活體湃望,圖二圖三均為非活體换衬,相信看到圖片說明后,會更清晰一些证芭。概念講完了我們該知道如何使用SDK瞳浦。在任何引擎使用之前,我們都要先進(jìn)行初始化废士,由于是以圖片形式進(jìn)行的活體檢測叫潦,我們要用到FD與Liveness兩個(gè)引擎,首先要進(jìn)行初始化官硝。
活體引擎初始化需要兩個(gè)參數(shù)矗蕊,第一個(gè)是上下文(即context),第二個(gè)是檢測的類型由于我們是用的圖片模式泛源,所以使用Image模式拔妥,如果初始化出錯(cuò),可以去對照錯(cuò)誤碼表上的錯(cuò)誤碼定位自己的問題达箍。引擎初始化的參數(shù)没龙,活體引擎只需要指定Image模式或者video模式即可。FD引擎稍微復(fù)雜一些缎玫,(第一個(gè)參數(shù)就是我們之前輸入的APPID(注意不是活體的AppID)硬纤,SDKKey,圖片的角度(默認(rèn)為0度我們上面的三張圖均為0度赃磨,逆時(shí)針為90度筝家,順時(shí)針為270度),最小人臉檢測大小邻辉,檢測的最多人臉數(shù)量)
初始化完成溪王,接下來我們要去調(diào)用活體的引擎了,首先看看活體檢測需要哪些參數(shù)值骇,
在官方文檔中有很詳盡的介紹莹菱,首先是傳入的圖像數(shù)據(jù),由于我們后面會選擇NV21吱瘩,所以要先用mageUtils.getNV21方法將圖像數(shù)據(jù)轉(zhuǎn)為NV21格式道伟,圖像寬度高度很簡單就不多說,顏色空間格式我選擇NV21,當(dāng)然官方也提供了BGR24的格式蜜徽,大家可根據(jù)需要選擇祝懂,接下來參數(shù)是使用FD引擎跟蹤的人臉信息格式,因此在活體檢測前我們要先使用FD引擎進(jìn)行人臉跟蹤拘鞋,才能進(jìn)行活體的檢測砚蓬,最后一個(gè)參數(shù)是用來保存活體檢測的信息。
這里就是FD進(jìn)行人臉檢測的代碼掐禁,參數(shù)大部分和活體檢測的差不多怜械,唯一一點(diǎn)不同的是最后的fdFaceList是作為輸出端保存檢測到的人臉位置等數(shù)據(jù),而活體部分是作為輸入端輸入人臉位置數(shù)據(jù)傅事。好了,到了這一步我們需要的參數(shù)都已經(jīng)齊全峡扩,總算可以進(jìn)行活體的檢測了蹭越。由于活體檢測目前只能支持單人臉,因此我們需要先清理一下FD跟蹤到的人臉數(shù)據(jù)教届,以實(shí)際情況來看响鹃,一般我們想檢測的都是最大的人臉,因此我們先找到FDlist中最大的人臉案训。
清理完成买置,我們可以開始進(jìn)行活體的檢測,參數(shù)上面都已經(jīng)講過了强霎,這里就不多贅述忿项,直接看代碼吧。
如果你的errorCode為0城舞,那么恭喜你轩触,起碼在所有參數(shù)上你都沒有問題了,之后只要從Liveneessinfo中拿到檢測的結(jié)果就可以了家夺,0代表非活體脱柱,1代表活體,2代表多余一張人臉(由于前面對數(shù)據(jù)已經(jīng)做了最大人臉的清理拉馋,因此不會出現(xiàn)榨为,看起來后續(xù)還會出多人臉的版本啊期待一下),其他均為未知煌茴。當(dāng)然不要高興的太早随闺,在使用完引擎后我們要進(jìn)行引擎的銷毀。
好了圖片模式的活體檢測已經(jīng)完成景馁,具體的效果這邊就不展示了板壮,大家自己可以去嘗試一下。接下來是視頻模式下的活體檢測合住,這才是我們?nèi)粘I钪凶畛E龅降膱鼍按戮畿浺矝]有吝嗇撒璧,給了它獨(dú)立的Activity,和圖片模式的待遇完全不一樣呢:)
其實(shí)Video模式下的人臉檢測與Image模式大同小異笨使,無非是一個(gè)使用相機(jī)實(shí)時(shí)傳回的數(shù)據(jù)源卿樱,另一個(gè)采用固定的數(shù)據(jù)源。稍微有所不同的是硫椰,我們的人臉跟蹤引擎由FD改為了FT繁调,F(xiàn)T相對于FD更快,更適合Video模式下的人臉實(shí)時(shí)跟蹤靶草。FT與FD的初始化參數(shù)一模一樣蹄胰,如果忘記的話可以往上翻一下∞认瑁活體引擎我們由剛才的Image 改為了Video裕寨。
之后就是怎么使用FT與活體了,首先我們要拿到相機(jī)的預(yù)覽數(shù)據(jù)派继,在preview的回調(diào)中我們可以拿到數(shù)據(jù)宾袜。
接下來的流程與Image模式一致,首先要找出數(shù)據(jù)源中的人臉驾窟,也就是調(diào)用FT尋找人臉庆猫。
與剛才不同的是我們要在視頻的預(yù)覽數(shù)據(jù)內(nèi)畫一個(gè)人臉框,讓我們能清除的知道人臉有沒有被檢測到绅络,檢測到的是哪一個(gè)人臉月培。
活體檢測的代碼與上面的Image模式的代碼一模一樣,這里就不多做贅述昨稼,有不清楚的可以往上翻一翻节视。好了我們來看一下Video模式下的活體檢測效果吧。
總的來說假栓,在我自己測試的時(shí)感覺準(zhǔn)確率還是相當(dāng)?shù)母叩难靶校矅L試了各種各樣的方式去攻擊,但是還是無法通過活體檢測匾荆,證明虹軟的算法確實(shí)很不錯(cuò)拌蜘,更重要的是這些算法是免費(fèi)提供的,對于我這種想嘗嘗鮮的人來說真的是個(gè)好消息牙丽。而且上手也快简卧,官方的文檔寫的非常詳細(xì),對每個(gè)函數(shù)以及變量都有解釋烤芦,而且也有示例的代碼举娩,在我的使用過程中基本沒有碰到過什么阻礙,很輕松的就上手了,有些地方寫的有些拖沓或者不清還請大家多多包涵铜涉,有不明白的問題也歡迎大家和我多多交流智玻,后面的話等自己有時(shí)間可能會再寫一篇用虹軟的SDK進(jìn)行二次開發(fā)的完整應(yīng)用。