【发布时间】:2012-03-31 00:26:34
【问题描述】:
关于来自 Frank Denis 先生的 libpuzzle libray for php (http://libpuzzle.pureftpd.org/project/libpuzzle)。我试图了解如何在我的 mysql 数据库中索引和存储数据。向量的生成是绝对没有问题的。
例子:
# Compute signatures for two images
$cvec1 = puzzle_fill_cvec_from_file('img1.jpg');
$cvec2 = puzzle_fill_cvec_from_file('img2.jpg');
# Compute the distance between both signatures
$d = puzzle_vector_normalized_distance($cvec1, $cvec2);
# Are pictures similar?
if ($d < PUZZLE_CVEC_SIMILARITY_LOWER_THRESHOLD) {
echo "Pictures are looking similar\n";
} else {
echo "Pictures are different, distance=$d\n";
}
这对我来说很清楚 - 但是现在当我有大量图片 >1.000.000 时我该如何工作?我计算向量并将其与数据库中的文件名一起存储?现在如何找到相似的图片?如果我将每个向量存储在 mysql 中,我必须打开每条记录并使用 puzzle_vector_normalized_distance 函数计算距离。该过程需要大量时间(打开每个数据库条目 - 将其抛出函数,...)
我从 lib puzzle libaray 中阅读了自述文件,发现以下内容:
它是否适用于拥有数百万张图片的数据库?
一个典型的图像签名只需要 182 个字节,使用内置的 压缩/解压功能。
相似的签名共享相同的“词”,即。相同的序列 相同位置的值。通过使用复合索引(word + 位置),可能的相似向量的集合是显着的 减少,并且在大多数情况下,实际上不需要矢量距离 得到计算。
通过单词和位置进行索引也可以很容易地拆分 数据到多个表和服务器中。
所以是的,Puzzle 库肯定与 需要索引数百万张图片的项目。
我还找到了关于索引的描述:
------------ 索引 ---------- --
如果是百万条记录,如何快速找到相似的图片?
原始论文有一个简单而有效的答案。
将向量切割成固定长度的单词。例如,让我们考虑 以下向量:
[ a b c d e f g h i j k l m n o p q r s t u v w x y z ]
字长(K)为10,可以得到以下单词:
[ a b c d e f g h i j ] 在位置 0 [ b c d e f g h i j k ] 在位置 1 找到 [ c d e f g h i j k l ] 在位置 2 等找到。 直到位置 N-1
然后,使用(单词+位置)的复合索引来索引您的向量。
即使有数百万张图像,K = 10 和 N = 100 也应该足以 很少有条目共享相同的索引。
这是一个非常基本的示例数据库架构:
+-----------------------------+
| signatures |
+-----------------------------+
| sig_id | signature | pic_id |
+--------+-----------+--------+
+--------------------------+
| words |
+--------------------------+
| pos_and_word | fk_sig_id |
+--------------+-----------+
我建议至少将“单词”表拆分为多个 表和/或服务器。
默认情况下 (lambas=9) 签名为 544 字节长。为了节省 存储空间,可以压缩到原来的1/3 通过puzzle_compress_cvec() 函数确定大小。使用前,他们 必须用puzzle_uncompress_cvec() 解压缩。
我认为压缩是错误的方式,因为我必须在比较之前解压缩每个向量。
我现在的问题是 - 处理数百万张图片的方法是什么,以及如何快速有效地比较它们。我无法理解“切割矢量”应该如何帮助我解决我的问题。
非常感谢 - 也许我可以在这里找到正在使用 libpuzzle libaray 的人。
干杯。
【问题讨论】:
标签: php mysql compare similarity image