使用Bag Of Features方法的图像搜索系统

时间:2014-07-16 01:31:19

标签: computer-vision

我正在做一个使用Bag Of Features方法制作视觉搜索系统的项目,但几乎没有问题。如果我正确理解了方法,那么该方法几乎没有步骤。

  1. 从图像中提取特征
  2. 矢量量化
  3. 从数据库中搜索图像
  4. 我在2到3之间存货。我使用名为scikit-learn的python包量化在opencv中使用SIFT算法提取的特征向量。目前,我使用默认设置设置了簇大小8。我试图从输出码本中生成直方图并显示它。我尝试了几次相同的图像,但所有的直方图看起来都不一样。代码如下。这是一个简单的代码。

    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn.cluster import KMeans
    
    def feature_extract(img):
        sift = cv2.SIFT()
        gray = img
        kp, des = sift.detectAndCompute(gray, None)
        return kp, des
    
    
    def codebook(k, des):
        km = KMeans(n_clusters=k, max_iter=500)
        km.fit(des)
        codebook = km.cluster_centers_
        label = km.labels_
        return codebook, label
    
    img = cv2.imread('sift_example.jpg', 0)
    kp, des = feature_extract(img)
    
    k = 8
    codebook, label = codebook(k, des)
    plt.hist(label, bins=range(0,9), align='left'), plt.show()
    

    我怀疑问题来自群集错误。由于最初的聚类中心设置为随机,因此最终的聚合中心是不同的。 这有什么解决方案吗?

1 个答案:

答案 0 :(得分:1)

你对KMeans初始中心的随机性是正确的,但是我会假设如果你没有明确地改变随机数生成器的初始种子,那么它总会选择相同的"随机"作为初始中心的特征。 另一个原因可能是,如果特征检测/提取是多线程的,则在您的图像上计算的特征可以在每次运行之间以不同的顺序出现。你也可以检查一下。

或者,您可以将自己的中心作为初始质心传递给KMeans,这样您就可以自己选择或生成它们,以确保KMeans始终以相同的初始中心开始