【深度学习】人脸识别模型的动手实践!
作者:宋志龍,算法工程師,Datawhale成員
人臉識別已經(jīng)成為生活中越來越常見的技術(shù),其中最關(guān)鍵的問題就是安全,而活體檢測技術(shù)又是保證人臉識別安全性的一個重要手段,本文將向大家簡單介紹活體檢測,并動手完成一個活體檢測模型的訓(xùn)練,最終實現(xiàn)對攝像頭或者視頻中的活體進行識別。
我們可以達成的效果
人臉識別的技術(shù)關(guān)鍵——活體檢測
一般提到人臉識別技術(shù),即指人臉比對或人臉匹配,即將待識別的人臉和系統(tǒng)中已經(jīng)提前錄入的人臉信息(如身份證照片)進行特征的比對,而在使用神經(jīng)網(wǎng)絡(luò)提取特征進行比對之前,需要首先對識別到的人臉進行活體檢測,以確定攝像頭前的人是個活人。因此整個人臉識別過程一般為(并非一定要這樣):人臉檢測 -> 關(guān)鍵點檢測 -> 人臉對齊 -> 活體檢測 -> 人臉特征提取 -> 人臉比對。
模型簡介
本項目使用基于resnet18的二分類模型對RGB圖像進行活體、非活體的分類識別, 網(wǎng)絡(luò)結(jié)構(gòu)如圖所示,有關(guān)于resnet的知識可自行查閱。
數(shù)據(jù)集簡介
本項目數(shù)據(jù)集使用中科院大型人臉活體檢測數(shù)據(jù)庫CACIA-SURF,這是一個包含大量不同年齡段人的多模態(tài)(RGB, Depth,IR)的數(shù)據(jù)集,其中包含大量真實活體人臉樣本,也包含了對應(yīng)的攻擊樣本(數(shù)據(jù)集已上傳至開源數(shù)據(jù)平臺Graviti)。
如圖所示,圖例中的攻擊樣本是以打印出來的人臉作為攻擊樣本,或者露出五官中的部分結(jié)合打印人臉一起作為攻擊樣本,當然還有別的攻擊樣本制作的形式。因此模型訓(xùn)練的目標就是要在遇到這些攻擊樣本的時候能夠正確識別出它不是一個活體。
其中,RGB表示RGB圖片,Depth表示深度圖,IR表示近紅外圖。三個模態(tài)的數(shù)據(jù)可以都用來訓(xùn)練,以使模型適應(yīng)不同圖像采集設(shè)備的需求。為了簡單,本項目僅使用RGB圖像訓(xùn)練。
數(shù)據(jù)集目錄結(jié)構(gòu)如圖所示:
Training中為訓(xùn)練集圖片,Val為驗證集圖片,train_list.txt為訓(xùn)練集各個樣本的路徑及標簽,val_private_list.txt為驗證集各個樣本的路徑及標簽,val_public_list.txt本項目暫時不用
代碼簡介
項目環(huán)境:python 3.7.4 、pytorch 1.4.0、其余的opencv、numpy啥的看缺啥裝啥吧。。。
項目代碼目錄如圖所示(代碼地址見文末):
其中,alive_detect為自定義的文件夾,里面存放了一些測試視頻,人臉檢測模型權(quán)重等等文件。
loss文件夾內(nèi)存放了一些損失函數(shù)的實現(xiàn) model文件夾內(nèi)存放了一些模型的實現(xiàn)
models文件夾是模型訓(xùn)練過程中權(quán)重的保存路徑 process文件夾內(nèi)存放了一些關(guān)于數(shù)據(jù)處理相關(guān)的代碼
metric.py實現(xiàn)了一些指標的計算
utils.py實現(xiàn)了一些訓(xùn)練或測試用到的小功能函數(shù)
train_CyclicLR.py是訓(xùn)練代碼,執(zhí)行這個代碼即可啟動訓(xùn)練
train_Fusion_CyclicLR.py是多模態(tài)數(shù)據(jù)的訓(xùn)練代碼。即同時使用上述數(shù)據(jù)集中的三種模態(tài)的數(shù)據(jù)進行訓(xùn)練
face_recognize.py是使用訓(xùn)練好的模型進行活體檢測測試的代碼
項目代碼中給出了訓(xùn)練好的模型權(quán)重示例,models/baseline_color_32/checkpoint/global_min_acer_model.pth。
執(zhí)行腳本face_recognize.py,即可調(diào)用訓(xùn)練好的模型完成活體檢測。
訓(xùn)練過程示例
以resnet18模型為例,使用數(shù)據(jù)集中的RGB圖片進行訓(xùn)練,輸入模型尺寸大小為32。
開始訓(xùn)練:
cd?alive_recognize_project#開啟訓(xùn)練 #--model?baseline?,?以resnet18為例,可選其他模型,自行探索 #--image_size?32?,?輸入活體檢測模型的人臉圖像大小為32 #--cycle_num?5,訓(xùn)練5個cycle周期 #--cycle_inter?50,?每個cycle周期內(nèi)訓(xùn)練50個epoch #--mode?train?,?開啟訓(xùn)練模型 python?train_CyclicLR.py?--model?baseline?--image_mode?color?--image_size?32?--cycle_num?5?--cycle_inter?50?--mode?train?對cycle_num和cycle_inter參數(shù)的說明,本項目學習率衰減策略采用周期性余弦衰減,cycle_num表示周期數(shù),cycle_inter表示一個周期內(nèi)訓(xùn)練的epoch數(shù),即每經(jīng)過cycle_inter個epoch,學習率從初始值下降到最低值,如下圖所示。
然后就開始訓(xùn)練了,期間會打印出一些訓(xùn)練過程中的loss、acc、acer等信息,如需要別的日志信息可自行修改。
訓(xùn)練完成后的模型保存在路徑models/baseline_color_32/checkpoint下,默認保存每個周期內(nèi)最低acer模型、最后一個epoch訓(xùn)練結(jié)束的模型和全局最低acer模型,如下圖所示。
在驗證集上測試模型
python?train_CyclicLR.py?--mode?infer_test?--model?baseline?--image_mode?color?--image_size?32?--batch_size?8驗證集上結(jié)果,ACER=0.0358
模型效果測試
調(diào)用訓(xùn)練好的模型,對視頻中的人臉進行活體檢測。(也可以檢測攝像頭前的自己,本項目以視頻文件為例)
測試腳本face_recognize.py參數(shù):
--alive_detect_model:活體檢測模型權(quán)重
--key_point_detect_model:關(guān)鍵點檢測模型,路徑為alive_detect/shape_predictor_68_face_landmarks.dat
--detect_vidio:待檢測的視頻片段存放路徑
--detect_res:視頻片段的檢測結(jié)果存放路徑
測試代碼示例:
python?face_recognize.py? --alive_detect_model?models/baseline_color_32/checkpoint/global_min_acer_model.pth? --key_point_detect_model?alive_detect/shape_predictor_68_face_landmarks.dat? --detect_vidio?alive_detect/video_demo.mov? --detect_res?alive_detect/res_video_demo.avi注:--detect_res保存的視頻文件默認avi格式,若需要保存其他格式可以自行修改代碼。
測試結(jié)果示例
擴展
關(guān)于模型訓(xùn)練,可繼續(xù)調(diào)參以期在驗證集獲得更好的效果。
關(guān)于數(shù)據(jù)集,可以使用全部三種模態(tài)的數(shù)據(jù),使用FaceBagNet模型進行多模態(tài)人臉活體檢測模型的訓(xùn)練。已經(jīng)給出相關(guān)代碼,可自行查看。
數(shù)據(jù)集獲取:https://gas.graviti.cn/dataset/datawhale/CASIA-SURF
代碼地址:https://github.com/ZJUTSong/Alive_Detect
點閱讀原文獲取數(shù)據(jù)集↓
總結(jié)
以上是生活随笔為你收集整理的【深度学习】人脸识别模型的动手实践!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win7休眠后唤醒出现黑屏的解决办法
- 下一篇: 梳理百年深度学习发展史-七月在线机器学习