Introduzione

Reti neurali convoluzionali (CNN) – il concetto alla base delle recenti scoperte e sviluppi nel deep learning.

Le CNN hanno rotto lo stampo e sono salite sul trono per diventare la tecnica di computer vision più avanzata. Tra i diversi tipi di reti neurali (altri includono le reti neurali ricorrenti (RNN), la memoria a breve termine lunga (LSTM), le reti neurali artificiali (ANN), ecc.), le CNN sono facilmente le più popolari.

Questi modelli di rete neurale convoluzionale sono onnipresenti nello spazio dei dati di immagine. Funzionano fenomenalmente bene in compiti di computer vision come la classificazione delle immagini, il rilevamento degli oggetti, il riconoscimento delle immagini, ecc.

Dove puoi mettere in pratica le tue abilità CNN? Bene, sei arrivato nel posto giusto!

Ci sono vari set di dati che puoi sfruttare per applicare le reti neurali convoluzionali. Ecco tre set di dati popolari:

  • MNIST
  • CIFAR-10
  • ImageNet

In questo articolo, costruiremo modelli di classificazione delle immagini usando CNN su ognuno di questi set di dati. Proprio così! Esploreremo MNSIT, CIFAR-10, e ImageNet per capire, in modo pratico, come funzionano le CNN per la classificazione delle immagini.

Puoi imparare tutto sulle Reti Neurali Convoluzionali (CNN) in questo corso gratuito: Convolutional Neural Networks (CNN) from Scratch

La mia ispirazione per scrivere questo articolo è di aiutare la comunità ad applicare la conoscenza teorica in modo pratico. Questo è un esercizio molto importante in quanto non solo ti aiuta a costruire una comprensione più profonda del concetto sottostante, ma ti insegnerà anche dettagli pratici che possono essere appresi solo attraverso l’implementazione del concetto.

Se sei nuovo nel mondo delle reti neurali, CNN, classificazione delle immagini, ti consiglio di leggere questi eccellenti tutorial di approfondimento:

  • Introduzione alle reti neurali (corso gratuito!)
  • Demistificare la matematica dietro le Reti Neurali Convoluzionali (CNNs)
  • Costruisci il tuo primo modello di classificazione delle immagini in soli 10 minuti

E se stai cercando di imparare la computer vision e l’apprendimento profondo in profondità, dovresti controllare i nostri corsi popolari:

  • Visione del computer usando l’apprendimento profondo
  • Programma certificato AI & ML Blackbelt+

Tabella dei contenuti

  1. Using CNNs to Classify Hand-scritto a mano sul dataset MNIST
  2. Identificare le immagini del dataset CIFAR-10 usando le CNN
  3. Categorizzare le immagini del dataset ImageNet usando le CNN
  4. Dove si va adesso?

Nota: In questo articolo userò Keras per dimostrare la classificazione delle immagini usando le CNN. Keras è un framework eccellente da imparare quando si sta iniziando a lavorare nel deep learning.

Usare le CNN per classificare le cifre scritte a mano sul dataset MNIST

MNIST (Modified National Institute of Standards and Technology) è un noto dataset usato nella Computer Vision che fu costruito da Yann Le Cun et. È composto da immagini che sono cifre scritte a mano (0-9), suddivise in un set di allenamento di 50.000 immagini e un set di test di 10.000 dove ogni immagine è di 28 x 28 pixel in larghezza e altezza.

Questo set di dati è spesso utilizzato per praticare qualsiasi algoritmo fatto per la classificazione delle immagini in quanto il set di dati è abbastanza facile da conquistare. Quindi, raccomando che questo sia il vostro primo set di dati se siete appena entrati nel campo.

MNIST viene fornito con Keras per impostazione predefinita e potete semplicemente caricare i file di allenamento e di test utilizzando poche righe di codice:

Ecco la forma di X (caratteristiche) e y (obiettivo) per i dati di allenamento e di convalida:

X_train shape (60000, 28, 28) y_train shape (60000,) X_test shape (10000, 28, 28) y_test shape (10000,)

Prima di allenare un modello CNN, costruiamo una rete neurale di base Fully Connected per il set di dati. I passi fondamentali per costruire un modello di classificazione delle immagini utilizzando una rete neurale sono:

  1. Flaten the input image dimensions to 1D (width pixels x height pixels)
  2. Normalizzare i valori dei pixel dell’immagine (dividere per 255)
  3. One-Hot Encode the categorical column
  4. Costruisci un’architettura del modello (Sequenziale) con Dense layers
  5. Allena il modello e fai previsioni

Ecco come puoi costruire un modello di rete neurale per MNIST. Ho commentato le parti rilevanti del codice per una migliore comprensione:

Dopo aver eseguito il codice di cui sopra, ci si rende conto che stiamo ottenendo facilmente una buona accuratezza di convalida di circa il 97%.

Modifichiamo il codice di cui sopra per costruire un modello CNN.

Un grande vantaggio dell’uso delle CNN rispetto alle NN è che non è necessario appiattire le immagini di input in 1D, poiché sono in grado di lavorare con dati di immagini in 2D. Questo aiuta a mantenere le proprietà “spaziali” delle immagini.

Ecco il codice completo del modello CNN:

Anche se la nostra massima accuratezza di validazione usando un semplice modello di rete neurale era intorno al 97%, il modello CNN è in grado di ottenere il 98%+ con un solo strato di convoluzione!

Puoi andare avanti e aggiungere più strati Conv2D, e anche giocare con gli iperparametri del modello CNN.

Identificare le immagini dal dataset CIFAR-10 usando le CNN

MNIST è un dataset per principianti nella computer vision. È facile ottenere un punteggio del 90%+ sulla convalida utilizzando un modello CNN. Ma cosa succede se sei oltre il principiante e hai bisogno di qualcosa di impegnativo per mettere in pratica i tuoi concetti?

Ecco dove entra in scena il dataset CIFAR-10!

Ecco come gli sviluppatori del CIFAR (Canadian Institute For Advanced Research) descrivono il dataset:

Il dataset CIFAR-10 consiste di 60.000 immagini a colori 32 x 32 in 10 classi, con 6.000 immagini per classe. Ci sono 50.000 immagini di allenamento e 10.000 immagini di test.

I punti importanti che distinguono questo dataset da MNIST sono:

  • Le immagini sono colorate in CIFAR-10 rispetto alla texture in bianco e nero di MNIST
  • Ogni immagine è 32 x 32 pixel
  • 50.000 immagini di allenamento e 10.000 immagini di test

Ora, queste immagini sono scattate in diverse condizioni di luce e con diverse angolazioni, e poiché si tratta di immagini colorate, vedrete che ci sono molte variazioni nel colore stesso di oggetti simili (per esempio, il colore dell’acqua dell’oceano). Se si utilizza la semplice architettura CNN che abbiamo visto nell’esempio MNIST di cui sopra, si otterrà una bassa accuratezza di convalida di circa il 60%.

Questa è una ragione fondamentale per cui raccomando CIFAR-10 come un buon set di dati per esercitare le proprie capacità di sintonizzazione degli iperparametri per le CNN. La cosa buona è che proprio come MNIST, CIFAR-10 è anche facilmente disponibile in Keras.

Puoi semplicemente caricare il dataset usando il seguente codice:

from keras.datasets import cifar10# loading the dataset (X_train, y_train), (X_test, y_test) = cifar10.load_data()

Ecco come puoi costruire un modello CNN decente (circa 78-80% sulla validazione) per CIFAR-10. Notate come i valori di forma sono stati aggiornati da (28, 28, 1) a (32, 32, 3) in base alle dimensioni delle immagini:

Ecco cosa ho cambiato nel modello:

  • Aumentato il numero di strati Conv2D per costruire un modello più profondo
  • Aumentato il numero di filtri per imparare più caratteristiche
  • Aggiunto Dropout per la regolarizzazione
  • Aggiunto più strati densi

Accuratezza di formazione e validazione attraverso le epoche:

Si può facilmente eclissare questa performance sintonizzando il modello di cui sopra. Una volta che avete imparato CIFAR-10, c’è anche CIFAR-100 disponibile in Keras che potete usare per ulteriore pratica. Dal momento che ha 100 classi, non sarà un compito facile da raggiungere!

Categorizzare le immagini di ImageNet usando CNNs

Ora che hai imparato MNIST e CIFAR-10, portiamo questo problema un po’ più in alto. Qui, daremo un’occhiata al famoso set di dati ImageNet.

ImageNet è il principale database dietro l’ImageNet Large Scale Recognition Challenge (ILSVRC). Sono come le Olimpiadi della Computer Vision. Questa è la competizione che ha reso le CNN popolari per la prima volta e ogni anno, i migliori team di ricerca delle industrie e del mondo accademico competono con i loro migliori algoritmi su compiti di computer vision.

Informazioni sul dataset ImageNet

Il dataset ImageNet ha più di 14 milioni di immagini, etichettate a mano in 20.000 categorie.

Inoltre, a differenza dei dataset MNIST e CIFAR-10 che abbiamo già discusso, le immagini in ImageNet hanno una risoluzione decente (224 x 224) ed è questo che ci pone una sfida: 14 milioni di immagini, ciascuna di 224 x 224 pixel. L’elaborazione di un set di dati di queste dimensioni richiede una grande quantità di potenza di calcolo in termini di CPU, GPU e RAM.

Il rovescio della medaglia – potrebbe essere troppo per un portatile di tutti i giorni. Quindi qual è la soluzione alternativa? Come può un appassionato lavorare con il dataset ImageNet?

Ecco dove entra in gioco il dataset Imagenette di Fast.ai

Imagenette è un dataset estratto dalla grande collezione di immagini ImageNet. La ragione dietro il rilascio di Imagenette è che i ricercatori e gli studenti possono fare pratica sulle immagini di livello ImageNet senza aver bisogno di molte risorse di calcolo.

Nelle parole dello stesso Jeremy Howard:

“Io (Jeremy Howard, cioè) ho creato Imagenette principalmente perché volevo un piccolo dataset di visione che potessi usare per vedere rapidamente se le mie idee di algoritmo potevano avere una possibilità di funzionare. Normalmente non funzionano, ma testarli su Imagenet richiede molto tempo per scoprirlo, soprattutto perché sono interessato agli algoritmi che funzionano particolarmente bene alla fine dell’addestramento.

Ma penso che questo possa essere un dataset utile anche per altri.”

E questo è quello che useremo anche per fare pratica!

Scaricate il dataset Imagenette

Ecco come potete recuperare il dataset (comandi per il vostro terminale):

$ wget https://s3.amazonaws.com/fast-ai-imageclas/imagenette2.tgz$ tar -xf imagenette2.tgz

Una volta scaricato il dataset, noterete che ha due cartelle – “train” e “val”. Queste contengono rispettivamente il set di allenamento e di convalida. All’interno di ogni cartella, ci sono cartelle separate per ogni classe. Ecco la mappatura delle classi:

Queste classi hanno lo stesso ID nel dataset originale di ImageNet. Ciascuna delle classi ha circa 1000 immagini quindi, nel complesso, è un dataset bilanciato.

Caricamento delle immagini usando ImageDataGenerator

Keras ha questa utile funzionalità per caricare immagini di grandi dimensioni (come quella che abbiamo qui) senza esaurire la RAM, facendolo in piccoli lotti. ImageDataGenerator in combinazione con fit_generator fornisce questa funzionalità:

Lo stesso ImageDataGenerator deduce le etichette delle classi e il numero di classi dai nomi delle cartelle.

Costruire un modello CNN di base per la classificazione delle immagini

Costruiamo un modello CNN di base per il nostro dataset Imagenette (allo scopo di classificare le immagini):

Quando confrontiamo l’accuratezza di validazione del modello di cui sopra, vi renderete conto che anche se è un’architettura più profonda di quella che abbiamo utilizzato finora, siamo solo in grado di ottenere un’accuratezza di validazione di circa il 40-50%.

Ci possono essere molte ragioni per questo, ad esempio il nostro modello non è abbastanza complesso per imparare i modelli sottostanti delle immagini, o forse i dati di formazione sono troppo piccoli per generalizzare accuratamente tra le classi.

Step up – transfer learning.

Using Transfer Learning (VGG16) per migliorare la precisione

VGG16 è un’architettura CNN che è stata la prima classificata nel 2014 ImageNet Challenge. È stata progettata dal Visual Graphics Group di Oxford e ha 16 strati in totale, con 13 strati convoluzionali. Caricheremo i pesi pre-addestrati di questo modello in modo da poter utilizzare le caratteristiche utili che questo modello ha imparato per il nostro compito.

Scaricare i pesi di VGG16

from keras.applications import VGG16# include top should be False to remove the softmax layerpretrained_model = VGG16(include_top=False, weights='imagenet')pretrained_model.summary()
Ecco l’architettura del modello:

Generare le caratteristiche da VGG16

Estrarre le caratteristiche utili che VGG16 già conosce dalle immagini del nostro dataset:

from keras.utils import to_categorical# extract train and val featuresvgg_features_train = pretrained_model.predict(train)vgg_features_val = pretrained_model.predict(val)
# OHE target columntrain_target = to_categorical(train.labels)val_target = to_categorical(val.labels)
Una volta che le caratteristiche di cui sopra sono pronte, possiamo semplicemente usarle per addestrare una rete neurale di base Fully Connected in Keras:

Notare quanto velocemente il modello inizia a convergere. In soli 10 epoche, hai una precisione di convalida del 94%+. Non è incredibile?

Nel caso in cui abbiate imparato a conoscere il dataset Imagenette, fastai ha anche rilasciato due varianti che includono classi che troverete difficili da classificare:

  • Imagewoof: 10 classi di razze di cani, un problema più difficile da classificare
  • Image网 (“wang”): Una combinazione di Imagenette e Imagewoof e un paio di trucchi che lo rendono un problema più difficile

Dove andare da qui?

A parte i set di dati che abbiamo sopra, puoi anche usare i set di dati seguenti per costruire algoritmi di visione artificiale. Infatti, considera questa una sfida. Puoi applicare le tue conoscenze CNN per battere il punteggio di riferimento su questi set di dati?

  • Fashion MNIST – Set di dati simili a MNIST di vestiti e abbigliamento. Invece di cifre, le immagini mostrano un tipo di abbigliamento (maglietta, pantaloni, borsa, ecc.)
  • Caltech 101 – Un altro set di dati impegnativo che ho trovato per la classificazione delle immagini

Suggerisco anche che prima di passare al transfer learning, prova a migliorare i tuoi modelli CNN di base. Puoi imparare dalle architetture di VGG16, ZFNet, ecc. per alcuni indizi sulla messa a punto degli iperparametri e puoi usare lo stesso ImageDataGenerator per aumentare le tue immagini e aumentare le dimensioni del dataset.

Puoi anche leggere questo articolo sulla nostra APP mobile

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.