0
votes

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.

1

1 Answers

1
votes

KNN does not elaborate attributes of specific class. It just finds difference on (lets say) every pixel value but not features. KNN works better on data having columns as attributes (Tabular data) in which every attribute defines a specific feature. but in image case, every pixel value do not define specific feature. Like human nose will lie on different pixel positions in different images. You should use deep learning for better results (CNN specifically).

I'm sorry for my bad English. I hope I've convayed the message.

Happy Learning!