I have an knn algorithm for image classification. In trainImages I have images for training, in trainLabels their's labels, validationImages and validationLabels are for testing
import imageio
import glob
import numpy as np
import os
import csv
trainImages = []
for imagePath in glob.glob('C:/Users/razva/*.png'):
image = imageio.imread(imagePath)
trainImages.append(image)
trainImages = np.array(trainImages)
trainImages = trainImages[:, 0]
f = open('C:/Users/razva/train.txt')
trainLabels = f.readlines()
for i in range(len(trainLabels)):
trainLabels[i] = int(trainLabels[i][11])
trainLabels = np.array(trainLabels)
validationImages = []
for imagePath in glob.glob('C:/Users/razva/*.png'):
image = imageio.imread(imagePath)
validationImages.append(image)
validationImages = np.array(validationImages)
f = open('C:/Users/razva/validation.txt')
validationLabels = f.readlines()
for i in range(len(validationLabels)):
validationLabels[i] = int(validationLabels[i][11])
validationLabels = np.array(validationLabels)
validationImages = validationImages[:, 0]
class ImageIdentifier:
def __init__(self, trainImages, trainLabels):
self.trainImages = trainImages
self.trainLabels = trainLabels
def classify(self, testImage, bins = 5):
distances = np.sum(np.abs(trainImages - testImage), axis = -1)
index = np.argsort(distances)
neighbors = self.trainLabels[index[:bins]]
x = np.bincount(neighbors)
return np.argmax(x)
p = ImageIdentifier(trainImages, trainLabels)
with open('output.csv', 'w') as file:
writer = csv.writer(file)
writer.writerow(['id', 'label'])
nr = 0
for i in range(len(validationLabels)):
writer.writerow([i, p.classify(validationImages[i])])
if validationLabels[i] == p.classify(validationImages[i]):
nr += 1
print(nr / 5000)
I got only 17%. What I do wrong? I tried to normalize training data but accuracy hasn't improved.