人臉識別FaceNet+TensorFlow
一、本文目標
利用facenet源碼實現從攝像頭讀取視頻,實時檢測並識別視頻中的人臉。換句話說:把facenet源碼中contributed目錄下的real_time_face_recognition.py運行起來。
二、需要具備的條件
1、準備好的Tensorflow環境
2、攝像頭(可用視頻文件替代)
3、準備好的facenet源碼並安裝依賴包
4、訓練好的人臉檢測模型
5、訓練好的人臉識別分類模型
三、準備工作
1、搭建Tensorflow環境
如何編譯搭建見《Ubuntu16.04+TensorFlowr1.12環境搭建指南》。
2、準備攝像頭
如果使用虛擬機,首先確保攝像頭連接的虛擬機,連接方式見下圖:
攝像頭連接的虛擬機成功後,在/dev目錄下會看到video0文件,需要確保當前用戶有攝像頭的訪問權限:
sudo chown jack:jack /dev/video0
如果沒有攝像頭,可用視頻文件替代,只需將real_time_face_recognition.py中
video_capture = cv2.VideoCapture(0)
這行代碼替換為:
video_capture = cv2.VideoCapture(VIDEOPATH)
事實上,在虛擬上使用攝像頭做實時視頻流的人臉識別,很可能會出現“select timeout”錯誤,這是由於CPU的處理能力不知導致,這時也可以用視頻來替代攝像頭來進行實驗。
建議在HOST上安裝xshell+xmanager來訪問虛擬機,顯示人臉檢查的視頻窗口必須xmanager配合xshell使用(具體安裝方式不再贅述)。也可以直接在虛擬機的terminal中運行real_time_face_recognition.py,而無需安裝xmanager。
3、準備好的facenet源碼並安裝依賴包
(1)下載源碼
cd /data
git clone https://github.com/davidsandberg/facenet.git
cd facenet
(2)設置PYTHONPATH
sudo vi ~/.bashrc
在文件最後添加:
export PYTHONPATH =/data/facenet/src
source ~/.bashrc
(3)安裝依賴包
workon tfenv
pip install -U –-upgrade pip
pip install -U h5py matplotlib==2.2.3 Pillow requests psutil opencv-python
(4)準備源碼
為了跟tensorflow r1.12兼容,需要需要facenet.py源碼中
create_input_pipeline函數,在函數的第一行添加
with tf.name_scope("tempscope"):
添加後,別忘了後面的代碼縮減哦。
4、準備人臉檢測模型
直接從https://drive.google.com/file/d/1EXPBSXwTaqrSC0OhUdXNmKSh9qJUQ55-/view下載已經訓練好的模型20180402-114759,國內需要FQ才能下載,不FQ大概率可以搜索從國內某些網盤上下載。文件大約4GB,建議用迅雷等工具下載。文件解壓到/data/models目錄,解壓後文件如下:
20180402-114759.pb
model-20180402-114759.ckpt-275.data-00000-of-00001
model-20180402-114759.ckpt-275.index
model-20180402-114759.meta
5、訓練人臉識別分類模型
(1)從http://vis-www.cs.umass.edu/lfw/lfw.tgz下載LFW數據集到/data/datasets目錄
cd /data/datasets
mkdir -p lfw/raw
tar xvf lfw.tgz -C lfw/raw --strip-components=1
(2) 訓練分類模型
對齊LFW 數據集:
workon tfenv
cd /data/facenet
for N in {1..4}; do \
python src/align/align_dataset_mtcnn.py \
/data/datasets/lfw/raw \
/data/datasets/lfw/lfw_mtcnnpy_160 \
--image_size 160 \
--margin 32 \
--random_order \
--gpu_memory_fraction 0.25 \
& done
訓練分類模型:
python src/classifier.py TRAIN \
/data/datasets/lfw/lfw_mtcnnpy_160 \
/data/models/20180402-114759/20180402-114759.pb \
/data/models/lfw_classifier.pkl \
--batch_size 1000 \
--min_nrof_images_per_class 40 \
--nrof_train_images_per_class 35 \
--use_split_dataset
四、運行人臉識別
配置檢測模型和分類模型,修改face.py文件
facenet_model_checkpoint = os.path.dirname(__file__) + "/../model_checkpoints/20170512-110547"
classifier_model = os.path.dirname(__file__) + "/../model_checkpoints/my_classifier_1.pkl"
為:
facenet_model_checkpoint = "/data/models/20180402-114759"
classifier_model ="/data/models/lfw_classifier.pkl"
運行人臉識別代碼了!祝你好運!
workon tfenv
cd /data/facenet/contributed
python real_time_face_recognition.py
到這裏,如果順利的話,你應該看到小視頻窗口了,人臉會被框出來,並在旁邊顯示識別的人名。識別出的人名肯定是不準確的,讓人臉識別更高效更準確,並能在生產實踐中應用,建議仔細研讀facenet的源碼和wifi:
https://github.com/davidsandberg/facenet/
https://github.com/davidsandberg/facenet/wiki
人臉識別FaceNet+TensorFlow