首页 > 解决方案 > 使用 L2 距离差异进行面部识别

问题描述

一段时间以来,我对此感到有些困惑。当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]

这是如何完成的,我可以用它进行面部识别吗?

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

标签: pythonmachine-learningcomputer-visioneuclidean-distancefacial-identification

解决方案


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

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]]while trumpface1to trumpface2was[[0.9754221]]


推荐阅读