首页 > 解决方案 > knn图像分类,准确率差

问题描述

我有一个用于图像分类的 knn 算法。在 trainImages 我有训练图像,在 trainLabels 他们的标签,validationImages 和 validationLabels 用于测试

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)

我只有17%。我做错了什么?我试图标准化训练数据,但准确性并没有提高。

标签: pythonnumpymachine-learningknn

解决方案


KNN 没有详细说明特定类的属性。它只是发现(比方说)每个像素值的差异,而不是特征。KNN 在将列作为属性的数据(表格数据)上效果更好,其中每个属性都定义了一个特定的特征。但在图像情况下,每个像素值都没有定义特定的特征。就像人的鼻子会位于不同图像中的不同像素位置。您应该使用深度学习来获得更好的结果(特别是 CNN)。

我很抱歉我的英语不好。我希望我已经传达了这个信息。

快乐学习!


推荐阅读