一、本文目標
利用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使用(具體安裝方式不再贅述,使用XShell建立連接時,設置連接屬性,在 SSH --> tunneling 選項下勾選 Forward X11 connections to: Xmanager)。也可以直接在虛擬機的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,國內需要翻牆才能下載,不翻牆大概率可以搜索從國內某些網盤上下載。文件大約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人臉識別的“hello world”算是實現了,對於人臉檢測、人臉識別、性別識別、情感識別、年齡識別、embedding提取、landmark提取,人臉對齊,並在生產實踐中應用,這僅僅是第一步。
上面識別出的人名肯定是不准確的,這是為什么呢?算是留下的思考題,大家自己動手試試,讓上面的人臉識別准確。推薦研讀facenet的源碼和wifi:
https://github.com/davidsandberg/facenet/
https://github.com/davidsandberg/facenet/wiki