尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
군산대학교 공과대학 3호관(지하 1층 ~ 5층)의 실내 길안내 웹앱입니다. 강의실 번호·교수님 성함·학과 사무실로 목적지를 찾으면, 3D 건물 모형과 실제 사진으로 엘리베이터에서 내려 어느 쪽으로 몇 번째 방인지까지 안내합니다. • 졸업작품 · 김민종 · 손의윤 · 문성일 • 주소 : https://minjong0910.github.io/ — 폰 브라우저에서 바로 동작하고, 설정 → 앱 다운로드로 홈 화면에 앱으로 설치할 수 있습니다. 처음 열 때 약 14MB 를 폰에 저장해 두어 인터넷 없이도 열립니다 (AI 사진 판별만 인터넷이 필요합니다). • 출발 위치는 출입문의 QR(정문·후문·동문·서문)이나 직접 고른 층으로 정합니다. QR 은 앱 주소라서 휴대폰 기본 카메라로 찍으면 앱이 열리고 "○문에 계신가요?" 확인 화면이 뜹니다. • 건의함 : 앱 사진이 실제와 다르면 사용자가 사진을 올리고, AI 가 어디인지 짐작해 두면 관리자가 확인해 승인합니다. AI 가 스스로 확정하지 않습니다(아래 「정확도」).查看完整 README ↗
군산대학교 공과대학 3호관(지하 1층 ~ 5층)의 실내 길안내 웹앱입니다. 강의실 번호·교수님 성함·학과 사무실로 목적지를 찾으면, 3D 건물 모형과 실제 사진으로 엘리베이터에서 내려 어느 쪽으로 몇 번째 방인지까지 안내합니다.
미리보기_실행.bat 미리보기 서버를 켠다 → http://localhost:8080 (앱이 열린다)
pwsh -File 도구\오프라인목록.ps1 site/ 를 고쳤으면 — 폰에 저장되는 파일 목록(sw.js)을 새로 쓴다
검사_실행.bat 고친 뒤 올리기 전에 — 파일 검사 + 브라우저 검사 (약 45초)
pwsh -File 검사.ps1 -Full + 1인칭 로드뷰 9가지를 끝까지 재생 (약 4분 더)
앱은 빌드 단계가 없습니다. site/ 폴더가 곧 배포되는 앱이고, 거기 있는 파일을 직접 고칩니다.
필요한 것 : Windows · PowerShell 7(pwsh) · Microsoft Edge (검사가 Edge 헤드리스를 쓴다). Node·Python 은 필요 없습니다.
| 경로 | 내용 |
|---|---|
site/ | 앱 — 이 폴더가 그대로 배포된다 |
site/index.html | 화면 틀(HTML)만. 코드·모양·자료는 아래 파일을 순서대로 부른다 |
site/css/ | 모양 (app.css, 부팅 화면 boot.css) — 크기는 모두 rem, 아래 「화면 크기」 |
site/js/app/ | 앱 코드 25개 파일 (아래 「구조」) |
site/js/vendor/ | three.js r128 · JSZip 3.10.1 · jsQR 1.4.0 |
site/lib/ | TensorFlow.js · MobileNet · Tesseract.js — AI·글자 읽기를 쓸 때만 받는다 |
site/data/photos.js + photos/ | 장소 사진 152곳(한 곳 1장) + 건물·출입문 8장, 그 목록 |
site/data/places.js | AI 가 아는 장소 이름 152곳 (늘 받는 1.4KB) |
site/data/aivec.js · ailib.js | AI 기준 자료 8.5MB · AI 자료집 2MB — 사진으로 찾을 때만 받는다 |
site/3d/ | 「여기가 맞나요?」 화면의 실사 3D (별도 페이지 + 그림 21장) |
site/manifest.webmanifest · site/img/icon-* | 앱 이름("3호관 길안내")·아이콘 — 홈 화면에 설치할 때 쓴다 |
site/sw.js | 인터넷 없이 열기 — 앱 파일 221개(14.3MB)를 폰에 저장 (목록은 도구/오프라인목록.ps1 이 쓴다) |
QR인쇄/ | 출입문 QR 인쇄용 그림 4장(정문_MAIN.png …) + A4 인쇄본 PDF (도구/QR_만들기.ps1 이 만든다) |
tests/ | 자동 검사 (아래 「검사」) |
서버/ | Firestore 보안 규칙 · 콘솔 설정 안내 |
도구/ | AI 자료 넣기 · 인터넷 없이 열기 목록 · 출입문 QR 만들기 · 발표 PDF 만들기 · 라운지 사진 분리 기록 · BLD_사진목록.json(건물·출입문 사진 — 사진을 다시 골라도 이건 그대로 둔다) |
문서/ | 측정 결과 · 한계와 대응 · 발표 자료 · 촬영 안내 |
eval_all.html 등 | 정확도 측정 페이지 (아래 「정확도」) |
batches.json | 사진 1,753장 → 촬영 묶음(층·파일계열·기기). 측정의 기준 |
사진 원본(2.9GB, 사진원본/)은 저장소에 넣지 않습니다.
모든 코드는 브라우저에서 돌아갑니다. 서버는 Firebase(Firestore — 제보·승인 사진, Authentication — 관리자)뿐입니다.
site/index.html 이 부르는 순서가 곧 실행 순서입니다. 앱 코드는 원래 한 파일(1만 6천 줄)이던 것을
기능별로 나눴고, 화면의 onclick="…" 이 함수 이름을 직접 부르기 때문에 대부분 전역 함수입니다
(검사.ps1 이 이름이 겹치지 않는지 확인합니다). 새로 짠 부분은 모듈 객체로 묶었습니다 — SUGAI(AI), SUGDB(서버), QRNAV(QR), NAVGRAPH(길찾기), PWA(설치·오프라인).
| 파일 | 하는 일 |
|---|---|
building.js | 층별 호실 배치 자료(FLOORS_DATA)를 3D 좌표(FLOOR_LAYOUT)로 |
shell.js · ui.js | 화면 전환 go() · 뒤로가기 · 즐겨찾기 · 한/영 · 검색 · 층 버튼 |
view3d.js | 3D 기본 · 장소 좌표 place3D() · 길찾기 그래프 NAVGRAPH · 관리자 후보 평면도 |
overview3d.js · floor-detail.js | 건물 전체 3D(목적지 강조·경로) · 층 상세 |
roadview*.js (8개) | 1인칭 로드뷰 — 층·계단실·지하·옥상·복도를 짓고, 경로를 재생하거나 눌러서 걷는다 |
guide.js | 안내 문장 만들기 buildSteps() — 「내려서 왼쪽으로 도세요 · 오른쪽에서 두 번째 방」 |
photos.js | 장소 사진 목록·표시·관리자 사진 넣기 · 사진 자료 묶음(zip) |
roomfix.js | 관리자 「구성 및 변경」 — 층 지도에서 방을 눌러 번호·이름·메모를 고친다(서버 rooms), 보이는 번호 dispNo() |
suggest.js · sugai.js · sugdb.js · aid.js | 건의함 · AI 판별 · 서버 · AI 자료집 |
qrnav.js · boot.js · zoom.js · start.js | QR · 부팅 화면 · 사진 확대 · 시작 |
pwa.js | 앱 다운로드(설치 안내) · sw.js 등록 · 출입문 QR 주소(?gate=) 받기 — head 에서 일찍 읽는다 |
beforeinstallprompt 를 받아 둠).PWA.install()) — 기기마다 다른 안내 :
안드로이드 크롬·삼성 인터넷은 버튼 한 번에 브라우저 설치 창 · 아이폰·아이패드는 그림 3단계(공유 → 홈 화면에 추가 → 추가, 아이콘·이름과 함께) ·
카카오톡·인스타그램 같은 앱 안 브라우저는 "크롬/사파리로 열기" · 설치 신호가 아직 없는 안드로이드·PC 는 브라우저 메뉴 안내.site/sw.js) — 처음 열 때 site/ 의 파일 221개(14.3MB)를 저장하고, 다음부터는 저장한 것으로 엽니다.
AI 사진 판별 자료(data/aivec.js·ailib.js)와 AI 라이브러리(lib/)는 저장하지 않습니다 — 끊겨 있으면 건의함이
"인터넷이 없어 AI 사진 판별은 쉬어요 — 제보는 그대로 되고, 사람이 확인해요"라고 말하고, 다시 연결되면 다시 받습니다.
파일마다 지문(SHA-256)을 적어 두어, 받은 파일이 목록과 다르면 다시 받고, 새 판이 나오면 바뀐 파일만 받습니다.
site/ 를 고치면 pwsh -File 도구\오프라인목록.ps1 로 목록을 새로 써야 합니다 (안 하면 검사.ps1 이 실패로 알려 줍니다).
미리보기 서버(localhost)에서는 꺼 둡니다 — 고친 파일이 바로 보여야 하니까요 (?sw=1 을 붙이면 켜짐).sw.js 는 첫 화면에 필요한 것(약 700KB)만 먼저 받고 곧바로 넘겨받습니다 — 재 보니 0.4초.
나머지(사진·3D 약 14MB)는 그다음에 배경에서 채웁니다(약 12초). 예전에는 14MB 를 다 받을 때까지 기다려서,
그동안 사용자는 계속 옛 화면을 보고 있었습니다.
② pwa.js 는 새 판이 넘겨받으면 화면을 한 번만 새로 고칩니다. 단 첫 화면일 때만 —
길안내 중이거나 카메라(QR)를 켜는 중이면 미뤄 뒀다가, 첫 화면으로 돌아오거나 앱을 다시 열 때 적용합니다.
처음 설치될 때는 새로 고치지 않습니다(괜히 한 번 깜빡임).
③ 그 새로 고침이 눈에 안 보이게 합니다 — pwa.js 가 sessionStorage에 b3nav_quiet 표시를 남기고,
boot.js 가 그 표시를 보면 켜는 화면(부팅 연출)을 통째로 건너뜁니다. 사용자 눈에는 앱이 한 번만 켜집니다.
사용자가 눌러야 하는 것은 없습니다. 앱을 열면 알아서 최신 판이 됩니다.
※ 옛 판을 지우는 것은 새 판을 다 옮겨 담은 뒤에 합니다. 먼저 지우면 '안 바뀐 파일 옮겨 담기'를 못 해
14MB 를 전부 다시 받게 됩니다.https://minjong0910.github.io/?gate=MAIN (정문 · BACK 후문 · EAST 동문 · WEST 서문).
기본 카메라로 찍으면 앱이 열리고 pwa.js 가 ?gate= 를 떼어 두었다가 QRNAV.fromUrl() 이 확인 화면을 띄웁니다.
앱 안 스캐너로 찍으면 주소를 열지 않고 글자만 읽습니다. 예전 인쇄본(B3NAV1:BLD:MAIN)도 읽습니다.
인쇄 그림은 pwsh -File 도구\QR_만들기.ps1 → QR인쇄/ — 이 PC 에 QR 프로그램이 없어 도구/QR_encode.js 로 직접 만들고,
앱이 쓰는 QR 읽기(jsQR)로 다시 읽어 맞을 때만 저장합니다. 사이트 주소가 바뀌면 qrnav.js 의 SITE_URL 을 고치고 다시 인쇄해야 합니다.설계 기준은 390 × 790 이고, app.css 의 크기는 거의 다 rem 입니다. 1rem = html 의 글자 크기 한 값뿐이라,
그 한 줄만 바꾸면 화면 전체가 같은 비율로 커지고 작아집니다.
html{font-size:16px} — 설계한 그대로 보입니다(안전망 그림이 흔들리지 않게).★ 폰에서만 물체가 통째로 사라지던 진짜 원인 (2026-09-25 해결) — fpEnsureEnvMap() 이 주는 환경맵은
PMREM(CubeUV · mapping 306) 이라 PBR 재질 전용입니다. 폰에서 MeshStandardMaterial 을 MeshPhongMaterial 로
바꿔치면서 이 환경맵을 그대로 넘기면, three.js 가 ENVMAP_TYPE_CUBE_UV 셰이더를 만들고 컴파일에 실패합니다
(콘솔 : SHADER_NAME MeshPhongMaterial … ENVMAP_TYPE_CUBE_UV … syntax error).
컴파일에 실패한 재질은 아무것도 안 그려집니다 — 문짝·난간·의자 다리가 통째로 사라집니다.
데스크톱은 PBR 을 그대로 쓰므로 멀쩡해서, 이 문제는 폰 경로에서만 재현됩니다.
→ 폰 바꿔치기에서 이 환경맵을 뗍니다(view3d.js). 옥상 장면에서만 185개 재질이 이 상태였습니다.
노란 화면·바닥 사라짐 — 1인칭으로 들어갔는데 실내가 안 켜지면(전환이 덜 끝났거나 실내를 못 지었을 때)
조감도의 층 타일이 그대로 보입니다. 그 타일이 「가야 할 층 = 노랑」이라 화면이 통째로 노랗고 바닥이 뚫려 보입니다.
그래서 overview3d.js 는 1인칭에 들어간 순간부터 실내가 보이든 말든 타일을 감춥니다(inFP).
문제 기록(설정) — 기기에서만 나는 문제를 볼 수 있게, 설정에 「문제 기록」 줄을 뒀습니다(pwa.js 의 DIAG).
오류·기기·그래픽칩·해상도 배율·폰재질 여부가 담기고, 그 줄을 누르면 전부 복사됩니다. 평소에는 "이상 없음"만 보입니다.
3D 화질 · 폰에서만 나던 문제 — 폰은 무거움을 줄이려고 view3d.js 에서 MeshStandardMaterial 을
MeshPhongMaterial 로 바꿔치기합니다. 그런데 Phong 에는 envMapIntensity 가 없어 조용히 무시되고
반사 세기(reflectivity)가 기본값 1(최대) 로 남았습니다 → 주변 환경 그림이 재질 색을 덮어써서,
옥상에서는 그 환경이 하늘이라 문·난간이 "투명해 보였습니다"(2026-09-25 에 고침. 데스크톱은 PBR 그대로라 멀쩡해서 재현이 안 됐습니다).
폰에서 계단현상 보정(antialias)도 꺼 두었더니 의자 다리(3.5cm)처럼 얇은 것이 사라져 보여 켰습니다.
폰에서만 나는 문제를 볼 때는 브라우저 폭을 좁힌 뒤 새로고침해야 이 경로가 켜집니다 — 폭만 줄이면 안 켜집니다.
3D 화질 — 해상도 배율은 overview3d.js 의 tunePixelRatio() 가 그때그때 정합니다 :
건물 전체를 밖에서 보는 조감도는 가벼우므로 2배(또렷하게), 1인칭 실내는 무거우므로 1.4배(프레임 지키기).
바닥 격자는 최대로 축소(radius 260)해도 화면을 채우도록 560 으로 넓혀 두었습니다 — 예전 240 이라 뒤가 검게 보였습니다.
font-size:clamp(13.5px, min(4.1vw, 2.03dvh), 19px)
가로는 화면 폭의 4.1%, 세로는 높이의 2.03% 를 재서 작은 쪽을 씁니다 — 폭은 넓은데 키가 작은 폰에서 아래가 잘리지 않습니다.
아주 작거나(13.5px) 아주 크지(19px) 않게 막아 둡니다.px 로 남겨 둔 것 : 테두리·그림자(1~2px 는 굵어지면 안 됨)와 min-width/min-height:44px
(손가락 터치 최소 크기는 기기가 작아도 줄면 안 됨).px 대신 rem 을 쓰세요 (16 으로 나눈 값). 안 그러면 그 부분만 기기에 따라 커지거나 작아집니다.#ph)에는 최소 높이가 있습니다. 예전에는 min-height:0 이라 화면이 짧은 폰에서 높이가 0 이 되어
그 기기에서만 사진이 아예 안 보였습니다.좌표 기준 — +Z = 엘리베이터에서 내려 −X 를 보고 섰을 때 왼쪽 복도. 층 자료의 Top 이 왼쪽 복도입니다
(호실 번호 순서로 추측하면 틀립니다 — 문서/발표자료_모음.txt 20절). 3D 단위는 임의이며 실제 축척이 아닙니다.
"어느 쪽으로 도세요"는 그 사람이 지금 어느 쪽을 보고 서 있느냐에 달려 있습니다. 앱은 세 가지를 구분합니다.
| 상황 | 보고 선 방향 | 안내 문구 |
|---|---|---|
| 2~5층 — 엘리베이터에서 내렸다 | −X (복도 쪽) | 「내려서 왼쪽으로 도세요」 |
| 1층 — 이미 1층에 있다 | +X (엘리베이터를 마주 봄) | 「엘리베이터를 마주 보고 왼쪽으로 도세요」 |
| 1층 — 출입문 QR 로 들어왔다 | 그 문이 향한 쪽 | 「복도로 나와 왼쪽으로 도세요」 |
1층이 다른 이유 : 1층은 엘리베이터를 타고 내리는 층이 아니라 밖에서 걸어 들어오는 층입니다. 1층에 서 있는 사람은 엘리베이터 쪽으로 걸어가 그것을 마주 보므로, 내렸을 때와 좌우가 정반대입니다 (2026-09-24 에 고침 — 그전에는 1층도 '내렸을 때' 기준이라 반대로 안내했습니다).
복도 사진은 도는 방향이 아니라 「목적지가 어느 복도에 있는가」로 고릅니다 (hallCode).
도는 방향으로 고르면 문으로 들어왔을 때 반대 복도 사진이 나옵니다.
복도 이름(1층 왼쪽 복도)은 '내렸을 때' 기준으로 붙은 이름입니다. 그래서 1층처럼 다른 자세를 기준으로
말할 때는 사진 설명에서 좌우를 빼고 1층 복도로만 적습니다 — 안 그러면 "오른쪽으로 도세요" 밑에
"왼쪽 복도"가 적혀 한 화면에서 엇갈려 보입니다.
검사 : tests/check.html 은 내렸을 때 기준만 잽니다(1층은 2층에서 내려온 것으로 계산).
1층에 이미 서 있는 경우는 안전망(tests/golden.html)이 잡습니다.
admins/{UID} 명단에 있는 계정. 규칙은 서버/firestore.rules.apiKey 는 공개용 값 — 막는 일은 규칙이 합니다.)rooms)는 누구나 읽고 관리자만 씁니다. 누가·언제·무엇을 고쳤는지 roomlog 에 남습니다.서버/보안_설정_안내.txt · 2026-10-18 추가분 서버/하루3번_방정보_설정_안내.txt.검사.ps1 은 지금까지 실제로 났던 사고를 잡습니다. 하나라도 걸리면 실패로 끝납니다.
| 검사 | 막는 사고 |
|---|---|
| 부르는 파일·사진 목록의 파일이 모두 있는가 | 파일 빠뜨리고 올림 |
places.js = AI 자료의 장소 | 관리자 목록에서 장소가 빠짐 (v75) |
| 함수 이름이 한 번씩인가 | 같은 이름이 뒤에서 조용히 덮어씀 (v74, fpExitSignTex) |
| 코드에 비밀번호·가짜 진행 문구·글자로 박은 그림이 없는가 | v84 · v85 · 18MB 앱 |
| 첫 화면 1MB 이하 (압축) | 예전 16MB |
| 앱 이름·아이콘 크기·첫 화면 문구·설정 버튼 | 홈 화면에 이름·아이콘이 깨져 보임 |
인터넷 없이 열기 목록(sw.js)이 지금 파일과 같은가 | 고친 뒤 목록을 안 바꿔 폰이 옛 파일을 계속 씀 |
| 출입문 QR 주소 = 이 저장소의 사이트 · 인쇄 그림 4장 | 인쇄해 붙인 QR 이 엉뚱한 곳을 엶 |
앱 검사 tests/check.html | 152곳 접수·이름·층·관리자 목록·3D 위치 · 길안내 좌우·차례 = 사용자 확정 목록·길찾기 그래프 · 실사 3D · 파일마다 문법 |
설치·오프라인 tests/pwa.html | QR 주소로 열기 · 첫 화면 문구(자리·색·누르면 설정) · 기기 흉내 13가지의 설치 안내 · 아이콘 크기 · 14MB 저장 → 인터넷 끊김 흉내에서 앱·사진·3D 가 열리고 AI 는 쉬는가 · 인쇄 QR 4장 다시 읽기 |
안전망 tests/golden.html | 길안내 754가지(한/영) · 사진 160장(바이트) · 화면 글자·모양 · CSS 599개 · 3D 그림 15장이 기록과 같은가 |
로드뷰 tests/roadview.html (-Full) | 경로 미리보기 9가지를 끝까지 재생 · 직접 걸어보기 — 오류 0 |
안전망은 시계를 멈추고 글꼴을 기다려 그리므로, 같은 앱이면 3D 그림까지 점 하나 다르지 않습니다.
일부러 바꾼 화면이면 확인한 뒤 새 기준을 기록합니다 : pwsh -File tests\run_golden.ps1 -Mode capture -Tag v153 (지금 기준은 v152)
(그다음 검사.ps1 · tests/run_golden.ps1 의 기본 -Tag 를 올린다). 검사마다 일부러 망가뜨린 사본으로 실패를 잡는지 확인했습니다.
1. 미리보기_실행.bat
2. http://localhost:8080/gen.html 「생성 시작」 (약 7분) → 생성물/aivec_new.json
3. pwsh -File 도구\AI자료_넣기.ps1 사진·batches.json 과 짝을 확인하고 site/data/aivec.js · places.js 를 쓴다
4. 검사_실행.bat
model/ 폴더(예전 로컬 모델)를 두지 마세요 — 원래 모델과 값이 달라 모든 판별이 틀어집니다 (검사가 막습니다).
사진 AI 모델은 site/ai-model/mobilenet_v2_050_224/ 에 있습니다 (2026-10-21) — tfhub.dev 가 없어지고 Kaggle 은 폰 종류마다 다르게 답해서, Kaggle 이 내주는 같은 모델 파일 그대로(7.9MB)를 받아 두었습니다. sugai.js 의 MODEL_URLS 가 이것을 먼저 쓰고, 검사가 세 파일의 지문(SHA-256)을 지킵니다. 오프라인 저장 목록에서는 뺐습니다(AI 자료처럼 인터넷이 될 때만).
다른 사람이 찍은 사진으로만 잽니다. 같은 사람이 한 번에 찍은 사진(38개 묶음)은 기준에서 빼고 맞힙니다. 처음 온 사용자는 우리가 찍은 사진을 갖고 있지 않기 때문입니다.
2026-09-23 기준 (사진 2,075장 · 4·5층 재촬영 322장을 더한 뒤). 괄호는 재촬영 전(1,753장) 값입니다.
| 종류 | 장수 | 정확한 자리 | 층 | 5등 안 |
|---|---|---|---|---|
| 전체 (강의실 제외) | 1,844 | 55.6% (53.3) | 66.8% (65.6) | 83.9% (82.4) |
| 복도 | 1,189 | 56.8% (55.3) | 67.4% (67.3) | 84.5% (82.7) |
| 라운지·로비 | 210 | 67.1% (64.2) | 80.5% (79.9) | 87.6% (84.9) |
| 복도 — 같은 자리에서 두 장 | 1,178 | 64.9% (61.9) | 74.7% (73.8) | 91.8% (88.2) |
95% 신뢰구간 — 자리 51.7 ~ 58.3%, 층 63.7 ~ 69.9% (촬영 묶음 38개를 통째로 복원추출 2,000번).
재촬영으로 달라진 곳 (가장 나빴던 5층) — 5층 왼쪽 복도 자리 5% → 48% · 층 39% → 63%, 5층 오른쪽 복도 29% → 37% · 47% → 46%, 4층 오른쪽 복도 38% → 61% · 53% → 71%, 창밖 22% → 35%. 두 사람이 다른 날 찍어 촬영자 편중이 풀린 것이 원인입니다.
그래서 앱은 확실할 때만 말합니다 — 1·2등 장소의 유사도 차이(격차)를 확신도로 씁니다. 사진을 반으로 나눠 한쪽에서 문턱을 정하고 다른 쪽에 적용한 값입니다.
| 격차 | 사진의 | 앱이 하는 말 | 시험 결과 (2026-09-23) |
|---|---|---|---|
| ≥ 0.22 | 약 7% | 「아마 여기예요 : ○○」 | 자리 95.2% (재촬영 전 93.1%) |
| ≥ 0.14 | 약 22% | 「층은 ○층 같아요 — 자리는 확실하지 않아요」 | 층 96.1% (재촬영 전 0.16 에서 97.9%) |
| 그 밖 | 「어디인지 알 수 없어요 — 번호판이 보이게 한 장 더」 |
앱의 문턱은 자리 0.22 · 층 0.16 입니다. 반 나눠 검증이 이번에는 층 문턱을 0.14 로 골랐습니다(더 많이 답하고 96.1%). 앱 값(0.16)은 그보다 엄격한 쪽이라 그대로 두었습니다 — 새 사진으로 한 번 더 확인한 뒤 바꿉니다.
1등 유사도는 확신도가 못 됩니다 (유사도로 줄 세우면 상위 10% 도 자리 60.5%) — 그래서 사용자에게 「유사도 %」를 보여 주지 않습니다. 글자 읽기(오독 0건) : 복도 번호판 37% · 엘리베이터 안 층 97% · 비상대피 안내판 층 45%.
2026-09-23 자료(사진 2,075장)로 다시 잰 값입니다. 세 기준선 모두 CNN 과 같은 224px 사진에서 특징만 다르게 뽑았습니다.
| 방식 | 정확한 자리 | 지금 앱과의 차이 (95% 구간) |
|---|---|---|
| 우연 (152곳 중 아무거나) | 0.7% | |
| 가장 흔한 곳만 답하기 | 10.7% | |
| 색 분포 (RGB 8×8×8) | 10.7% | |
| 작은 흑백 사진 16×16 | 20.4% | CNN 이 +35.2%p (+30.6 ~ +38.9) — 의미 있음 |
| CNN — 지금 앱 | 55.6% | |
| CNN · 후처리 없이 정규화만 | 54.9% | 후처리가 +0.7%p (−0.7 ~ +2.0) — 우연과 구분 안 됨 |
| CNN · 주성분 5개 제거 | 56.8% | +1.1%p (−0.1 ~ +2.3) — 9/21 에는 유의했으나(+1.9) 새 사진에서는 아님 → 앱 안 바꿈 |
| 번호판 조각 시점 없이 | 52.8% | 넣은 것이 +2.8%p (+1.0 ~ +4.9) — 의미 있음 |
측정 : eval_all.html 약 90초 · eval_ablation.html 약 10분. 한계와 대응은 문서/한계와_대응.txt.
NAV_M_PER_UNIT 로 거리·시간을 낼 수 있다).onclick 을 이벤트 연결로 바꾸면서 모듈로 옮기는 것이 다음 단계.