python的大量面孔识别面部识别
#教程 #开源 #python #computervision

Lots of faces
资料来源:cnn.com

嘿!

曾经想知道计算机如何识别面孔?好吧,如今,由于计算机视觉的惊人进步,它并不像以前那样复杂。像face_rcognition和deepface这样的图书馆使面部识别任务非常简单。您只需几行代码即可轻松识别一两个面(甚至一百个面孔)。但是,正如您可能期望的那样,当您处理大量面孔时,事情会有些棘手。您的面孔越多,花费的时间和精力就越多。

但不要害怕!在本文中,我们将深入研究如何应对这一挑战并在一大堆面孔上进行面部识别。

了解嵌入:

首先,让我们谈论所谓的“嵌入”。将嵌入视为每个脸部的独特签名。这些是描述脸部本质的数字。要使用python的face_rendition图库获取这些嵌入,请按照以下步骤:

import face_recognition

# Load the known image (e.g., Joe Biden's face)
known_image = face_recognition.load_image_file("biden.jpg")
biden_embeddings = face_recognition.face_encodings(known_image)[0]

打印出这些嵌入时,您会看到数字数组,通常长度为128。不同的深度学习模型可能会产生不同长度的嵌入。

计算相似性:

现在,这些嵌入的用途是什么?好吧,他们帮助我们比较面孔。可以说我们还有另一个脸,我们想看看它与乔·拜登的脸有多相似。我们可以为此使用数学措施,例如余弦或欧几里得距离。

在这里您如何计算余弦相似性:

from numpy import dot
from numpy.linalg import norm

def cosine_similarity(list_1, list_2):
  cos_sim = dot(list_1, list_2) / (norm(list_1) * norm(list_2))
  return cos_sim

简单地说,相似性得分越接近1,面孔越相似。因此,如果您的相似性得分为0.86,则可以说这些面孔约为86%。

使用向量数据库:

但是,等等,当您有大量的面孔时,计算每对面的相似性可能会很慢且内存密集。这是向量数据库进行救援的地方。将矢量数据库视为存储和快速检索嵌入的一种明智的方法。

让我们以Chromadb的方式为例。这是如何将其用于面部识别任务:

首先,创建一个集合来存储您的图像:

import chromadb

# Choose where to store the database
client = chromadb.PersistentClient(path)

db = client.get_or_create_collection(
    name='facedb',
    metadata={
        "hnsw:space": 'cosine',
    },
)

现在,您可以将嵌入式添加到数据库中:

db.add(
    ids=['1'],
    embeddings=[embeds],  # Replace with your embeddings
    metadatas=[{'name': 'Joe Biden'}]
)

在数据库中搜索类似面孔:

results = db.query(
    query_embeddings=[unknown_embeddings],  # Replace with your unknown embeddings
    n_results=5
)

结果将告诉您哪些面相似以及它们有多近。

了解距离指标:

我对Chromadb进行了一些不同的距离指标进行了一些实验。想象一下蓝色表明面部匹配的蓝色,红色的意思是它们不

  • 余弦:余弦相似性测量向量之间的角度。

Cosine

  • L2(欧几里得):欧几里得距离测量点之间的直线距离。

Euclidean

使用facedB包:

为了使您的生活更轻松,我将所有这些功能捆绑到一个方便的包装中,称为“ facedB”。您可以使用简单的PIP命令安装它:

pip install facedb

Image description
Source: github.com/ageitgey/face_recognition

在这里如何使用它:

# Import the FaceDB library
from facedb import FaceDB

# Create a FaceDB instance and specify where to store the database
db = FaceDB(
    path="facedata",
)

# Add a new face to the database
face_id = db.add("Joe Biden", img="joe_biden.jpg")

# Recognize a face from a new image
result = db.recognize(img="new_face.jpg")

# Check if the recognized face matches the one in the database
if result and result["id"] == face_id:
    print("Recognized as Joe Biden")
else:
    print("Unknown face")

对于更多用例:

如果您有兴趣探索更多用例并深入研究代码,则可以查看GitHub repository。在那里,您会找到其他示例和资源来帮助您进行面部识别项目。

所以,继续尝试一下!再见,希望您发现此信息对您的面部识别项目有帮助!