0基础如何进行人脸识别?DeepFace可以做到

通常,检测人脸是你通常执行的第一步,接着是人脸识别。人脸识别是一个过程,其中你将数字图像或视频帧中的人脸与一个人脸数据库进行匹配。有几个深度学习模型可以用于进行人脸识别,但所有这些都要求你具备一些神经网络的知识,而且你还需要使用自己的数据集对它们进行训练。对于那些想要进行人脸识别但不想深入了解神经网络工作原理的人来说,有一个真正简化人脸识别的API — DeepFace。

什么是DeepFace?

DeepFace是一个基于 Python 的轻量级人脸识别和面部属性分析(年龄、性别、情感和种族)框架(API)。它本质上是一个用于识别人脸的先进模型的包装器。它可以使用以下预训练模型:

  • VGG-Face(默认)

  • Google FaceNet

  • OpenFace

  • Facebook DeepFace

  • DeepID

  • ArcFace

  • Dlib

  • SFace

简而言之,DeepFace允许你使用预训练模型来识别自己的一组人脸,而无需创建和训练自己的模型。本文中,我将介绍一些DeepFace的酷炫功能以及如何将人脸识别整合到你自己的项目中。

人脸检测/识别的伦理考虑

虽然识别人脸的能力确实很酷,但它肯定涉及很多伦理问题。在将面部识别应用于项目之前,有几个问题需要注意。这些问题包括隐私(人脸检测可以用于未经同意追踪人的动向)、偏见(人脸识别可能对不同种族、性别或年龄的个体存在偏见)和滥用(捕捉到的面部可能被用于其他非法用途或恶意目的)。因此,尽管本文关注人脸识别的技术能力,但在将其应用于工作中之前,你应该仔细考虑其道德和伦理影响。以下是一些可以实施人脸识别的低风险项目:

  • 考勤跟踪 — 你可以在学校或工作场所使用人脸识别来进行考勤。

  • 个性化 — 使用人脸识别来个性化服务。一个很好的例子是在娱乐服务中,根据用户的观看历史推荐特定的电视节目。- 安全 — 使用人脸识别来解锁非关键系统,如智能手机和计算机。

然而,在某些应用中使用人脸识别具有严重的道德影响。以下是一些例子:

  • 执法 — 虽然人脸识别对执法有用,但对其准确性和偏见存在一些严重的担忧。

  • 监视 — 一些国家使用人脸识别技术监视和追踪其公民,尤其是持不同政见者。一些公司还使用人脸识别来监视员工的生产力,这直接侵犯了他们的隐私。

安装DeepFace

安装DeepFace相对较简单,如果你使用的是Mac。对于Windows,需要进行一些额外的工作。我将为你介绍在macOS和Windows上安装DeepFace的步骤。

  • 对于macOS

对于macOS,只需在Jupyter Notebook中运行以下命令来安装cmake、dlib,然后安装deepface:

!pip install cmake
!pip install dlib
!pip install deepface
  • 对于Windows

对于Windows,你需要执行以下一系列步骤:

  1. 从https://cmake.org/download/下载CMake并运行安装程序。

  2. 在安装过程中确保将其bin路径添加到环境变量中,例如:C:/ProgramFiles/cmake/bin。

  3. 从https://visualstudio.microsoft.com/visual-cpp-build-tools/下载Visual Studio Build Tools并运行安装程序。

  4. 选中C++构建工具并点击安装:

0基础如何进行人脸识别?DeepFace可以做到_第1张图片

5. 最后,在Jupyter Notebook中运行以下命令:

!pip install dlib
!pip install deepface

使用DeepFace

要使用DeepFace,先导入它:

from deepface import DeepFace

准备图片

我将下载并准备一些图片,以便可以用DeepFace进行测试。首先,下载以下基努·里维斯(Keanu Reeves)的图片,并将其保存到与你的Jupyter Notebook相同的目录中:

0基础如何进行人脸识别?DeepFace可以做到_第2张图片

然后,创建一个名为`image1`的变量,并将其赋值为图片的文件名:

image1 = 'Keanu_Reeves_(crop_and_levels)_(cropped).jpg'

同样,对以下图片也执行相同的操作:

0基础如何进行人脸识别?DeepFace可以做到_第3张图片

image2 = 'Reunião_com_o_ator_norte-americano_Keanu_Reeves_(46806576944)_(cropped).jpg'

0基础如何进行人脸识别?DeepFace可以做到_第4张图片

image3 = 'Jet_Li_2009_(cropped).jpg'

0基础如何进行人脸识别?DeepFace可以做到_第5张图片

image4 = 'Denzel_Washington_2018.jpg'

0基础如何进行人脸识别?DeepFace可以做到_第6张图片

image5 = 'Smiling_girl.jpg'

比较人脸

现在让我们使用DeepFace来比较两张图片,看看它们是否包含相同人物的面孔。为此,你可以使用`verify()`函数:

DeepFace.verify(img1_path = image1,  # Keanu Reeves
                img2_path = image2)  # Keanu Reeves

第一次运行DeepFace时,它会下载预训练模型的权重(默认情况下使用VGG-Face模型)到你的计算机上:

0基础如何进行人脸识别?DeepFace可以做到_第7张图片

一旦权重下载完成,DeepFace将返回一个类似于以下结果的结果:

{'verified': True,
 'distance': 0.17842618501190277,
 'threshold': 0.4,
 'model': 'VGG-Face',
 'detector_backend': 'opencv',
 'similarity_metric': 'cosine',
 'facial_areas': {'img1': {'x': 42, 'y': 61, 'w': 144, 'h': 144},
  'img2': {'x': 73, 'y': 57, 'w': 103, 'h': 103}},
 'time': 0.27}

`verified`键的值指示两个面孔是否相同。`distance`键的值是两个面孔向量之间的距离(值越小,两个面孔越相似)。`threshold`键的值设置了距离值的阈值 — 小于0.4的值将导致`verified`键被设置为True。`facial_areas`键包含了两个图像中人脸的位置。

让我们尝试比较另外两张图片 — image1和image3:

DeepFace.verify(img1_path = image1,   # Keanu Reeves
                img2_path = image3)   # Jet Li

毫不奇怪,DeepFace检测到这两张脸是不同的:

{'verified': False,
 'distance': 0.4034869302977028,
 'threshold': 0.4,
 'model': 'VGG-Face',
 'detector_backend': 'opencv',
 'similarity_metric': 'cosine',
 'facial_areas': {'img1': {'x': 42, 'y': 61, 'w': 144, 'h': 144},
  'img2': {'x': 20, 'y': 49, 'w': 164, 'h': 164}},
 'time': 0.27}

embedding

embedding是表示面部图像的多维向量。DeepFace允许你使用`represent()`函数找到嵌入:

embeddings = DeepFace.represent(img_path = image1)  # Keanu Reeves
embeddings

image1的embedding如下:

[{'embedding': [0.00948819238692522,
   -0.010876820422708988,
   -0.0013923903461545706,
   0.01534500066190958,
   ...
   -0.014694824814796448,
   -0.015208861790597439,
   0.005312952678650618,
   ...],
  'facial_area': {'x': 42, 'y': 61, 'w': 144, 'h': 144}}]

根据你在DeepFace中使用的预训练模型,`embedding`键的值的大小会有所不同。对于VGG-Face,面部图像被表示为一个2622维的向量。更有趣的是`facial_area`键的值,其中包含了图像中检测到的面部的位置。

以下代码片段显示了image1的图像以及围绕检测到的面孔区域绘制的矩形:

import matplotlib.pyplot as plt
import matplotlib.patches as patches
from PIL import Image


im = Image.open(image1)
fig, ax = plt.subplots()


# display the image
ax.imshow(im)


# draw a rectangle around the face
face_coord = embeddings[0]['facial_area']
rect = patches.Rectangle((face_coord['x'], face_coord['y']), 
                         face_coord['w'], face_coord['h'], 
                         linewidth = 2, 
                         edgecolor = 'r', 
                         facecolor = 'none')


# add the patch to the axes
ax.add_patch(rect)

0基础如何进行人脸识别?DeepFace可以做到_第8张图片

寻找文件夹中的面孔

DeepFace最令人兴奋的功能之一可能是它可以让你拿一张图片与位于文件夹中的一组图像进行比较。然后,DeepFace将告诉你哪些图像与你提供的图像最相似。这本质上就是人脸识别。为了看到这一功能有多强大,我在与Jupyter Notebook相同的文件夹中创建了一个名为Faces的新文件夹,并用一些Jet Li和基努·里维斯的图片填充了它:

0基础如何进行人脸识别?DeepFace可以做到_第9张图片

然后,调用`find()`函数并传递给它`image1`:

DeepFace.find(img_path = image1,    # the image to compare against
              db_path = "Faces",    # folder containing all the images
              enforce_detection = False)[0]

如果`find()`函数发现Faces文件夹中的某个图像不包含任何面孔,它将引发一个异常。为了防止这种情况发生,将`enforce_detection`参数设置为`False`。`find()`函数返回一个Pandas DataFrames的列表,因此你需要使用索引0来检索第一个DataFrame:

0基础如何进行人脸识别?DeepFace可以做到_第10张图片

DataFrame包含一个最接近你搜索的图像的图像文件名列表。在这个例子中,最匹配的是`KeanuReeves_3.jpg`:

0基础如何进行人脸识别?DeepFace可以做到_第11张图片

DataFrame根据`VGG-Face_cosine`进行排序(值越小,匹配越接近)。

请注意,当你第一次调用`find()`函数时,将在Faces文件夹中创建并存储一个名为`representations_vgg_face.pkl`的表示文件。如果要向Faces文件夹添加新图像,请记得删除`representations_vgg_face.pkl`文件。使用`find()`函数,你基本上可以执行人脸识别而无需训练任何模型 — 只需创建一个包含你想要识别的人脸的文件夹(每个个体应尽可能有更多的图像),然后你就拥有了一个人脸识别模型!

分析面孔

除了比较面孔和从面孔文件夹中找到面孔之外,DeepFace还允许你分析面孔的各种特征,如年龄、性别、情感和种族:

DeepFace.analyze(img_path=image4, 
                 actions=["age", "gender", "emotion", "race"])

上述语句分析了丹泽尔·华盛顿的图像(`image4`),并相当准确地预测该图像中的面孔:

  • 感觉悲伤

  • 一个黑人男性

以下是`analyze()`函数返回的结果:

[{'age': 35,
  'region': {'x': 31, 'y': 46, 'w': 117, 'h': 117},
  'gender': {'Woman': 0.015357557276729494, 'Man': 99.98464584350586},
  'dominant_gender': 'Man',
  'emotion': {'angry': 0.3038950626725033,
   'disgust': 3.667220231060474e-11,
   'fear': 2.3939014472247897,
   'happy': 1.2440780556642484e-05,
   'sad': 87.49081939349405,
   'surprise': 6.846103949403675e-05,
   'neutral': 9.81130493418037},
  'dominant_emotion': 'sad',
  'race': {'asian': 7.334453304675418,
   'indian': 3.1661530981155095,
   'black': 85.50387534522267,
   'white': 0.09932484836949994,
   'middle eastern': 0.03912873741168454,
   'latino hispanic': 3.8570622418559934},
  'dominant_race': 'black'}]

让我们尝试分析另一张图像,这次使用一个微笑的女孩的图像(`image5`):

DeepFace.analyze(img_path=image5, 
                 actions=["age", "gender", "emotion", "race"])

结果非常准确:

[{'age': 26,
  'region': {'x': 377, 'y': 140, 'w': 558, 'h': 558},
  'gender': {'Woman': 99.66641068458557, 'Man': 0.3335847519338131},
  'dominant_gender': 'Woman',
  'emotion': {'angry': 1.31229280062393e-10,
   'disgust': 2.1887400676449618e-26,
   'fear': 3.8267408134914985e-22,
   'happy': 99.99999403953517,
   'sad': 2.6514247764822096e-14,
   'surprise': 2.245952144279152e-17,
   'neutral': 6.961274993922523e-06},
  'dominant_emotion': 'happy',
  'race': {'asian': 3.0054475969609733,
   'indian': 4.536693711482729,
   'black': 0.7851633247927815,
   'white': 41.17996289491211,
   'middle eastern': 23.323961892600284,
   'latino hispanic': 27.168768902870287},
  'dominant_race': 'white'}]

更改预训练模型

如果要更改DeepFace使用的底层预训练模型,可以在`verify()`函数中使用`model_name`参数指定要使用的模型:

models = ["VGG-Face", "Facenet", "OpenFace", "DeepFace", "ArcFace"]
DeepFace.verify(image1, 
                image2, 
                model_name = models[1])  # change to Facenet

所选模型的权重现在将下载到你的计算机上。

对于`represent()`函数也是一样的:

embeddings = DeepFace.represent(img_path=image1,
                                model_name=models[1])

以及`find()`函数:

DeepFace.find(img_path=image1, 
              db_path="Faces",
              model_name=models[1],
              enforce_detection=False)[0]

使用DeepFace使得进行人脸识别变得非常简单 — 无需明确训练,你只需要将面部图像放入特定的文件夹,DeepFace将完成识别特定面孔的繁重工作。DeepFace的缺点是返回结果需要一些时间。如果你想在实时人脸识别中使用DeepFace,它可能不是最佳选择。然而,仍然有很多应用可以使用DeepFace构建。

·  END  ·

HAPPY LIFE

0基础如何进行人脸识别?DeepFace可以做到_第12张图片

本文仅供学习交流使用,如有侵权请联系作者删除

你可能感兴趣的:(0基础如何进行人脸识别?DeepFace可以做到)