Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

115 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

AS_Radiomics

๋Œ€๋™๋งฅ ํŒ๋ง‰ ํ˜‘์ฐฉ์ฆ(Aortic Stenosis) ์ง„๋‹จ์„ ์œ„ํ•œ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์˜๋ฃŒ ์˜์ƒ ๋ถ„์„ ์‹œ์Šคํ…œ

Radiomics ํŠน์ง• ์ถ”์ถœ๊ณผ ๋”ฅ๋Ÿฌ๋‹ ์ž„๋ฒ ๋”ฉ์„ ๊ฒฐํ•ฉํ•˜์—ฌ 3D ์‹ฌ์žฅ ์˜์ƒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•˜๊ณ  AS ์ค‘์ฆ๋„๋ฅผ ๋ถ„๋ฅ˜ํ•˜๋Š” ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.

์ฃผ์š” ํŠน์ง•

  • ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์ ‘๊ทผ๋ฒ•: Handcrafted Radiomics + ๋”ฅ๋Ÿฌ๋‹ ์ž„๋ฒ ๋”ฉ ๊ฒฐํ•ฉ
  • Multi-fold DL ์ž„๋ฒ ๋”ฉ: fold ๋ณ„ DL ๊ฐ€์ค‘์น˜๋ฅผ ๋ฐ”๊ฟ” 5ํšŒ ๋ฐ˜๋ณต ํ‰๊ฐ€ (๋ฐ์ดํ„ฐ ๋ถ„ํ• ์€ ๊ณ ์ • hold-out โ€” ๊ต์ฐจ๊ฒ€์ฆ ์•„๋‹˜)
  • ์ด์ค‘ ๋ถ„๋ฅ˜ ๋ชจ๋“œ: Binary (nonsevere/severe) ๋ฐ Multi-class (normal/nonsevere/severe) ๋ถ„๋ฅ˜ ์ง€์›
  • nnUNet ํ†ตํ•ฉ: ์‚ฌ์ „ ํ›ˆ๋ จ๋œ nnUNet ์ธ์ฝ”๋” ํ™œ์šฉ ๊ฐ€๋Šฅ
  • Gated Fusion: Learnable gate๋ฅผ ํ†ตํ•œ adaptive feature fusion
  • Soft Voting Ensemble: DL + ML ๋ชจ๋ธ ์•™์ƒ๋ธ”
  • ์œ ์—ฐํ•œ ํŠน์ง• ์„ ํƒ: LASSO, RFE, Univariate, Mutual Info, Random Forest ์ง€์›

๋น ๋ฅธ ์‹œ์ž‘

๋ฉ”์ธ ํŒŒ์ดํ”„๋ผ์ธ ์‹คํ–‰

# Multi-class ๋ถ„๋ฅ˜ ๋ชจ๋“œ๋กœ ์ „์ฒด ํŒŒ์ดํ”„๋ผ์ธ ์‹คํ–‰
python main.py

๋”ฅ๋Ÿฌ๋‹ ๋ถ„๋ฅ˜ ๋ชจ๋ธ ํ•™์Šต

# nnUNet ์ธ์ฝ”๋” ์‚ฌ์šฉ (๊ถŒ์žฅ) โ€” ๊ฒฝ๋กœ๊ฐ€ cwd ์ƒ๋Œ€์ด๋ฏ€๋กœ ์ €์žฅ์†Œ ๋ฃจํŠธ์—์„œ ์‹คํ–‰
python DL_Classification/dl_cls_train.py --model_type nnunet --img_size "(32, 384, 320)"

# Custom ResNet50 ์‚ฌ์šฉ
python DL_Classification/dl_cls_train.py --model_type custom --img_size "(56, 448, 448)"

๋”ฅ๋Ÿฌ๋‹ ๋ชจ๋ธ ํ…Œ์ŠคํŠธ ๋ฐ ์‹œ๊ฐํ™”

# Grad-CAM ์‹œ๊ฐํ™” ํฌํ•จ ํ…Œ์ŠคํŠธ โ€” ์ €์žฅ์†Œ ๋ฃจํŠธ์—์„œ ์‹คํ–‰
python DL_Classification/dl_cls_test.py --model_type nnunet --img_size "(32, 384, 320)" --enable_cam

ํ•ต์‹ฌ ์„ค์ • (config.py)

๋ถ„๋ฅ˜ ๋ชจ๋“œ

CLASSIFICATION_MODE = 'multi'  # 'binary' ๋˜๋Š” 'multi'

DL Embedding ์„ค์ •

ENABLE_DL_EMBEDDING = False    # DL embedding ์‚ฌ์šฉ ์—ฌ๋ถ€ (๊ธฐ๋ณธ๊ฐ’ False; ์‚ฌ์šฉํ•˜๋ ค๋ฉด True)
DL_MODEL_TYPE = 'nnunet'       # 'nnunet' ๋˜๋Š” 'custom'
DL_IMG_SIZE = (32, 384, 320)   # nnUNet ๊ถŒ์žฅ: (32, 384, 320)

ํŠน์ง• ์œตํ•ฉ ๋ฐฉ์‹

USE_GATED_FUSION = False       # True: Gated Fusion, False: ์ผ๋ฐ˜ Concat
USE_ENSEMBLE = False           # Soft Voting Ensemble ์‚ฌ์šฉ ์—ฌ๋ถ€

ํŠน์ง• ์„ ํƒ ๋ฐฉ๋ฒ•

FEATURE_SELECTION_METHOD = 'lasso'  # 'lasso', 'rfe', 'univariate', 'mutual_info', 'random_forest', 'none'

๋ฐ์ดํ„ฐ ๋ถ„ํ•  ์„ค์ •

DATA_SPLIT_MODE = 'fix'        # 'random' ๋˜๋Š” 'fix' (๋””๋ ‰ํ† ๋ฆฌ ๊ธฐ๋ฐ˜ ๊ณ ์ • ๋ถ„ํ• )
TEST_SIZE_RATIO = 0.2          # random ๋ชจ๋“œ์—์„œ๋งŒ ์‚ฌ์šฉ
DATA_SPLIT_RANDOM_STATE = 42   # random ๋ชจ๋“œ์—์„œ๋งŒ ์‚ฌ์šฉ

ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

AS_Radiomics/
โ”œโ”€โ”€ config.py                          # ์ „์—ญ ์„ค์ • ๊ด€๋ฆฌ
โ”œโ”€โ”€ main.py                            # ๋ฉ”์ธ ํŒŒ์ดํ”„๋ผ์ธ
โ”œโ”€โ”€ data/                              # ๋ฐ์ดํ„ฐ ๋กœ๋”ฉยท์ „์ฒ˜๋ฆฌ + ๋ฐ์ดํ„ฐ์…‹ ์‹ค์ฒด
โ”‚   โ”œโ”€โ”€ loader.py
โ”‚   โ”œโ”€โ”€ preprocessor.py
โ”‚   โ”œโ”€โ”€ AS_CRF.csv                     # ํ™˜์ž ๋ ˆ์ด๋ธ” ํŒŒ์ผ
โ”‚   โ”œโ”€โ”€ dataprep/                      # ๋ฐ์ดํ„ฐ์…‹ ๊ตฌ์ถ• ์Šคํฌ๋ฆฝํŠธ (1ํšŒ์„ฑ, ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ํ˜ธ์ถœ ์•ˆ ํ•จ)
โ”‚   โ”œโ”€โ”€ datasets/                      # Dataset00* ์˜์ƒยท๋งˆ์Šคํฌ (git ์ œ์™ธ)
โ”‚   โ””โ”€โ”€ datasets_raw/                  # ์›๋ณธ DICOM (git ์ œ์™ธ)
โ”œโ”€โ”€ trainer/                           # ํŠน์ง• ์ถ”์ถœ ๋ฐ ๋ชจ๋ธ ํ•™์Šต
โ”‚   โ”œโ”€โ”€ features_extractor.py
โ”‚   โ”œโ”€โ”€ dl_embedding_extractor.py
โ”‚   โ”œโ”€โ”€ feature_selector.py
โ”‚   โ”œโ”€โ”€ model_factory.py
โ”‚   โ””โ”€โ”€ train.py
โ”œโ”€โ”€ DL_Classification/                 # ๋”ฅ๋Ÿฌ๋‹ ๋ถ„๋ฅ˜ ๋ชจ๋“ˆ
โ”‚   โ”œโ”€โ”€ dl_cls_train.py                # DL ๋ชจ๋ธ ํ•™์Šต
โ”‚   โ”œโ”€โ”€ dl_cls_test.py                 # DL ๋ชจ๋ธ ํ…Œ์ŠคํŠธ
โ”‚   โ”œโ”€โ”€ dl_cls_cam.py                  # Grad-CAM ์‹œ๊ฐํ™”
โ”‚   โ”œโ”€โ”€ dl_cls_model.py                # 3D CNN ๋ชจ๋ธ ์ •์˜
โ”‚   โ”œโ”€โ”€ dl_cls_dataset.py              # ๋ฐ์ดํ„ฐ๋กœ๋”
โ”‚   โ”œโ”€โ”€ dl_cls_config.py               # ์„ค์ • ๋ฐ ํŒŒ์‹ฑ
โ”‚   โ”œโ”€โ”€ dl_cls_valid.py                # ์„ฑ๋Šฅ ํ‰๊ฐ€
โ”‚   โ””โ”€โ”€ nnUNet/                        # nnUNet ์„ค์ • ํŒŒ์ผ
โ”œโ”€โ”€ gated_models/                      # Gated Fusion ๋ชจ๋ธ
โ”‚   โ”œโ”€โ”€ gated_model.py                 # Gated Fusion ๋ ˆ์ด์–ด ๋ฐ ๋ถ„๋ฅ˜๊ธฐ
โ”‚   โ”œโ”€โ”€ gated_trainer.py               # ํ•™์Šต ์Šคํฌ๋ฆฝํŠธ
โ”‚   โ”œโ”€โ”€ gated_feature_extractor.py     # ํŠน์ง• ์ถ”์ถœ๊ธฐ
โ”‚   โ”œโ”€โ”€ gated_pipeline.py              # ํŒŒ์ดํ”„๋ผ์ธ
โ”‚   โ””โ”€โ”€ README.md                      # Gated Fusion ์ƒ์„ธ ๋ฌธ์„œ
โ”œโ”€โ”€ utils/                             # ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ชจ๋“ˆ
โ”‚   โ”œโ”€โ”€ plotter.py                     # ๊ฒฐ๊ณผ ์‹œ๊ฐํ™”
โ”‚   โ”œโ”€โ”€ file_handler.py                # ํŒŒ์ผ ์ €์žฅ ๋ฐ ๊ด€๋ฆฌ
โ”‚   โ”œโ”€โ”€ logger.py                      # ๋กœ๊น… ์‹œ์Šคํ…œ
โ”‚   โ”œโ”€โ”€ data_splitter.py               # ๋ฐ์ดํ„ฐ ๋ถ„ํ• 
โ”‚   โ””โ”€โ”€ ensemble.py                    # Soft Voting Ensemble
โ”œโ”€โ”€ docs/                              # ์ƒ์„ธ ๋ฌธ์„œ (๋ฐ์ดํ„ฐ์…‹/์•„ํ‚คํ…์ฒ˜/์›Œํฌํ”Œ๋กœ์šฐ/์„ค์ •/๊ฒฐ๊ณผ)
โ”œโ”€โ”€ CLAUDE.md                          # ์ฝ”๋”ฉ ์—์ด์ „ํŠธ์šฉ ํ•˜๋“œ ์ปจ์ŠคํŠธ๋ ˆ์ธํŠธ
โ””โ”€โ”€ radiomics_analysis_results/        # ๋ถ„์„ ๊ฒฐ๊ณผ ์ €์žฅ

์›Œํฌํ”Œ๋กœ์šฐ

1. Radiomics ํŠน์ง• ์ถ”์ถœ

  • PyRadiomics๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ handcrafted ํŠน์ง• ์ถ”์ถœ
  • ์ถ”์ถœ ์ „ [0.3828125, 0.3828125, 3.0] mm ๋กœ ๋ฆฌ์ƒ˜ํ”Œ๋ง (Config.RESAMPLED_SPACING, None ์ด๋ฉด ์›๋ณธ spacing)
  • imagesTr๊ณผ imagesVal ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ๋…๋ฆฝ์ ์œผ๋กœ ์ถ”์ถœ ํ›„ ๋ณ‘ํ•ฉ
  • Dilation ์˜ต์…˜ ์ง€์›

2. DL Embedding ์ถ”์ถœ (์„ ํƒ)

  • Fold๋ณ„ ์‚ฌ์ „ ํ›ˆ๋ จ๋œ DL ๋ชจ๋ธ์—์„œ ๊ณ ์ฐจ์› ํŠน์ง• ์ถ”์ถœ
  • nnUNet ๋˜๋Š” Custom ResNet50 ๋ชจ๋ธ ์ง€์›

3. ํŠน์ง• ์œตํ•ฉ

์ผ๋ฐ˜ Concat ๋ฐฉ์‹ (USE_GATED_FUSION = False)

  • Radiomics + DL features๋ฅผ ๋‹จ์ˆœ concatenation

Gated Fusion ๋ฐฉ์‹ (USE_GATED_FUSION = True)

  • Learnable gate๋ฅผ ํ†ตํ•œ adaptive fusion
  • Two-stage learning:
    1. Stage 1: Gated Fusion Layer + MLP Classifier ํ•™์Šต โ†’ imagesVal(test set)๋กœ MLP ์ตœ์ข… ์„ฑ๋Šฅ ํ‰๊ฐ€
    2. Stage 2: Fused features ์ถ”์ถœ โ†’ ์ „ํ†ต์  ML ๋ถ„๋ฅ˜๊ธฐ ํ•™์Šต (fusion_dim ๋ฏธ์ง€์ • ์‹œ radiomics + DL ์ฐจ์› ํ•ฉ. nnUNet ๊ธฐ๋ณธ ์„ค์ •์—์„œ๋Š” 107 + 320 = 427)
  • Gated Fusion ์ด ์ผœ์ ธ ์žˆ์œผ๋ฉด Ensemble ์€ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค (main.py:210-212 ์—์„œ ์กฐ๊ธฐ ๋ฐ˜ํ™˜)

4. ํŠน์ง• ์„ ํƒ

  • LASSO: L1 ์ •๊ทœํ™” ๊ธฐ๋ฐ˜ (ํฌ์†Œ์„ฑ ์œ ๋„)
  • RFE: Recursive Feature Elimination
  • Univariate: F-test ๊ธฐ๋ฐ˜ ๋‹จ๋ณ€๋Ÿ‰ ๊ฒ€์ •
  • Mutual Info: ์ƒํ˜ธ ์ •๋ณด๋Ÿ‰ ๊ธฐ๋ฐ˜
  • Random Forest: ํŠน์ง• ์ค‘์š”๋„ ๊ธฐ๋ฐ˜

5. ๋ชจ๋ธ ํ•™์Šต ๋ฐ ํ‰๊ฐ€

  • ์ „ํ†ต์  ML ๋ถ„๋ฅ˜๊ธฐ: LR, SVM, RF, GB, KNN, NB (๊ธฐ๋ณธ๊ฐ’์€ CLASSIFICATION_MODELS = ['LR', 'SVM', 'RF'])
  • ํ•™์Šต/ํ‰๊ฐ€๋Š” train/test hold-out 1ํšŒ. CV_FOLDS = 5 ๋Š” LassoCV ๋“ฑ ํŠน์ง• ์„ ํƒ ๋‚ด๋ถ€ CV ์—๋งŒ ์“ฐ์ธ๋‹ค
  • ์„ฑ๋Šฅ ๋ฉ”ํŠธ๋ฆญ: Accuracy, F1-Score, AUC, AP

6. Soft Voting Ensemble (์„ ํƒ)

  • DL ๋ชจ๋ธ๊ณผ ML ๋ชจ๋ธ๋“ค์˜ ํ™•๋ฅ ๊ฐ’ ๊ฒฐํ•ฉ
  • DL+LR, DL+RF, DL+SVM ์กฐํ•ฉ
  • Macro-average AUC, AP ๊ณ„์‚ฐ

์ฃผ์š” ๊ธฐ๋Šฅ

1. ์ž๋™ ํด๋ž˜์Šค ๊ฐ€์ค‘์น˜ ๊ณ„์‚ฐ

ํด๋ž˜์Šค ๋ถˆ๊ท ํ˜• ๋ฌธ์ œ๋ฅผ ์ž๋™์œผ๋กœ ํ•ด๊ฒฐ:

# Cross Entropy Loss์— ์ž๋™ ์ ์šฉ
weights = total_samples / (num_classes * class_counts)

2. ๋ ˆ์ด๋ธ” ์ˆœ์„œ ๊ณ ์ •

์ผ๊ด€๋œ ํด๋ž˜์Šค ์ˆœ์„œ ๋ณด์žฅ:

  • Multi-class: ['normal', 'nonsevere', 'severe'] (0, 1, 2)
  • Binary: ['nonsevere', 'severe'] (0, 1)

3. Macro-Average AUC ๊ณ„์‚ฐ

Multi-class ๋ถ„๋ฅ˜์—์„œ One-vs-Rest ๋ฐฉ์‹ ์‚ฌ์šฉ:

# ๊ฐ ํด๋ž˜์Šค๋ฅผ ์ด์ง„ ๋ถ„๋ฅ˜ ๋ฌธ์ œ๋กœ ๋ณ€ํ™˜
y_true_bin = label_binarize(y_true, classes=range(n_classes))
auc_score = roc_auc_score(y_true_bin, y_proba, average='macro', multi_class='ovr')

4. Grad-CAM ์‹œ๊ฐํ™”

๋ชจ๋ธ ํ•ด์„ ๊ฐ€๋Šฅ์„ฑ ํ–ฅ์ƒ (--enable_cam ์ง€์ • ์‹œ, ์ตœ๋Œ€ 20 ์ƒ˜ํ”Œ ร— 3์žฅ):

  • {sample}_key_slices.png: CAM ๋ฐ˜์‘์ด ํฐ ์ƒ์œ„ 12๊ฐœ ์Šฌ๋ผ์ด์Šค
  • {sample}_all_slices.png: ์ „์ฒด ์Šฌ๋ผ์ด์Šค ๊ทธ๋ฆฌ๋“œ
  • {sample}_3d_projection.png: Axial/Coronal/Sagittal 3๋ฐฉํ–ฅ ์ตœ๋Œ€ ๊ฐ•๋„ ํˆฌ์˜(MIP)
  • ์ €์žฅ ์œ„์น˜: DL_Classification/results/{writer_comment}/cam_visualization/fold_{n}/

๋ฐ์ดํ„ฐ ๊ตฌ์กฐ

ํ™˜์ž ๋ ˆ์ด๋ธ” ํŒŒ์ผ (data/AS_CRF.csv)

์ด 120๊ฐœ ์ปฌ๋Ÿผ์ด์ง€๋งŒ ์ฝ”๋“œ๊ฐ€ ์ฝ๋Š” ๊ฒƒ์€ ์•„๋ž˜ 3๊ฐœ๋ฟ์ด๋‹ค (data/loader.py:38).

1์ฐจ๋…„๋„์—ฐ๊ตฌ๋ฒˆํ˜ธ,...,AV_binaryclassification,AS ,...
patient001,...,nonsevere,none,...
patient002,...,severe,severe,...
patient003,...,nonsevere,mild,...
  • AS ๋Š” ์ปฌ๋Ÿผ๋ช… ๋์— ๊ณต๋ฐฑ์ด ํ•˜๋‚˜ ๋ถ™์–ด ์žˆ๊ณ , 1์ฐจ๋…„๋„์—ฐ๊ตฌ๋ฒˆํ˜ธ ๋Š” ํŒŒ์ผ ์„ ๋‘์— BOM ์ด ์žˆ๋‹ค. ์ปฌ๋Ÿผ๋ช… ๋น„๊ต ์‹œ ์ฃผ์˜.

ํŒŒ์ผ ๋ช…๋ช… ๊ทœ์น™

  • ์ด๋ฏธ์ง€ ํŒŒ์ผ: {patient_id}_{sequence}_0000.nii.gz
  • ๋ ˆ์ด๋ธ” ํŒŒ์ผ: {patient_id}_{sequence}.nii.gz

๋ ˆ์ด๋ธ” ๋งคํ•‘

Binary ๋ชจ๋“œ:

# AV_binaryclassification ์ปฌ๋Ÿผ ์‚ฌ์šฉ
'nonsevere' โ†’ 0
'severe' โ†’ 1

Multi-class ๋ชจ๋“œ:

# AS ์ปฌ๋Ÿผ ๋ณ€ํ™˜
'none', 'no' โ†’ 'normal' (0)
'mild', 'moderate', 'pseudosevere' โ†’ 'nonsevere' (1)
'severe', 'very severe' โ†’ 'severe' (2)

๊ฒฐ๊ณผ ๊ตฌ์กฐ

radiomics_analysis_results/
โ””โ”€โ”€ total/
    โ””โ”€โ”€ lasso/
        โ””โ”€โ”€ multi/
            โ”œโ”€โ”€ dlnnunet_32_384_320_gated_20250930_123456/   # USE_GATED_FUSION = True
            โ”‚   โ”œโ”€โ”€ log.txt                                  # ์‹คํ–‰ ๋กœ๊ทธ (์ตœ์ƒ๋‹จ์—๋งŒ ์ƒ์„ฑ)
            โ”‚   โ”œโ”€โ”€ fold_1/
            โ”‚   โ”‚   โ”œโ”€โ”€ fold_1_best_model.pth                # Gated Fusion ๋ชจ๋ธ
            โ”‚   โ”‚   โ”œโ”€โ”€ gated_training.log                   # Gated ํ•™์Šต ๋กœ๊ทธ
            โ”‚   โ”‚   โ”œโ”€โ”€ gated_fusion_predictions_fold_1.csv  # MLP ์˜ˆ์ธก ๊ฒฐ๊ณผ
            โ”‚   โ”‚   โ”œโ”€โ”€ gated_fused_features_all.csv         # fused features (+ _train/_test)
            โ”‚   โ”‚   โ”œโ”€โ”€ model_validation_summary.csv         # MLP/LR/RF/SVM ์„ฑ๋Šฅ ์š”์•ฝ
            โ”‚   โ”‚   โ”œโ”€โ”€ {model}_confusion_matrix.png         # Confusion Matrix
            โ”‚   โ”‚   โ”œโ”€โ”€ test_cases_prediction_results.csv    # ์˜ˆ์ธก ๊ฒฐ๊ณผ
            โ”‚   โ”‚   โ””โ”€โ”€ lasso_feature_analysis.csv           # LASSO ๋ถ„์„
            โ”‚   โ”œโ”€โ”€ fold_2/
            โ”‚   โ””โ”€โ”€ ...
            โ””โ”€โ”€ dlnnunet_32_384_320_ensemble_20250930_123456/  # USE_ENSEMBLE = True (Gated ์™€ ๋ฐฐํƒ€)
                โ””โ”€โ”€ fold_1/
                    โ”œโ”€โ”€ radiomics_features_all.csv           # (+ _train/_test)
                    โ”œโ”€โ”€ model_validation_summary.csv
                    โ”œโ”€โ”€ test_cases_prediction_results.csv
                    โ””โ”€โ”€ ensemble/                            # Ensemble ๊ฒฐ๊ณผ
                        โ”œโ”€โ”€ ensemble_results_fold_1.csv
                        โ””โ”€โ”€ ensemble_model_validation_summary.csv

๊ณ ๊ธ‰ ๊ธฐ๋Šฅ

Gated Fusion ๋ชจ๋ธ

Radiomics์™€ DL features๋ฅผ adaptiveํ•˜๊ฒŒ ์œตํ•ฉ:

h = tanh(W_h [Radiomics; Deep Learning] + b_h)
g = ฯƒ(w_g [Radiomics; Deep Learning] + b_g)
F_fused = g โŠ— h

์ž์„ธํ•œ ๋‚ด์šฉ์€ gated_models/README.md ์ฐธ์กฐ

Soft Voting Ensemble

DL๊ณผ ML ๋ชจ๋ธ์˜ ํ™•๋ฅ ๊ฐ’์„ ํ‰๊ท ํ•˜์—ฌ ์ตœ์ข… ์˜ˆ์ธก:

# DL+LR ์•™์ƒ๋ธ” ์˜ˆ์‹œ
ensemble_proba = (DL_proba + LR_proba) / 2
predicted_class = argmax(ensemble_proba)

์˜์กด์„ฑ

requirements.txt / pyproject.toml ์€ ์—†๋‹ค. ์•„๋ž˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ง์ ‘ ์„ค์น˜ํ•ด์•ผ ํ•œ๋‹ค.

  • torch, tensorboard: ๋”ฅ๋Ÿฌ๋‹ ํ”„๋ ˆ์ž„์›Œํฌ ๋ฐ ํ•™์Šต ๋กœ๊น…
  • monai: ์˜๋ฃŒ ์˜์ƒ ๋”ฅ๋Ÿฌ๋‹ (Custom ResNet50 ๋ฐฑ๋ณธ)
  • nnunetv2: nnUNet encoder ๋กœ๋”ฉ
  • pyradiomics, nibabel, scipy: Radiomics ํŠน์ง• ์ถ”์ถœ ๋ฐ ๋งˆ์Šคํฌ Dilation
  • scikit-learn: ์ „ํ†ต์  ML ๋ฐ ํ‰๊ฐ€
  • pandas, numpy: ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ
  • matplotlib, seaborn: ์‹œ๊ฐํ™”
  • tqdm, natsort: ์ง„ํ–‰ ํ‘œ์‹œ ๋ฐ ํŒŒ์ผ ์ •๋ ฌ

์„ฑ๋Šฅ ํ‰๊ฐ€ ๋ฉ”ํŠธ๋ฆญ

Multi-class (3-class)

  • Accuracy: ์ „์ฒด ์ •ํ™•๋„
  • F1-Score: Macro-average (๋ชจ๋“  ํด๋ž˜์Šค ๋™๋“ฑ)
  • AUC: One-vs-Rest Macro-average
  • AP: Average Precision (Macro-average)

Binary (2-class)

  • Accuracy: ์ „์ฒด ์ •ํ™•๋„
  • F1-Score: Binary ๋ฐฉ์‹
  • AUC: ์–‘์„ฑ ํด๋ž˜์Šค(severe) ๊ธฐ์ค€
  • AP: ์–‘์„ฑ ํด๋ž˜์Šค(severe) ๊ธฐ์ค€

๋ฌธ์ œ ํ•ด๊ฒฐ

DL ๋ชจ๋ธ ๊ฒฝ๋กœ ์˜ค๋ฅ˜

# config.py์˜ get_dl_model_paths()๊ฐ€ {fold: ๊ฒฝ๋กœ} ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
# ํฌ๋งท: ./DL_Classification/weights/{DL_COMMENT_WRITER}/{fold}/best_model.pth
Config.get_dl_model_paths()

CUDA Out of Memory

# Gated Fusion: gated_models/gated_pipeline.py ์˜ train_config ์—์„œ ๋ฐฐ์น˜ ํฌ๊ธฐ ๊ฐ์†Œ
train_config = {
    'batch_size': 8,  # 16 โ†’ 8๋กœ ๊ฐ์†Œ
    ...
}

DL Classification ํ•™์Šต์€ CLI ๋กœ ์กฐ์ •ํ•œ๋‹ค: --batch_size 1 (๊ธฐ๋ณธ๊ฐ’ 2).

Ensemble/Gated Fusion ์‚ฌ์šฉ ์‹œ

# DL Embedding์ด ํ™œ์„ฑํ™”๋˜์–ด์•ผ ํ•จ
ENABLE_DL_EMBEDDING = True
USE_ENSEMBLE = True  # ๋˜๋Š” USE_GATED_FUSION = True

์ฐธ๊ณ  ์ž๋ฃŒ

  • ์ƒ์„ธ ๋ฌธ์„œ ์ธ๋ฑ์Šค: docs/README.md
    • ๋ฐ์ดํ„ฐ์…‹ ์นดํƒˆ๋กœ๊ทธยทํด๋ž˜์Šค ๋ถ„ํฌ: docs/DATASET.md
    • ๋ชจ๋“ˆ ์˜์กด์„ฑยท๋ฐ์ดํ„ฐ ํ๋ฆ„: docs/ARCHITECTURE.md
    • ์‹คํ–‰ ์‹œ๋‚˜๋ฆฌ์˜คยทํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…: docs/WORKFLOWS.md
    • Config ์ „์ˆ˜ ๋ ˆํผ๋Ÿฐ์Šค: docs/CONFIG_REFERENCE.md
    • ๊ฒฐ๊ณผ ๋””๋ ‰ํ† ๋ฆฌ/CSV ์‚ฌ์–‘: docs/RESULTS_LAYOUT.md
    • ์‹คํ—˜ ์„ค๊ณ„ ๊ฒ€ํ†  ๋…ธํŠธ (ํ•ญ๋ชฉ๋ณ„ ์ง„ํ–‰ ์ƒํƒœ๋Š” ๊ฐ ๋ฌธ์„œ์˜ [์™„๋ฃŒ] ํ‘œ์‹œ ์ฐธ์กฐ): docs/notes/
  • ์ฝ”๋”ฉ ์—์ด์ „ํŠธ์šฉ ๊ทœ์•ฝ: CLAUDE.md
  • Gated Fusion ์ƒ์„ธ: gated_models/README.md
  • DL Classification: DL_Classification/ ๋””๋ ‰ํ† ๋ฆฌ

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages