Accepted for Sprint 1 execution
ADR-0002: Training Model Design
작성일: 2026-05-13 · 범위: 모델 구조, loss, 학습 단계, ONNX 산출물
Decision
Sprint 1 모델은 teacher-assisted student retrieval classifier로 설계한다. 사용자에게는 Top-3 landmark 후보를 보여주지만, 내부 모델은 classification head와 embedding retrieval head를 함께 가진다. 배포 artifact는 student ONNX 하나와 JSON prototype index를 기본으로 한다.
Model Stack
| 역할 | 모델 | 사용 목적 | Sprint 1 결정 |
|---|---|---|---|
| Teacher baseline | DINOv2/DINOv3 계열 frozen visual encoder | 이미지 특징 품질 baseline, prototype retrieval 기준점. | 학습 대상이 아니라 embedding 추출 및 baseline 평가에 사용. |
| Image-text reference | MobileCLIP2-S0/S2 또는 SigLIP2 frozen image-text encoder | caption/name 기반 retrieval 가능성 확인. | MobileCLIP2는 경량 image-text 후보로 우선 비교. Sprint 1 배포 모델에는 text encoder를 싣지 않음. |
| Primary student | MobileNetV4 medium 또는 EfficientNet-B2 | ONNX 변환과 휴대폰/노트북 local runtime 시연. | 먼저 MobileNetV4 Conv/Hybrid Medium, EfficientNet-B2로 end-to-end 성능을 비교한다. |
| Accuracy fallback | MobileNetV4 Conv Large, ConvNeXt-Tiny, EfficientNet-B3급 | 작은 student 정확도가 부족할 때 사용. | 정확도 개선 후보. ONNX/mobile latency 확인 전까지 기본값은 아님. |
Student Architecture
student는 하나의 backbone 위에 두 개의 head를 둔다.
| 구성 | 출력 | 용도 |
|---|---|---|
| Backbone | global pooled feature | 이미지의 시각 특징 추출. |
| Embedding head | 512-d L2-normalized embedding | prototype cosine similarity로 Top-3 후보 검색. |
| Classification head | 10~15 class logits | closed-set accuracy, auxiliary supervision, confidence 보조. |
Loss Design
| Loss | 기본 가중치 | 역할 |
|---|---|---|
| Cross Entropy + label smoothing | 1.0 | 지정 landmark class를 정확히 맞히는 기본 목표. |
| ArcFace 또는 cosine margin head | 0.5 | 비슷한 건물끼리 embedding 간격을 벌려 Top-k 혼동을 줄임. |
| Teacher distillation cosine loss | 0.25 | student embedding이 teacher representation을 따라가게 함. Stage 2부터 적용. |
Sprint 1의 가장 작은 성공 경로는 CE-only 또는 CE+ArcFace다. distillation은 baseline이 안정된 뒤 추가한다. 처음부터 모든 loss를 켜지 않는다.
Training Stages
- Stage 0: dataset audit, labels_master.json, split manifest 검증.
- Stage 1: frozen teacher prototype retrieval baseline. 학습 없이 Top-3 Accuracy를 얻는다.
- Stage 1b: MobileCLIP2-S0/S2 frozen image-text/prototype retrieval baseline을 비교한다.
- Stage 2: student CE-only 1 batch overfit, single-GPU smoke, 1 epoch baseline.
- Stage 3: CE+ArcFace 또는 SupCon으로 embedding retrieval 품질 개선.
- Stage 4: teacher distillation 추가. 성능이 오르지 않으면 제거한다.
- Stage 5: ONNX export, Python local inference wrapper, Flutter handoff package 생성.
Inference Scoring
기본 ranking은 student embedding과 class prototype의 cosine similarity로 계산한다. classification softmax는 confidence 보조 신호로만 사용한다. 사용자 표시값은 validation set 기반 calibration이 있으면 calibration percent를 쓰고, Sprint 1 초기에는 prototype score를 class 내 min/max 또는 softmax 형태로 임시 percent 변환한다.
Evaluation Gates
| Gate | 통과 기준 | 실패 시 조치 |
|---|---|---|
| Data gate | audit 통과, split 생성, class별 train/val/test 존재. | labels/file_name/image 구조 수정. |
| Baseline gate | teacher frozen Top-3 baseline 기록. | 데이터 누락/라벨 품질/전처리 확인. |
| Student gate | student가 val Top-3에서 teacher baseline에 근접하거나 초과. | student 용량 상향, ArcFace, distillation, augmentation 조정. |
| ONNX gate | PyTorch와 ONNX output cosine 차이가 작고 Python local demo가 동작. | unsupported op, preprocessing parity, export opset 확인. |
| Demo gate | 사진 입력 → Top-3 percentage 출력 → out_of_scope 안내/log 동작. | Flutter 대신 Python local demo로 fallback. |