⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计10077字,阅读大概需要10分钟
🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号:不懂开发的程序猿
个人网站:https://jerry-jy.co/
基于FaceNet的人脸识别
基于FaceNet的人脸识别
一、任务需求
人脸识别是一项计算机视觉任务,它根据人脸照片识别和验证人。FaceNet 是谷歌研究人员于 2015 年开发的人脸识别系统,该系统在一系列人脸识别基准数据集上取得了当时最先进的结果。由于模型的多个第三方开源实现和预训练模型的可用性,FaceNet 系统可以被广泛使用。FaceNet 系统可用于从人脸中提取高质量特征,称为人脸嵌入,然后可用于训练人脸识别系统。通过本实验,您将了解如何使用 FaceNet和SVM分类器开发人脸检测系统,以从照片中识别人物。
二、任务目标
1、了解人脸识别
2、了解FaceNet 模型
3、了解tensorflow.Keras中加载FaceNet模型
4、了解检测人脸以进行人脸识别
5、了解人脸识别的分类过程
三、任务环境
1、jupyter开发环境
2、python3.6
3、tensorflow2.4
四、任务实施过程
(一)、人脸检测
FaceNet 是一种人脸识别系统,由Florian Schroff等人描述。在 Google 的 2015 年论文中,题为“ FaceNet:人脸识别和聚类的统一嵌入”。
这是一个系统,给定一张人脸图片,将从人脸中提取高质量特征并预测这些特征的 128 个元素向量表示,称为人脸嵌入。
本实验中,我们将使用Hiroki Taniai提供的预训练Keras FaceNet 模型。它在MS-Celeb-1M 数据集上进行了训练,具有 160×160 像素的正方形。
与 IMDB 和 MNIST 类似,路透社数据集也内置为 tf.Keras 的一部分。我们查看训练集和测试集数据。下载模型文件并将其放置在./data目录中,文件名为“ facenet_keras.h5 ”
1、使用load_model()函数直接在Keras 中加载模型
import tensorflow as tf
# example of loading the keras facenet model
from tensorflow.keras.models import load_model
tf.compat.v1.logging.set_verbosity('ERROR')
# load the model
model = load_model('./data/facenet_keras.h5')
# summarize input and output shape
print(model.inputs)
print(model.outputs)
[<KerasTensor: shape=(None, 160, 160, 3) dtype=float32 (created by layer 'input_1')>]
[<KerasTensor: shape=(None, 128) dtype=float32 (created by layer 'Bottleneck_BatchNorm')>]
运行示例加载模型并打印输入和输出张量的形状。我们可以看到,该模型确实期望正方形彩色图像作为形状为 160×160 的输入,并将输出人脸嵌入作为 128 个元素的向量。现在我们有了 FaceNet 模型,我们可以探索使用它。
在进行人脸识别之前,我们需要检测人脸。人脸检测是自动定位照片中的人脸并通过在其范围周围绘制边界框来定位它们的过程。
2、我们还将使用多任务级联卷积神经网络 (MTCNN) 进行人脸检测,例如从照片中查找和提取人脸。这是用于人脸检测的最先进的深度学习模型
# demonstrate face detection on 5 Celebrity Faces Dataset
from os import listdir
from PIL import Image
from numpy import asarray
from matplotlib import pyplot
from mtcnn.mtcnn import MTCNN
# extract a single face from a given photograph
def extract_face(filename, required_size=(160, 160)):
# load image from file
image = Image.open(filename)
# convert to RGB, if needed
image = image.convert('RGB')
# convert to array
pixels = asarray(image)
# create the detector, using default weights
detector = MTCNN()
# detect faces in the image
results = detector.detect_faces(pixels)
# extract the bounding box from the first face
x1, y1, width, height = results[0]['box']
# bug fix
x1, y1 = abs(x1), abs(y1)
x2, y2 = x1 + width, y1 + height
# extract the face
face = pixels[y1:y2, x1:x2]
# resize pixels to the model size
image = Image.fromarray(face)
image = image.resize(required_size)
face_array = asarray(image)
return face_array
第一步是将图像加载为 NumPy 数组,我们可以使用 PIL 库和open()函数来实现。我们还将图像转换为 RGB
接下来,我们可以创建一个 MTCNN 人脸检测器类,并使用它来检测加载照片中的所有人脸。
结果是一个边界框列表,其中每个边界框定义了边界框的左下角,以及宽度和高度。我们可以使用这些坐标来提取人脸。
然后我们可以使用 PIL 库将这张人脸的小图像调整为所需的大小;具体来说,该模型需要形状为 160×160 的方形输入。
3、执行人脸检测
数据集是一个包含名人照片的小型数据集。
它包括以下照片:本·阿弗莱克、埃尔顿·约翰、杰瑞·宋飞、麦当娜和明迪·卡灵。
该数据集目录结果如下
# specify folder to plot
folder = './data/train/ben_afflek/'
i = 1
# enumerate files