一, 本文目标
利用 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 的源码和 Wi-Fi:
- https://github.com/davidsandberg/facenet/
- https://github.com/davidsandberg/facenet/wiki
来源: https://www.cnblogs.com/dskit/p/9941079.html