我正在做一个使用Bag Of Features方法制作视觉搜索系统的项目,但几乎没有问题。如果我正确理解了方法,那么该方法几乎没有步骤。
我在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()
我怀疑问题来自群集错误。由于最初的聚类中心设置为随机,因此最终的聚合中心是不同的。 这有什么解决方案吗?
答案 0 :(得分:1)
你对KMeans初始中心的随机性是正确的,但是我会假设如果你没有明确地改变随机数生成器的初始种子,那么它总会选择相同的"随机"作为初始中心的特征。 另一个原因可能是,如果特征检测/提取是多线程的,则在您的图像上计算的特征可以在每次运行之间以不同的顺序出现。你也可以检查一下。
或者,您可以将自己的中心作为初始质心传递给KMeans,这样您就可以自己选择或生成它们,以确保KMeans始终以相同的初始中心开始