데이콘(Dacon) 경진대회 — 이미지 기반 구조물 안정성 예측
평가 지표: LogLoss (낮을수록 좋음)
구조물의 정면(front) 과 상면(top) 이미지를 입력받아, 해당 구조물이 안정(stable) 인지 불안정(unstable) 인지를 예측하는 이진 분류 모델입니다.
| 항목 | 내용 |
|---|---|
| 아키텍처 | Dual-View Classifier (정면 + 상면 공유 백본) |
| 백본 모델 | EVA-02 Large, ConvNeXtV2 Large, CAFormer B36 |
| 학습 전략 | 5-Fold CV, AMP, EMA, Mixup/CutMix, Cosine + Warmup |
| 추론 전략 | Fold 앙상블 + TTA(5종) + 멀티 아키텍처 앙상블 |
| 프레임워크 | PyTorch 2.x + timm |
📦 데이컨 공모전/
├── 📄 README.md ← 이 파일
├── 📄 guide.md ← 신입 개발자용 상세 가이드
│
├── 📂 src/ ← 핵심 소스 패키지
│ ├── __init__.py
│ ├── config.py ← 설정(Config dataclass, 모델 프리셋)
│ ├── utils.py ← 유틸리티(시드, 메트릭, EMA, Mixup 등)
│ ├── augmentation.py ← 이미지 증강(학습/검증/TTA)
│ ├── dataset.py ← 데이터셋 & 데이터 로딩
│ ├── model.py ← DualViewClassifier 모델 정의
│ ├── trainer.py ← K-Fold 학습 엔진
│ └── inference.py ← 앙상블 추론 & 제출 파일 생성
│
├── 📄 train.py ← 학습 CLI 스크립트
├── 📄 predict.py ← 추론 CLI 스크립트
├── 📄 run_all.py ← 전체 파이프라인 (학습→추론)
│
├── 📂 train/ ← 학습 데이터 (1000개)
│ ├── TRAIN_001/
│ │ ├── front.png
│ │ ├── top.png
│ │ └── simulation.mp4
│ └── ...
├── 📂 dev/ ← 개발 데이터 (100개, 라벨 있음)
│ ├── DEV_001/
│ │ ├── front.png
│ │ └── top.png
│ └── ...
├── 📂 test/ ← 테스트 데이터 (라벨 없음)
│ ├── TEST_0001/
│ │ ├── front.png
│ │ └── top.png
│ └── ...
│
├── 📄 train.csv ← 학습 라벨
├── 📄 dev.csv ← 개발 라벨
└── 📄 sample_submission.csv ← 제출 양식
- Python ≥ 3.10
- CUDA 지원 GPU (VRAM ≥ 12GB 권장, RTX 4080 Super 테스트 완료)
# 가상환경 생성
python -m venv venv
# 활성화 (Windows)
venv\Scripts\activate
# 활성화 (Linux / macOS)
source venv/bin/activate이후 모든 명령어는 가상환경이 활성화된 상태에서 실행합니다.
터미널 프롬프트 앞에(venv)가 붙으면 정상적으로 활성화된 것입니다.
# PyTorch (CUDA 12.6 기준)
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu126
# 나머지 패키지
pip install timm albumentations opencv-python scikit-learn pandas numpyCUDA 버전이 다르다면 PyTorch 공식 사이트에서 맞는 설치 명령어를 확인하세요.
| 라이브러리 | 버전 |
|---|---|
| PyTorch | 2.9.1+cu126 |
| torchvision | 0.24.1+cu126 |
| timm | 1.0.25 |
| albumentations | 2.0.8 |
| OpenCV | 4.12.0.88 |
| scikit-learn | 1.8.0 |
| pandas | 2.3.2 |
| numpy | 2.2.6 |
# 기본: EVA-02 Large, 5-Fold
python train.py
# 특정 프리셋
python train.py --preset convnextv2_large
# 커스텀 하이퍼파라미터
python train.py --preset eva02_large --epochs 40 --batch_size 6 --lr 3e-5
# 특정 폴드만 학습
python train.py --preset eva02_large --folds 0,1,2# 단일 아키텍처 (폴드 앙상블 + TTA)
python predict.py --preset eva02_large
# 멀티 아키텍처 앙상블
python predict.py --multi_arch
# TTA 비활성화
python predict.py --preset eva02_large --no_tta# 3 아키텍처 학습 + 앙상블 추론
python run_all.py
# 특정 아키텍처만
python run_all.py --presets eva02_large convnextv2_large
# 학습 스킵, 추론만
python run_all.py --skip_train front.png ──→ ┌──────────────┐ ──→ front_feat (1024d)
│ Shared │ ┌──────────┐
│ Backbone │ ──→ │ MLP Head │ ──→ logits (2d)
│ (EVA-02 등) │ └──────────┘
top.png ──→ └──────────────┘ ──→ top_feat (1024d)
concat (2048d)
- 공유 백본: 같은 가중치로 정면·상면을 각각 인코딩 → 파라미터 효율
- MLP Head:
Linear(2048→512) → LN → GELU → Dropout → Linear(512→256) → LN → GELU → Dropout → Linear(256→2)
| 프리셋 | 모델 | 이미지 크기 | 파라미터 |
|---|---|---|---|
eva02_large |
EVA-02 Large Patch14 | 448×448 | ~305M |
eva02_clip |
EVA-02 Large CLIP | 336×336 | ~305M |
convnextv2_large |
ConvNeXtV2 Large | 384×384 | ~198M |
caformer_b36 |
CAFormer B36 | 384×384 | ~99M |
| 전략 | 설정 |
|---|---|
| Cross Validation | StratifiedKFold, 5-Fold |
| 옵티마이저 | AdamW (weight_decay=0.05) |
| 학습률 | Backbone: 2e-5, Head: 2e-4 (10배) |
| 스케줄러 | Linear Warmup (3 epochs) → Cosine Annealing |
| 정밀도 | AMP (FP16 혼합 정밀도) |
| 정규화 | Label Smoothing(0.05), Dropout(0.3), Drop Path(0.2) |
| 데이터 증강 | Resize(+32) → RandomCrop, Mixup(α=0.3) / CutMix(α=1.0), 강한 공간·색상 변환 |
| EMA | Exponential Moving Average (decay=0.9998) |
| Early Stopping | patience=7 |
| Gradient Accumulation | steps=4 (effective batch=16) |
outputs/
├── eva02_large/
│ ├── best_fold0.pt
│ ├── best_fold1.pt
│ ├── ...
│ └── train.log
├── convnextv2_large/
│ └── ...
├── submission.csv ← 단일 아키텍처 제출 파일
└── submission_ensemble.csv ← 멀티 아키텍처 제출 파일
이 프로젝트는 데이콘 경진대회 용도로 작성되었습니다.