我们使用 libpuzzle ( http://www.pureftpd.org/project/libpuzzle/doc ) 来比较 400 万张图像的相似性。
它工作得很好。
但不是使用 libpuzzle 函数进行图像与图像比较,还有另一种比较图像的方法。
这是一些快速背景:
Libpuzzle 为任何给定图像创建一个相当小的(544 字节)散列。这个散列又可以用来与使用 libpuzzles 函数的其他散列进行比较。有一些 API……PHP、C 等等……我们正在使用 PHP API。
比较图像的另一种方法是从给定的哈希创建向量,这是来自文档的粘贴:
将向量切割成固定长度的单词。例如,让我们考虑以下向量:
[ abcdefghijklmnopqrstu vwxyz ]
词长(K)为10,可以得到以下词:
[ abcdefghij ] 在位置 0 找到 [ bcdefghijk ] 在位置 1 找到 [ cdefghijkl ] 在位置 2 找到,依此类推,直到位置 N-1
然后,使用(单词+位置)的复合索引索引您的向量。
即使有数百万张图像,K = 10 和 N = 100 也应该足以让很少的条目共享相同的索引。
所以,我们有矢量方法工作。它实际上比图像与图像比较好一点,因为当我们进行图像与图像比较时,我们使用其他数据来减少我们的样本量。它有点无关紧要,并且特定于应用程序我们使用什么其他数据来减少样本量,但是使用向量方法......我们不必这样做,我们可以对 400 万个哈希中的每一个进行真正的测试.
我们遇到的问题如下:
有 400 万张图像,每张图像有 100 个向量,这变成了 4 亿行。我们发现 MySQL 在大约 60000 张图像(60000 x 100 = 600 万行)之后往往会阻塞。
我们使用的查询如下:
SELECT isw.itemid, COUNT(isw.word) as strength
FROM vectors isw
JOIN vectors isw_search ON isw.word = isw_search.word
WHERE isw_search.itemid = {ITEM ID TO COMPARE AGAINST ALL OTHER ENTRIES}
GROUP BY isw.itemid;
如前所述,即使有适当的索引,当涉及到 4 亿行时,上面的速度也相当慢。
那么,任何人都可以建议任何其他技术/算法来测试这些相似性吗?
我们愿意试一试。
一些值得一提的事情:
- 哈希是二进制的。
- 哈希总是相同的长度,544 字节。
我们能想到的最好的是:
- 将图像哈希从二进制转换为 ascii。
- 创建向量。
- 如下创建一个字符串:VECTOR1 VECTOR2 VECTOR3 等。
- 使用狮身人面像搜索。
我们还没有尝试上述方法,但这可能会比执行 mysql 查询产生更好的结果。
有任何想法吗?如前所述,我们愿意安装任何新服务(postgresql?hadoop?)。
最后一点,这个向量+比较方法的工作原理可以在问题Libpuzzle索引数百万张图片中找到?. 我们本质上是使用 Jason 提供的精确方法(目前是最后一个答案,获得了 200+ 分)。