资料来源: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进行了一些不同的距离指标进行了一些实验。想象一下蓝色表明面部匹配的蓝色,红色的意思是它们不
- 余弦:余弦相似性测量向量之间的角度。
- L2(欧几里得):欧几里得距离测量点之间的直线距离。
使用facedB包:
为了使您的生活更轻松,我将所有这些功能捆绑到一个方便的包装中,称为“ facedB”。您可以使用简单的PIP命令安装它:
pip install facedb
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。在那里,您会找到其他示例和资源来帮助您进行面部识别项目。
所以,继续尝试一下!再见,希望您发现此信息对您的面部识别项目有帮助!