Scikit学习:从文件夹加载图像以创建用于KNN分类的标记数据集

时间:2019-07-02 08:25:16

标签: python file scikit-learn directory

我想通过scikit-learn使用K-Nearest Neighbors分类进行手写数字识别。我有一个包含5001张手写数字图像的文件夹(0-9之间的每个数字500张图像)。

enter image description here

我正在尝试找到一种基于这些图像创建数据集的方法,以便随后可以创建训练和测试集。我已经阅读了很多有关如何使用scikit-learn进行K最近邻分类的在线教程,但是大多数教程都加载了现有数据集,例如MNIST手写数字数据集。

是否可以通过从文件夹中读取图像然后为每个图像分配标签来创建自己的数据集?我不确定可以使用哪种方法来执行此操作。任何见解都会受到赞赏。

3 个答案:

答案 0 :(得分:0)

您可以使用Pillow或opencv库读取图像。

对于枕头:

from PIL import Image 
import numpy as np

img = PIL.Image.open("image_location/image_name") # This returns an image object   
img = np.asarray(img) # convert it to ndarray

对于Opencv:

import cv2

img = cv2.imread("image_location/image_name", cv2.IMREAD_GRAYSCALE)

要转换所有图像,可以使用os库,例如:

import os
创建图像名称列表
loc = os.listdir('your_images_folder')

要使用一个颜色通道存储灰度图像,可以使用一个空数组

data = np.ones((# of images, image_size wxh))


  for i, l in enumerate(loc):

     # Full image path
     path = os.path.join("your_images_folder", l)

     img = np.asarray(PIL.Image.open(path))

     # Make a vector from an image
     img = img.reshape(-1, img.size)

     # store this vector
     data[i,:]  = img

因此,wou将为您的分类项目获得numpy数组“数据”。 也可以在每个图像名称的同一循环中添加“ y”矢量。

要在循环中用进度条跟踪您的过程,有时tqdm库可能是合适的解决方案。 要存储rgb图像,您可以实施相同的解决方案。对于rgb图片,img.reshape(-1, )将返回更长的矢量。

答案 1 :(得分:0)

要读取数据,您应该执行以下操作:

from os import listdir
from os.path import isfile, join
import re
import matplotlib.pyplot as plt

mypath = '.' # edit with the path to your data
files = [f for f in listdir(mypath) if isfile(join(mypath, f))]

x = []
y = []

for file in files:
    label = file.split('_')[0] # assuming your img is named like this "eight_1.png" you want to get the label "eight"
    y.append(label)
    img = plt.imread(file)
    x.append(img)

然后,您需要先对x和y进行一些操作,然后再进行scikit学习,但是您应该没事。

答案 2 :(得分:0)

有帮助吗?

import os
import imageio


def convert_word_to_label(word):

    if word == 'zero':
        return 0
    elif word == 'one':
        return 1
    elif word == 'two':
        return 2
    elif word == 'three':
        return 3
    elif word == 'four':
        return 4
    elif word == 'five':
        return 5
    elif word == 'six':
        return 6
    elif word == 'seven':
        return 7
    elif word == 'eight':
        return 8
    elif word == 'nine':
        return 9



def create_dataset(path):
    X = []
    y = []

    for r, d, f in os.walk(path):
        for image in f:
            if '.jpg' in image:
                image_path = os.path.join(r, image)
                img = imageio.imread(image_path)
                X.append(img)
                word = image.split('_')[0]
                y.append(convert_word_to_label(word))
    return X, y

if __name__ == '__main__':
    X, y = create_dataset('path/to/image_folder/')