人臉識別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