我的图像存储服务器出了很大问题。
上面有大约2,000,000张产品图片并且不断增加,但很多产品图片非常相似。例如:iPad照片有许多类似尺寸的120 * 120,118 * 120,131 * 125 ......等等,它们在我的网站上占用了大量不必要的磁盘空间和糟糕的用户体验(图库中的类似图像)。
这些图片已在数据库中编入索引,我可以在某些条件下找到它们,例如产品,类别等。我需要找到一种方法在数据库中标记这些相似的图像并将其删除。
我做了什么: 发现一个名为pHash的库可以计算出两个图像的相似度,我可以用它来逐个计算图像。但通过这种方式,需要花费大量时间才能找到这些图像。现在我不知道如何让这个过程更快。
有什么想法吗?
答案 0 :(得分:3)
答案 1 :(得分:3)
你是对的,一个天真的算法是O(n^2)
,因为你正在对所有n个大小的数据集进行成对比较。
有一种称为blocking的技术,其实现是canopy clustering,可以通过将比较窗口大小划分为一组可能相似的“块”来绕过成对比较。
您可以通过对特征向量进行提取和排序来对图像进行聚类(我不确定如何对图像进行处理)。
然后,定义一个比较窗口w,使得w< ñ。
然后应用一种称为sorted neighborhood method的技术,该技术在已排序的记录上按顺序移动固定大小w
的窗口。然后,窗口内的每个图像与其“邻居”配对并包括在候选记录对列表中。
这基本上将比较复杂度降低到O(w * n)
,从而产生具有常数w
的线性算法。
在执行比较后,您应该将传递闭包放在匹配对上。
您的结果对现在是similar
图像。
注意,此算法为embarrassingly parallel。