Scipy.cluster.vq.kmeans“列表没有属性形状”

时间:2013-12-11 21:06:31

标签: python scipy

所以这是我遇到的一个非常奇怪的问题。我基本上试图创建一个练习码本,它使用由Python中的kmeans算法聚类的图像的SIFT特征。但是每当我运行代码时,我都会收到以下错误

Traceback (most recent call last):
  File "C:\Users\Administrator\Desktop\Python\assignment2\SIFT_Dectection.py", line 34, in    <module>
    codebook, dis = cluster.vq.kmeans(codebook_construction(files[:20]),3)
  File "C:\Python27\lib\site-packages\scipy\cluster\vq.py", line 513, in kmeans
    No = obs.shape[0]
AttributeError: 'list' object has no attribute 'shape'

我认为这是Scipy库的vq脚本中的错误。但是,我还有其他朋友正在研究这个问题,我使用与scipy库完全相同的代码,但我仍然遇到这个问题。我也尝试完全卸载Python重新安装一切。我正在运行Windows 7上的东西顺便说一句。我正在使用的代码看起来像这样:

import cv2
import glob
from scipy import cluster

files = glob.glob('101_ObjectCategories/*/*.jpg')

def codebook_construction(im):

    codebook = []

    for image in im:
        img = cv2.imread(image)
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        sift = cv2.SIFT()
        kp, desc = sift.detectAndCompute(gray, None)

        if codebook == []:            
            codebook = desc

        else:
            codebook = np.vstack((codebook, desc))

    return codebook

codebook, dis = cluster.vq.kmeans(codebook_construction(files[:20]),3)

那里的glob函数需要我从Caltech下载的图像库。我已经搜索了高低的答案,但似乎没有人遇到过类似的问题。希望我能在这里得到一些指导

1 个答案:

答案 0 :(得分:2)

问题似乎是kmeans期待一个数组,而你正在为它提供一个列表。尝试将codebook_construction()功能的最后一行更改为:

return scipy.array(codebook)