一段时间以来,我对此有些困惑。当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]
这是怎么做的,我可以以此来进行面部识别吗?
如果此处不合适,请将其移至正确的论坛。
答案 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
将obamaface2
与trumpface1
进行比较的结果是:[[0.9417696]]
而trumpface1
与trumpface2
是[[0.9754221]]