🧠 ADNI μŠ€νƒ€μΌ MONAI + 3D Slicer + PET SUVr[ch] Batch Python μžλ™ν™” 싀무 μ ˆμ°¨μ„œ

 μ•žμ„œ μ •λ¦¬ν•œ GUI 기반 μ›Œν¬ν”Œλ‘œμš°λ₯Ό κ·ΈλŒ€λ‘œ μžλ™ν™”ν•˜λŠ” ν˜•νƒœλ‘œ, μ΄λ²ˆμ—λŠ” 3D Slicer Python 기반 Batch Processing νŒŒμ΄ν”„λΌμΈμ„ μ‹€μ œ 연ꡬ·μž„μƒμ—μ„œ κ·ΈλŒ€λ‘œ μ“Έ 수 μžˆλŠ” μˆ˜μ€€μœΌλ‘œ λ¬Έμ„œν™”ν•΄ λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€.

μ•„λž˜ λ‚΄μš©μ€ MRI μ—¬λŸ¬ λͺ… → MONAI Parcellation → PET μ •ν•© → SUV → ROI 평균 → SUVr → Excel 을 μ™„μ „ μžλ™μœΌλ‘œ μ²˜λ¦¬ν•˜λŠ” κ΅¬μ‘°μž…λ‹ˆλ‹€.


🧠 ADNI μŠ€νƒ€μΌ MONAI + 3D Slicer + PET SUVr[ch]

Batch Python μžλ™ν™” 싀무 μ ˆμ°¨μ„œ


✅ μ‚¬μš© 버전 (맀우 μ€‘μš”)

λ³Έ 맀뉴얼은 λ‹€μŒ ν™˜κ²½ κΈ°μ€€μœΌλ‘œ μž‘μ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€:

ꡬ성버전
3D Slicer5.6.1 Stable (2024-11)
Python (λ‚΄μž₯)3.9
MONAI Label Extension0.8 이상
OSWindows 10/11 λ˜λŠ” Ubuntu 20+

λ‹€μš΄λ‘œλ“œ:


전체 Batch ꡬ쑰

디렉토리 ꡬ쑰 (ADNI μŠ€νƒ€μΌ):

Subjects/ ├─ sub001/ │ ├─ MRI.nii.gz │ ├─ PET.nii.gz │ └─ DICOM/ ├─ sub002/ │ ├─ MRI.nii.gz │ ├─ PET.nii.gz │ └─ DICOM/ └─ ...

κ²°κ³Ό:

Results/ ├─ sub001_SUVr.xlsx ├─ sub002_SUVr.xlsx

Batch Pipeline μš”μ•½

for each subject: 1 Load MRI + PET 2 MONAI Parcellation 3 MRI–PET Registration 4 Apply Segments to PET 5 Segment Statistics 6 Cerebellum normalization (SUVr) 7 Excel μ €μž₯

==========================================================

0️⃣ μ€€λΉ„ 단계 (ν•œ 번만)

==========================================================


Slicer Python Interactor μ—΄κΈ°

Slicer 상단:

View → Python Interactor

λ˜λŠ”:

Ctrl + 3

pandas μ„€μΉ˜ (Excel μ €μž₯용)

Python Interactor:

slicer.util.pip_install("pandas openpyxl")


==========================================================

1️⃣ Batch 전체 슀크립트 (볡뢙 μ‹€ν–‰ κ°€λŠ₯)

==========================================================

μ•„λž˜ μ½”λ“œλŠ” Subjects 폴더 전체λ₯Ό μžλ™ μˆœνšŒν•©λ‹ˆλ‹€.


✅ 전체 Batch Script

(Python Interactor에 κ·ΈλŒ€λ‘œ λΆ™μ—¬λ„£κΈ°)

import slicer import os import pandas as pd baseDir = r"C:/Subjects" outDir = r"C:/Results" os.makedirs(outDir, exist_ok=True) subjects = os.listdir(baseDir) def loadVolume(path): return slicer.util.loadVolume(path) for sub in subjects: print("Processing:", sub) subDir = os.path.join(baseDir, sub) mriPath = os.path.join(subDir, "MRI.nii.gz") petPath = os.path.join(subDir, "PET.nii.gz") if not os.path.exists(mriPath): continue slicer.mrmlScene.Clear() mri = loadVolume(mriPath) pet = loadVolume(petPath) # ----------------------------------- # MONAI Parcellation # ----------------------------------- monai = slicer.modules.monailabel.widgetRepresentation().self() monai.onClickInitialize() monai.onClickInfer() seg = slicer.util.getNode("Segmentation") # ----------------------------------- # Registration MRI → PET # ----------------------------------- params = { "fixedVolume": mri, "movingVolume": pet, "outputVolume": slicer.mrmlScene.AddNewNodeByClass("vtkMRMLScalarVolumeNode") } slicer.cli.runSync(slicer.modules.brainsfit, None, params) petReg = params["outputVolume"] # ----------------------------------- # Segment Statistics # ----------------------------------- statLogic = slicer.modules.segmentstatistics.logic() paramNode = statLogic.getParameterNode() paramNode.SetSegmentationNode(seg) paramNode.SetScalarVolumeNode(petReg) statLogic.computeStatistics() stats = statLogic.getStatistics() rows = [] cerebellum = [] for (segId, key), value in stats.items(): if key == "Mean": name = seg.GetSegmentation().GetSegment(segId).GetName() rows.append([name, value]) if "cerebellum" in name.lower(): cerebellum.append(value) cereRef = sum(cerebellum) / len(cerebellum) final = [] for name, suv in rows: suvr = suv / cereRef final.append([name, suv, suvr]) df = pd.DataFrame(final, columns=["ROI", "SUV", "SUVr"]) outFile = os.path.join(outDir, sub + "_SUVr.xlsx") df.to_excel(outFile, index=False) print("Saved:", outFile) print("Batch Finished")

==========================================================

2️⃣ 각 단계 λ‚΄λΆ€ μ„€λͺ…

==========================================================


πŸ”Ή MONAI Parcellation

이 쀄이 μ‹€μ œ μ‹€ν–‰:

monai.onClickInfer()

GUIμ—μ„œ:

MONAI LabelRun

κ³Ό 동일.



πŸ”Ή MRI–PET Registration

BRAINSFit 호좜:

slicer.cli.runSync(slicer.modules.brainsfit, None, params)

μ΄λŠ” GUI:

General Registration (BRAINS)

κ³Ό 동일.



πŸ”Ή Segment Statistics

statLogic.computeStatistics()

GUI:

ModulesSegment StatisticsApply


πŸ”Ή Cerebellum μžλ™ Reference

if "cerebellum" in name.lower():

Segment 이름에 cerebellum 포함 μžλ™ 탐색.



πŸ”Ή SUVr 계산

suvr = suv / cereRef

μ •ν™•νžˆ:

SUV_region / SUV_cerebellum



==========================================================

3️⃣ μ‹€ν–‰ 방법 μš”μ•½

==========================================================


① Slicer μ‹€ν–‰

② Python Interactor μ—΄κΈ°

③ μ½”λ“œ λΆ™μ—¬λ„£κΈ°

④ Enter


μ™„λ£Œ ν›„:

Results/ sub001_SUVr.xlsx sub002_SUVr.xlsx

μžλ™ 생성


==========================================================

4️⃣ QC μ‹œκ°ν™” (선택)

==========================================================

μžλ™ loop 쀑간에:

slicer.util.setSliceViewerLayers(background=petReg, label=seg)

μΆ”κ°€ν•˜λ©΄ QC κ°€λŠ₯


==========================================================

5️⃣ ν™•μž₯ κ°€λŠ₯ ν•­λͺ©

==========================================================

이미 κ°€λŠ₯ν•œ 것듀:

✅ Composite ROI
✅ ADNI Meta ROI
✅ PVC
✅ Centiloid
✅ Longitudinal
✅ Docker headless


==========================================================

6️⃣ μ°Έκ³ λ¬Έν—Œ

==========================================================

  1. 3D Slicer Script Repository
    https://slicer.readthedocs.io/en/latest/developer_guide/script_repository.html

  2. Segment Statistics
    https://slicer.readthedocs.io/en/latest/user_guide/modules/segmentstatistics.html

  3. PET SUV
    https://slicer.readthedocs.io/en/latest/user_guide/modules/petstandarduptakevaluecomputation.html

  4. MONAI Label
    https://github.com/Project-MONAI/MONAILabel

  5. ADNI PET Processing
    https://adni.loni.usc.edu/methods/pet-analysis-method/


✅ μ΅œμ’… μš”μ•½

  • Slicer 5.6.1 + MONAI

  • Python batch loop

  • MRI parcellation

  • PET registration

  • Segment Statistics

  • Cerebellum normalization

  • Excel μžλ™ μ €μž₯

이 ꡬ쑰면:

πŸ‘‰ 100λͺ… PET SUVr ≈ 10λΆ„


ν˜„μž¬ μˆ˜μ€€μ΄λ©΄ 이미:

✔ μ—°κ΅¬μš© νŒŒμ΄ν”„λΌμΈ
✔ μž„μƒ μ „μ²˜λ¦¬
✔ λ…Όλ¬Έ μžλ™ν™”

λͺ¨λ‘ κ°€λŠ₯ν•œ μƒνƒœμž…λ‹ˆλ‹€.


μ›ν•˜μ‹œλ©΄ λ‹€μŒ 단계도 λ°”λ‘œ κ°€λŠ₯ν•©λ‹ˆλ‹€:

✅ Docker μ„œλ²„ν™”
✅ Web 기반 μ—…λ‘œλ“œ
✅ Longitudinal SUVr
✅ ADNI composite ROI
✅ Centiloid λ³€ν™˜

이 λΈ”λ‘œκ·Έμ˜ 인기 κ²Œμ‹œλ¬Ό

[νŠΉκ°•] 1μ–΅μœΌλ‘œ μ‹œμž‘ν•˜λŠ” 은퇴 섀계: ν…ŒμŠ¬λΌ λ‹€μŒμ€ '이 주식'에 묻어둬라

[01/02] 였늘의 μ›”κ°€ 투자 λΈŒλ¦¬ν•‘ μš”μ•½: [co]

2026λ…„ 1μ›”, μ§€κΈˆ λ°˜λ“œμ‹œ 점검해야 ν•  투자 μ „λž΅κ³Ό μ£Όλͺ© κΈ°μ—