์ X-Ray ์ด๋ฏธ์ง์์ ๋ผ๋ฅผ 29๊ฐ ํด๋์ค๋ก ์ธ๊ทธ๋ฉํ ์ด์ ํ๋ ๋ฅ๋ฌ๋ ํ๋ก์ ํธ์ ๋๋ค. ์์ธํ ํ๋ก์ ํธ ์งํ ๋ด์ฉ์ WrapUpReport๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์!
- ํ๋ก์ ํธ ๊ตฌ์กฐ
- ํ๊ฒฝ ์ค์
- ๋น ๋ฅธ ์์
- ์คํ ์งํ ๋ฐฉ๋ฒ
- ์ค์ ํ์ผ ๊ฐ์ด๋
- WandB ์ฌ์ฉ๋ฒ
- TTA (Test Time Augmentation)
- ์์๋ธ (Ensemble)
- ํ์ ๊ท์น
- ๋ํ ์ ์ถ์ฉ CSV ์์ฑ
- ํธ๋ฌ๋ธ์ํ
- ์คํ ์ฒดํฌ๋ฆฌ์คํธ
- 29๊ฐ ํด๋์ค ๋ชฉ๋ก
Xray-Segmentation/
โโโ .gitignore # Git ๋ฌด์ ํ์ผ ๋ชฉ๋ก
โโโ README.md # ์ด ํ์ผ
โโโ requirements.txt # ํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ชฉ๋ก
โโโ main.py # ํ์ต/์ถ๋ก ๋ฉ์ธ ์ฝ๋
โโโ configs/ # ์คํ ์ค์ ํ์ผ (YAML)
โ โโโ base_config.yaml # ๊ธฐ๋ณธ ์ค์ ํ
ํ๋ฆฟ
โ โโโ exp01_fcn_resnet50.yaml # ์คํ 1: FCN ๋ฒ ์ด์ค๋ผ์ธ
โ โโโ exp02_loss_experiment.yaml # ์คํ 2: Loss ์คํ
โ โโโ exp03_augmentation.yaml # ์คํ 3: Augmentation ์คํ
โโโ src/ # ํต์ฌ ์ฝ๋ ๋ชจ๋
โ โโโ __init__.py
โ โโโ dataset.py # ๋ฐ์ดํฐ์
ํด๋์ค
โ โโโ models.py # ๋ชจ๋ธ ์ ์
โ โโโ losses.py # Loss ํจ์
โ โโโ utils.py # ์ ํธ๋ฆฌํฐ ํจ์
โโโ notebooks/ # (์์ฑ ํ์) EDA, ๊ฐ์ธ ์คํ์ฉ ๋
ธํธ๋ถ
โโโ data/ # (Git ๋ฌด์) ๋ฐ์ดํฐ์
์ฌ๋ณผ๋ฆญ ๋งํฌ ๋๋ ๋ณต์ฌ
โโโ saved_models/ # (Git ๋ฌด์) ํ์ต๋ ๋ชจ๋ธ ์ ์ฅ
git clone [repository-url]
cd Xray-Segmentation# conda ์ฌ์ฉ์
conda create -n xray python=3.10
conda activate xray
# ๋๋ venv ์ฌ์ฉ์
python -m venv venv
source venv/bin/activate # Linux/Mac
# venv\Scripts\activate # Windowspip install -r requirements.txt
# PyTorch GPU ๋ฒ์ ์ค์น (CUDA 11.8 ๊ธฐ์ค)
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118๋ฐ์ดํฐ๋ Git์ ์ฌ๋ฆฌ์ง ์์ผ๋ฏ๋ก ์ฌ๋ณผ๋ฆญ ๋งํฌ ๋๋ config ํ์ผ ์์ ์ผ๋ก ์ฐ๊ฒฐํฉ๋๋ค.
# ๋ฐฉ๋ฒ 1: ์ฌ๋ณผ๋ฆญ ๋งํฌ ์์ฑ
ln -s /path/to/Xray-Segmentation/data/train
ln -s /path/to/Xray-Segmentation/data/test
# ๋ฐฉ๋ฒ 2: config ํ์ผ์์ ์ง์ ๊ฒฝ๋ก ์์
# configs/base_config.yaml์ data ์น์
์์ # ๊ธฐ๋ณธ ์คํ (FCN ResNet50)
python main.py --config configs/exp01_fcn_resnet50.yaml --mode train
# Loss ์คํ (BCE + Dice)
python main.py --config configs/exp02_loss_experiment.yaml --mode train
# Augmentation ์คํ
python main.py --config configs/exp03_augmentation.yaml --mode train# ๋ฐฉ๋ฒ 1: main.py ์ฌ์ฉ (config ํ์ผ ํ์)
python main.py --config configs/exp01_fcn_resnet50.yaml --mode inference
# ๋ฐฉ๋ฒ 2: inference.py ์ฌ์ฉ (๋ ๊ฐ๋จ!)
python inference.py --config configs/exp01_fcn_resnet50.yaml
# ๋ฐฉ๋ฒ 3: ๋ชจ๋ธ ๊ฒฝ๋ก ์ง์ ์ง์
python inference.py --model saved_models/exp01/best_model.pt --output output.csv
# ๋ฐฉ๋ฒ 4: ์์ธ ์ต์
์ง์
python inference.py --model saved_models/exp01/best_model.pt \
--model_name fcn_resnet50 \
--test_root data/test/DCM \
--output my_submission.csv \
--threshold 0.5
# ๋ฐฉ๋ฒ 5: TTA ์ฌ์ฉ (์ฑ๋ฅ ํฅ์!)
python inference.py --config configs/exp01_fcn_resnet50.yaml --tta
python inference.py --model saved_models/exp01/best_model.pt --tta --output output_tta.csvpython main.py --config configs/exp01_fcn_resnet50.yaml --mode all# base_config.yaml์ ๋ณต์ฌํ์ฌ ์ ์คํ ํ์ผ ์์ฑ
cp configs/base_config.yaml configs/exp04_your_experiment.yaml# configs/exp04_your_experiment.yaml
experiment:
name: "exp04_deeplabv3" # โ๏ธ ์คํ ์ด๋ฆ ์์
description: "DeepLabV3 ์คํ" # โ๏ธ ์ค๋ช
์ถ๊ฐ
author: "your_name" # โ๏ธ ๋ณธ์ธ ์ด๋ฆ
model:
name: "deeplabv3_resnet101" # โ๏ธ ๋ชจ๋ธ ๋ณ๊ฒฝ
pretrained: true
loss:
name: "bce_dice" # โ๏ธ Loss ๋ณ๊ฒฝ
bce_weight: 0.5
dice_weight: 0.5
save:
dir: "saved_models/exp04_deeplabv3" # โ๏ธ ์ ์ฅ ํด๋ ์์ python main.py --config configs/exp04_your_experiment.yaml --mode train์คํ ๊ฒฐ๊ณผ๋ฅผ ํ ๋ ธ์ ์ด๋ ์คํ๋ ๋์ํธ์ ๊ธฐ๋กํฉ๋๋ค.
| ๋ชจ๋ธ๋ช | ์ค๋ช | ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ |
|---|---|---|
fcn_resnet50 |
FCN with ResNet50 | ๋ฎ์ |
fcn_resnet101 |
FCN with ResNet101 | ์ค๊ฐ |
deeplabv3_resnet50 |
DeepLabV3 with ResNet50 | ์ค๊ฐ |
deeplabv3_resnet101 |
DeepLabV3 with ResNet101 | ๋์ |
deeplabv3_mobilenet |
DeepLabV3 with MobileNet | ๋ฎ์ |
model:
name: "deeplabv3_resnet101" # ์ํ๋ ๋ชจ๋ธ ์ ํ
pretrained: true| Loss๋ช | ์ค๋ช | ์ฌ์ฉ ์ํฉ |
|---|---|---|
bce |
Binary Cross Entropy | ๊ธฐ๋ณธ ๋ฒ ์ด์ค๋ผ์ธ |
dice |
Dice Loss | ํด๋์ค ๋ถ๊ท ํ |
bce_dice |
BCE + Dice ์กฐํฉ | ์์ ์ ์ธ ํ์ต |
focal |
Focal Loss | ์ฌํ ํด๋์ค ๋ถ๊ท ํ |
tversky |
Tversky Loss | FP/FN ๊ฐ์ค์น ์กฐ์ |
# BCE๋ง ์ฌ์ฉ
loss:
name: "bce"
# BCE + Dice ์กฐํฉ
loss:
name: "bce_dice"
bce_weight: 0.5 # BCE ๊ฐ์ค์น
dice_weight: 0.5 # Dice ๊ฐ์ค์น
# Focal Loss
loss:
name: "focal"
alpha: 0.25 # ์์ฑ ํด๋์ค ๊ฐ์ค์น
gamma: 2.0 # focusing parameter
# Tversky Loss
loss:
name: "tversky"
alpha: 0.3 # FP ๊ฐ์ค์น
beta: 0.7 # FN ๊ฐ์ค์นaugmentation:
train:
resize: 512 # ์ด๋ฏธ์ง ํฌ๊ธฐ
horizontal_flip: false # ์ข์ฐ ๋ฐ์ (X-ray๋ ์ฃผ์)
vertical_flip: false # ์ํ ๋ฐ์
rotate: true # ํ์
rotate_limit: 15 # ํ์ ๊ฐ๋ ๋ฒ์ (ยฑ15๋)
brightness_contrast: true # ๋ฐ๊ธฐ/๋๋น ์กฐ์
elastic_transform: true # Elastic ๋ณํ
grid_distortion: true # Grid ์๊ณก
valid:
resize: 512training:
epochs: 50 # ์ด ์ํญ ์
batch_size: 8 # ๋ฐฐ์น ํฌ๊ธฐ (GPU ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ๋ผ ์กฐ์ )
learning_rate: 0.0001 # ํ์ต๋ฅ
weight_decay: 0.000001 # ๊ฐ์ค์น ๊ฐ์
optimizer: "adam" # adam, adamw, sgd
scheduler: "cosine" # null, cosine, step
val_every: 5 # ๊ฒ์ฆ ์ฃผ๊ธฐ
num_workers: 4 # DataLoader ์์ปค ์
n_splits: 5 # K-Fold ์
fold: 0 # ์ฌ์ฉํ fold (0~4)# wandb ๋ก๊ทธ์ธ (์ฒ์ ํ ๋ฒ๋ง)
wandb login
# API ํค ์
๋ ฅ (https://wandb.ai/authorize ์์ ํ์ธ)# ๐ WandB ์ค์
wandb:
enabled: true # false๋ก ๋๋ฉด ๋ก๊น
์ํจ
entity: "let_cv_03" # ํ entity ์ด๋ฆ (๋ณ๊ฒฝ ๊ธ์ง!)
project: "segmentation" # ํ๋ก์ ํธ ์ด๋ฆ (๋ณ๊ฒฝ ๊ธ์ง!)
name: "gh_fcn_resnet50_epoch50" # โ ๏ธ ์คํ ์ด๋ฆ (ํ์ ์์ !)
tags: ["baseline", "fcn"] # ํ๊ทธ (์ ํ)
notes: "FCN ๋ฒ ์ด์ค๋ผ์ธ ์คํ" # ๋ฉ๋ชจ (์ ํ)ํ์: ์ด๋์
_๋ชจ๋ธ_์ถ๊ฐ์ ๋ณด
| ์์ | ์ค๋ช |
|---|---|
gh_fcn_resnet50_baseline |
๊ฐํ, FCN ResNet50 ๋ฒ ์ด์ค๋ผ์ธ |
jh_deeplabv3_bce_dice |
์งํ, DeepLabV3 BCE+Dice Loss |
sm_unet_augmentation |
์๋ฏผ, UNet Augmentation ์คํ |
yj_fcn_cosine_lr |
์์ค, FCN Cosine LR ์ค์ผ์ค๋ฌ |
์คํ ์คํ ํ ์๋ ์ฃผ์์์ ๊ฒฐ๊ณผ ํ์ธ:
- ํ๋ก์ ํธ URL: https://wandb.ai/let_cv_03/segmentation
| ํญ๋ชฉ | ์ค๋ช |
|---|---|
train/step_loss |
๋งค step loss |
train/epoch_loss |
์ํญ ํ๊ท loss |
train/learning_rate |
ํ์ฌ learning rate |
val/loss |
๊ฒ์ฆ loss |
val/dice |
๊ฒ์ฆ ํ๊ท Dice |
val_dice/{class} |
ํด๋์ค๋ณ Dice |
val/predictions |
๐ผ๏ธ ์๊ฐํ ์ด๋ฏธ์ง (Input, GT, Prediction) |
best_dice |
์ต๊ณ Dice (summary) |
best_epoch |
์ต๊ณ ์ฑ๋ฅ ์ํญ (summary) |
validation๋ง๋ค ์๋์ผ๋ก ์์ธก ๊ฒฐ๊ณผ๊ฐ WandB์ ์ด๋ฏธ์ง๋ก ๋ก๊น ๋ฉ๋๋ค!
์๊ฐํ๋๋ ๋ด์ฉ:
- Input: ์๋ณธ X-Ray ์ด๋ฏธ์ง
- Ground Truth: ์ค์ ์ ๋ต ๋ง์คํฌ (์์๋ณ ํด๋์ค)
- Prediction: ๋ชจ๋ธ ์์ธก ๋ง์คํฌ
ํ์ธ ๋ฐฉ๋ฒ:
- WandB ๋์๋ณด๋ ์ ์
- ํด๋น run ํด๋ฆญ
- Media ํญ ๋๋ Charts โ
val/predictionsํ์ธ
์๊ฐํ ์ํ ์ ์กฐ์ :
wandb:
num_vis_samples: 4 # 0์ผ๋ก ์ค์ ํ๋ฉด ์๊ฐํ ์ํจ๋ก์ปฌ ํ ์คํธ์ wandb๋ฅผ ๋๋ ค๋ฉด:
wandb:
enabled: false # false๋ก ๋ณ๊ฒฝ# ์คํ๋ผ์ธ ๋ชจ๋๋ก ์คํ (์ธํฐ๋ท ์์ ๋)
WANDB_MODE=offline python main.py --config configs/exp01.yaml --mode train
# ์คํ ํ ๋์ค์ sync
wandb sync ./wandb/offline-run-*TTA๋ ํ ์คํธ/์ถ๋ก ์ ์ฌ๋ฌ augmentation์ ์ ์ฉํ์ฌ ์์ธก์ ์์๋ธํ๋ ๊ธฐ๋ฒ์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก 0.5~2% Dice score ํฅ์์ ๊ธฐ๋ํ ์ ์์ต๋๋ค.
# CLI์์ --tta ํ๋๊ทธ ์ฌ์ฉ
python inference.py --config configs/exp01.yaml --tta
# ๋ชจ๋ธ ์ง์ ์ง์ + TTA
python inference.py --model saved_models/best_model.pt --tta --output output_tta.csvinference:
threshold: 0.5
batch_size: 2 # TTA ์ฌ์ฉ ์ ๋ฉ๋ชจ๋ฆฌ ๊ณ ๋ คํ์ฌ ์๊ฒ
output_csv: "output_tta.csv"
# ๐ TTA ์ค์
tta:
enabled: true # TTA ํ์ฑํ
horizontal_flip: true # ์ํ ๋ค์ง๊ธฐ (๊ถ์ฅ)
vertical_flip: false # ์์ง ๋ค์ง๊ธฐ
rotate90: false # 90๋ ๋จ์ ํ์
merge_mode: "mean" # "mean" ๋๋ "max"| ์ต์ | ์ค๋ช | ํจ๊ณผ | ์๊ฐ ์ฆ๊ฐ |
|---|---|---|---|
horizontal_flip |
์ข์ฐ ๋ฐ์ | โญโญโญ ๊ฐ์ฅ ํจ๊ณผ์ | x2 |
vertical_flip |
์ํ ๋ฐ์ | โญโญ | x2 |
rotate90 |
90/180/270๋ ํ์ | โญ X-ray์๋ ๋น์ถ์ฒ | x4 |
| ์กฐํฉ | Transform ์ | ์ถ๋ก ์๊ฐ | ๊ถ์ฅ๋ |
|---|---|---|---|
| HFlip๋ง | 2 (์๋ณธ + HFlip) | x2 | โญโญโญ ๊ธฐ๋ณธ ๊ถ์ฅ |
| HFlip + VFlip | 4 (์๋ณธ + HFlip + VFlip + HVFlip) | x4 | โญโญ |
| ๋ชจ๋ ์ต์ | 8 | x8 | โญ ๊ณผ๋ํ ์ ์์ |
X-ray ์ ์ด๋ฏธ์ง ํน์ฑ์ ๊ณ ๋ คํ ๊ถ์ฅ ์ค์ :
tta:
enabled: true
horizontal_flip: true # โ
์ข/์ฐ ์ ๋์นญ, ๋งค์ฐ ํจ๊ณผ์
vertical_flip: false # โ ์์ ํน์ ๋ฐฉํฅ์ด๋ผ ํจ๊ณผ ์ ํ์
rotate90: false # โ X-ray ํน์ฑ์ ๋น์ถ์ฒ
merge_mode: "mean" # mean์ด max๋ณด๋ค ์์ ์ | ๋ฐฉ๋ฒ | ์ค๋ช | ํน์ง |
|---|---|---|
mean |
๋ชจ๋ ์์ธก์ ํ๊ท | ์์ ์ , ๋ ธ์ด์ฆ ๊ฐ์ |
max |
๋ชจ๋ ์์ธก ์ค ์ต๋๊ฐ | ๋ฏผ๊ฐ๋ ๋์, FP ์ฆ๊ฐ ๊ฐ๋ฅ |
batch_size๋ฅผ ์ค์ด์ธ์.
# ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ์
inference:
batch_size: 1 # ๋ฐฐ์น ํฌ๊ธฐ ์ค์ด๊ธฐ
tta:
enabled: true
horizontal_flip: true # ํ์ํ ๊ฒ๋ง ์ฌ์ฉ์ฌ๋ฌ ๋ชจ๋ธ์ ์์ธก ๊ฒฐ๊ณผ๋ฅผ ๊ฒฐํฉํ์ฌ ์ฑ๋ฅ์ ํฅ์์ํค๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก 1~3% Dice score ํฅ์์ ๊ธฐ๋ํ ์ ์์ต๋๋ค.
# CSV ํ์ผ ์์๋ธ (๊ฐ์ฅ ๊ฐ๋จ)
python ensemble.py --csvs output1.csv output2.csv output3.csv \
--output ensemble.csv
# ๊ฐ์ค์น ๊ธฐ๋ฐ ์์๋ธ (์ฑ๋ฅ ์ข์ ๋ชจ๋ธ์ ๋์ ๊ฐ์ค์น)
python ensemble.py --csvs output1.csv output2.csv output3.csv \
--weights 0.5 0.3 0.2 \
--method weighted_average \
--output ensemble_weighted.csv
# Config ํ์ผ ์ฌ์ฉ (๊ถ์ฅ)
python ensemble.py --config configs/ensemble/ensemble_csv_simple.yaml| ๋ฐฉ๋ฒ | ์ค๋ช |
|---|---|
simple_average |
๋ชจ๋ ๋ชจ๋ธ์ ํ๋ฅ ๊ฐ ํ๊ท |
weighted_average |
์ฑ๋ฅ ๊ธฐ๋ฐ ๊ฐ์ค์น ํ๊ท |
max_voting |
๊ฐ ํฝ์ ์์ ์ต๋ ํ๋ฅ ๊ฐ ์ ํ |
hard_voting |
์ด์งํ ํ ๋ค์๊ฒฐ |
rank_average |
์์ ๊ธฐ๋ฐ ํ๊ท |
geometric_mean |
๊ธฐํํ๊ท |
# Step 1: ์ฌ๋ฌ ๋ชจ๋ธ ํ์ต
python main.py --config configs/exp01_unetpp_efficientb4.yaml
python main.py --config configs/exp02_unetpp_mobilenet.yaml
python main.py --config configs/exp03_deeplabv3_resnet50.yaml
# Step 2: ๊ฐ ๋ชจ๋ธ๋ก ์ถ๋ก
python inference.py --config configs/exp01_unetpp_efficientb4.yaml
python inference.py --config configs/exp02_unetpp_mobilenet.yaml
python inference.py --config configs/exp03_deeplabv3_resnet50.yaml
# Step 3: ์์๋ธ
python ensemble.py --csvs exp01_output.csv exp02_output.csv exp03_output.csv \
--method simple_average \
--output final_ensemble.csv# configs/ensemble/my_ensemble.yaml
ensemble:
method: "weighted_average"
csv_files:
- "exp01_output.csv" # dice: 0.95
- "exp02_output.csv" # dice: 0.93
- "exp03_output.csv" # dice: 0.91
# Validation Dice Score ๊ธฐ๋ฐ ๊ฐ์ค์น
weights: [0.5, 0.3, 0.2]
output_csv: "ensemble_output.csv"
threshold: 0.5โ
๋ค์์ฑ ํ๋ณด: ์๋ก ๋ค๋ฅธ ์ํคํ
์ฒ, ๋ฐฑ๋ณธ, ์ด๋ฏธ์ง ํฌ๊ธฐ ์ฌ์ฉ
โ
๊ฐ์ค์น ์ค์ : Validation Dice Score ๊ธฐ๋ฐ์ผ๋ก ๊ฐ์ค์น ๋ถ์ฌ
โ
์ ์ ํ ๊ฐ์: 3~5๊ฐ ๋ชจ๋ธ์ด ์ผ๋ฐ์ ์ผ๋ก ์ถฉ๋ถ
โ
๋ฐฉ๋ฒ ์ ํ: Simple Average๋ก ์์, ์ฑ๋ฅ ์ฐจ์ด ํฌ๋ฉด Weighted Average
๋ ์์ธํ ๋ด์ฉ์ ์์๋ธ ๊ฐ์ด๋๋ฅผ ์ฐธ๊ณ ํ์ธ์.
# ์๋ก์ด ์คํ์ ๋ณธ์ธ ๋ธ๋์น์์ ์งํ
git checkout -b exp/ํ๊ธธ๋/loss_experiment
# ์์
์๋ฃ ํ main์ merge
git checkout main
git merge exp/ํ๊ธธ๋/loss_experiment# ํ์: [ํ์
] ๋ด์ฉ
# ์์
git commit -m "[exp] exp04 Loss ์คํ ์ถ๊ฐ"
git commit -m "[fix] dataset ๊ฒฝ๋ก ๋ฒ๊ทธ ์์ "
git commit -m "[feat] Cosine scheduler ์ถ๊ฐ"
git commit -m "[docs] README ์ฌ์ฉ๋ฒ ์
๋ฐ์ดํธ"exp[๋ฒํธ]_[์คํ๋ด์ฉ].yaml
# ์์
exp01_fcn_resnet50.yaml # ๋ชจ๋ธ ์คํ
exp02_loss_bce_dice.yaml # Loss ์คํ
exp03_augmentation.yaml # Augmentation ์คํ
exp04_scheduler_cosine.yaml # ์ค์ผ์ค๋ฌ ์คํ
์คํ ํ ์๋ ์ ๋ณด๋ฅผ ํ๊ณผ ๊ณต์ ํฉ๋๋ค:
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ์คํ ๋ฒํธ | exp04 |
| ์คํ์ | ํ๊ธธ๋ |
| ๋ณ๊ฒฝ ์ฌํญ | DeepLabV3 + Dice Loss |
| Best Dice | 0.9523 |
| ํ์ต ์๊ฐ | 2์๊ฐ |
| ํน์ด์ฌํญ | epoch 30์์ ์๋ ด |
# Config ํ์ผ ์ฌ์ฉ (๊ถ์ฅ)
python inference.py --config configs/exp01_fcn_resnet50.yaml
# ๋๋ ์ง์ ๋ชจ๋ธ ๊ฒฝ๋ก ์ง์
python inference.py --model saved_models/exp01/best_model.pt \
--output submission.csv| ์ต์ | ์ค๋ช | ๊ธฐ๋ณธ๊ฐ |
|---|---|---|
--config |
Config yaml ํ์ผ ๊ฒฝ๋ก | - |
--model |
ํ์ต๋ ๋ชจ๋ธ ํ์ผ (.pt) | - |
--model_name |
๋ชจ๋ธ ์ด๋ฆ | fcn_resnet50 |
--test_root |
ํ ์คํธ ์ด๋ฏธ์ง ๊ฒฝ๋ก | data/test/DCM |
--output |
์ถ๋ ฅ CSV ํ์ผ๋ช | output.csv |
--image_size |
์ ๋ ฅ ์ด๋ฏธ์ง ํฌ๊ธฐ | 512 |
--threshold |
์ด์งํ ์๊ณ๊ฐ | 0.5 |
--batch_size |
๋ฐฐ์น ํฌ๊ธฐ | 2 |
--tta |
๐ TTA ์ฌ์ฉ (์ฑ๋ฅ ํฅ์) | false |
image_name,class,rle
image001.png,finger-1,1 5 10 3 ...
image001.png,finger-2,20 8 35 12 ...
...- ํ
์คํธ ๋ฐ์ดํฐ ๊ฒฝ๋ก๊ฐ ์ฌ๋ฐ๋ฅธ๊ฐ? (
data/test/DCM) - ํ์ต๋ ๋ชจ๋ธ ํ์ผ(.pt)์ด ์กด์ฌํ๋๊ฐ?
- ๋ชจ๋ธ ์ด๋ฆ(
--model_name)์ด ํ์ต ๋์ ๋์ผํ๊ฐ? - CSV ํ์ผ์ด ์ ์์ ์ผ๋ก ์์ฑ๋์๋๊ฐ?
- CSV ํ์ผ ํฌ๊ธฐ๊ฐ ์ ์ ํ๊ฐ? (๋น ํ์ผ ์๋์ง)
- ๐ TTA ์ฌ์ฉ ์ฌ๋ถ๋ฅผ ๊ณ ๋ คํ๋๊ฐ? (
--ttaํ๋๊ทธ)
# ๋ฐฐ์น ์ฌ์ด์ฆ ์ค์ด๊ธฐ
training:
batch_size: 4 # 8 โ 4
# ๋๋ ์ด๋ฏธ์ง ํฌ๊ธฐ ์ค์ด๊ธฐ
image:
size: 256 # 512 โ 256# num_workers ๋๋ฆฌ๊ธฐ
training:
num_workers: 8 # 4 โ 8
# ๋๋ ๊ฐ๋ฒผ์ด ๋ชจ๋ธ ์ฌ์ฉ
model:
name: "deeplabv3_mobilenet"# 1. Loss ๋ณ๊ฒฝ
loss:
name: "bce_dice"
# 2. Learning rate ์กฐ์
training:
learning_rate: 0.00001 # ์ค์ด๊ธฐ
# 3. Augmentation ์ถ๊ฐ
augmentation:
train:
rotate: true
brightness_contrast: true# config ํ์ผ์ ๊ฒฝ๋ก ํ์ธ
data:
train_image_root: "../Segmentation/train/DCM"
# ์ค์ ๊ฒฝ๋ก๊ฐ ๋ง๋์ง ํ์ธ!
# ์๋ ๊ฒฝ๋ก ๋์ ์ ๋ ๊ฒฝ๋ก ์ฌ์ฉ
data:
train_image_root: "/home/user/data/Segmentation/train/DCM"์๋ก์ด ์คํ ์ ํ์ธ์ฌํญ:
- ์ config ํ์ผ ์์ฑํ๋๊ฐ?
- ์คํ ์ด๋ฆ(
experiment.name)์ ๊ณ ์ ํ๊ฒ ์ค์ ํ๋๊ฐ? - ์ ์ฅ ํด๋(
save.dir)๋ฅผ ์คํ๋ณ๋ก ๋ค๋ฅด๊ฒ ์ค์ ํ๋๊ฐ? - ์ถ๋ ฅ CSV(
inference.output_csv)๋ฅผ ์คํ๋ณ๋ก ๋ค๋ฅด๊ฒ ์ค์ ํ๋๊ฐ? - ์คํ์ ์ด๋ฆ(
experiment.author)์ ์ ๋ ฅํ๋๊ฐ? - ๋ฐ์ดํฐ ๊ฒฝ๋ก๊ฐ ์ฌ๋ฐ๋ฅธ๊ฐ?
- WandB ์ค์ :
wandb.name์ ๋ณธ์ธ ์ด๋์ + ์คํ ์ ๋ณด๋ก ์ค์ ํ๋๊ฐ? - WandB ์ค์ :
wandb.tags์ ์คํ ํค์๋๋ฅผ ์ถ๊ฐํ๋๊ฐ?
| ๋ฒํธ | ํด๋์ค๋ช | ์ค๋ช |
|---|---|---|
| 0-18 | finger-1 ~ finger-19 | ์๊ฐ๋ฝ ๋ผ |
| 19 | Trapezium | ๋๋ฅํ๊ณจ |
| 20 | Trapezoid | ์๋ฅํ๊ณจ |
| 21 | Capitate | ์ ๋๊ณจ |
| 22 | Hamate | ์ ๊ตฌ๊ณจ |
| 23 | Scaphoid | ์ฃผ์๊ณจ |
| 24 | Lunate | ์์๊ณจ |
| 25 | Triquetrum | ์ผ๊ฐ๊ณจ |
| 26 | Pisiform | ๋์๊ณจ |
| 27 | Radius | ์๊ณจ |
| 28 | Ulna | ์ฒ๊ณจ |
| ์ด๋ฆ | ์ญํ | ๋ด๋น ์คํ |
|---|---|---|
| ๋ฐ์๋ฒ | ๋ฉ์์ด | EDA, data preprocessing, loss, augmentation |
| ์์ง๊ฒฝ | ๋ฉ์์ด | model, augmentation, feature research |
| ์ด๊ฐํ | ๋ฉ์์ด | setting, model, fine-tuning |
| ์ดํ์ค | ๋ฉ์์ด | EDA, data preprocessing, loss, feature research |
| ํฉ์๋ฐฐ | ๋ฉ์์ด | model, augmentation, feature research |
Happy Experimenting! ๐