Computer vision 基于特征袋法的图像检索系统

Computer vision 基于特征袋法的图像检索系统,computer-vision,Computer Vision,我正在做一个项目,使用特征袋方法制作视觉搜索系统,但没有什么问题。如果我正确理解了这个方法,那么这个方法有几个步骤 从图像中提取特征 矢量量化 从数据库中搜索图像 我的库存在2到3之间。我使用名为scikit的python包学习量化opencv中使用SIFT算法提取的特征向量。现在,我使用默认设置将集群大小设置为8。我试图从输出码本中生成直方图并显示它。我用同一张图片试了好几次,但是所有的直方图看起来都不一样。代码如下。这是一个简单的代码 import cv2 import numpy as n

我正在做一个项目,使用特征袋方法制作视觉搜索系统,但没有什么问题。如果我正确理解了这个方法,那么这个方法有几个步骤

  • 从图像中提取特征
  • 矢量量化
  • 从数据库中搜索图像
  • 我的库存在2到3之间。我使用名为scikit的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()
    
    我怀疑问题来自于集群错误。由于聚类的初始中心设置为随机,因此最终的收敛中心是不同的。
    有什么解决办法吗?

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


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

    谢谢,我认为问题在于随机选择初始质心,以便质心收敛到不同的最终质心。我考虑固定初始质心,使其始终收敛到相同的最终质心。因此,在聚类中找不到全局最小质心??KMeans没有花环,但使用KMeans++初始化可以让您有更多机会找到全局最小质心。