MTCNN+FaceNet人脸识别

人脸识别简介

  人脸验证是验证一个人的图片是否对应到一个人的名字ID,如果把这个方法应用到人脸识别,如果验证一个人脸的错误率是1%,那么在100个人的数据库上进行识别,其总体错误率就会很高。所以,如果要在大型数据库上识别每个人,并且错误率比较低,那么人脸验证所需要的达到的精度需要很高才行,比如99.99%,这是比较困难的。
  实现人脸验证的一个难点在于需要解决One-Shot一次学习问题,这意味着在数据库中,只需要提供一张照片,就能在任何场景下识别出这个人。而通常的深度学习分类方法,在只有一个训练样例时,一般不会有好的表现效果。因为很多时候,在实际应用中,难以提供很多张需要识别的人脸照片,可能只能提供一张照片。而且有时候,这个识别系统需要随时增加某个人,如果使用分类的方法去实现,这意味着随时可能要重新训练模型参数。
  为了解决更好上述问题,一般的方法是使用深度学习拟合出一个Similarity相似性函数,使用神经网络学习这样一个相似度函数,能够给出两张图片的人脸之间的相似性距离。
d ( i m a g e 1 , i m a g e 2 ) = d e g r e e   o f   d i f f e r e n c e   b e t w e e n   i m a g e s d(image_1,image_2)=degree\ of\ difference\ between\ images d(image1,image2)=degree of difference between images
在实际应用中,拿来需要识别的人脸照片,与数据库中的人脸图片依次进行比对,也就是依次计算相似性距离函数 d ( i m a g e 1 , i m a g e 2 ) d(image_1,image_2) d(image1,image2),如果距离值 d d d很小,小于某个阈值,就判定为同一个人,反之亦然。这样有个好处就是,如果需要随时增加某个人到数据库中来,那么模型参数也不需要重新进行训练,只需要将他的照片加到你的数据库,系统依然能照常工作。
  可以通过Siamese network实现上述的相似性距离函数,照片输入到神经网络中,最终会产生一个特征向量。分别计算两张照片,就会产生两个特征向量,这时只需要计算两个向量的欧式距离,就能获取两张图片之间的相似性距离。但是需要采用Triplet loss三元组损失训练神经网络,才能使其能够产生有这种良好性能的特征向量,其作者开发了DeepFace识别系统。
L ( A , P , N ) = m a x ( ∣ ∣ f ( A ) − f ( P ) ∣ ∣ 2 − ∣ ∣ f ( A ) − f ( N ) ∣ ∣ 2 + α , 0 ) L(A,P,N)=max(||f(A)-f(P)||^2-||f(A)-f(N)||^2+\alpha,0) L(A,P,N)=max(f(A)f(P)2f(A)f(N)2+α,0)
  其中A和P是同一个人,N是不同的另外一个人,神经网络产生的特征为 f ( A ) f(A) f(A),这个损失函数的目的是,应当使A和P的特征表示尽量接近,而A和N的特征表示尽量差距很大。

实践

  关于上手实践人脸识别的过程,首先需要到github上下载相应的代码和模型参数文件,网址为
https://github.com/davidsandberg/facenet
安装python环境依赖

tensorflow==1.7
scipy
scikit-learn
opencv-python
h5py
matplotlib
Pillow
requests
psutil
numpy==1.6

下载LFW数据集并解压
http://vis-www.cs.umass.edu/lfw/lfw.tgz

cd ~/datasets
mkdir -p lfw/raw
tar xvf ~/Downloads/lfw.tgz -C lfw/raw --strip-components=1

设置python路径时需要注意一个问题,如果使用的是conda虚拟环境,那么你需要知道那个虚拟环境的python解释器的路径,如果不知道也行,只需在虚拟环境中执行以下命令

export PYTHONPATH=$PYTHONPATH:~/facenet/src

预处理LFW数据集,使用MTCNN将图片中的人脸图像块,精确的检测并裁剪出来,其中的–detect_multiple_faces True表示是否在一张图片中同时检测多个人脸框,最后会统一处理成160大小,其中的–gpu_memory_fraction 0.25表示使用25%比例的GPU显存,如果不设置这项,就会默认为100%显存,但是代码运行时可能无法使用到100%显存,所以可能会因此出现代码运行报错。

for N in {
    
    1..4}; do \
python src/align/align_dataset_mtcnn.py \
~/datasets/lfw/raw \
~/datasets/lfw/lfw_mtcnnpy_160 \
--image_size 160 \
--margin 32 \
--random_order \
--gpu_memory_fraction 0.25 \
--detect_multiple_faces True
& done

同时还需要下载模型的参数文件,下载链接可在github页面找到
20180402-114759
下载解压之后,其中的内容为

20180402-114759.pb
model-20180402-114759.ckpt-275.data-00000-of-00001
model-20180402-114759.ckpt-275.index
model-20180402-114759.meta

在LFW数据集上运行人脸识别测试

python src/validate_on_lfw.py \
~/datasets/lfw/lfw_mtcnnpy_160 \
~/models/facenet/20180402-114759 \
--distance_metric 1 \
--use_flipped_images \
--subtract_mean \
--use_fixed_image_standardization

之后会产生输出

Model directory: /home/david/models/20180402-114759/
Metagraph file: model-20180402-114759.meta
Checkpoint file: model-20180402-114759.ckpt-275
Runnning forward pass on LFW images
........................
Accuracy: 0.99650+-0.00252
Validation rate: 0.98367+-0.00948 @ FAR=0.00100
Area Under Curve (AUC): 1.000
Equal Error Rate (EER): 0.004

或者只比较人脸识别的特征

python compare.py \
~/poster/20180402-114759 \ 
~images/pic/* \
--image_size 160 \
--margin 32 \
--gpu_memory_fraction 0.25 \
--dist_out_path ~/images/pic_160

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/wanchaochaochao/article/details/108101651