MONAI transform으로 의료영상 전처리 예제 코드[pe]
관련된
다음 예제는 “3D 의료영상(예: CT) + 라벨”을 MONAI transform으로 전처리하는 가장 대표적인 코드 패턴이다.
UNETR 같은 3D segmentation 모델에 넣기 직전까지의 과정이라고 보면 된다.
핵심 아이디어 한 줄 정리
3D 의료영상 전처리는
“로드 → 채널 추가 → 방향 통일 → 스페이싱 재조정 → 강도 정규화 → 관심영역 크롭 → 랜덤 패치 크롭 → 증강(플립·회전·밝기 변화) → 텐서 변환”
이 한 줄 순서를 기억하면 된다.
3D CT/ MRI 전처리 예제 코드 (이미지+라벨)
아래 코드는 NIfTI 형식의 3D 볼륨(이미지, 라벨)을 읽어 UNETR 입력용 패치(96×96×96)로 만드는 예시다.
pythonfrom monai.transforms import ( Compose, LoadImaged, AddChanneld, Orientationd, Spacingd, ScaleIntensityRanged, CropForegroundd, RandCropByPosNegLabeld, RandFlipd, RandRotate90d, RandShiftIntensityd, ToTensord, ) # 원하는 voxel 해상도와 패치 크기 pix_dim = (1.0, 1.0, 1.0) roi_size = (96, 96, 96) train_transforms = Compose([ # 1) 이미지/라벨 로드 (NIfTI 파일 등) LoadImaged(keys=["image", "label"]), # 2) 채널 추가 (C, D, H, W 형태로 만들기) AddChanneld(keys=["image", "label"]), # 3) 방향 통일 (RAS: Right–Anterior–Superior 기준) Orientationd(keys=["image", "label"], axcodes="RAS"), # 4) 스페이싱 통일 (voxel 크기 맞추기) Spacingd( keys=["image", "label"], pixdim=pix_dim, mode=("bilinear", "nearest"), ), # 5) 강도 정규화 (HU 범위 등을 0~1로 스케일링) ScaleIntensityRanged( keys=["image"], a_min=-175, a_max=250, b_min=0.0, b_max=1.0, clip=True, ), # 6) 배경 제외하고 foreground 중심으로 크롭 CropForegroundd( keys=["image", "label"], source_key="image", ), # 7) 양성/음성 패치를 섞어서 랜덤 크롭 RandCropByPosNegLabeld( keys=["image", "label"], label_key="label", spatial_size=roi_size, pos=1, neg=1, num_samples=4, image_key="image", image_threshold=0, ), # 8) 데이터 증강 – 축별 랜덤 뒤집기 RandFlipd( keys=["image", "label"], spatial_axis=[0], prob=0.1, ), RandFlipd( keys=["image", "label"], spatial_axis=[1], prob=0.1, ), RandFlipd( keys=["image", "label"], spatial_axis=[2], prob=0.1, ), # 9) 90도 회전 증강 RandRotate90d( keys=["image", "label"], prob=0.1, max_k=3, ), # 10) 밝기/강도 랜덤 시프트 RandShiftIntensityd( keys=["image"], offsets=0.1, prob=0.5, ), # 11) 최종적으로 PyTorch 텐서로 변환 ToTensord(keys=["image", "label"]), ])
pythondata = { "image": "imagepath.nii.gz", "label": "labelpath.nii.gz", } tf_data = train_transforms(data) print(tf_data["image"].shape) # 예: torch.Size([1, 96, 96, 96]) print(tf_data["label"].shape)
이 정도 전처리 코드가 있으면, 이후 DataLoader에 그대로 얹어서 3D segmentation, MLLM용 feature 추출 등 다양한 실험의 “이미지 파트”를 안정적으로 돌릴 수 있다.
관련된
댓글
댓글 쓰기