Transformando uma imagem em .CSV para .JPEG
Demostração do código para tranformar o arquivo MNIST em csv para jpeg.
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
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()
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)
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, [])
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.