在本项目中,人脸检测参考的主要理论依据为 Kaipeng Zhang,Zhanpeng Zhang,Zhifeng Li,Yu Qiao. Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks. IEEE Signal Processing Letters(SPL), vol.23,no10, pp.1499-1503,2016.,后来在CSDN中找到了一个系列的实战应用及详细的教程和讲解:tensorflow入门教程(三十五)facenet源码分析之MTCNN--人脸检测及关键点检测,博客中讲的肯定比我叙述得更详细,所以这部分尽可能去参考这个系列吧(题外话,这个博主感觉确实是个大牛,尤其是针对于Tensorflow这一块,做了很多详尽的研究)。瞳孔检测部分没有使用神经网络,主要是觉得全都是神经网络解决的话那这个项目就过于简单了,意义不大,因此从这一步起均采用传统图像处理的方法。事实上为了完成瞳孔位置的定位着实花了我很多时间,尝试了很多方法,最后效果虽然一般,但是在这个过程中充分锻炼了自己的思考能力和解决问题的能力。瞳孔检测在人脸识别的基础上需要先进行眼部ROI区域的划定,因此会分为单独的一点来介绍。
下面对环境的搭建和本项目中的具体使用作简单讲解:
一、开发平台及辅助工具等
二、安装
1、Anaconda安装:手把手教你如何安装Tensorflow(Windows和Linux两种版本
2、Spyder安装:选择Tensorflow环境,点击Spyder下面的Install按钮即可。(我的是已经安装好了,所以显示的是Launch)
3、OpenCV安装:点击Environments → tensorflow,在搜索栏输入opencv,全点上安装就好了。
4、Facenet源码下载:https://github.com/davidsandberg/facenet/tree/master(参考博客)
三、启动
通常来说我们启动应用时只需要在搜索栏搜索应用然后回车即可,但是由于Anaconda是一个对开发环境的统一管理平台,也就意味着可能同时存在多种环境,比如这次所需的Tensorflow开发环境,因此直接启动的话有可能进不去我们所需的目标环境,所以需要注意下启动方式。
我采用的方式如下:
1、在Windows搜索栏搜索Anaconda Prompt并启动,可以看到一个类似于cmd的窗口被打开:
2、注意到上图中括号内的“base”字样,表示当前为默认环境;
3、输入 activate Tensorflow ,按下回车,可以注意到括号内的字符串变为tensorflowle了,这意味着我们成功进入了搭建的tensorflow环境:4、输入Spyder启动Spyder编译器即可进行代码撰写
至此,开发环境已经搭建完毕,打开对应的py文件即可进行编译。这里贴一个我遇到的问题:
图源及解决方法参考:https://www.cnblogs.com/Terrypython/p/10467859.html
四、完整源码
为便于下面各部分的讲解,先给出完整的源码如下:
# -*- coding: utf-8 -*-
"""
Created on Tue Mar 26 22:40:32 2019
@author: Beta
"""
import cv2
import tensorflow as tf
import align.detect_face
from Filter import Filtercol
from Filter import Findboundcol
from Filter import Findboundrow
video_capture = cv2.VideoCapture(0)
#video_capture = cv2.VideoCapture("E:\\TensorCode\\facenet-master-Mine\\src\\Test.mp4")
totalimgnum = 0;
successnum = 0;
capture_interval = 1
capture_num = 100
capture_count = 0
frame_count = 0
detect_multiple_faces = False #因为是训练目标对象,一次只有一张人脸
#这里引用facenet/src/align/align_dataset_mtcnn.py文件的代码对采集帧进行人脸检测和对齐
minsize = 20 # minimum size of face
threshold = [ 0.6, 0.7, 0.7 ] # three steps's threshold
factor = 0.709 # scale factor
with tf.Graph().as_default():
gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.5)
sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options, log_device_placement=False))
with sess.as_default():
pnet, rnet, onet = align.detect_face.creat