人脸匹配用FaceNet的模型计算人脸之间距离(TensorFlow)


2015年Google的研究人员发表了一篇论文:FaceNet: A Unified Embedding for Face Recognition and Clustering,是关于人脸识别的,他们训练一个网络来得到人脸的128维特征向量,从而通过计算特征向量之间的欧氏距离来得到人脸相似程度。在LFW上面取得了当时最好的成绩,识别率为99.63%。

传统的基于CNN的人脸识别方法为:利用CNN的siamese网络来提取人脸特征,然后利用SVM等方法进行分类。而这篇文章中他们提出了一个方法系统叫作FaceNet,它直接学习图像到欧式空间上点的映射,其中呢,两张图像所对应的特征的欧式空间上的点的距离直接对应着两个图像是否相似。

人脸之间距离

如上图所示,直接得出不同人脸图片之间的距离,通过距离就可以判断是否是同一个人,阈值大概在1.1左右。

而现在我要做的,就是用训练好的模型文件,实现任意两张人脸图片,计算其FaceNet距离。然后就可以将这个距离用来做其他的事情了。

环境

  • macOS 10.12.6
  • Python 3.6.3
  • TensorFlow 1.3.0

实现

模型文件

首先我们需要训练好的模型文件,这个可以在FaceNet官方的github中获取:

github的README中有

注意他们是存放在Google云盘中的,需要翻墙获取(没个翻墙能力连科研都做不好了。。)

代码

这里我们需要FaceNet官方的github中获取到的facenet.py文件以供调用,需要注意的是其github中的文件一直在更新,我参考的很多代码中用到的facenet.py文件里方法居然有的存在有的不存在,所以可能随着时间流逝有些现在能成功以后需要修改代码才能成功了。

代码如下:

# -*- coding: utf-8 -*-

import tensorflow as tf
import numpy as np
import scipy.misc
import cv2
import facenet

image_size = 200 #don't need equal to real image size, but this value should not small than this
modeldir = './model_check_point/20170512-110547.pb' #change to your model dir
image_name1 = 'x.jpg' #change to your image name
image_name2 = 'y.jpg' #change to your image name

print('建立facenet embedding模型')
tf.Graph().as_default()
sess = tf.Session()

facenet.load_model(modeldir)
images_placeholder = tf.get_default_graph().get_tensor_by_name("input:0")
embeddings = tf.get_default_graph().get_tensor_by_name("embeddings:0")
phase_train_placeholder = tf.get_default_graph().get_tensor_by_name("phase_train:0")
embedding_size = embeddings.get_shape()[1]

print('facenet embedding模型建立完毕')

scaled_reshape = []

image1 = scipy.misc.imread(image_name1, mode='RGB')
image1 = cv2.resize(image1, (image_size, image_size), interpolation=cv2.INTER_CUBIC)
image1 = facenet.prewhiten(image1)
scaled_reshape.append(image1.reshape(-1,image_size,image_size,3))
emb_array1 = np.zeros((1, embedding_size))
emb_array1[0, :] = sess.run(embeddings, feed_dict={images_placeholder: scaled_reshape[0], phase_train_placeholder: False })[0]

image2 = scipy.misc.imread(image_name2, mode='RGB')
image2 = cv2.resize(image2, (image_size, image_size), interpolation=cv2.INTER_CUBIC)
image2 = facenet.prewhiten(image2)
scaled_reshape.append(image2.reshape(-1,image_size,image_size,3))
emb_array2 = np.zeros((1, embedding_size))
emb_array2[0, :] = sess.run(embeddings, feed_dict={images_placeholder: scaled_reshape[1], phase_train_placeholder: False })[0]

dist = np.sqrt(np.sum(np.square(emb_array1[0]-emb_array2[0])))
print("128维特征向量的欧氏距离:%f "%dist)

代码的逻辑就是 
1. 先导入模型参数 
2. 然后导入两张图片,分别获取其经过模型后得到的128维特征向量 
3. 最后计算两个向量的欧氏距离

代码中有几个参数: 
* image_size:图片长宽尺寸,这里要求输入的图片是长宽相等的,但是不要求两张人脸图大小一致,这里设置的尺寸是代码中会将人脸图读取后重新拉伸压缩成这个大小,这个尺寸最好比200大,太小了会运行失败 
* modeldir:预训练好的模型路径 
* image_name1:第一张人脸图的图片名 
* image_name2:第二张人脸图的图片名

实验

给两个不同人的人脸图片,得到的结果如下:

终端运行输出

如果比较两个相同的人脸图片,得到的距离会是零点几;如果是两张一样的图,得到的距离会是0,符合要求。

这里有我的工程代码:https://github.com/Cloudox/facenet_distance




### 回答1: FaceNet是一个用于人脸识别的深度学习模型,旨在实现高性能的人脸识别算法。在Keras中实现FaceNet模型需要遵循以下步骤: 1. 数据准备:数据集应该包含大量的人脸图像,每个图像应标记对应的人名或ID。数据集可以通过互联网或手动收集。 2. 数据预处理:数据需要进行预处理,包括图像重缩放、灰度或彩色转换、预处理图像增强等。 3. 构建模型:构建FaceNet模型可以适当使用预训练模型,包括VGG、ResNet等。该模型主要包括卷积层、Pooling层、全连接层等。其中,卷积层用于提取特征,全连接层用于将提取的特征向量映射到特定的实空间。 4. 训练模型:在数据集上对模型进行训练,并执行交叉验证以避免过拟合。 5. 评估性能:评估FaceNet模型的性能可以使用准确性、召回率、精确度等指标。 在keras中的实现,需要先导入相关的库,如keras、tensorflow等,然后在构建模型时逐层添加网络层。具体的实现,包括前向和后向传播,可以根据具体的模型来进行编程实现。 总之,FaceNet是一个优秀的人脸识别模型,Keras提供了方便的接口来实现该模型以及进行相关优化和改进。通过对FaceNet模型的建模和训练,可以实现高效的人脸识别,为安全管理、身份认证等领域奠定基础。 ### 回答2: Facenet是一种流行的人脸识别模型,它是通过深度神经网络实现的。最近,人们在Keras框架下实现Facenet模型,使其更便于使用和调试。 在Keras实现中,Facenet模型主要由三个部分组成:人脸检测、人脸对齐和人脸嵌入。 人脸检测部分使用一个卷积神经网络来检测图像中的人脸并确定它们的位置。这个网络训练的目的是检测一张图像中的每一个人脸,返回一个框定每个人脸位置和大小的边框。 人脸对齐是将检测到的人脸进行转换,使其风格和大小匹配,以便在嵌入步骤中获得更好的结果。这个部分的实现使用了一系列的仿射变换和三维对准技术,以确保每个人脸在变换后能够对齐。 人脸嵌入是将归一化后的检测图像映射为人脸向量,也是Facenet的核心部分。这个部分使用了一个具有三个等距卷积层的深度神经网络,并将每个人脸转换为一个128维的向量。这个向量的距离可以表示两张人脸之间的差异,从而实现识别功能。 值得注意的是,在Keras实现中,Facenet模型使用了Triplet Loss作为损失函数,它可以帮助提高嵌入向量的质量,并使得具有相同特征的人脸之间距离尽可能小,同时使具有不同特征的人脸之间距离最大化。 总之,通过使用Keras框架实现Facenet模型,可以方便地进行人脸识别和验证任务,为深度学习人脸识别应用提供了有效的实现方式。 ### 回答3: FaceNet是一种人脸识别模型,它可以将人脸图像转换为具有独特特征的向量。这个模型可以在Keras中实现。 Keras是一种用于构建神经网络的高级Python库,它提供了一种简单易用的API,使得用户可以集中精力于模型的构建和调优。在Keras中实现FaceNet采用深度学习的方法,结合了卷积神经网络和三元组损失函数。 具体来说,FaceNet模型通过卷积神经网络提取人脸图像的特征。在图像经过卷积层、池化层和全连接层之后,可以将其转换为一个固定长度的向量,该向量可以表示出不同人脸之间的差异。通过三元组损失函数,模型可以对这些向量进行训练。三元组损失函数是一种用于训练嵌入向量的度量学习函数,让嵌入向量之间距离有明确的含义,可以识别出不同人脸之间的差异。 在Keras中实现FaceNet模型,需要使用以下库:tensorflow, numpy, matplotlib,和sklearn。这些库可以让用户在建模,训练和评估模型时使用特定函数和工具。 总之,采用Keras实现FaceNet模型能够实现准确、快速地对人脸进行识别,这可以开辟人脸识别应用程序的新前景。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值