python - 使用 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]
这是如何完成的,我可以用它进行面部识别吗?
如果此处不合适,请将此移至正确的论坛。
解决方案
我回来了,这就是我想出的。这有点令人困惑,因为似乎没有太大区别。我用了两张特朗普和奥巴马的照片。计算余弦相似度没有任何意义。也许我做错了什么?
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 trumpface1
to trumpface2
was[[0.9754221]]