Questo articolo esplora come l’entropia può essere utilizzata come strumento per la stima dell’incertezza nelle attività di segmentazione delle immagini. Esamineremo cos’è l’Entropia e come implementarla con Python.

fotografato da Michael Dziedzic SU Unsplash

Mentre lavoravo all’Università di Cambridge come ricercatore in Neuroimaging e AI, ho affrontato la sfida di eseguire la segmentazione delle immagini su intricati set di dati cerebrali utilizzando le più recenti tecniche di Deep Learning, in particolare il nnU-Net. Durante questo sforzo, ho osservato una lacuna significativa: trascurare la stima dell’incertezza. Ancora, L’incertezza è cruciale per un processo decisionale affidabile.

Prima di entrare nello specifico, sentiti libero di dare un’occhiata al mio Deposito Github che contiene tutti i frammenti di codice discussi in questo articolo.

Nel mondo della visione artificiale e dell’apprendimento automatico, la segmentazione delle immagini è un problema centrale. Che si tratti di imaging medico, auto a guida autonoma o robotica, una segmentazione accurata è fondamentale per un processo decisionale efficace. Tuttavia, un aspetto spesso trascurato è il misura dell’incertezza associata a queste segmentazioni.

Perché dovremmo preoccuparci dell’incertezza nella segmentazione delle immagini?

In molte applicazioni del mondo reale, una segmentazione errata potrebbe avere conseguenze disastrose. Ad esempio, se un’auto a guida autonoma identifica erroneamente un oggetto o un sistema di imaging medico etichetta erroneamente un tumore, le conseguenze potrebbero essere catastrofiche. La stima dell’incertezza ci dà una misura di quanto “sicuro” è il modello riguardo alla sua previsione, consentendo decisioni più informate.

Possiamo anche usare l’entropia come misura dell’incertezza per migliorare l’apprendimento delle nostre reti neurali. Questa zona è conosciuta come ‘apprendimento attivo’. Questa idea verrà esplorata in ulteriori articoli, ma l’idea principale è identificare le zone su cui i modelli sono più incerti su cui concentrarsi. Ad esempio, potremmo avere una CNN che esegue la segmentazione delle immagini mediche sul cervello, ma con prestazioni molto scarse sui soggetti con tumori. Allora potremmo concentrare i nostri sforzi per acquisire più etichette di questo tipo.

L’entropia è un concetto preso in prestito dalla termodinamica e dalla teoria dell’informazione, che quantifica la quantità di incertezza o casualità in un sistema. Nel contesto dell’apprendimento automatico, l’entropia può essere utilizzata per misurare l’incertezza delle previsioni del modello.

Matematicamente, per una variabile casuale discreta X con funzione di massa di probabilità P(X), l’entropia H(X) è definito come:

Oppure nel caso continuo:

Maggiore è l’entropia, maggiore è l’incertezza e viceversa.

Un classico esempio per cogliere appieno il concetto:

Situazione 1: una moneta distorta

fotografato da Jizhidexiaohailang SU Unsplash

Immagina una moneta distorta, che cade in testa con una probabilità p=0,9, e coda con una probabilità 1-p=0,1.

La sua entropia è

Situazione 2: moneta equilibrata

Ora immaginiamo una moneta equilibrata che cade su testa e croce con probabilità p=0,5

La sua entropia è:

L’entropia è maggiore, il che è coerente con quanto detto prima: più incertezza = più entropia.

In effetti è interessante notarlo p=0,5 corrisponde alla massima entropia:

Visualizzazione dell’entropia, immagine dell’autore

Intuitivamente, ricorda che una distribuzione uniforme è il caso con la massima entropia. Se ogni risultato è ugualmente probabile, ciò corrisponde alla massima incertezza.

Per collegare questo alla segmentazione delle immagini, considera che nel deep learning, il livello softmax finale solitamente fornisce le probabilità di classe per ciascun pixel. Si può facilmente calcolare l’entropia per ciascun pixel in base a questi output softmax.

Ma come funziona?

Quando un modello è sicuro che un particolare pixel appartenga a una classe specifica, il livello softmax mostra un’alta probabilità (~1) per quella classe e probabilità molto piccole (~0) per le altre classi.

Strato Softmax, custodia sicura, immagine dell’autore

Al contrario, quando il modello è incerto, l’output softmax è distribuito in modo più uniforme su più classi.

Strato Softmax, caso incerto, Immagine dell’autore

Le probabilità sono molto più diffuse, vicine al caso uniforme se ricordate, perché il modello non può decidere quale classe è associata al pixel.

Se ce l’hai fatta fino ad ora, bene! Dovresti avere una grande intuizione di come funziona l’entropia.

Illustriamolo con un esempio pratico utilizzando l’imaging medico, in particolare le scansioni cerebrali T1 dei feti. Tutti i codici e le immagini per questo caso di studio sono disponibili nel mio Deposito Github.

1. Calcolo dell’entropia con Python

Come abbiamo detto prima, stiamo lavorando con il tensore di output softmax, fornito dalla nostra rete neurale. Questo approccio è privo di modelliutilizza solo le probabilità di ciascuna classe.

Chiariamo una cosa importante riguardo alle dimensioni dei tensori con cui stiamo lavorando.

Se stai lavorando con immagini 2D, la forma del tuo livello softmax dovrebbe essere:

Ciò significa che per ogni pixel (o voxel) abbiamo un vettore di dimensione Classi, che ci dà le probabilità che un pixel appartenga a ciascuna delle classi che abbiamo.

Pertanto l’entropia dovrebbe essere calcolata lungo la prima dimensione:


def compute_entropy_4D(tensor):
"""
Compute the entropy on a 4D tensor with shape (number_of_classes, 256, 256, 256).

Parameters:
tensor (np.ndarray): 4D tensor of shape (number_of_classes, 256, 256, 256)

Returns:
np.ndarray: 3D tensor of shape (256, 256, 256) with entropy values for each pixel.
"""

# First, normalize the tensor along the class axis so that it represents probabilities
sum_tensor = np.sum(tensor, axis=0, keepdims=True)
tensor_normalized = tensor / sum_tensor

# Calculate entropy
entropy_elements = -tensor_normalized * np.log2(tensor_normalized + 1e-12) # Added a small value to avoid log(0)
entropy = np.sum(entropy_elements, axis=0)

entropy = np.transpose(entropy, (2,1,0))

total_entropy = np.sum(entropy)

return entropy, total_entropy

2. Visualizzazione dell’incertezza basata sull’entropia

Ora visualizziamo le incertezze utilizzando una mappa termica, su ciascuna fetta della nostra segmentazione dell’immagine.

Scansione T1 (a sinistra), Segmentazione (al centro), Entropia (a destra), Immagine dell’autore

Consideriamo un altro esempio:

Scansione T1 (a sinistra), Segmentazione (al centro), Entropia (a destra), Immagine dell’autore

I risultati sembrano fantastici! In effetti possiamo vedere che questo è coerente perché le zone ad alta entropia si trovano sul contorno delle forme. Questo è normale perché il modello non mette in dubbio i punti al centro di ciascuna zona, ma piuttosto la delimitazione o il contorno che è difficile da individuare.

Questa incertezza può essere utilizzata in molti modi diversi:

  1. Poiché gli esperti medici lavorano sempre di più con l’intelligenza artificiale come strumento, essere consapevoli dell’incertezza del modello è fondamentale. Ciò significa che gli esperti medici potrebbero dedicare più tempo alla zona in cui è richiesta un’attenzione più dettagliata.

2. Nel contesto di Apprendimento attivo O Apprendimento semi-supervisionatopossiamo sfruttare l’incertezza basata sull’entropia per concentrarci sugli esempi con la massima incertezza e migliorare l’efficienza dell’apprendimento (maggiori informazioni su questo argomento nei prossimi articoli).

  • L’entropia è un concetto estremamente potente per misurare la casualità o l’incertezza di un sistema.
  • È possibile sfruttare l’entropia nella segmentazione delle immagini. Questo approccio è privo di modelli e utilizza solo il tensore di output softmax.
  • La stima dell’incertezza viene trascurata, ma è cruciale. I bravi data scientist sanno come creare buoni modelli. I Great Data Scientist sanno dove il loro modello fallisce e lo usano per migliorare l’apprendimento.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *