Sprint 1 Evidence
데모 앱 모델 교체 및 시연 검증
2026-05-17 새 MobileCLIP2-S4 checkpoint를 Landmark Assistant 데모 앱에 반영하고, PyTorch, FP32 ONNX, dynamic INT8 ONNX 경로에서 Sprint 1 시연 흐름을 다시 검증한 기록이다.
결론
Sprint 1 시연은 Landmark Assistant 데모 앱 + dynamic INT8 ONNX artifact를 기본 경로로 둔다. 새 모델은 이미지 검색, 자연어 검색, Top-3, 상세보기, 신뢰도 정책, 로그 저장을 통과했다. 이름 검색 탭은 제거했고, 장소명 입력은 자연어 검색의 keyword/catalog 검색으로 처리한다.
광화문과 경복궁 근정문은 새 데이터 보강 후 대표 fixture에서는 분리된다.
다만 넓은 광화문 전경처럼 청와대/산/궁궐 배경이 함께 들어오는 장면은 점수가 낮아
out_of_scope 또는 ambiguous로 내려갈 수 있으므로 Sprint 2 hard-case 데이터 과제로 유지한다.
사용한 모델과 데이터 기준
| Checkpoint | landmark-demo-app/best.pt (MobileCLIP2-S4) |
|---|---|
| W&B export | mobileclip2_s4_fold0_20260517_095559 |
| Dataset split | 4,848 records, 4,569 confirmed, 13 classes, fingerprint 9f1c5b9e7d47ebf46de487370a029ada9437a5e5 |
| Prototype source | ArcFace head weight. 로컬 CPU에서 전체 image-average prototype 재생성이 너무 느려 Sprint 1 검증에는 학습된 class head를 class center로 사용했다. |
| Text catalog fix | contrast_with 문장은 text embedding 입력에는 유지하되 keyword 직접 매칭에서는 제외했다. 부정 문장에 들어간 단어가 검색을 오염시키는 문제를 막기 위해서다. |
구현 변경
- Streamlit UI를 이미지 검색과 자연어 검색 2탭으로 단순화했다.
- 이름 검색 탭과 name lookup 로그 흐름을 제거했다.
40/0/0처럼 Top-1만 고립된 경우는matched로 허용하고,40/30/30처럼 후보가 붙어 있는 경우는ambiguous로 유지하는 isolated-match 정책을 추가했다.- 새
best.pt기준으로prototype_index.json와landmark_text_index.json를 재생성했다. - FP32 ONNX와 dynamic INT8 ONNX artifact를 재생성했다. C 드라이브 공간 부족 때문에 검증 artifact는
D:\landmark-demo-artifacts\에서 생성했다. - 데모 smoke test와 Streamlit UI smoke test 스크립트를 추가했다.
검증 결과
| 검증 | 명령/대상 | 결과 |
|---|---|---|
| Unit tests | python -m pytest tests -q |
3 passed |
| PyTorch smoke | scripts/demo_smoke_test.py --config config.toml |
image 18/18, text 10/10, all pass |
| FP32 ONNX smoke | config.onnx.local.toml |
image 18/18, text 10/10, all pass |
| INT8 ONNX smoke | config.int8.local.toml |
image 18/18, text 10/10, all pass |
| Streamlit UI smoke | scripts/ui_smoke_test.py |
이름 탭 제거, 자연어 Top-3 상세 버튼, 상세 페이지 렌더 통과 |
| INT8 regression | FP32 ONNX vs dynamic INT8 ONNX, 15 fixture | Top-1 agreement 100%, decision agreement 100%, cosine mean 0.99942 |
대표 케이스
| 케이스 | Top-3 | 판정 | 해석 |
|---|---|---|---|
| 광화문 대표 이미지 | gwanghwamun, cheonggyecheon, statue_of_king_sejong |
matched |
Top-1 0.46대, Top-2 0.07 이하라 isolated match로 통과. |
| 경복궁 근정문 대표 이미지 | gyeongbokgung_geunjeongmun, gwanghwamun, jogyesa |
matched |
Top-1 0.45대, 광화문이 Top-2로 남아 있어 Sprint 2 confusion set으로 추적. |
| 광화문 wide shot + 청와대 배경 | gwanghwamun, changgyeonggung, cheongwadae |
out_of_scope |
Top-1은 맞지만 전체 점수가 낮다. 확정 답처럼 보이지 않도록 보수적으로 처리한다. |
| 광화문 gate crop | gwanghwamun, deoksugung, jogyesa |
matched |
대상이 크게 잡히면 광화문으로 안정적으로 분리된다. |
| 화면 캡처 합성 OOS | mmca_seoul, cheonggyecheon, statue_of_king_sejong |
out_of_scope |
후보는 계산되지만 threshold에서 확정 답으로 표시하지 않는다. |
art gallery |
mmca_seoul 포함 Top-1 |
matched |
영어 자연어 검색은 MMCA로 복구. |
palace gate |
gwanghwamun, gyeongbokgung_geunjeongmun 포함 |
matched 또는 ambiguous |
ONNX/INT8 경로에서는 keyword/catalog 기반이라 후보 선택형으로 보여주는 것이 적절하다. |
stream in Seoul |
cheonggyecheon 포함 Top-1 |
matched 또는 ambiguous |
청계천 검색 의도는 충족하지만 ONNX 계열에서는 semantic encoder가 아니라 text catalog matching에 의존한다. |
Artifact 결과
| Artifact | 크기 | latency reference | 상태 |
|---|---|---|---|
| FP32 ONNX | 1,233.16 MB | warm median 684.13 ms | 기준선 |
| dynamic INT8 ONNX | 983.02 MB | warm median 658.95 ms | 팀원 실행 기본값 |
위 latency는 Windows 노트북 ONNX Runtime CPU 기준의 회귀 수치다. 스마트폰 브라우저 시연은 노트북 서버에 접속하는 구조이므로, 실제 스마트폰 NPU 실행 수치와 분리해서 설명한다.
Sprint 1 평가 기준 점검
| 평가 질문 | 판단 | 근거 |
|---|---|---|
| 제시한 Sprint Goal이 결과물로 구현되었는가? | 부분 이상 달성 | 발표 당시 Goal은 US 07, 즉 모델 준비와 핵심 기능 토대작업이었다. 실제 구현은 이를 넘어서 demo app, artifact, 회귀 테스트, 문서화까지 포함했다. |
| 핵심 기능이 실제로 동작하는가? | 동작 확인 | 이미지 검색, 자연어 검색, Top-3, 상세보기, confidence policy, 로그 저장을 smoke/UI 테스트로 확인했다. |
| 사용자가 이해하고 사용할 수 있는가? | 시연 가능 | 이름 탭을 제거해 입력 방식을 이미지/자연어로 단순화했다. 애매한 결과는 확정처럼 보이지 않고 후보 선택형으로 설명한다. |
| Sprint 2 발전 가능성이 보이는가? | 명확함 | 광화문/근정문 sub-landmark, OOS negative 데이터, 실제 모바일 runtime, text encoder export/QAT가 다음 개선 축이다. |
Planning과 결과가 달라 보이는 이유는 Sprint 1 중간에 “모델을 준비하는 것”만으로는 시연 신뢰성을 설명하기 어렵다고 판단했기 때문이다. 그래서 US 07의 토대작업을 유지하되, 팀원이 만질 수 있는 데모 앱과 검증 문서를 함께 만든 방향으로 범위를 조정했다.
남은 리스크
- ONNX/INT8 경로의 자연어 검색은 현재 PyTorch text tower를 싣지 않고 text catalog/keyword 기반으로 동작한다. semantic text search 품질은 PyTorch 경로가 더 강하다.
- 광화문 wide shot처럼 여러 랜드마크와 배경이 한 이미지에 섞이면 Top-1은 맞아도 확신 점수가 낮을 수 있다.
- 실제 스마트폰 브라우저 시연은 폰 화면에서 쓰는 형태이고, 추론은 노트북에서 수행한다. 실제 온디바이스 앱 탑재는 Sprint 2에서 별도 검증해야 한다.
- dynamic INT8은 PC ONNX Runtime 기준으로 동치성이 좋지만, AI Hub w8a16 PTQ와 같은 NPU용 static quantization은 이전 실험에서 mode collapse가 있었다.
Sprint 2 제안
- 경복궁 parent landmark 아래에 광화문, 근정문, 근정전 sub-landmark를 두는 계층형 판정 구조 설계.
- 지원 범위 밖 이미지와 화면 캡처, 흐린 사진, 관광지 아닌 사진을 negative/OOS 데이터로 수집.
- 모바일 앱 runtime에서 실제 메모리, cold start, warm latency, battery 영향 측정.
- 한국어/영어 text catalog를 더 풍부하게 만들고, text encoder ONNX export 또는 lightweight retrieval engine을 분리 검토.
- QAT 또는 mixed precision으로 NPU용 INT8 정확도 붕괴 문제 재도전.