Accepted with verification gates

ADR-0004: Image Recognizer Model Selection — MobileCLIP2-S4

작성일: 2026-05-14 · 범위: Sprint 1 image recognizer 단일 후보 확정 · 선행 결정: ADR-0001, ADR-0002, ADR-0003

Decision

Sprint 1 image recognizer는 MobileCLIP2-S4 단일 후보로 확정한다. ADR-0003에서 image recognizer 후보로 남겨둔 MobileCLIP2-B/S4와 MobileNetV4 Hybrid 중, ADR-0003의 dual-engine retrieval 방향과 가장 잘 맞고 image-text shared embedding 자산을 그대로 재사용할 수 있는 MobileCLIP2-S4를 선택한다.

Why MobileCLIP2-S4

관점근거
Pretraining 규모 DFNDR-2B (~2B image-text)로 pretrain되어, IN-12k 기반 MobileNetV4 대비 약 2배 이상 큰 시각 표현 자산을 가진다. confirmed records 1,841 / 4 classes의 작은 학습셋에서는 pretrain 품질이 final accuracy를 결정한다.
ADR-0003 dual-engine과의 정합 image와 text가 같은 embedding space로 정렬되어 있어, ADR-0003의 fusion 입력으로 사용할 image score와 text score를 같은 단위(cosine similarity)로 다룰 수 있다. 별도 align 단계가 필요 없다.
Top-3 + 유사 랜드마크 변별 contrastive 학습으로 임베딩 공간에서 비슷한 개념을 떨어뜨리는 것이 본업이다. ADR-0001의 hard negative tuning(경복궁/창덕궁 류 한국 전통 건축물 변별) 요구와 잘 맞는다.
Out-of-scope reject cosine similarity threshold가 classification softmax보다 OOD에 견고하다. ADR-0001/0002의 reject gate 정책에 자연스럽다.
Caption supervision 활용 labels_master.jsonname_anchor, visual_feature 영문 caption을 학습 신호로 사용 가능하다. MobileNetV4 supervised 경로에서는 이 caption을 버려야 한다.
온디바이스 latency iPhone12 Pro Max 기준 image encoder 19.6ms (text encoder 6.6ms는 앱 미탑재). Sprint 1 latency 목표 1초에 충분히 부합한다.
온디바이스 사이즈 image encoder ~321.6M params, FP16 ONNX 약 640MB. ADR-0001의 50MB 목표는 hard stop이 아니라 보고 지표이며, 정확도 1순위 정책상 320~640MB 다운로드는 수용 가능 범위로 판단한다(2026 모바일 기준).

Why Not MobileNetV4 (Hybrid Large / Conv-AA Large in12k)

MobileNetV4 Hybrid Large는 fallback 후보로 남긴다. MobileCLIP2-S4가 ONNX gate 또는 5-fold 확장에서 실패하거나, partial fine-tune으로 학습이 불안정해질 경우 즉시 전환한다.

Why Not MobileCLIP2-B / S3

Empirical Evidence (Fold 0)

현재 가용한 학습 결과는 fold 0 1회분이다. 4 모델 모두 locked_test_plus_5fold_trainval seed 20260513, 4 classes (mmca_seoul, cheongwadae, naksan_park, myeongdong_cathedral), confirmed 1,841, trainval 1,564, test 277, holdout_non_confirmed 232에서 동일 split으로 학습됐다. dataset_fingerprint c95c8a5e33cfa6455fd468ac4366a7e8fbd2bee2.

모델best val_top1best val_top3final val_top1 test_top1test_top3runtimemin train_loss
mobileclip2_s4 0.99051.00000.9746 0.98190.9928928s0.3193
mobileclip2_s3 0.98731.00000.9714 0.95670.9928596s0.3029
mobilenetv4_conv_aa_large_in12k 0.99051.00000.9810 0.97470.9964377s0.2431
mobilenetv4_hybrid_large 0.99371.00000.9841 0.97831.0000395s0.2477
이 결과만으로 모델을 확정할 수는 없다. val_top3가 4 모델 모두 1.0으로 saturated이며, val_top1/test_top1 차이가 fold 분산 안에 들어올 가능성이 높다. test_top1만 보면 mobileclip2_s4가 1위(0.9819), val_top1만 보면 mobilenetv4_hybrid가 1위(0.9937)다. 따라서 본 ADR의 결정은 fold 0 결과 + ADR-0003과의 아키텍처 정합성 + pretrain 자산의 종합 판단이며, "수치만으로 가장 좋아서"가 아니다.

Risks & Mitigations

리스크완화
4 클래스에서 측정한 0.99 saturation은 10-15 클래스로 확장 시 깨질 수 있다. 클래스 추가(특히 시각적으로 유사한 한국 전통 건축물)마다 재학습. 새 fingerprint로 W&B 분리 기록.
fold 0만 돌아 모델 간 차이가 fold 분산에 묻혔을 수 있다. 5-fold 전체 실행을 ONNX export gate 이전에 완료. mean ± std 기준 finalist 재확인.
MobileCLIP2 ONNX export 전 reparameterize_model() 누락 시 export 실패. train.py 또는 export 스크립트에 reparam 강제 step 추가. PyTorch ↔ ONNX cosine 차이 임계 검사.
MobileCLIP2 fine-tune 초기 epoch이 불안정 (epoch 1 val_top1 0.64). partial fine-tune 유지(현재 설정), warmup 추가 검토, head-only 1 epoch 후 backbone unfreeze 옵션 보유.
~640MB FP16 다운로드가 일부 사용자/환경에서 부담. Sprint 2에서 INT8 양자화 또는 MobileCLIP2-B로 device-tier 분기. Sprint 1은 정확도 우선.
Tesla P100 16GB에서 S4 (321M) full fine-tune은 VRAM 부담. partial fine-tune + batch_size_per_gpu=8 유지. gradient accumulation, FP16 AMP 활용.
ADR-0001은 DINOv3 visual teacher + SigLIP2 image-text teacher로 distillation을 명시했다. 본 ADR은 Sprint 1 student 단독 트랙을 우선한다. teacher distillation은 5-fold + per-class 결과 후 phase3에서 옵션으로 추가하되, MobileCLIP2-S4 자체가 강한 pretrain을 가지므로 KD 미적용도 허용.

Verification Gates

Gate통과 기준실패 시 조치
K-Fold gate 5-fold mean val_top1 ≥ MobileNetV4-Hybrid 5-fold mean − 1.0%, std ≤ 1.5%. MobileNetV4-Hybrid로 fallback 전환.
Per-class gate 최저 클래스 val_top1 ≥ 0.90 (특히 cheongwadae 196장 같은 소수 클래스). 해당 클래스 augmentation 강화, ArcFace margin 조정.
OOD gate holdout_non_confirmed 232장에서 cosine similarity 분포가 confirmed와 분리됨 (시각적 검사 + AUROC smoke). threshold 보정 또는 dual-engine fusion에서 image score 가중치 하향.
ONNX gate reparam 후 export 성공, PyTorch ↔ ONNX output cosine 차이 ≤ 1e-3, Python local inference 동작. opset 변경, unsupported op 우회, 또는 MobileNetV4-Hybrid fallback.
Demo gate 사진 입력 → Top-3 percentage 출력 → out_of_scope 안내/log 동작. Flutter 대신 Python local demo로 fallback (ADR-0001 Demo Ladder).

Consequences

References