# NIST UHCS 데이터셋 (curl 다운로드, 257MB)
micrographs.zip → microstructures.sqlite
↓ 클래스 레이블 조인
961장 이미지 → train/val 80:20 분할
↓ DataLoader (batch=32)
ImageNet Normalize → 학습 파이프라인
# 원본 ResNet50 FC 교체 model.fc = nn.Sequential( nn.Linear(2048, 512), nn.BatchNorm1d(512), # 학습 안정화 nn.ReLU(inplace=True), nn.Dropout(p=0.4), # 과적합 억제 nn.Linear(512, 128), nn.BatchNorm1d(128), nn.ReLU(inplace=True), nn.Dropout(p=0.3), nn.Linear(128, 7) # 7개 클래스 )
| Optimizer | AdamW (weight_decay=1e-4) |
| LR Scheduler | CosineAnnealingLR (T_max=30, η_min=1e-6) |
| Loss | CrossEntropyLoss (label_smoothing=0.1) |
| Gradient Clip | max_norm=1.0 |
| Batch / Epoch | 32 / 30 (CPU, ~3시간 소요) |
| 기법 (파라미터) | 설계 근거 |
|---|---|
| RandomRotation(360°) | 금속 조직은 등방성(isotropic) → 어느 각도 촬영도 동일 조직. 단, 마르텐사이트 침상 방향 다양화에 필수 |
| ColorJitter(b=0.3, c=0.3, s=0.1, h=0.05) | 나이탈/피크랄 등 에천트 종류·농도에 따라 밝기·대비가 달라짐. 색조는 최소화(금속=주로 회색조) |
| RandomAffine(shear=10°, scale=0.9~1.1) | 시편 연마 과정의 미세 왜곡, 현미경 배율 변화 시뮬레이션 |
| GaussianBlur(σ=0.1~1.0) | 현미경 초점 불일치(focus drift), 배율별 해상도 차이 대응 |
| RandomErasing(p=0.2) | 비금속 개재물(inclusion), 기공(porosity) 등 시편 결함 노이즈 모방 |
| RandomGrayscale(p=0.1) | 흑백 광학현미경 이미지 대응 — 일부 NIST 이미지가 grayscale |
| 구간 | Train Acc | Val Acc | 해석 |
|---|---|---|---|
| E1–3 | 40→70% | 43→76% | Val이 Train을 앞섬: ImageNet 사전학습 특징의 즉각 전이 |
| E4–11 | 76→84% | 79→84% | Train≈Val 수렴: 정상적인 파인튜닝 진행 |
| E12–23 | 85→90% | 87→89% | 고원(plateau) 구간 — CosineAnnealingLR이 LR을 점진 감소 |
| E24 | 88.8% | 90.3% ★ | 최고 Val Acc — 모델 저장 |
| E25–30 | 88→89% | 88→89% | 과적합 없음: Train/Val 격차 최소 유지 |
# 후크로 특징맵·기울기 동시 추출 layer.register_forward_hook(save_feature_maps) layer.register_full_backward_hook(save_gradients) # 채널 중요도: 전역 평균 풀링 weights = gradients.mean(dim=[2, 3], keepdim=True) # 가중합 + ReLU (양의 기여만 시각화) heatmap = F.relu((weights * feature_maps).sum(dim=1))
| 클래스 | 예측 | 신뢰도 | 판정 |
|---|---|---|---|
| Martensite | Martensite | 90.2% | ✓ 침상 구조 장축 집중 확인 |
| Pearlite | Pearlite | 92.2% | ✓ 층상 경계면 집중 확인 |
| network | network | 82.7% | ✓ 망상 삼중점 집중 확인 |
| sph.+widmanstatten | sph.+widmanstatten | 90.8% | ✓ 올바른 부위 집중 |
| pearlite+spheroidite | pearlite+spheroidite | 57.3% | ⚠ 낮은 신뢰도 — 혼합 조직 특성 |
| spheroidite | Martensite | 66.4% | ✗ 오분류 — 해당 샘플 비대표성 |
| pearlite+widmanstatten | Pearlite | 36.7% | ✗ 오분류 — 학습 데이터 27장(최소) |
| 클래스 | P | R | F1 | N |
|---|---|---|---|---|
| network | 1.00 | 1.00 | 1.00 | 43 |
| spheroidite | 0.99 | 0.92 | 0.95 | 75 |
| Pearlite | 0.79 | 0.92 | 0.85 | 25 |
| pearlite+spheroidite | 0.89 | 0.77 | 0.83 | 22 |
| Martensite | 0.78 | 0.88 | 0.82 | 8 |
| sph.+widmanstatten | 0.70 | 0.94 | 0.80 | 17 |
| pearlite+widmanstatten | 0.67 | 0.33 | 0.44 | 6 |
| Macro Avg | 0.83 | 0.82 | 0.81 | 196 |
망상(網狀) 시멘타이트의 입계 망상 패턴은 다른 조직과 시각적으로 명확히 구분 → 43장의 적당한 샘플로도 충분한 특징 학습. Grad-CAM에서 삼중점(triple junction)에 활성화 집중 확인
실제 해당 클래스를 잘 잡아내지만(R=0.94), 다른 클래스를 이 클래스로 잘못 분류하는 경우 있음 → Widmanstätten 구조가 spheroidite와 pearlite 경계에 걸쳐 있어 인접 클래스와 혼동
전체 데이터 27장, val 6장 — 통계적으로 신뢰하기 어려운 샘플 수. Recall 0.33은 실제 6장 중 2장만 올바르게 분류했음을 의미. pearlite(층상)와 widmanstatten(침상)의 혼합 조직을 구별할 충분한 패턴을 학습하지 못함
| 플랫폼 | 무료 | 282MB 모델 | Python 서버 | 결과 |
|---|---|---|---|---|
| Streamlit Cloud | ✓ | ✗ (100MB 제한) | ✓ | 탈락 |
| Cloudflare Pages | ✓ | ✓ | ✗ (정적 파일만) | 탈락 |
| Render.com | 부분 | ✓ | ✓ | 슬립모드 문제 |
| Hugging Face Spaces | ✓ | ✓ (LFS 지원) | ✓ (Docker) | 채택 |
FROM python:3.11-slim # OpenCV 런타임 의존성 RUN apt-get install -y \ libglib2.0-0 libgl1 \ libsm6 libxext6 libxrender-dev COPY requirements.txt . RUN pip install -r requirements.txt COPY . . EXPOSE 7860 # HF Spaces 기본 포트 CMD ["streamlit", "run", "app.py", "--server.port=7860", "--server.address=0.0.0.0", "--server.headless=true"]
pearlite+widmanstatten: 27장
통계적 신뢰 구간 자체가 성립하기 어려운 샘플 수. val 6장 기준 F1=0.44는 1~2장 변동에도 크게 흔들림
Austenite·Ferrite 클래스 부재
NIST 데이터셋에 해당 클래스 이미지 없음 → 실제 현장 활용 범위 제한
단일 도메인(UHCS)
초고탄소강(Ultra High Carbon Steel)에 특화 — 일반 탄소강·합금강에 대한 일반화 성능 미검증
클래스 불균형 미보정
weighted sampling 또는 class_weight 적용 없이 label_smoothing만으로 대응 — 희소 클래스에 불리
CPU 전용 학습
30 epoch에 약 3시간 소요 → 하이퍼파라미터 탐색(스케줄러 종류, Dropout율 등) 실험 횟수 제한
앙상블 미적용
단일 모델 추론 — Test-Time Augmentation(TTA)이나 앙상블로 혼합 조직 클래스 성능 개선 여지 있음
단기:
WeightedRandomSampler 도입으로 희소 클래스 오버샘플링
클래스별 Focal Loss 적용 (α, γ 조정)
중기:
GAN 기반 합성 데이터 생성 (마르텐사이트, widmanstatten 증강)
EfficientNet-B3 / Swin Transformer와 백본 비교 실험
장기:
GPU 환경에서 하이퍼파라미터 그리드 서치
UHCS 외 다른 강종 데이터셋으로 도메인 일반화 검증