Efficiente segmentazione delle immagini utilizzando PyTorch Parte 1.

Efficient image segmentation with PyTorch Part 1.

Concept e idee

In questa serie in 4 parti, implementeremo la segmentazione delle immagini passo passo, partendo da zero, utilizzando tecniche di deep learning in PyTorch. Inizieremo la serie con i concetti e le idee di base necessarie per la segmentazione delle immagini in questo articolo.

Figura 1: Immagini di animali domestici e le loro maschere di segmentazione (Fonte: The Oxford-IIIT Pet Dataset)

In collaborazione con Naresh Singh

La segmentazione delle immagini è una tecnica per isolare i pixel appartenenti a oggetti specifici in un’immagine. L’isolamento dei pixel degli oggetti apre le porte a interessanti applicazioni. Ad esempio, nella Figura 1, le immagini a destra sono le maschere corrispondenti alle immagini di animali domestici a sinistra, dove i pixel gialli appartengono all’animale domestico. Una volta identificati i pixel, potremmo facilmente ingrandire l’animale domestico o cambiare lo sfondo dell’immagine. Questa tecnica è ampiamente utilizzata nelle funzionalità dei filtri per il viso in molte applicazioni di social media.

Il nostro obiettivo alla fine di questa serie di articoli è di dare al lettore un’idea di tutti i passaggi necessari per costruire un modello di intelligenza artificiale per la visione e condurre esperimenti con diverse impostazioni utilizzando PyTorch.

Articoli in questa serie

Questa serie è per lettori di tutti i livelli di esperienza con il deep learning. Se vuoi imparare sulla pratica del deep learning e dell’intelligenza artificiale per la visione insieme ad una solida teoria ed esperienza pratica, sei nel posto giusto! Questa serie dovrebbe essere composta da 4 parti con i seguenti articoli:

  1. Concept e idee (questo articolo)
  2. Un modello basato su CNN
  3. Convolution Depthwise separabile
  4. Un modello basato su Vision Transformer

Introduzione alla segmentazione delle immagini

La segmentazione delle immagini suddivide o segmenta un’immagine in regioni che corrispondono a oggetti, sfondi e bordi. Dai un’occhiata alla Figura 2 che mostra una scena urbana. Marca le regioni corrispondenti a auto, motociclette, alberi, edifici, marciapiedi e altri oggetti interessanti con diverse maschere di colore. Queste regioni sono identificate attraverso tecniche di segmentazione delle immagini.

Storicamente, abbiamo utilizzato strumenti e pipeline di elaborazione delle immagini specializzati per suddividere un’immagine in regioni. Tuttavia, a causa dell’incredibile crescita dei dati visivi negli ultimi due decenni, il deep learning è emerso come soluzione principale per il compito di segmentazione delle immagini. Riduce significativamente la dipendenza da un esperto per costruire una strategia di segmentazione delle immagini specifica del dominio, come era stato fatto in passato. Un praticante di deep learning può addestrare un modello di segmentazione delle immagini se sono disponibili abbastanza dati di formazione per il compito.

Figura 2: Una scena segmentata dal dataset a2d2 (CC BY-ND 4.0)

Quali sono le applicazioni della segmentazione delle immagini?

La segmentazione delle immagini ha applicazioni in diversi campi come la comunicazione, l’agricoltura, il trasporto, la sanità e altro ancora. Inoltre, le sue applicazioni stanno crescendo con la crescita dei dati visivi. Ecco alcuni esempi:

  • Nelle auto a guida autonoma, un modello di deep learning elabora costantemente il flusso video dalle telecamere dell’auto per suddividere la scena in oggetti come auto, pedoni e semafori, che sono essenziali per il funzionamento sicuro dell’auto.
  • Nelle immagini mediche, la segmentazione delle immagini aiuta i medici a identificare le aree nelle scansioni mediche che corrispondono a tumori, lesioni e altre anomalie.
  • Nelle videochiamate Zoom, viene utilizzata per preservare la privacy di un individuo sostituendo lo sfondo con scene virtuali.
  • Nell’agricoltura, le informazioni sulle regioni di erbe infestanti e colture identificate utilizzando la segmentazione delle immagini vengono utilizzate per mantenere rese di colture sane.

Puoi leggere maggiori dettagli sulle applicazioni pratiche della segmentazione delle immagini su questa pagina di v7labs.

Quali sono i diversi tipi di compiti di segmentazione delle immagini?

Ci sono molti tipi diversi di compiti di segmentazione delle immagini, ognuno con i suoi vantaggi e svantaggi. I 2 tipi più comuni di compiti di segmentazione delle immagini sono:

  • Segmentazione di classe o semantica: La segmentazione di classe assegna una classe semantica come sfondo, strada, auto o persona ad ogni pixel dell’immagine. Se l’immagine ha 2 auto in essa, quindi i pixel corrispondenti ad entrambe le auto saranno etichettati come pixel di auto. Viene spesso utilizzata per compiti come la guida autonoma e la comprensione della scena.
  • Segmentazione di oggetti o istanze: La segmentazione di oggetti identifica gli oggetti e assegna una maschera ad ogni oggetto unico in un’immagine. Se l’immagine ha 2 auto in essa, quindi i pixel corrispondenti ad ogni auto verranno identificati come appartenenti a oggetti separati. La segmentazione di oggetti viene spesso utilizzata per il tracciamento di oggetti individuali, come un’auto a guida autonoma programmata per seguire un’auto specifica che la precede.
Figura 3: Segmentazioni di oggetti e classi (fonte: MS Coco — Licenza di attribuzione Creative Commons)

In questa serie, ci concentreremo sulla segmentazione di classe.

Decisioni necessarie per implementare una segmentazione delle immagini efficiente

Addestrare efficacemente il tuo modello per velocità e precisione comporta la presa di numerose decisioni importanti durante il ciclo di vita del tuo progetto. Questo include (ma non si limita a):

  1. Scegliere il tuo framework di deep learning
  2. Scegliere una buona architettura del modello
  3. Selezionare una funzione di perdita efficace che ottimizza l’aspetto che ti interessa
  4. Evitare l’overfitting e l’underfitting
  5. Valutare l’accuratezza del modello

Nel resto di questo articolo, approfondiremo ciascuno degli aspetti sopra menzionati e forniremo numerosi link ad articoli che discutono ogni argomento in modo molto più dettagliato di quanto si possa coprire qui.

PyTorch per una segmentazione delle immagini efficiente

Cos’è PyTorch?

“PyTorch è un framework di deep learning open source costruito per essere flessibile e modulare per la ricerca, con la stabilità e il supporto necessari per la distribuzione in produzione. PyTorch fornisce un pacchetto Python per funzionalità di alto livello come il calcolo del tensore (come NumPy) con una forte accelerazione GPU e TorchScript per una facile transizione tra la modalità impaziente e la modalità grafica. Con l’ultima versione di PyTorch, il framework fornisce un’elaborazione basata su grafo, addestramento distribuito, distribuzione mobile e quantizzazione.” (fonte: pagina Meta AI su PyTorch)

PyTorch è scritto in Python e C++, il che lo rende facile da usare e apprendere oltre che efficiente nell’esecuzione. Supporta una vasta gamma di piattaforme hardware, tra cui (server e mobile) CPU, GPU e TPU.

Perché PyTorch è una buona scelta per la segmentazione delle immagini?

PyTorch è una scelta popolare per la ricerca e lo sviluppo di deep learning, poiché fornisce un ambiente flessibile e potente per la creazione e l’addestramento di reti neurali. È una scelta ottima di framework per implementare la segmentazione delle immagini basata sul deep learning grazie alle seguenti caratteristiche:

  • Flessibilità: PyTorch è un framework flessibile che consente di creare e addestrare reti neurali in vari modi. È possibile utilizzare modelli pre-addestrati, o è possibile crearne uno proprio da zero molto facilmente
  • Supporto backend: PyTorch supporta più backend come hardware GPU/TPU
  • Librerie di dominio: PyTorch ha un ricco insieme di librerie di dominio che rendono molto facile lavorare con specifici settori di dati. Ad esempio, per l’AI relativa alla visione (immagine/video), PyTorch fornisce una libreria chiamata torchvision che useremo ampiamente in tutta questa serie
  • Semplicità d’uso e adozione della comunità: PyTorch è un framework facile da usare che è ben documentato e ha una grande comunità di utenti e sviluppatori. Molti ricercatori utilizzano PyTorch per i loro esperimenti e i risultati nei loro articoli pubblicati hanno un’implementazione del modello in PyTorch liberamente disponibile

Scelta del dataset

Utilizzeremo il dataset Oxford IIIT Pet (sotto licenza CC BY-SA 4.0) per la segmentazione delle classi. Questo dataset ha 3680 immagini nel set di training, e ogni immagine ha un trimap di segmentazione associato ad essa. Il trimap è una delle 3 classi di pixel:

  1. Pet
  2. Sfondo
  3. Bordo

Abbiamo scelto questo dataset poiché è abbastanza diversificato per fornirci un compito di segmentazione di classe non banale. Inoltre, non è così complesso da farci perdere tempo a occuparci di sbilanciamento delle classi, ecc… e perdere il focus del problema principale che vogliamo imparare e risolvere; ovvero la segmentazione di classe.

Altri dataset popolari utilizzati per compiti di segmentazione dell’immagine includono:

  1. Pascal VOC (classi di oggetti visivi)
  2. MS Coco
  3. Cityscapes

Efficiente segmentazione dell’immagine con PyTorch

In questa serie, addestreremo molti modelli per la segmentazione di classe da zero. Ci sono molte considerazioni da tenere in conto quando si costruisce e si addestra un modello da zero. Di seguito, analizzeremo alcune delle decisioni chiave che devi prendere quando lo fai.

Scegliere il modello giusto per il tuo compito

Ci sono molti fattori da considerare quando si sceglie il modello giusto di deep-learning per la segmentazione dell’immagine. Alcuni dei fattori più importanti includono:

  • Il tipo di compito di segmentazione dell’immagine : Ci sono due tipi principali di compiti di segmentazione dell’immagine: segmentazione di classe (semantica) e segmentazione di oggetti (istanza). Poiché ci stiamo concentrando sul più semplice problema di segmentazione di classe, considereremo di modellare il nostro problema di conseguenza.
  • Dimensioni e complessità del dataset : Le dimensioni e la complessità del dataset influiranno sulla complessità del modello che dobbiamo utilizzare. Ad esempio, se stiamo lavorando con immagini con una piccola dimensione spaziale, possiamo utilizzare un modello più semplice (o meno profondo), come una rete completamente convoluzionale (FCN). Se stiamo lavorando con un dataset grande e complesso, possiamo utilizzare un modello più complesso (o più profondo) come un U-Net.
  • Disponibilità di modelli pre-addestrati : Ci sono molti modelli pre-addestrati disponibili per la segmentazione dell’immagine. Questi modelli possono essere utilizzati come punto di partenza per il nostro modello o possiamo utilizzarli direttamente. Tuttavia, se usiamo un modello pre-addestrato, potremmo essere vincolati dalle dimensioni spaziali dell’immagine di input al modello. In questa serie, ci concentreremo sull’addestramento di un modello da zero.
  • Risorse di calcolo disponibili : I modelli di deep learning possono essere computazionalmente costosi da addestrare. Se abbiamo risorse di calcolo limitate, potremmo dover scegliere modelli più semplici o architetture di modello più efficienti.

In questa serie, lavoreremo con il dataset di Oxford IIIT Pet poiché è abbastanza grande per permetterci di allenare un modello di dimensioni significative e richiede l’uso di una GPU. Consigliamo vivamente di creare un account su kaggle.com o di utilizzare la GPU gratuita di Google Colab per eseguire i notebook e il codice citati in questa serie.

Architetture di modello

Ecco alcune delle architetture di modelli di deep learning più popolari per la segmentazione dell’immagine:

  • U-Net : L’U-Net è una rete neurale convoluzionale comunemente utilizzata per compiti di segmentazione dell’immagine. Utilizza connessioni di salto, che possono aiutare ad addestrare la rete più velocemente e ottenere una migliore precisione complessiva. Se devi scegliere, U-Net è sempre un’ eccellente scelta predefinita!
  • FCN : La rete completamente convoluzionale (FCN) è una rete completamente convoluzionale, ma non è profonda come l’U-Net. La mancanza di profondità è principalmente dovuta al fatto che ad alte profondità di rete, la precisione diminuisce. Ciò rende più veloce l’addestramento, ma potrebbe non essere accurato come l’U-Net.
  • SegNet : SegNet è una popolare architettura di modello simile a U-Net e usa una memoria di attivazione inferiore rispetto a U-Net. Utilizzeremo SegNet in questa serie.
  • Vision Transformer (ViT) : I Vision Transformer hanno recentemente guadagnato popolarità grazie alla loro struttura semplice e all’applicabilità del meccanismo di attenzione al testo, alla visione e ad altri domini. I Vision Transformer possono essere più efficienti (rispetto alle CNN) sia per l’addestramento che per l’elaborazione, ma storicamente hanno avuto bisogno di più dati per l’addestramento rispetto alle reti neurali convoluzionali. Utilizzeremo anche ViT in questa serie.
Figura 4: L'architettura del modello U-Net. Fonte: Università di Freiburg, autore(i) originale(i) di U-Net.

Questi sono solo alcuni dei molti modelli di deep learning che possono essere utilizzati per la segmentazione delle immagini. Il miglior modello per il tuo compito specifico dipenderà dai fattori menzionati in precedenza, dal compito specifico e dai tuoi esperimenti.

Scelta della funzione di perdita corretta

La scelta della funzione di perdita per i compiti di segmentazione delle immagini è importante, poiché può avere un impatto significativo sulle prestazioni del modello. Esistono molte diverse funzioni di perdita disponibili, ognuna con i propri vantaggi e svantaggi. Le funzioni di perdita più popolari per la segmentazione delle immagini sono:

  • Perdita di entropia incrociata: La perdita di entropia incrociata è una misura della differenza tra la distribuzione di probabilità prevista e la distribuzione di probabilità della verità fondamentale
  • Perdita IoU: La perdita IoU misura la quantità di sovrapposizione tra la maschera prevista e la maschera della verità fondamentale per classe. La perdita IoU penalizza i casi in cui la previsione o il richiamo subirebbero. L’IoU così come definito non è differenziabile, quindi dobbiamo modificarlo leggermente per utilizzarlo come funzione di perdita
  • Perdita di Dice: La perdita di Dice è anche una misura della sovrapposizione tra la maschera prevista e quella della verità fondamentale.
  • Perdita di Tversky: La perdita di Tversky è stata proposta come funzione di perdita robusta che può essere utilizzata per gestire insiemi di dati sbilanciati.
  • Perdita focale: La perdita focale è progettata per concentrarsi su esempi difficili, che sono esempi difficili da classificare. Ciò può essere utile per migliorare le prestazioni del modello su insiemi di dati sfidanti.

La migliore funzione di perdita per un compito particolare dipenderà dai requisiti specifici del compito. Ad esempio, se l’accuratezza è più importante, allora le perdite IoU o di Dice potrebbero essere scelte migliori. Se il compito è sbilanciato, allora le perdite di Tversky o di Focal potrebbero essere buone scelte. La funzione di perdita specifica utilizzata può influire sul tasso di convergenza del modello durante la formazione.

La funzione di perdita è un iperparametro del tuo modello e l’utilizzo di una diversa perdita basata sui risultati che vediamo ci permette di ridurre la perdita più rapidamente e migliorare l’accuratezza del modello.

Predefinito: In questa serie, useremo la perdita di entropia incrociata, poiché è sempre una buona predefinizione da scegliere quando i risultati non sono noti.

Puoi utilizzare le seguenti risorse per saperne di più sulle funzioni di perdita.

  1. Funzioni di perdita PyTorch: La guida definitiva
  2. Torchvision — Perdite
  3. Torchmetrics

Esaminiamo più nel dettaglio la perdita IoU definita di seguito come alternativa robusta alla perdita di entropia incrociata per i compiti di segmentazione.

La perdita IoU personalizzata

IoU è definito come intersezione su unione. Per i compiti di segmentazione delle immagini, possiamo calcolare questo calcolando (per ogni classe), l’intersezione di pixel in quella classe come previsto dal modello e nella maschera di segmentazione della verità fondamentale.

Ad esempio, se abbiamo 2 classi:

  1. Sfondo
  2. Persona

Poi possiamo determinare quali pixel sono stati classificati come persona, confrontarlo con i pixel di verità fondamentale per una persona e calcolare l’IoU per la classe persona. Allo stesso modo, possiamo calcolare l’IoU per la classe di sfondo.

Una volta ottenute queste metriche IoU specifiche per classe, possiamo scegliere di ponderarle o meno prima di mediare per tener conto di eventuali squilibri di classe come abbiamo visto nell’esempio precedente.

La metrica IoU come definita richiede di calcolare etichette difficili per ogni metrica. Ciò richiede l’uso della funzione argmax(), che non è differenziabile, quindi non possiamo utilizzare questa metrica come funzione di perdita. Pertanto, invece di utilizzare etichette difficili, applichiamo softmax() e utilizziamo le probabilità previste come etichette morbide per calcolare la metrica IoU. Ciò porta a una metrica differenziabile che possiamo quindi utilizzare per calcolare la perdita. Pertanto, a volte, la metrica IoU è nota anche come metrica IoU morbida quando utilizzata nel contesto di una funzione di perdita.

Se abbiamo una metrica (M) che assume valori tra 0,0 e 1,0, possiamo calcolare la perdita (L) come:

L = 1 — M

Tuttavia, ecco un altro trucco che si può usare per convertire una metrica in una perdita se la tua metrica ha il valore tra 0,0 e 1,0. Calcola:

L = -log(M)

Cioè, calcola il logaritmo negativo della metrica. Questo è significativamente diverso dalla formulazione precedente, e puoi leggerne qui e qui. Fondamentalmente, ciò porta a un apprendimento migliore per il tuo modello.

Figura 6: Confronto tra la perdita risultante da 1-P(x) con -log(P(x)). Fonte: Autore/i.

Usare IoU come nostra perdita porta anche la funzione di perdita a catturare ciò a cui realmente teniamo. Ci sono pro e contro nell’uso di una metrica di valutazione come funzione di perdita. Se sei interessato ad esplorare maggiormente questo spazio, puoi iniziare con questa discussione su StackExchange.

Aumento dei dati

Per addestrare il tuo modello in modo efficiente ed efficace per una buona accuratezza, è necessario prestare attenzione alla quantità e al tipo di dati di addestramento usati per addestrare il modello. La scelta dei dati di addestramento utilizzati avrà un impatto significativo sull’accuratezza finale del modello, quindi se c’è una cosa che vuoi trarre da questa serie di articoli, dovrebbe essere questa!

In genere, dividiamo i nostri dati in 3 parti con le parti che sono approssimativamente nelle proporzioni menzionate di seguito.

  1. Addestramento (80%)
  2. Validazione (10%)
  3. Test (10%)

Addestriamo il nostro modello sull’insieme di addestramento, valutiamo l’accuratezza sull’insieme di validazione e ripetiamo il processo finché non siamo soddisfatti delle metriche riportate. Solo allora valuteremo il modello sull’insieme di test e quindi riporteremo i numeri. Ciò è fatto per prevenire qualsiasi tipo di bias nell’architettura del tuo modello e negli iperparametri utilizzati durante l’addestramento e la valutazione. In generale, più modifichi la tua configurazione in base ai risultati che vedi con i dati di test, meno affidabili diventeranno i tuoi risultati. Pertanto, dobbiamo limitare le nostre decisioni solo ai risultati che vediamo sui set di dati di addestramento e di validazione.

In questa serie, non useremo un set di dati di test. Invece, useremo il nostro set di dati di test come set di dati di validazione e applicheremo l’aumento dei dati sul set di dati di test in modo da validare sempre i nostri modelli su dati leggermente diversi. Questo impedisce di sovradattare le decisioni sul set di dati di validazione. Questo è un po’ un hack, e lo stiamo facendo solo per l’efficienza e come scorciatoia. Per lo sviluppo di modelli di produzione, dovresti cercare di attenerti alla ricetta standard menzionata sopra.

Il set di dati che utilizzeremo in questa serie ha 3680 immagini nell’insieme di addestramento. Sebbene possa sembrare un gran numero di immagini, vogliamo assicurarci che il nostro modello non si sovraadatti su queste immagini poiché addestreremo il modello per numerosi cicli.

In un singolo ciclo di addestramento, addestriamo il modello sull’intero set di dati di addestramento, e in genere addestriamo i modelli in produzione per 60 o più cicli. In questa serie, addestreremo il modello solo per 20 cicli per tempi di iterazione più veloci. Per prevenire l’overfitting, utilizzeremo una tecnica chiamata aumento dei dati che viene utilizzata per generare nuovi dati di input dai dati di input esistenti. L’idea di base dell’aumento dei dati per i dati di input dell’immagine è che se si cambia leggermente l’immagine, sembra una nuova immagine per il modello, ma si può ragionare se le uscite attese sarebbero le stesse. Ecco alcuni esempi di aumenti dei dati che applicheremo in questa serie.

  1. Flip orizzontale casuale
  2. Variazione casuale del colore

Mentre utilizzeremo la libreria Torchvision per applicare gli aumenti dei dati sopra, ti incoraggiamo a valutare anche la libreria di aumento dei dati Albumentations per le attività di visione. Entrambe le librerie hanno un ricco set di trasformazioni disponibili per l’uso con i dati delle immagini. Personalmente continuiamo a utilizzare Torchvision semplicemente perché è quello con cui abbiamo iniziato. Albumentations supporta primitive più ricche per l’aumento dei dati che possono apportare modifiche all’immagine di input così come alle etichette o maschere di verità fondamentali contemporaneamente. Ad esempio, se dovessi ridimensionare o girare un’immagine, dovresti apportare la stessa modifica alla maschera di segmentazione di verità fondamentale. Albumentations può farlo per te immediatamente.

In generale, entrambe le librerie supportano trasformazioni che vengono applicate all’immagine sia a livello di pixel che a livello di dimensioni spaziali dell’immagine. Le trasformazioni a livello di pixel sono chiamate trasformazioni di colore da Torchvision, mentre le trasformazioni spaziali sono chiamate trasformazioni geometriche da Torchvision.

Di seguito, vedremo alcuni esempi di trasformazioni a livello di pixel e di trasformazioni geometriche applicate dalle librerie Torchvision e Albumentations.

Figura 7: Esempi di aumenti di dati a livello di pixel applicati alle immagini utilizzando Albumentations. Fonte: Albumentations
Figura 8: Esempi di aumenti di dati applicati alle immagini utilizzando le trasformazioni di Torchvision. Fonte: Autore (quaderno)
Figura 9: Esempi di trasformazioni a livello spaziale applicate utilizzando Albumentations. Fonte: Autore (quaderno)

Valutare le prestazioni del tuo modello

Quando si valutano le prestazioni del tuo modello, si vuole sapere come si comporta su una metrica che rappresenta la qualità delle prestazioni del modello sui dati del mondo reale. Ad esempio, per il compito di segmentazione delle immagini, si vuole sapere con quale precisione un modello è in grado di prevedere la classe corretta per un pixel. Pertanto, diciamo che la precisione del pixel è la metrica di validazione per questo modello.

Potresti utilizzare la tua metrica di valutazione come funzione di perdita (perché non ottimizzare ciò che ti interessa davvero!), tranne che questo potrebbe non essere sempre possibile.

Oltre alla precisione, tracceremo anche la metrica di IoU (anche chiamata indice di Jaccard) e la metrica di IoU personalizzata che abbiamo definito in precedenza.

Per saperne di più sulle varie metriche di precisione applicabili ai compiti di segmentazione delle immagini, consulta:

  • Tutte le metriche di segmentazione — Kaggle
  • Come valutare i modelli di segmentazione delle immagini
  • Valutare i modelli di segmentazione delle immagini

Il lato negativo dell’utilizzo della precisione del pixel come metrica di prestazione

Anche se la metrica di precisione può essere una buona scelta predefinita per misurare le prestazioni dei compiti di segmentazione delle immagini, ha i suoi svantaggi, che possono essere significativi in base alla tua situazione specifica.

Ad esempio, considera un compito di segmentazione delle immagini per identificare gli occhi di una persona in una foto e segnalare quei pixel di conseguenza. Il modello classificherà quindi ogni pixel come uno dei seguenti:

  1. Sfondo
  2. Occhio

Supponiamo che ci sia solo 1 persona in ogni immagine e il 98% dei pixel non corrisponde a un occhio. In questo caso, il modello può semplicemente imparare a prevedere ogni pixel come un pixel di sfondo e raggiungere una precisione del pixel del 98% sul compito di segmentazione. Wow!

Figura 10: Un'immagine del viso di una persona e la maschera di segmentazione corrispondente per i loro occhi. Si può vedere che gli occhi occupano una frazione molto piccola dell'immagine complessiva. Fonte: Adattato da Unsplash

In tali casi, l’utilizzo della metrica di IoU o del coefficiente di Dice potrebbe essere una scelta molto migliore, poiché l’IoU catturerebbe quanto della previsione è corretta e non sarebbe necessariamente influenzata dalla regione che ogni classe o categoria occupa nell’immagine originale. Potresti persino considerare l’utilizzo del coefficiente di IoU o di Dice per classe come metrica. Questo potrebbe catturare meglio le prestazioni del tuo modello per il compito in questione.

Quando si considera solo l’accuratezza dei pixel, la precisione e il richiamo dell’oggetto per cui vogliamo calcolare la maschera di segmentazione (occhi nell’esempio sopra) possono catturare i dettagli che stiamo cercando.

Ora che abbiamo coperto gran parte delle basi teoriche della segmentazione delle immagini, facciamo una deviazione verso le considerazioni relative all’elaborazione e alla distribuzione della segmentazione delle immagini per carichi di lavoro del mondo reale.

Dimensione del modello e latenza di elaborazione

Ultimo ma non meno importante, vogliamo assicurarci che il nostro modello abbia un numero di parametri ragionevole ma non troppo elevato, poiché desideriamo un modello piccolo ed efficiente. Esamineremo questo aspetto in maggior dettaglio in un post futuro relativo alla riduzione della dimensione del modello utilizzando architetture di modello efficienti.

Per quanto riguarda la latenza di elaborazione, ciò che conta è il numero di operazioni matematiche (mult-adds) che esegue il nostro modello. Sia la dimensione del modello che i mult-adds possono essere visualizzati utilizzando il pacchetto torchinfo. Sebbene i mult-adds siano un ottimo proxy per determinare la latenza del modello, può esserci una grande variazione nella latenza tra vari backend. L’unico modo reale per determinare le prestazioni del tuo modello su un backend o dispositivo specifico è di profilare e testarlo su quel dispositivo specifico con il set di input che ci si aspetta di vedere in ambienti di produzione.

from torchinfo import summarymodel = nn.Linear(1000, 500)summary(  model,  input_size=(1, 1000),  col_names=["kernel_size", "output_size", "num_params", "mult_adds"],  col_width=15,)

Output:

====================================================================================================Layer (type:depth-idx)                   Kernel Shape    Output Shape    Param #         Mult-Adds====================================================================================================Linear                                   --              [1, 500]        500,500         500,500====================================================================================================Total params: 500,500Trainable params: 500,500Non-trainable params: 0Total mult-adds (M): 0.50====================================================================================================Input size (MB): 0.00Forward/backward pass size (MB): 0.00Params size (MB): 2.00Estimated Total Size (MB): 2.01====================================================================================================

Ulteriori letture

Gli articoli seguenti forniscono informazioni aggiuntive sulle basi della segmentazione delle immagini. Se sei il tipo di persona che ama leggere diverse prospettive sullo stesso argomento, ti invitiamo a leggerli.

  1. Guida alla segmentazione delle immagini in computer vision: migliori pratiche
  2. Un’introduzione alla segmentazione delle immagini: deep learning vs. tradizionale [+esempi]
  3. Segmentazione delle immagini: le basi e 5 tecniche chiave

Se desideri mettere le mani nella Oxford IIIT Pet dataset e utilizzare torchvision e Albumentations per eseguire l’aumento delle immagini, abbiamo fornito un notebook di avvio su Kaggle che puoi clonare e con cui puoi giocare. Molti delle immagini in questo articolo sono state generate da quel notebook!

Riepilogo dell’articolo

Ecco un rapido riassunto di ciò di cui abbiamo discusso finora.

  • La segmentazione delle immagini è una tecnica per suddividere un’immagine in più segmenti (fonte: Wikipedia)
  • Ci sono due tipi principali di compiti di segmentazione delle immagini: segmentazione di classe (semantica) e segmentazione di oggetti (istanza). La segmentazione di classe assegna a ciascun pixel di un’immagine una classe semantica. La segmentazione di oggetti identifica ciascun singolo oggetto in un’immagine e assegna una maschera a ciascun oggetto unico
  • Utilizzeremo PyTorch come framework di deep learning e il dataset Oxford IIIT Pet in questa serie di segmentazione efficiente delle immagini
  • Ci sono molti fattori da considerare quando si sceglie il modello di deep learning giusto per la segmentazione delle immagini, tra cui (ma non solo) il tipo di compito di segmentazione delle immagini, la dimensione e la complessità del dataset, la disponibilità di modelli pre-addestrati e le risorse computazionali disponibili. Alcune delle architetture di modello di deep learning più popolari per la segmentazione delle immagini includono U-Net, FCN, SegNet e Vision Transformer (ViT)
  • La scelta della funzione di perdita per i compiti di segmentazione delle immagini è importante, poiché può avere un impatto significativo sulle prestazioni del modello e sull’efficienza di formazione. Per i compiti di segmentazione delle immagini, possiamo utilizzare la perdita di entropia incrociata, la perdita IoU, la perdita di Dice o la perdita focale (tra le altre)
  • L’aumento dei dati è una tecnica preziosa che viene utilizzata per prevenire l’overfitting e affrontare la mancanza di dati di formazione
  • Valutare le prestazioni del modello è importante per il compito a portata di mano e bisogna scegliere attentamente questa metrica
  • La dimensione del modello e la latenza di elaborazione sono metriche vitali da considerare quando si sviluppa un modello, soprattutto se si intende utilizzarlo in applicazioni in tempo reale come la segmentazione del viso o la rimozione del rumore di fondo

Nel prossimo post, esamineremo una Convolutional Neural Network (CNN) costruita da zero con PyTorch per eseguire la segmentazione delle immagini sul dataset Oxford IIIT Pet.