在这个场景中,当为同一个人存储多个人脸编码时,如何查找人脸编码之间的距离。。。(Python)

在这个场景中,当为同一个人存储多个人脸编码时,如何查找人脸编码之间的距离。。。(Python),python,opencv,neural-network,artificial-intelligence,face-recognition,Python,Opencv,Neural Network,Artificial Intelligence,Face Recognition,我正在进行一项基于面部识别和验证的项目。 Iam使用暹罗网络获得人脸的128个向量(嵌入) I正在数据库中存储人脸的编码/嵌入,然后检查或说将传入人脸的编码与先前存储的编码匹配以识别此人 为了创建一个健壮的系统,我必须存储同一个人的多个编码。 当我只使用了一个编码向量,并且匹配了: 人脸识别。比较人脸(存储的编码列表,检查图像编码) 这并不总是有效,因为我只比较了单一编码。 为了使系统能够满足大多数情况,我想存储同一个人的至少3种编码,然后与新数据进行比较 现在的问题是: 如何存储同一个人的多个

正在进行一项基于面部识别和验证的项目。 Iam使用暹罗网络获得人脸的128个向量(嵌入)

I正在数据库中存储人脸的编码/嵌入,然后检查或说将传入人脸的编码与先前存储的编码匹配以识别此人

为了创建一个健壮的系统,我必须存储同一个人的多个编码。 当我只使用了一个编码向量,并且匹配了:

人脸识别。比较人脸(存储的编码列表,检查图像编码)

这并不总是有效,因为我只比较了单一编码。 为了使系统能够满足大多数情况,我想存储同一个人的至少3种编码,然后与新数据进行比较

现在的问题是:

如何存储同一个人的多个嵌入,然后比较距离

请帮我做这个


(使用face_recognition作为库和暹罗网络进行特征提取)

为了获得每个人物图像的编码,您可以使用face_recognition库的face_编码功能,然后通过比较这些编码之间的距离,您可以以自己的方式改进您的系统

例如:

encoding_1 = face_recognition.face_encodings(img_1)
encoding_2 = face_recognition.face_encodings(img_2)
encoding_3 = face_recognition.face_encodings(img_3)

encodings = [encoding_1,encoding_2,encoding3]

new_encoding = face_recognition.face_encodings(new_image)

for encoding in encodings:
    #to look at distance between two encoding vector, you can use numpy linear algebra functions (you can also use other distance metrics)
    distance = np.linalg.norm(new_encoding - encoding)
    
    if distance < threshold:
        return True
encoding_1=人脸识别。人脸编码(img_1)
encoding_2=人脸识别。人脸编码(img_2)
编码\u 3=人脸识别。人脸编码(img\u 3)
编码=[编码1,编码2,编码3]
新编码=人脸识别。人脸编码(新图像)
对于编码中的编码:
#要查看两个编码向量之间的距离,可以使用numpy线性代数函数(也可以使用其他距离度量)
距离=np.linalg.norm(新编码-编码)
如果距离<阈值:
返回真值

为了获得每个人物图像的编码,您可以使用人脸识别库的人脸编码功能,然后通过比较这些编码之间的距离,您可以以自己的方式改进您的系统

例如:

encoding_1 = face_recognition.face_encodings(img_1)
encoding_2 = face_recognition.face_encodings(img_2)
encoding_3 = face_recognition.face_encodings(img_3)

encodings = [encoding_1,encoding_2,encoding3]

new_encoding = face_recognition.face_encodings(new_image)

for encoding in encodings:
    #to look at distance between two encoding vector, you can use numpy linear algebra functions (you can also use other distance metrics)
    distance = np.linalg.norm(new_encoding - encoding)
    
    if distance < threshold:
        return True
encoding_1=人脸识别。人脸编码(img_1)
encoding_2=人脸识别。人脸编码(img_2)
编码\u 3=人脸识别。人脸编码(img\u 3)
编码=[编码1,编码2,编码3]
新编码=人脸识别。人脸编码(新图像)
对于编码中的编码:
#要查看两个编码向量之间的距离,可以使用numpy线性代数函数(也可以使用其他距离度量)
距离=np.linalg.norm(新编码-编码)
如果距离<阈值:
返回真值
如何比较每个人的多张脸 假设您的数据库看起来像:

face_table {
    'person_name' : String,
    'embedding' : Array of 128 floats,
    'other_data' : Something,
    ...
}
你有一个功能

face_recognition.compare_faces(encoding_list, reference_encoding)
它返回
编码列表
的每个元素的概率分数,以及它与
参考编码
的匹配程度

你的主循环做了如下的事情

name_list, encoding_list = zip(query_database_for_encodings())
results = face_recognition.compare_faces(encoding_list, reference_encoding)
best = np.argmax(results)
return name_list[best]
解决方案1-添加记录 在这个解决方案中,您可以简单地为同一个人向数据库添加多个记录

{ # record 1
    'person_name' : 'Alice',
    'embedding' : Array of 128 floats,
    'photo_number' : 1
}
{ # record 2
    'person_name' : 'Alice',
    'embedding' : Array of 128 floats,
    'photo_number' : 2
}
{ # record 3
    'person_name' : 'Bob',
    'embedding' : Array of 128 floats,
    'photo_number' : 1
}
等等,每个人都有多个记录

解决方案2-存储一个嵌入数组 在这个解决方案中,每个人在数据库中都有一个嵌入数组,如下所示

face_table {
    'person_name' : String,
    'embedding_list' : Array of (Array of 128 floats),
    'other_data' : Something,
    ...
}
而你的另一个主循环代码可能会改变来处理它

records = query_database_returning_dictionary_results()

def generate_name_embedding_pairs(records):
    for record in records:
        name = record['person_name']
        for encoding_list in record['embedding_list']:
            yield name, encoding_list

name_list, encoding_list = zip(list(generate_name_embedding_pairs(records)))
results = face_recognition.compare_faces(encoding_list, reference_encoding)
best = np.argmax(results)
return name_list[best]
如何比较每个人的多张脸 假设您的数据库看起来像:

face_table {
    'person_name' : String,
    'embedding' : Array of 128 floats,
    'other_data' : Something,
    ...
}
你有一个功能

face_recognition.compare_faces(encoding_list, reference_encoding)
它返回
编码列表
的每个元素的概率分数,以及它与
参考编码
的匹配程度

你的主循环做了如下的事情

name_list, encoding_list = zip(query_database_for_encodings())
results = face_recognition.compare_faces(encoding_list, reference_encoding)
best = np.argmax(results)
return name_list[best]
解决方案1-添加记录 在这个解决方案中,您可以简单地为同一个人向数据库添加多个记录

{ # record 1
    'person_name' : 'Alice',
    'embedding' : Array of 128 floats,
    'photo_number' : 1
}
{ # record 2
    'person_name' : 'Alice',
    'embedding' : Array of 128 floats,
    'photo_number' : 2
}
{ # record 3
    'person_name' : 'Bob',
    'embedding' : Array of 128 floats,
    'photo_number' : 1
}
等等,每个人都有多个记录

解决方案2-存储一个嵌入数组 在这个解决方案中,每个人在数据库中都有一个嵌入数组,如下所示

face_table {
    'person_name' : String,
    'embedding_list' : Array of (Array of 128 floats),
    'other_data' : Something,
    ...
}
而你的另一个主循环代码可能会改变来处理它

records = query_database_returning_dictionary_results()

def generate_name_embedding_pairs(records):
    for record in records:
        name = record['person_name']
        for encoding_list in record['embedding_list']:
            yield name, encoding_list

name_list, encoding_list = zip(list(generate_name_embedding_pairs(records)))
results = face_recognition.compare_faces(encoding_list, reference_encoding)
best = np.argmax(results)
return name_list[best]

您的图像源集是否有限?我的意思是,你真的有同一个人的3个稍微不同的姿势/脸吗?那么嵌入通常是正确的。否则,您可以将单个源面扩大到某种透视变换(不太大的变形)并生成嵌入,并确保距离(余弦距离)在阈值中,以使其成为同一个面。您的源图像集有限吗?我的意思是,你真的有同一个人的3个稍微不同的姿势/脸吗?那么嵌入通常是正确的。否则,您可以将单个源面扩大到某种透视变换(不太大的变形)并生成嵌入,并确保距离(余弦距离)在阈值中,以使其成为同一个面。