利用L2距离的差异进行面部识别

时间:2019-12-15 22:41:46

标签: python machine-learning computer-vision euclidean-distance facial-identification

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

我的问题是:我可以使用这种嵌入计算出三重态损失吗?如果是这样,怎么做?我要减去与另一个相对应的元素吗?

    arr = [] #supposed new embedding after difference is calculated
    for i in range(0,128):
       j = b[i] - a[i]
       arr.append[j]

这是怎么做的,我可以以此来进行面部识别吗?

如果此处不合适,请将其移至正确的论坛。

1 个答案:

答案 0 :(得分:0)

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

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

obamaface2trumpface1进行比较的结果是:[[0.9417696]]trumpface1trumpface2[[0.9754221]]