tensorflow 实现人脸识别(facenet)

1.获取数据集(LFW)

http://vis-www.cs.umass.edu/lfw/

2.下载facenet并配置

 1)git clone --recursive https://github.com/davidsandberg/facenet.git
 2)cd facenet/
 3)pip install -r requirements.txt
 4)export PYTHONPATH=$(pwd)/src
3.处理数据集(对齐数据集)
执行下面命令
1)cd facenet
2)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

图片较多需要等一段时间

4.下载模型文件

https://github.com/davidsandberg/facenet

选择pre-trained models

下载20170512-110547(MS-Celeb-1M数据集训练的模型文件)

然后解压

放在一个文件夹下 mkdir ~/models以便后面路径寻找

5.在lfw数据集上面进行验证

1)cd facenet

2) python src/validate_on_lfw.py ~/dataset/lfw/lfw_mtcnnpy_160 ~/models/20170512-110547

即可

accuracy:0.993+-0.004

validation rate:0.97400+-0.01380 @ FAR=0.00100

Area Under Curve(AUC):0.999

Equal Error Rate(EER):0.008

以下是使用 TensorFlow 实现 FaceNet 人脸识别的代码: ```python import tensorflow as tf import numpy as np import os import urllib.request import tarfile import zipfile import sys import math import pickle from scipy import misc from sklearn.model_selection import train_test_split from sklearn.utils import shuffle # 下载和提取数据集 def download_and_extract_model(): model_dir = 'model' if not os.path.exists(model_dir): os.makedirs(model_dir) model_url = 'https://github.com/davidsandberg/facenet/releases/download/v1.0/20170512-110547.zip' urllib.request.urlretrieve(model_url, os.path.join(model_dir, '20170512-110547.zip')) zip_ref = zipfile.ZipFile(os.path.join(model_dir, '20170512-110547.zip'), 'r') zip_ref.extractall(model_dir) zip_ref.close() # 加载预训练模型 def load_model(model_dir): model_path = os.path.join(model_dir, '20170512-110547', 'model-20170512-110547.ckpt-250000') metagraph_path = os.path.join(model_dir, '20170512-110547', 'model-20170512-110547.meta') saver = tf.train.import_meta_graph(metagraph_path) sess = tf.Session() saver.restore(sess, model_path) return sess # 将图片转换为 160x160 的大小 def prewhiten(x): mean = np.mean(x) std = np.std(x) std_adj = np.maximum(std, 1.0 / np.sqrt(x.size)) y = np.multiply(np.subtract(x, mean), 1 / std_adj) return y # 从图片路径中提取人名和图片名 def get_name(path): parts = path.split('/') return parts[-2] def get_image(path): img = misc.imread(path) img = prewhiten(img) return img # 加载数据集 def load_dataset(data_dir): images = [] labels = [] for subdir, _, files in os.walk(data_dir): for file in files: if file.endswith('.jpg') or file.endswith('.png'): path = os.path.join(subdir, file) label = get_name(path) images.append(path) labels.append(label) return images, labels # 对图片进行嵌入 def embed(sess, images): 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") emb_array = np.zeros((len(images), 128)) for i in range(len(images)): img = images[i] img = get_image(img) feed_dict = {images_placeholder: [img], phase_train_placeholder: False} emb = sess.run(embeddings, feed_dict=feed_dict) emb_array[i] = emb return emb_array # 计算欧氏距离 def distance(emb1, emb2): return np.sum(np.square(emb1 - emb2)) # 预测图片中的人名 def predict(sess, dataset, labels, image_path, k): images = [image_path] embs = embed(sess, images) distances = [] for i in range(len(dataset)): emb = dataset[i] dist = distance(embs[0], emb) distances.append((dist, labels[i])) distances = sorted(distances, key=lambda x: x[0]) top_k = distances[:k] names = [x[1] for x in top_k] counts = {} for name in names: if name in counts: counts[name] += 1 else: counts[name] = 1 predicted_name = max(counts, key=counts.get) return predicted_name # 主函数 if __name__ == '__main__': data_dir = 'data' image_path = 'test.jpg' k = 5 download_and_extract_model() sess = load_model('model') images, labels = load_dataset(data_dir) dataset = embed(sess, images) predicted_name = predict(sess, dataset, labels, image_path, k) print('Predicted name:', predicted_name) ``` 在此代码中,我们使用 TensorFlow 实现FaceNet 人脸识别。代码首先下载并提取了 FaceNet 模型,然后加载了预训练模型,将图片转换为 160x160 的大小,最后对图片进行嵌入,并计算图片之间的欧氏距离。最后,我们可以使用预测函数来预测图片中的人名。
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值