keras - 如何使用不同的图像提取同一个人的特定特征?
问题描述
我的项目的目的是在手机上提取特定的面部特征。这是一个使用用户面部的验证应用程序。给定同一个人的两张不同图像,提取尽可能接近的特征。
目前,我使用 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。我需要的是比较提取的特征。
综上所述,如果我们比较同一个人不同图像的特征,距离(差异)应该是“接近”(小)。如果我们比较不同人的不同图像的特征,距离应该是“远”(大)。
非常感谢。
解决方案
我会做以下事情:我们想从卷积网络的深层计算特征,最终将新图像与基础图像进行比较。假设这个深层为您提供了特征向量 f。现在,创建一个包含图像对和标签 y 的数据集。比如说,如果两个图像与基本图像是同一个人,则 y = 1,如果它们不同,则 y = 0。然后,计算元素差异并将其输入逻辑回归单元以获得您的 y_hat: y_hat = sigmoid(np.multiply(W, np.sum(abs(f1 - f2)) + b)
。您将必须创建一个“Siamese”网络,其中您有两个相同的 ConvNet,一个为您f1
提供一张图像,另一个为您提供f2
对于来自同一示例对的另一个图像。连体网络需要始终具有准确的权重,因此您需要确保它们的权重始终彼此相同。当你训练这个新网络时,你应该得到想要的结果。
推荐阅读
- javascript - 更改使用 amcharts 绘制的 3D 条形图标签的字体颜色和标题
- listview - Flutter - 如何覆盖滚动物理
- unix - 特定场景的 Unix 命令
- ios - 有没有办法将 CSR 解码为字符串以获取属性?
- active-directory - Notes 联合登录未在内存 ID 文件中下载 - 在索引中找不到条目
- c# - 如何正确使用 c# 通过 ADO.net 2.0 执行不带值的存储过程?
- android - 在活动之间传递位图失败
- android - 地图 apk 不要求位置访问权限
- ios - 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[ABDC.File encodeWithCoder:]:
- ionic-framework - 如何更改离子弹出框的宽度