코드 링크: 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: 조영제를 통해 혈관/종양 부위를 더 선명하게 관찰
- 왜 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
- check_file 함수로 각 경로 존재 여부 확인
- data_dict에 Brats20ID, flair, t1, t1ce, t2, mask 컬럼을 담아 df 생성
- df.dropna()로 누락된 케이스(파일 5개 중 일부 없음) 제거
- 그래프(sns.barplot)로 Modal별 파일 수 시각화
3.2 Merge with Survival CSV
- train_survival_df = pd.read_csv(cfg.train_survival_csv)
- merge_df = train.merge(train_survival_df, how='inner', on='Brats20ID')
- 추가적인 생존 정보 등과 결합 가능
3.3 NIfTI 파일 입출력 비교 (SimpleITK vs nibabel)
- SimpleITK: sample_img = sitk.ReadImage(path), arr = sitk.GetArrayFromImage(sample_img)
- Nibabel: sample_img = nib.load(path), arr = sample_img.get_fdata()
- 두 라이브러리가 속도, 메타데이터 접근에서 약간 차이
- 메타데이터 출력
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)
- 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
- data_dicts에 image(4채널), label(마스크) 경로를 저장
- train_transform = Compose([...])
- LoadImaged, EnsureChannelFirstd → 4채널 스택
- NormalizeIntensityd(keys="image") → intensity 정규화
- 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 등) 준비 완료