Rete neurale convoluzionale per il riconoscimento di capi di abbigliamento
Introduzione
L'obiettivo di questo progetto è sviluppare e addestrare una rete neurale in grado di riconoscere diverse tipologie di capi di abbigliamento, utilizzando il dataset Fashion MNIST (Modified National Institute of Standards and Technology). Si tratta di un insieme di immagini in scala di grigi di dimensioni 28x28 pixel rappresentanti diversi capi di abbigliamento (t-shirt, scarpe, cappotti ecc.).
Nel corso di questo progetto, utilizzerò la libreria Keras e applicherò tecniche di deep learning per costruire e addestrare una rete neurale con strati convoluzionali per affrontare questa sfida. Le reti neurali convoluzionali sono particolarmente adatte per questo tipo di task poiché sono in grado di rilevare i pattern locali delle immagini.
Nell'ultima parte del progetto, testerò il modello su 3 immagini di abbigliamento reperite sul web.
Fonte dati di addestramento: https://datasets.activeloop.ai/docs/ml/datasets/fashion-mnist-dataset/
Importazione dei moduli
import numpy as np
import matplotlib.pyplot as plt
from time import time
from keras.models import Sequential
from keras.layers import Dense, Conv2D, Flatten, Dropout, MaxPooling2D
from keras.utils import to_categorical
from keras.datasets import fashion_mnistImportazione e preprocessing dei dati
In questa sezione verrà caricato il dataset e saranno eseguite le operazioni necessarie a trasformare i dati nel formato ottimale per l'addestramento. Nello specifico:
- Divisione del dataset in sezione di addestramento e sezione di test
- Reshaping delle features
- Normalizzazione delle features
- One-Hot encoding delle classi target
Caricamento e divisione del dataset in dataset di addestramento e di test
(X_train, y_train), (X_test, y_test) = fashion_mnist.load_data()
display(X_train.shape)
display(X_test.shape)Reshaping delle features
Poichè si vuole utilizzare una rete neurale convoluzionale, è necessario mantenere la dimensione dei pixel delle singole immagini e aggiungere una dimensione che identifichi il numero di canali (1 nel caso delle immagini in bianco e nero). Il dataset di addestramento, per esempio, avrà dimensione (60000, 28, 28, 1).
X_train = X_train.reshape(X_train.shape[0], X_train.shape[1], X_train.shape[2],1)
X_test = X_test.reshape(X_test.shape[0], X_test.shape[1], X_test.shape[2],1)
display(X_train.shape)
display(X_test.shape)Normalizzazione delle features
Poiché i pixel hanno un valore compreso tra 0 e 255, dividendo i valori per 255 questi saranno compresi tra 0 e 1 e, pertanto, più facilmente gestibili in fase di addestramento.
Per ciò che riguarda le classi target, andremo ad assegnare a ognuna di queste un'etichetta per identificarle in modo più efficace.
X_train = X_train/255
X_test = X_test/255# Individua i valori univoci delle classi target
display(np.unique(y_train))
# Lista contenente l'etichetta di ogni classe
labels = ['T-shirt/top',
'Pantalone',
'Pullover',
'Vestito',
'Cappotto',
'Sandalo',
'Camicia',
'Scarpe',
'Borsa',
'Stivaletto']
# Crea un dizionario le cui chiavi sono le classi target e i valori la rispettiva etichetta
diz_labels = dict(zip(np.unique(y_train), labels))
diz_labelsMostriamo la prima immagine di ogni classe
plt.figure(figsize=[12, 5])
for i in diz_labels.keys():
index = np.where(y_train == i)[0][0]
plt.subplot(2, 5, i+1)
plt.imshow(X_train[index], cmap="grey")
plt.title(diz_labels[i], color="black")
plt.axis("off")
plt.show()