65.9K
CodeProject 正在变化。 阅读更多。
Home

为边缘 AI 面部识别创建人脸数据库

2021年7月22日

CPOL

4分钟阅读

viewsIcon

11315

downloadIcon

788

在本文中,我们将解释如何创建一个简单的人脸识别数据库。

引言

人脸识别是人工智能 (AI) 的一个领域,过去十年深度学习 (DL) 在该领域取得了巨大成功。 最好的人脸识别系统可以像人类一样精确地识别图像和视频中的人物,甚至更好。 人脸识别的两个主要基础阶段是人物验证和身份识别。

在本系列文章的第一个(当前)部分,我们将

  • 讨论现有的人脸检测AI方法,并开发一个程序来运行预训练的DNN模型
  • 考虑人脸对齐,并使用人脸标志点实现一些对齐算法
  • 在树莓派设备上运行人脸检测DNN,探索其性能,并考虑可能的加速运行方法,以及实时检测人脸
  • 创建一个简单的人脸数据库,并用从图像或视频中提取的人脸填充它

我们假设您熟悉 DNN、Python、Keras 和 TensorFlow。 欢迎您下载此项目代码...

在之前的文章中,我们已经改进了我们的 AI 人脸检测器,使其能够在边缘设备上以接近实时的模式运行。 在本文中,我们将讨论我们识别系统的另一个组件——人脸数据库。

数据库中的内容

首先要问的问题是,我们到底必须将什么保存到数据库中。 一般来说,我们必须在数据库中存储人的标识符——比如他们的姓名——以及他们的面部特征,我们可以将这些特征与另一张脸的特征进行比较,以评估相似程度。 在大多数真实的人脸识别系统中,人脸特征被称为嵌入(embeddings)。 这些嵌入是从带有 DNN 模型的人脸图像中提取的。

为了使我们的系统通用且简单,我们将使用非常简单的数据库结构。 它将由一个文件夹表示,其中包含 PNG 格式的人脸图像,每个人对应一个图像。 文件将以人的标识符(姓名)命名。 每个人的图像都将包含从图片中提取的对齐的面部。 当我们使用数据库进行人脸识别时,我们将动态提取嵌入。 我们可以将同一个数据库与不同的 DNN 模型一起使用。

创建数据库

让我们创建我们的数据库。 我们有两种获取人脸数据的方法:从视频和从图像。 我们已经有从视频中提取人脸数据的代码。 我们可以按如下方式运行我们的人脸检测器

d = MTCNN_Detector(50, 0.95)
vd = VideoFD(d)
v_file = r"C:\PI_FR\video\5_3.mp4"

save_path = r"C:\PI_FR\detect"
(f_count, fps) = vd.detect(v_file, save_path, True, False)

print("Face detections: "+str(f_count))
print("FPS: "+str(fps))

请注意,save_path 参数的值是存储所有提取的人脸的文件夹。 align 参数为 True,因为面部必须对齐; draw_keypoints 参数为 False,因为我们不想存储面部地标。

当过程完成时,我们可以为我们想要添加到数据库中的每个人选择特定的人脸样本。 这是为五个人提供的样本,从五个测试视频中提取,我们已将其保存到我们的数据库中。

我们有意未将视频文件中出现的某些人添加到数据库中。 这些将用于在视频中识别未知人类时测试识别模型

填充数据库

让我们编写 Python 代码,该代码将从图像中提取人脸并将它们添加到我们的数据库中

from matplotlib import pyplot as plt

fa = Face_Align_Mouth(160)

db_path = r"C:\PI_FR\db"
align = True

p_name = "Woman05"
f_file = r"C:\PI_FR\faces\CF0055_1100_00F.jpg"

fimg = cv2.imread(f_file, cv2.IMREAD_UNCHANGED)
faces = d.detect(fimg)

r_file = os.path.join(db_path, p_name+".png")

face = faces[0]
if align:
    (f_cropped, f_img) = fa.align(fimg, face)
else:
    (f_cropped, f_img) = d.extract(fimg, face)
    
if (not (f_img is None)) and (not f_img.size==0):
    cv2.imwrite(r_file, f_img)
    plt.imshow(f_img)
    print(p_name+" appended to Face DB.")
else:
    print("Wrong image.")

使用上面的代码,我们可以使用人物的照片轻松地将人脸样本添加到数据库中。

为了使我们的数据库便于测试所有的人脸识别场景,我们必须向其中添加一些未出现在测试视频文件中的人脸。 我们可以从其他视频中提取这些面孔。 但在这里我们将偷工减料并从免费人脸数据库借用人脸。

我们从多个来源收集了一些人脸,并将它们放在图像档案中。 然后,我们在该档案上运行我们的人脸提取代码。

这会将十个人脸样本添加到我们的数据库中。 因此,我们在数据库中总共有十五个人。

我们将新的人命名为“Man01, …, Woman05”,以将它们与已知的人——出现在测试视频中的人区分开来。 欢迎您下载数据库样本

后续步骤

现在我们已经准备好人脸识别应用程序的所有组件。 在本系列的后半部分中,我们将选择一个人脸识别 DNN 模型,并开发用于针对视频馈送运行此模型的代码。

© . All rights reserved.