戴口罩的人臉識別
1.前情提要
這學期ZUCC計算的人工智能導論課,老師之前說是以考試的形式考核,后來改成了大作業。大作業的分為三類。組隊的人數不同,難度也不同。一共有三類,我們選擇的是難度最高的三人組,選題是魯棒性人臉識別系統,另一個是新冠肺炎的圖像檢測,我們覺得自己能力有限,還是就選擇了人臉識別。
(ps:建議小組展示早點講掉,不然越到后面越“卷”,原本20mins的時間,大伙兒竟然會“水”到30甚至40mins)
在魯棒性人臉識別系統這個大作業的選題中,我們選擇了去遮擋的方向,具體到生活中的體現就是在戴口罩的情況下也能正確識別人臉的身份信息。當然,我們並沒有徒手擼代碼從零開始搞起,而是“借鑒和參考”了玄諤博主的代碼,想要了解原作者實現方法的同學點擊此處轉到原文,當然下面的內容也差不多。
最后十分感謝玄諤博主在GitHub、CSDN上的指導和轉載支持,十分感謝小組成員建子哥和葛兄的辛苦付出,沒有你們這個項目很難落地。本着開源共享,少讓后人走彎路的精神,我計划寫了這篇博客。
2.配置環境
此開源項目是基於Tensorflow 1.0實現的,所以需要在自己的電腦上安裝好,最好(一定)是“一條龍服務”,如tensorflow的套餐:CUDA10.0+cuDNN7.6.1+python3.7+tensorflow1.13.1
Tensorflow官網上也有配套說明,這里我給出我搭環境的指南鏈接。
如果之前已經搭好了2.0的環境,沒關系,在運行報錯的代碼處添加版本轉換的代碼就好了。注意,有些報錯也許是因為庫和包是版本不匹配而無法搭配工作,也許根本沒有導入這個庫,不要心急慢慢搞。還有一點很重要,配環境的電腦最好是運存16GB的游戲本,我在自己8GB的全能本上試了一下FPS幀率很低,而且emmmm........
3.項目資料
演示視頻 提取碼:coma
4.實現流程
MTCNN:人臉檢測,人臉對齊,從圖片中框出人臉。旗下三個子網絡 P-Net, R-Net 和 O-Net層層遞進,做出精細化處理確定合格的人臉。
FaceNet:提取128維人臉特征向量,生成人臉特征信息並與本尊名字對應。
MobileNet:判斷人臉是否佩戴口罩。
簡易流程圖:
用一句話概括實現原理:
攝像頭或者本地傳入帶有人臉的照片,MTCNN框出人臉,FaceNet提取其人臉特征(128維的特征向量),然后和數據庫里的特征向量做對比(數據庫里的特征向量是訓練分類器時存儲的,作為識別樣本庫),選擇小於閾值且歐式距離最小的一個,最后輸出其對應的標簽信息。
此時FaceNet比較的是數據庫里戴口罩人臉和攝像頭輸入的人臉信息,選取距離最短,並且小於一定門限的人臉作為輸出結果,所以能在戴口罩的情況下正確識別人臉信息。最后通過MobileNet判斷人臉是否佩戴口罩。
5.項目實現的tips
- 首先在models文件夾下面如圖放置20200505-085843文件
下圖是20200505-085843文件夾內的文件,這些數據是利用加了口罩的Casia-FaceV5重新進行了訓練的,是提取了特征向量的模型。
關於怎么獲取20200505-085843文件,可以見原博客。
- 讓real_time.py 和local_img.py 能正常運行
real_time.py 調用攝像頭實時檢測和識別 local_img.py 識別傳入的本地圖片
這兩個是主要運行文件,若它們能正常運行,那么環境就基本沒問題了(通過配置好的jupyter運行.ipynb文件)
- 訓練自己的模型
訓練自己的分類器模型是為了能識別自己和想要識別的對象。
在datas/DL/mask下面新建一個數據集,每人按照人名設置一個文件夾,里面放上此人戴口罩的160*160像素的圖片。可以使用里面批量處理口罩的代碼,但本人時間緊迫,探索失敗了,是自己手動P的口罩,壓縮成統一像素倒是用了批量處理的代碼。
運行程序classifier.py。
在Tensorflow 的環境下cd到facenet_src,執行命令:
python classifier.py TRAIN(運行模式) 數據集路徑 模型路徑 要生成的pkl文件路徑
如圖:
最后把生成的pkl文件改成“dl_classifier_masks_65.pkl”替換原來就好了。
生成的pkl文件是保存特征向量和人的身份信息的文件。
同理把運行模式從TRAIN改為CLASSIFY就可以測試分類器了。
6.總結
基於原博主的文章,我們踩過了許多坑。寫這篇博客,就是想在自己做過的基礎上讓后人少踩一點坑。回頭看,發現最頭痛還是配環境和如何食用這份代碼,結合原博主的文章,我想在你閱讀后應該有所幫助,記得素質三連,不要下次一定哦。
德麗莎世界第一可愛!