计算图像嵌入与一组图像嵌入的距离

Posted

技术标签:

【中文标题】计算图像嵌入与一组图像嵌入的距离【英文标题】:Computing the distance of an image embedding against a group of image embeddings 【发布时间】:2021-12-31 21:49:15 【问题描述】:

如何正确获取图像嵌入与另一个图像嵌入的列表/组的距离?

我有一个预训练模型,用于从图像中提取嵌入,并且我想获取图像与其他少数图像的距离,即

Embedding (1028,) against Embedding (5, 1028)

我正在尝试做一个图像相似度实验,我使用来自 Tensorflow 的余弦相似度度量来计算两个嵌入之间的距离,并且它在一对一的计算中效果很好,即

Embedding_1 = (1028,)
Embedding_2 = (1028,)
metrics.CosineSimilarity(Embedding_1, Embedding_2)

但我不知道如何在 1 对 N 距离计算中做到这一点。

Embedding_1 = (1028,)
Embedding_Group = [(1028,),(1028,),(1028,),(1028,),(1028,)]

【问题讨论】:

算1-1的倍数再求均值怎么样? 谢谢,我根据您的回答做了类似的方法。我得到了 Embedding Group 的平均值,然后用它来得到与 Embedding_1 的距离。它奏效了。 【参考方案1】:

可以使用broadcasting 完成。在这种情况下,迭代图像并计算每个单独对的距离是个坏主意,因为它不会被并行化(除非你自己知道如何去做)。

import tensorflow as tf

embedding = tf.constant([1., 1.]) # your shape here is (1028,) instead of (2,)
embedding_group = tf.constant([[1., 1.], [1., 2.], [0., 1.]]) # your shape here is (5, 1028) instead of (3, 2)
norm_embedding = tf.nn.l2_normalize(embedding[None, ...], axis=-1)
norm_embedding_group = tf.nn.l2_normalize(embedding_group, axis=-1)
similarity = tf.reduce_sum(norm_embedding * norm_embedding_group, axis=-1) # cosine similarity of same shape as number of samples

print(norm_embedding.numpy())
print(norm_embedding_group.numpy())
print(similarity.numpy())
# [[0.7071067 0.7071067]]
# [[0.7071067  0.7071067 ]
#  [0.44721356 0.8944271 ]
#  [0.         1.        ]]
# [0.9999998  0.94868314 0.7071067 ]

【讨论】:

以上是关于计算图像嵌入与一组图像嵌入的距离的主要内容,如果未能解决你的问题,请参考以下文章

swift将多个图像与一组图像进行比较

如何计算两个坐标之间的距离(没有浮点数)?

让我的 discord.js 机器人从我的计算机中的一组图像中发送一张随机图片

如何使用SAS计算Word Mover的距离

如何将外部 OCR 嵌入现有 PDF?

准确率 99%,分类不正确 - 三元网络