【问题标题】:Facial identification using difference of L2 distances使用 L2 距离差异进行面部识别
【发布时间】:2019-12-15 22:41:46
【问题描述】:

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

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

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

【问题讨论】:

  • 它会相当简单吧?您为嵌入之间的距离(通常是余弦距离)设置阈值范围,如果它在阈值范围内,则它相同,如果超出阈值,则它们相距甚远且不同。
  • 是的,但它是否像所有嵌入的每个元素一样?在技​​术层面上如何计算距离?在使用这种架构训练系统期间,距离看起来几乎是任意的。一些嵌入,即使它们是正锚,也可能是正确的?所以权重被优化以使正数更接近?
  • 我想让你尝试一下,获取一组具有相似和不同面孔的样本图像的所有嵌入(例如一个 numpy 数组),计算叉积,即一个与所有余弦距离的嵌入。看看结果吧,可能会让你更好的理解。到目前为止,在我的例子中,我计算了嵌入并取余弦距离,得到了相当准确的结果。
  • 我会去的!我会在弄清楚这一点后立即报告并在答案中发布结果。我会问我是否对任何技术感到困惑
  • 等等,我该怎么做呢?我是否将 FaceNet 嵌入初始化为一个变量,然后使用这些变量计算余弦损失?

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


【解决方案1】:

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

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]]

【讨论】:

    猜你喜欢
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    • 2022-11-17
    • 1970-01-01
    • 2020-07-28
    • 2022-06-16
    相关资源
    最近更新 更多