I am trying to made a image classifier using kNearestNeigbours. I have 50 classes and for each class we got 4 images. I am using 3 images for training and 1 for testing. My code:
def get_img_files(img_dir):
df = pd.DataFrame(filter(lambda x: ".JPG" in x, listdir(img_dir)), columns=["name"])
df["class"] = np.repeat(np.linspace(0, 49, num=50), 4) # number of files=200, number of classes=4
df["class"] = df["class"].astype("category")
return df
def extract_sift(df):
key_points, kp_descriptors = [], []
df_name = list(df["name"])
sift = cv2.SIFT(nfeatures=20)
for i in xrange(len(df)):
img = cv2.imread(join(img_dir, df_name[i]))
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
kp, des = sift.detectAndCompute(img, None)
key_points.append(map(lambda x: {"pt": x.pt, "angle": x.angle, "size": x.size,
"octave": x.octave, "response": x.response}, kp))
kp_descriptors.append(des.astype(np.uint16))
df["sift_kp"] = key_points
df["sift_kp_desc"] = kp_descriptors
return df
if __name__ == '__main__':
img_dir = '../data/uni/'
df = get_img_files(img_dir)
df = extract_sift(df)
X_train, X_test, y_train, y_test = train_test_split(df["sift_kp_desc"], df["class"], test_size=0.25, random_state=42)
knn = KNeighborsClassifier(n_neighbors=5, weights="distance", metric=cos_dist)
knn.fit(X_train, y_train)
print knn.score(X_test, y_test)
But I get an error ValueError: Incompatible dimension for X and Y matrices: X.shape[1] == 50 while Y.shape[1] == 150 How do I fix it?
Aucun commentaire:
Enregistrer un commentaire