Python 基于L2距离差的人脸识别

Python 基于L2距离差的人脸识别,python,machine-learning,computer-vision,euclidean-distance,facial-identification,Python,Machine Learning,Computer Vision,Euclidean Distance,Facial Identification,我对这件事有些困惑已经有一段时间了。当在图像上运行时,它返回一个欧几里德空间/L2中的128元素数组(即使这是我不完全理解的)。我有一个想法,也许这个嵌入可以用来预测三重态丢失的人脸 我的问题是:我能用这个嵌入来计算像三重态损耗这样的东西吗?如果是的话,是如何做到的?我是否要减去与另一个元素对应的元素,如: arr = [] #supposed new embedding after difference is calculated for i in range(0,128):

我对这件事有些困惑已经有一段时间了。当在图像上运行时,它返回一个欧几里德空间/L2中的128元素数组(即使这是我不完全理解的)。我有一个想法,也许这个嵌入可以用来预测三重态丢失的人脸

我的问题是:我能用这个嵌入来计算像三重态损耗这样的东西吗?如果是的话,是如何做到的?我是否要减去与另一个元素对应的元素,如:

    arr = [] #supposed new embedding after difference is calculated
    for i in range(0,128):
       j = b[i] - a[i]
       arr.append[j]
是这样做的吗?我能用这个做面部识别吗


如果这里不合适,请将此移到正确的论坛。

我回来了,下面是我的想法。这有点令人困惑,因为两者似乎没有太大区别。我用了两张特朗普和奥巴马的照片。计算余弦相似性并没有显示任何重要的意义。也许我做错了什么

import PIL
from PIL import Image   

import tensorflow as tf
import numpy as np
from tensorflow import keras
from tensorflow.keras.models import load_model
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.preprocessing.image import img_to_array

from sklearn.metrics.pairwise import cosine_similarity

#load model and compile
facenet = load_model('facenet_keras.h5', compile='False')
facenet.compile(optimizer='adam', loss='categorical_crossentropy',metrics=['accuracy'])

def dist(a,b):
    #prepare image for FaceNet
    a,b = Image.open(a), Image.open(b)
    a,b = np.array(a), np.array(b)
    a,b = Image.fromarray(a), Image.fromarray(b)
    a,b = a.resize((160,160)), b.resize((160,160))
    a,b = img_to_array(a), img_to_array(b)
    a = a.reshape((1,a.shape[0], a.shape[1], a.shape[2]))
    b = b.reshape((1,b.shape[0], b.shape[1], b.shape[2]))

    #get FaceNet embedding vector
    a, b = facenet.predict(a), facenet.predict(b)

    #compute distance metric
    print((cosine_similarity(a, b)))


dist("obamaface2.jpg", "trumpface1.jpg") #images cropped to face

obamaface2
trumpface1
进行比较的结果是:
[[0.9417696]
,而
trumpface1
trumpface2
[[0.9754221]
我回来了,下面是我想到的。这有点令人困惑,因为两者似乎没有太大区别。我用了两张特朗普和奥巴马的照片。计算余弦相似性并没有显示任何重要的意义。也许我做错了什么

import PIL
from PIL import Image   

import tensorflow as tf
import numpy as np
from tensorflow import keras
from tensorflow.keras.models import load_model
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.preprocessing.image import img_to_array

from sklearn.metrics.pairwise import cosine_similarity

#load model and compile
facenet = load_model('facenet_keras.h5', compile='False')
facenet.compile(optimizer='adam', loss='categorical_crossentropy',metrics=['accuracy'])

def dist(a,b):
    #prepare image for FaceNet
    a,b = Image.open(a), Image.open(b)
    a,b = np.array(a), np.array(b)
    a,b = Image.fromarray(a), Image.fromarray(b)
    a,b = a.resize((160,160)), b.resize((160,160))
    a,b = img_to_array(a), img_to_array(b)
    a = a.reshape((1,a.shape[0], a.shape[1], a.shape[2]))
    b = b.reshape((1,b.shape[0], b.shape[1], b.shape[2]))

    #get FaceNet embedding vector
    a, b = facenet.predict(a), facenet.predict(b)

    #compute distance metric
    print((cosine_similarity(a, b)))


dist("obamaface2.jpg", "trumpface1.jpg") #images cropped to face

obamaface2
trumpface1
进行比较的结果是:
[[0.9417696]
,而
trumpface1
trumpface2
进行比较的结果是
[[0.9754221]]
,这将相当简单,对吗?您为嵌入之间的距离(通常为余弦距离)设置阈值范围,如果它在阈值范围内,则其相同,如果它超出阈值,则它们相距很远且不同。是的,但对于所有嵌入的每个元素都是一样的吗?如何在技术层面上计算距离?在使用此体系结构的系统培训期间,距离几乎是任意的。一些嵌入,即使它们是积极的锚定,可能是非常正确的?因此,对权重进行了优化,使其更接近正数?我希望您尝试一下,获取具有相似和不相似面的图像样本集的所有嵌入(例如numpy阵列),计算嵌入的叉积,即一对所有余弦距离。看看结果吧,也许这会让你更好的理解。到目前为止,在我的例子中,我计算了嵌入并采用了余弦距离,这已经给出了相当准确的结果。我会开始的!我一弄明白这一点就会报告,并在回答中公布结果。我会问我是否对技术上的问题感到困惑等等,我该怎么做?我是否要初始化FaceNet嵌入到一个变量中,然后用这些变量计算余弦损失?这将相当简单,对吗?您为嵌入之间的距离(通常为余弦距离)设置阈值范围,如果它在阈值范围内,则其相同,如果它超出阈值,则它们相距很远且不同。是的,但对于所有嵌入的每个元素都是一样的吗?如何在技术层面上计算距离?在使用此体系结构的系统培训期间,距离几乎是任意的。一些嵌入,即使它们是积极的锚定,可能是非常正确的?因此,对权重进行了优化,使其更接近正数?我希望您尝试一下,获取具有相似和不相似面的图像样本集的所有嵌入(例如numpy阵列),计算嵌入的叉积,即一对所有余弦距离。看看结果吧,也许这会让你更好的理解。到目前为止,在我的例子中,我计算了嵌入并采用了余弦距离,这已经给出了相当准确的结果。我会开始的!我一弄明白这一点就会报告,并在回答中公布结果。我会问我是否对技术上的问题感到困惑等等,我该怎么做?我是否初始化FaceNet嵌入到变量中,然后用这些变量计算余弦损失?