Python Bag of Words clustering

blurb picture blurb · Nov 14, 2015 · Viewed 8.4k times · Source

Edit: Here is the complete code for anyone having issues still github.com

I'm trying to do an image recognition project using SIFT and BOW. So far, I'm trying to train and build my dictionary. I've read in images from 5 different classes, computed descriptors and added them all to a python list ([]) side by side. Now, I'm trying to use the python version of BOWMeansTrainer to cluster my descriptors with k = 5 (is this correct? for 5 classes?). I'm trying to pass cluster() my descriptor vector, but I'm getting the error

Traceback (most recent call last):


File "C:\Python27\Project2\beginning.py", line 40, in <module>
    bow.cluster(des)
TypeError: descriptors data type = 17 is not supported

I'm not really sure what format to put my numpy array in, does anyone have an idea?

sift = cv2.SIFT()

descriptors = []
for path in training_paths:
    image = cv2.imread(path)
    print path
    gray = cv2.cvtColor(image, cv2.CV_LOAD_IMAGE_GRAYSCALE)
    kp, dsc= sift.detectAndCompute(gray, None)
    descriptors.append(dsc)

des = np.array(descriptors)

k=5
bow = cv2.BOWKMeansTrainer(k)
bow.cluster(des)

As you can see I keep appending the sift descriptors, and then try to convert to a numpy array (the needed format).

Answer

blurb picture blurb · Nov 15, 2015

Just figured it out thanks to the opencv forums, instead of using another list (I used descriptors above), just add the descriptors you find directly to your bag with bow.add(dsc)

dictionarySize = 5

BOW = cv2.BOWKMeansTrainer(dictionarySize)

for p in training_paths:
    image = cv2.imread(p)
    gray = cv2.cvtColor(image, cv2.CV_LOAD_IMAGE_GRAYSCALE)
    kp, dsc= sift.detectAndCompute(gray, None)
    BOW.add(dsc)

#dictionary created
dictionary = BOW.cluster()

EDIT: For anyone else having trouble I've uploaded the rest of the script here