Programming/AI & ML

[딥러닝을 활용한 의료 영상 처리 & 모델 개발] Part2-4. Brain tumor Semantic segmentation(Brats 2020) EDA(탐색적 데이터 분석) 및 전처리 과정 실습

YeonJuJeon 2025. 1. 8. 20:55

코드 링크: https://drive.google.com/file/d/1BWygf40czY9c2FkDnP0tmHiE3eMJO0c-/view?usp=sharing

 

ch05-05-3d-brain-tumor-segmentation-eda.ipynb

Colab notebook

drive.google.com


0. 설치 및 라이브러리 로드

  • !pip install monai, !pip install natsort로 필요 라이브러리 설치
  • import 구문: numpy, pandas, seaborn, matplotlib, SimpleITK, nibabel 등

1. Introduction

  • 브레인 종양(Brain Tumor) 세그멘테이션
    • Challenge dataset: Brats 2020
    • Brats는 매년(2023까지) 연속적으로 업데이트됨
    • Multi-modal(T1, T1Gd, T2, FLAIR) 영상을 함께 사용하여 종양 분석
  • 각 Modal 특징
    • T2, FLAIR: 조직 수분 관찰 → 넓은 영역에서 병변 감지
    • T1: 병변 위치 파악
    • T1Gd: 조영제를 통해 혈관/종양 부위를 더 선명하게 관찰

중앙 : T1에 mask입힌 영상, 빨간색 : ET, 초록색 : NET&NCR, 노락색 : ED왼쪽 위 : T2, 오른쪽 위 : T1, 왼쪽 아래 : T1Gd(contrast enhance), 오른쪽 아래 : FLAIR

  • 왜 Image processing이 필요한가?
    • 종양(예: Gliomas)은 진단이 어려움, 생존율 낮음
    • 일반적 임상 진단은 직경 측정 + 정성적 판단 → 자동 분할이 필요

2. How get annotation?

  • 3개 Class: ET(enhancing tumor), NET/NCR(non enhancing tumor & necrotic), ED(peritumoral edema)
    • ET/NET/NCR을 합하면 Tumor Core
    • ED까지 합치면 전체 Tumor
  • 마스크 형식으로 각각 레이블이 붙어 있음

 

3. EDA (Exploratory Data Analysis)

3.1 Check & Counting data

  1. check_file 함수로 각 경로 존재 여부 확인
  2. data_dict에 Brats20ID, flair, t1, t1ce, t2, mask 컬럼을 담아 df 생성
  3. df.dropna()로 누락된 케이스(파일 5개 중 일부 없음) 제거
  4. 그래프(sns.barplot)로 Modal별 파일 수 시각화


3.2 Merge with Survival CSV

  1. train_survival_df = pd.read_csv(cfg.train_survival_csv)
  2. merge_df = train.merge(train_survival_df, how='inner', on='Brats20ID')
    • 추가적인 생존 정보 등과 결합 가능

3.3 NIfTI 파일 입출력 비교 (SimpleITK vs nibabel)

  1. SimpleITK: sample_img = sitk.ReadImage(path), arr = sitk.GetArrayFromImage(sample_img)
  2. Nibabel: sample_img = nib.load(path), arr = sample_img.get_fdata()
    • 두 라이브러리가 속도, 메타데이터 접근에서 약간 차이
  3. 메타데이터 출력


3.4 Extract meta data for all images

  • extract_meta_data 함수: ITK or nibabel로 읽고 최소값/최대값, shape/spacing 반환
  • 루프를 돌며 meta_dict에 각 Modal별 (min, max, shape, spacing) 저장
  • meta_df로 만들고 melt_df로 히스토그램 시각화
    • 분포 차이(예: flair, t1ce는 밝기 범위가 큼)를 파악


3.5 Mask annotation check

  • 마스크에 있는 np.unique 값이 {0,1,2,3}인지 확인
    • 혹시 이상치(셋 중 빠진 class 등) 존재 여부를 확인
  • number_of_incomplete_masks 산출
    • Number of complete masks: 235 (100.00%)

3.6 Image & mask visualization (일반 파이썬 + animation)

  1. create_parallel_animation 함수
    • volumes를 (z, x, y)로 transpose
    • matplot의 ArtistAnimation으로 여러 슬라이스 순회
    • show_mask=True일 경우, 마스크 부분을 컬러맵으로 overlay


3.7 Image & mask visualization (MONAI 활용)

3.7.1 Dataset & Transform

  1. data_dicts에 image(4채널), label(마스크) 경로를 저장
  2. train_transform = Compose([...])
    • LoadImaged, EnsureChannelFirstd → 4채널 스택
    • NormalizeIntensityd(keys="image") → intensity 정규화
  3. train_dataset = Dataset(data_dicts, transform=train_transform)

3.7.2 matshow3d

  • matshow3d로 3D 볼륨 슬라이스를 GUI 형태로 띄우거나, 특정 슬라이스 표시
  • ex) img[...,50::70]로 간격 두고 시각화

3.7.3 blend_images

  • norm_img와 norm_lab(마스크)를 blend → 병변 overlay 확인
  • ex) (train_dataset[0]["label"][None]==(i+1))*0.1로 해당 클래스를 합성


정리

  • Brats 2020 데이터의 Multi-modal(4채널) + 마스크 파일 경로를 정리하고, 누락된 것 제외
  • Meta data(shape, spacing, min/max intensity) 확인하여 영상 전처리에 참고
  • Mask unique value로 클래스 분포 조사
  • 다양한 시각화 기법(matplotlib animation, MONAI의 matshow3d 등)으로 3D 뇌 종양을 slice별 확인
  • 이후 세그멘테이션 모델(예: U-Net) 학습 시 필요한 Transform(Load, EnsureChannelFirst, Normalize 등) 준비 완료