我需要搜索一个巨大的图像数据库,使用pHash找到可能的重复,假设这些图像记录具有使用pHash生成的哈希码。
现在我必须比较一个新图像,我必须使用针对现有记录的pHash为此创建哈希。但根据我的理解,比较并不像
那样直截了当hash1 - has2 < threshold
看起来我需要将两个哈希码传递到pHash API来进行匹配。所以我必须批量检索DB中的所有哈希码,并使用pHash API逐个进行比较。
但如果我在队列中有大约1000张图像与数百万已经存在的图像进行比较,这看起来不是最好的方法。
我需要了解以下内容。
提前致谢。
答案 0 :(得分:3)
我认为这个问题的某些部分是在pHash支持论坛上讨论的。
您需要使用mvptree存储机制
http://lists.phash.org/htdig.cgi/phash-support-phash.org/2011-May/000122.html 和 http://lists.phash.org/htdig.cgi/phash-support-phash.org/2010-October/000103.html
答案 1 :(得分:2)
根据您对“巨大”的定义,这里的一个好方法是实现BK-Tree
哈希树(human readable description)。
我正在使用类似的项目,并实施了BK tree in cython。它具有相当的性能(对于1200万个项目数据集,搜索汉明距离为2小于50毫秒,并且接触约0.01-0.02%的树节点)。
较大比例搜索(编辑距离为8)需要更长时间(约500毫秒)并触摸约5%的树节点。
这是64位散列大小。