Para utilizamos algumas dos frameworks de machine learning mais utilizandos atualmente, não podemos carregar estas imagens se os dados dos pixels dessas imagens estiverem em um arquivo tipo .csv. Para isso, é importante fazermos a conversão desse tipo de arquivo para uma extensão suportada.

Esse arquivo pode ser obtido diretamente no site do Kaggle: https://www.kaggle.com/c/digit-recognizer/data

#importando os pacotes necessários
import pandas as pd
import imageio
import numpy as np
from fastai.vision.all import *
from IPython.display import Image

Carregando a base de dados

path = Path(r"C:\Users\lucas\Documents\lucastiagooliveira\Kaggle\digit-recognizer\fastai\data") #definindo o caminho
df_train = pd.read_csv(str(path) + '/train.csv') #carregando o arquivo de treino
df_test = pd.read_csv(str(path) + '/test.csv') #carregando o arquivo de test
df_train.head()
label pixel0 pixel1 pixel2 pixel3 pixel4 pixel5 pixel6 pixel7 pixel8 ... pixel774 pixel775 pixel776 pixel777 pixel778 pixel779 pixel780 pixel781 pixel782 pixel783
0 1 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
2 1 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
3 4 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
4 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0

5 rows × 785 columns

Tranformação dos dados utilizando numpy

Antes de tudo deve-se realizar o mudança da base de dados para utilizando o numpy, pois cada imagem é um vetor linha, ou seja, criar uma matriz 28x28 (que é a quantidade de pixels da imagem).

def to_img_shape(data_X, data_y=[]): #função para transformação dos dados
    data_X = np.array(data_X, dtype = np.uint8).reshape(-1,28,28)
    data_X = np.stack((data_X,)*3, axis=-1)
    data_y = np.array(data_y, dtype = np.uint8)
    return data_X,data_y

Separando as variáveis dependentes das idenpendentes.

y, X = df_train.pop('label'), df_train

Criando os dataset para validação futura do modelo.

from sklearn.model_selection import train_test_split

train_X, val_X, train_y, val_y = train_test_split(X, y, test_size=0.2)

Aplicando a transformação nos dados de treino, validação e teste.

train_X,train_y = to_img_shape(train_X, train_y)
val_X,val_y = to_img_shape(val_X,val_y)
test_X, _ = to_img_shape(df_test)

Transformando em imagem

Utilizando a biblioteca imageio podemos criar os arquivos, para cada conjunto de dados será criado uma nova pasta.

def save_imgs(path:Path, data, labels):
    path.mkdir(parents=True, exist_ok=True)
    for label in np.unique(labels):
        (path/str(label)).mkdir(parents=True, exist_ok=True)
    for i in range(len(data)):
        if(len(labels) != 0):
            imageio.imsave(str(path/str(labels[i])/(str(i)+'.jpeg')), data[i])
        else:
            imageio.imsave(str(path/(str(i)+'.jpg')), data[i])

save_imgs(Path('data/train'),train_X,train_y)
save_imgs(Path('data/valid'),val_X,val_y)
save_imgs(Path('data/test'),test_X, [])

Exibindo alguns dados já transformados

Image(str(path) + r"\train\0\0.jpeg")
Image(str(path) + r"\valid\0\5.jpeg")

Este trabalho precisou ser realizado por conta que o fastai não tem suporte a carregamento de arquivos .csv para treinamento dos modelos.