monai

Par mkurman · zorai

Medical Open Network for AI (MONAI). Framework de deep learning pour l'imagerie médicale : segmentation, classification, détection, recalage. Prend en charge les formats DICOM, NIfTI, PNG. Basé sur PyTorch avec accélération GPU.

npx skills add https://github.com/mkurman/zorai --skill monai

Présentation

MONAI est le framework standard basé sur PyTorch pour le deep learning en imagerie médicale. Utilisez-le pour la segmentation, la classification, l'enregistrement, le prétraitement et les pipelines d'entraînement sur les formats d'images médicales DICOM, NIfTI et autres.

Installation

uv pip install monai
# extras optionnels selon les besoins
uv pip install monai[all]

Points forts

MONAI vous propose :

  • des transformations conscientes des images médicales
  • des architectures spécialisées comme UNet, UNETR, SwinUNETR
  • des fonctions de perte comme DiceLoss et DiceCELoss
  • des métriques comme Dice et la distance de Hausdorff
  • des utilitaires de dataset et engine pour les boucles d'entraînement

Modèle de segmentation 3D basique

import torch
from monai.networks.nets import UNet
from monai.networks.layers import Norm

model = UNet(
    spatial_dims=3,
    in_channels=1,
    out_channels=3,
    channels=(16, 32, 64, 128, 256),
    strides=(2, 2, 2, 2),
    num_res_units=2,
    norm=Norm.BATCH,
).cuda()

Transformations de prétraitement

from monai.transforms import (
    Compose, LoadImaged, EnsureChannelFirstd, Spacingd,
    Orientationd, ScaleIntensityRanged, CropForegroundd,
    RandCropByPosNegLabeld, RandFlipd, EnsureTyped,
)

train_transforms = Compose([
    LoadImaged(keys=['image', 'label']),
    EnsureChannelFirstd(keys=['image', 'label']),
    Orientationd(keys=['image', 'label'], axcodes='RAS'),
    Spacingd(keys=['image', 'label'], pixdim=(1.5, 1.5, 2.0), mode=('bilinear', 'nearest')),
    ScaleIntensityRanged(keys=['image'], a_min=-200, a_max=300, b_min=0.0, b_max=1.0, clip=True),
    CropForegroundd(keys=['image', 'label'], source_key='image'),
    RandCropByPosNegLabeld(keys=['image', 'label'], label_key='label', spatial_size=(96, 96, 96), num_samples=4),
    RandFlipd(keys=['image', 'label'], prob=0.5, spatial_axis=0),
    EnsureTyped(keys=['image', 'label']),
])

Perte + métrique

from monai.losses import DiceCELoss
from monai.metrics import DiceMetric

loss_fn = DiceCELoss(to_onehot_y=True, softmax=True)
dice_metric = DiceMetric(include_background=False, reduction='mean')

Flux de travail

  1. Normalisez d'abord l'orientation et l'espacement de l'image.
  2. Utilisez les modes de transformation sûrs pour les labels : bilinéaire pour les images, nearest pour les labels.
  3. Commencez par les architectures de référence MONAI avant d'en inventer de personnalisées.
  4. Vérifiez les hypothèses d'espacement voxel avant l'entraînement.
  5. Suivez le Dice par classe, pas seulement la perte agrégée.
  6. Enregistrez la configuration de prétraitement avec le modèle pour que l'inférence corresponde à l'entraînement.

Skills similaires