首页 > 解决方案 > 如何使用不同的图像提取同一个人的特定特征?

问题描述

我的项目的目的是在手机上提取特定的面部特征。这是一个使用用户面部的验证应用程序。给定同一个人的两张不同图像,提取尽可能接近的特征。

目前,我使用 VGGFace 团队的预训练模型和权重作为特征提取器,您可以在此处下载模型。但是,当我基于模型提取特征时,结果不够好,我将我所做的和我想要的描述如下:

我从 Emma Watson 的图像中提取特征,image_1 返回 feature_1,image2 返回 feature_2,依此类推(向量长度 = 2048)。如果 feature[i] > 0.0,则将其转换为 1。

for i in range(0, 2048): if feature1[0][i] > 0.0: feature1[0][i] = 1

然后,我使用汉明距离比较两个特征向量。汉明距离只是一种比较幼稚的方法,在实际项目中,我会在比较之前对这些特征进行量化。然而,即使我使用 2 张神经面部表情图像,Emma 的 2 张图像之间的距离仍然很大(相同的情绪,不同的情绪类型返回更差的结果)。

我的问题是如何训练模型来提取目标用户的特征。成像,Emma 是目标用户,她的手机只需要提取她的特征。当有人试图解锁 Emma 的手机时,她的手机会提取此人的面部,然后与保存的 Emma 的特征进行比较。另外,我不想训练一个模型来分类 2 类 Emma 而不是 Emma。我需要的是比较提取的特征。

综上所述,如果我们比较同一个人不同图像的特征,距离(差异)应该是“接近”(小)。如果我们比较不同人的不同图像的特征,距离应该是“远”(大)。

非常感谢。

标签: kerasdeep-learningfeature-extractiontraining-datapre-trained-model

解决方案


我会做以下事情:我们想从卷积网络的深层计算特征,最终将新图像与基础图像进行比较。假设这个深层为您提供了特征向量 f。现在,创建一个包含图像对和标签 y 的数据集。比如说,如果两个图像与基本图像是同一个人,则 y = 1,如果它们不同,则 y = 0。然后,计算元素差异并将其输入逻辑回归单元以获得您的 y_hat: y_hat = sigmoid(np.multiply(W, np.sum(abs(f1 - f2)) + b)。您将必须创建一个“Siamese”网络,其中您有两个相同的 ConvNet,一个为您f1提供一张图像,另一个为您提供f2对于来自同一示例对的另一个图像。连体网络需要始终具有准确的权重,因此您需要确保它们的权重始终彼此相同。当你训练这个新网络时,你应该得到想要的结果。


推荐阅读