L’apprendimento automatico ha trasformato l’analisi delle immagini mediche, permettendo di automatizzare processi complessi come la segmentazione organica. In questo tutorial, andiamo oltre la teoria e costruiamo un’intera pipeline di segmentazione end-to-end per il fegato partendo da volumi CT (Computed Tomography). Sfruttiamo MONAI, una libreria open-source sviluppata per applicazioni di diagnostica medica su grandi dataset, insieme a PyTorch per il training e l’inferenza.
Introduzione al Progetto
Lo scopo del tutorial è addestrare un modello 3D UNet usando il dataset Medical Segmentation Decathlon Task09. Questo dataset contiene diverse immagini volumetriche CT e maschere corrispondenti per la segmentazione di organi specifici, in questo caso il fegato o la milza. Il processo include:
- Scaricare il dataset e configurare l’ambiente
- Eseguire preprocessing delle immagini CT (es. orientamento, normalizzazione, ridimensionamento)
- Scegliere un modello UNet adatto ai dati tridimensionali
- Eseguire il training usando una loss DiceCE
- Validare e visualizzare i risultati
Struments E Dati
Usiamo MONAI insieme a PyTorch e a librerie per il data science come NumPy e Matplotlib. MONAI semplifica l’elaborazione delle immagini mediche tridimensionali grazie a trasformazioni predefinite, dataset e metriche ad hoc. Il dataset Task09 ha circa 50 casi trai CT di pazienti con annotazioni manuale per il fegato.
Configurazione Iniziale
Possiamo installare MONAI con alcune dipendenze aggiuntive grazie al comodo comando di Python:
!pip install -q "monai[nibabel,tqdm,matplotlib]==1.5.2" 2>/dev/null
Importiamo poi i moduli necessari come torch, numpy e il core MONAI per dataset, trasformazioni e metriche. Supprimiamo le avvertenze per una maggiore leggibilità del codice.
Dati E Trasformazioni
Utilizziamo il modulo DecathlonDataset di MONAI per scaricare e processare il dataset, dividendolo in parte di training e validazione. Le trasformazioni eseguite comprendono:
- LoadImaged: per caricare immagini e etichette
- EnsureChannelFirstd: per sistemare i canali in formato canale-primo
- Orientationd: per allineare l’orientamento
- Spacingd: per rispettare le giuste dimensioni dei voxel
- ScaleIntensityRanged: per normalizzare intensità HU
- CropForegroundd: per togliere il fondo estraneo
- RandFlipd, RandRotate90d, RandShiftIntensityd: per aumentare dati durante il training
Creazione Dei Caricatori Dei Dati
Una volta definite le trasformazioni, costruiamo i data loader per il training e la validazione. Configuriamo dimensioni di batch, cache e workers per ottimizzare l’accesso ai dati. Per accelerare, usiamo anche la programmazione GPU, quando disponibile.
Modello E Strumenti Di Training
Costruiamo un modello 3D UNet per la segmentazione binaria. Il modello è definito in MONAI e include strati di normalizzazione BatchNorm3d, filtri e connessioni per la rete neurale.
- DiceCELoss: combina Dice Loss e CrossEntropy per migliorare la convergenza
- AdamW: ottimizzatore con aggiornamenti pesi e regolarizzazione
- GradScaler: per training a precisione mista
- Dice Metric: per valutare l’accuratezza delle maschere predette
Addestramento Del Modello
Avviamo il training utilizzando un loop in cui addestriamo per epoche e validiamo a intervalli regolari. Lavoriamo con patch estratte da volumi CT utilizzando RandCropByPosNegLabeld, e durante il training applichiamo data augmentation come flip e rotazioni aleatorie.
for epoch in range(1, max_epochs + 1):
Ad ogni epoca, il modello è addestrato su batch con campionamento casuale, calcoliamo la loss e ottimizziamo i pesi. Utilizziamo anche un CosineAnnealingLR per il learning rate per migliorare la convergenza.
Validazione E Monitoraggio
Per la validazione, usiamo slidingwindowinference per spostarci su tutto il volume durante l’inferenza e predire l’intero organo. Valutiamo il modello usando la metrica Dice, che misura quanto le previsioni si avvicinano alle maschere ground-truth.
Salvataggio E Visualizzazione
Durante la validazione, salviamo il miglior checkpoint del modello ogni volta che il Dice migliorano. Alla fine, visualizziamo l’andamento del loss e del Dice attraverso grafici in matplotlib.
plt.plot(...)
plt.xlabel(...)
plt.ylabel(...)
...ecc.
Questo passo aiuta a capire come il modello apprende e adottiamo un approccio iterativo per raffinare i parametri.
Risultati E Considerazioni
Dopo la conclusione del training, si ottiene un modello che segmenta il fegato in volumi tridimensionali CT. La metrica di Dice raggiunge un livello alto, mostrando che il modello predice bene. La visualizzazione del risultato mostra chiaramente come la rete riconosca e segli il fegato, evidenziando la struttura e i confini.
Confronto Con Il Training
- Raggiungiamo buone performance con un Dice fino a 0.96.
- Il modello è robusto grazie al data augmentation.
- Usiamo mixed precision per accelerare il training.
Applicazioni Pratiche
Questo tipo di modello può essere