Big Project · AI's EYE 17
탐지 수치가 좋아도 장기 Tracking 모델을 바로 채택하지 않은 성능 게이트
Precision·mAP가 높고 많은 프레임을 오류 없이 처리했다면 새 Vision 모델을 서비스에 적용해도 될 것 같다. 왜 장기 Track ID와 체류시간 기능은 보류했는지 의문이다.
근거 · 프로젝트 문서 · 코드 · 테스트
1장: 높은 탐지 수치가 왜 충분치 않았을까?
솔라는 모니터 화면의 두 문장을 번갈아 보며 미간을 찌푸렸다. 하나는 새로운 Vision 모델의 성능 평가 결과였고, 다른 하나는 그에 따른 결론이었다.
성능 평가표는 온통 초록불이었다. 탐지 정확도를 나타내는 Precision과 mAP 수치는 목표치를 훌쩍 넘었고, 수많은 프레임을 처리하는 동안에도 오류 없이 안정적이었다. 솔라의 머릿속에선 상식적인 결론이 맴돌았다. ‘이 정도면 당연히 기존 모델을 대체하고 서비스에 적용해야지.’
하지만 바로 아래 적힌 의사결정 문장은 그 생각에 찬물을 끼얹었다.
[결론] 장기 추적(Long-term Tracking) 및 체류 시간(Dwell Time) 기능에 대한 운영 채택은 보류한다.
솔라는 의자를 뒤로 밀며 나지막이 혼잣말을 내뱉었다. “아니, 왜?”
보고서를 훑어보던 언니 루나가 찻잔을 내려놓으며 조용히 물었다.
“뭐가 그렇게 이해가 안 돼?”
“언니, 이것 좀 봐. 새로 테스트한 모델인데, 사람을 찾아내는 정확도(Precision, mAP)는 거의 완벽에 가까워. 안정성도 좋고. 그런데 이걸 서비스에 바로 안 쓴대. 특히 ‘장기 추적’이랑 ‘체류 시간’ 기능은 보류하겠다고 하네. 이렇게 성능이 좋은데 대체 왜?”
솔라는 답답하다는 듯이 화면을 가리켰다. 그녀의 생각은 명확했다. 좋은 부품이 나왔으니 당연히 기계에 갈아 끼워야 한다는 것이었다.
루나는 솔라가 가리키는 화면을 잠시 들여다보더니, 의외의 제안을 했다.
“잠깐 그 보고서는 잊어버리고, 머릿속으로 간단한 영화 한 편만 만들어 보자.”
“영화?”
“응. 솔라 네가 감독이야. 무대는 매장이고, 카메라는 천장에 달려있어. 그리고 아주 특별한 능력을 가진 배우, 그러니까 Vision 모델이 등장하지.”
루나는 말을 이었다.
“이 배우는 사람을 기가 막히게 잘 알아봐. 매장 안을 돌아다니는 모든 사람을 한 명도 놓치지 않고, 프레임이 바뀔 때마다 정확하게 ‘여기 사람이 있다’고 네모 상자를 그려줘. 솔라 네가 지금 보고 있는 보고서의 높은 Precision, mAP 수치가 바로 그 능력을 보여주는 거야. ‘탐지’ 능력은 완벽해.”
“거봐, 완벽하잖아. 그런데…”
솔라가 말을 채 끝내기도 전에 루나가 이야기를 끊었다.
“그런데 이 배우한테 이상한 버릇이 하나 있어. 사람을 볼 때마다 완전히 새로운 이름표를 붙여주는 거야. 예를 들어, 빨간 옷을 입은 사람이 처음 카메라에 잡혔을 땐 ‘고객 1번’이라고 불렀어.”
“응.”
“1초 뒤, 그 사람이 한 걸음 옆으로 움직였어. 모델은 여전히 그 사람을 완벽하게 ‘탐지’해서 네모 상자를 그렸지. 그런데 이번엔 ‘고객 73번’이라는 새 이름표를 붙이는 거야. 그 다음 프레임에선 ‘고객 214번’. 계속해서.”
루나는 솔라를 물끄러미 쳐다봤다. “자, 이제 감독인 솔라 네가 이 데이터를 가지고 ‘고객 1번이 매장에 얼마나 오래 머물렀는지’ 알아내야 한다면, 답이 뭘까?”
순간 솔라의 머릿속이 하얘졌다. 완벽하게 사람을 찾아내는 네모 상자들이 프레임마다 깜빡이며 각기 다른 번호를 달고 나타났다 사라지는 장면이 그려졌다. ‘고객 1번’은 단 한 프레임에만 존재했다. ‘고객 73번’도, ‘고객 214번’도 마찬가지였다.
”…알아낼 수 없어.” 솔라가 마침내 입을 열었다. “모든 고객의 체류 시간은 그냥 0초, 혹은 1 프레임이 되겠네. 실제로는 한 사람이 10분 동안 매장 안에 있었더라도, 데이터상으로는 수백 명의 서로 다른 사람이 찰나의 순간에 나타났다가 사라진 것처럼 보일 거야. 이건… 데이터가 아니라 그냥 쓰레기잖아.”
“바로 그거야.”
루나가 잔잔한 목소리로 말했다.
“솔라 네가 지금 ‘탐지’와 ‘추적’의 근본적인 차이를 스스로 발견한 거야. 탐지는 ‘지금 이 장면에 무엇이 있는가?‘라는 스냅샷 질문에 답하는 능력이야. 우리가 본 보고서의 높은 Precision, mAP는 이 능력이 뛰어나다는 뜻이지. 하지만 ‘체류 시간’ 같은 기능은 다른 질문에 답해야 해. 바로 ‘조금 전의 그 사람이 지금 이 사람과 동일 인물인가?‘라는, 시간을 관통하는 질문이지. 이걸 ‘추적’이라고 불러.”
루나의 말에 솔라는 다시 보고서로 눈을 돌렸다. 아까는 이해할 수 없었던 ‘채택 보류’라는 결정이 이제는 너무나 당연하게 느껴졌다. 아무리 사진을 잘 찍는 사진사라도, 영화를 찍으려면 필름을 이어 붙이는 법을 알아야 하는 것과 같았다.
“아… 그래서 탐지 수치가 아무리 좋아도 소용없었던 거구나. 그건 그냥 ‘순간’을 잘 포착했다는 점수일 뿐, ‘이야기’를 이어가는 능력과는 아무 상관이 없었던 거야.”
솔라는 자신이 얼마나 단순하게 생각했는지 깨달았다. 높은 숫자 뒤에 숨은 문제의 본질을 보지 못했던 것이다. 그녀는 이제 새로운 질문에 다다랐다. 문득 고개를 든 솔라가 루나를 보며 물었다.
“그럼, 언니. ‘같은 사람인지를 얼마나 잘 유지하는가’를 재는, 추적을 위한 점수도 따로 있는 거야? 그게 뭔데?“
2장: 추적의 핵심: IDF1과 ID Switch
솔라의 질문에 루나는 바로 답하는 대신, 손가락으로 스크롤바를 천천히 내려 보고서의 다른 구절을 화면 중앙에 띄웠다. 솔라가 아까는 무심코 지나쳤던, 낯선 약어와 숫자가 적힌 문장이었다.
[주요 결과] 새 설정은 held-out 데이터셋에서 사전 설정된 IDF1 개선 기준을 충족하지 못했다. 별도로 진행된 장기 평가 영상에서의 IDF1 수치 역시 약 27.6%에 그쳐, 즉시 운영에 채택하지 않기로 결정했다.
솔라는 눈살을 찌푸렸다. 언니가 방금 ‘추적’이라는 새로운 문제를 꺼냈고, 이 문장이 그에 대한 답인 것 같았다. 하지만 IDF1이라는 생소한 지표와 27.6%라는 구체적인 수치는 그녀에게 또 다른 벽처럼 느껴졌다. 탐지 정확도처럼 직관적으로 와닿지 않았다. ‘추적을 위한 점수가 있긴 있구나. 그런데 IDF1이 대체 뭐지? 27.6%는 왜 낮은 점수일까?’
“이 지표들이 왜 중요한지 알려면, 아까의 영화감독 놀이를 조금 더 해봐야 해.”
루나가 테이블 위에 있던 펜을 집어 들었다. 그리곤 펜을 책상 이쪽 끝에서 반대쪽 끝으로 천천히 움직이기 시작했다.
“자, 이 펜이 매장에 들어온 고객이야. 우리 모델은 아주 훌륭하게 이 펜을 ‘사람’으로 탐지하고 ‘고객 15번’이라는 ID를 붙여줬어.”
솔라는 말없이 고개를 끄덕였다. 루나는 펜을 계속 움직이다가, 다른 쪽 손으로 펜 위를 잠시 가렸다. 마치 고객이 기둥 뒤로 잠깐 숨은 것처럼.
“자, 이제 고객이 기둥 뒤에서 다시 나왔어.”
루나가 손을 치우자 펜이 다시 나타났다.
“이때, 우리 모델이 여전히 이 고객을 ‘고객 15번’이라고 부르면 아주 좋겠지? 하지만 만약 모델이 이 고객을 처음 보는 사람으로 착각해서 ‘고객 132번’이라는 새 ID를 붙여버리면 어떻게 될까?”
“아…” 솔라가 짧은 탄식을 내뱉었다. “어제의 그 문제네. 체류 시간을 계산할 수 없게 되는 거.”
“맞아. 방금 일어난 일이 바로 ‘ID 스위치(ID Switch)’야. 추적하던 객체의 정체성이 중간에 다른 것으로 바뀌어 버리는 실수지. 당연히 이 횟수는 적을수록 좋아.”
루나는 펜을 내려놓고 다시 화면을 가리켰다.
“하지만 추적의 실수는 ID 스위치만 있는 게 아니야. 기둥 뒤에서 나온 고객을 아예 인식조차 못 할 수도 있고(False Negative), 있지도 않은 유령 고객을 만들어 낼 수도 있지(False Positive). IDF1은 바로 이런 추적 과정에서 발생하는 여러 종류의 오류들을 종합해서, 모델이 얼마나 한 객체의 정체성(Identity)을 꾸준하고 정확하게 유지하는지를 하나의 점수로 나타낸 거야.”
루나의 설명은 복잡한 개념을 하나의 이미지로 묶어주었다. IDF1은 단순히 ‘찾았나 못 찾았나’를 넘어선, ‘관계 유지 능력’에 대한 점수였다. 한 번 알아본 대상을 잊지 않고, 다른 사람과 헷갈리지 않고, 끝까지 책임지는 능력.
솔라는 다시 보고서의 문장을 보았다. IDF1도 약 27.6%여서 즉시 운영 채택하지 않았다. 이제 이 문장은 더 이상 암호가 아니었다. 그녀는 혼잣말처럼 중얼거렸다.
“그러니까… 새로 만든 모델은 사람을 순간순간 포착하는 능력(탐지)은 뛰어났지만, 그 사람이 누구인지 기억하고 관계를 유지하는 능력(추적)은 형편없었다는 거네. 100번의 관계 유지가 필요한 상황에서 27~28번 정도만 성공했다는 뜻이니까. 이러면 누가 몇 분 동안 머물렀는지에 대한 데이터는 거의 다 틀리겠구나.”
높은 탐지 정확도라는 화려한 스펙 뒤에 가려져 있던 모델의 치명적인 약점이 비로소 선명하게 보였다. 솔라는 이제 ‘왜 채택하지 않았는지’가 아니라 ‘어떻게 이런 결정을 내렸는지’가 궁금해졌다. 그녀는 새로운 의문을 품고 루나에게 물었다.
“언니, 27.6%가 나쁘다는 건 이제 알겠어. 그런데 왜 하필 이 수치가 ‘부족하다’고 판단한 기준이 된 거야? 우리 서비스에서 ‘정확한 장기 추적’을 하려면 몇 점 정도가 필요한 건데? 그 합격선은 누가, 어떻게 정하는 거야?”
3장: 장기 추적 기능과 지표의 연결
솔라는 깨끗한 메모장 위에 의미 없는 선 하나를 그었다. 한 사람이 매장에 들어와서 돌아다니는 동선. 그러다 선을 뚝 끊고, 조금 옆에 다른 색 펜으로 새로운 선을 그리기 시작했다. ‘고객 15번’의 동선이 끊기고, 그 자리에 ‘고객 132번’의 동선이 시작되는 장면을 시각화해 본 것이다. 이 행위를 몇 번 반복하자, 한 사람의 궤적이 너덜너덜하게 끊긴 여러 개의 선 조각으로 변했다.
IDF1 점수가 27.6%라는 건, 이 선들이 얼마나 자주 끊어지고 엉망으로 이어지는지를 나타내는 성적표였다. ‘낙제점’이라는 건 알겠다. 하지만 솔라는 그 너머가 궁금했다. 성적이 나쁘다는 사실 자체보다, 그 나쁜 성적이 정확히 무엇을, 얼마나 망가뜨리는지 알고 싶었다. ‘정확한 장기 추적과 체류시간 운영에는 부족하다’는 보고서의 결론은 그래서 구체적으로 무슨 뜻일까?
“언니, 27.6%가 나쁘다는 건 이제 알겠어. 그런데 왜 하필 이 수치가 ‘부족하다’고 판단한 기준이 된 거야? 우리 서비스에서 ‘정확한 장기 추적’을 하려면 몇 점 정도가 필요한 건데? 그 합격선은 누가, 어떻게 정하는 거야?”
솔라의 질문에 루나는 잠시 생각에 잠기더니, 솔라가 그려놓은 선 조각들을 가리켰다.
“합격선을 이야기하기 전에, 이 선 조각들이 실제로 어떤 문제를 일으키는지 먼저 계산해볼까? 그래야 합격선에 담긴 의미를 제대로 이해할 수 있을 테니.”
루나는 솔라의 메모장을 자기 쪽으로 살짝 돌렸다.
“여기, 아주 중요한 가상의 고객이 한 명 있다고 치자. 이 고객은 10분 동안 매장에 머물렀어. 우리 서비스의 목표는 ‘이 고객이 10분간 체류했다’는 사실을 정확히 기록하는 거야.”
“응.”
“그런데 성능이 낮은 우리 모델이 이 고객을 추적하면서, 10분 동안 ‘ID 스위치’를 5번 일으켰다고 가정해보자. 처음 2분은 ‘ID 1번’으로 잘 추적하다가, ID가 바뀌어서 다음 2분은 ‘ID 2번’으로, 그 다음 2분은 ‘ID 3번’으로… 이런 식으로 총 6개의 다른 ID가 이 한 사람에게 부여된 거야.”
솔라는 루나의 시나리오를 따라 메모장에 숫자를 적기 시작했다.
한 사람 (실제): 10분 체류
모델의 관찰 (데이터):
ID 1: 2분
ID 2: 2분
ID 3: 2분
ID 4: 1분
ID 5: 1분
ID 6: 2분
“자, 이제 솔라 네가 데이터 분석가야. 이 데이터를 보고 ‘고객들의 평균 체류 시간’을 계산해줘. 어떤 결론이 나오지?”
루나의 말에 솔라는 자신이 적은 숫자를 멍하니 바라보았다. 데이터만 놓고 보면, ‘10분 동안 머문 한 명의 고객’은 어디에도 존재하지 않았다. 대신 ‘1~2분 정도 머물다 나간 여섯 명의 고객’만 있을 뿐이었다.
“…말도 안 돼.”
솔라의 입에서 탄식이 터져 나왔다.
“데이터상으로는… 10분짜리 고객은 사라지고, 2분짜리 고객 여섯 명이 생긴 셈이야. 평균 체류 시간은 10분이 아니라 1.67분(10분/6명)이 되어버려. 실제 일어난 일과는 정반대의 해석을 하게 되는 거네. 이건 그냥 오차가 있는 수준이 아니라, 아예 거짓말을 하는 데이터잖아.”
“바로 그거야. IDF1 27.6%라는 수치가 ‘부족하다’고 판단된 진짜 이유지.”
루나는 차분한 목소리로 말을 이었다.
“그 수치는 단순히 ‘모델이 100번 중 72번 정도 실수한다’는 뜻이 아니야. 우리가 ‘체류 시간 분석’이라는 기능을 제공하겠다고 약속했을 때, 그 약속을 지킬 수 없게 만드는 수치라는 의미야. 기능이 요구하는 최소한의 데이터 신뢰도를 무너뜨리는 수준인 거지. 그래서 보고서 작성자는 ‘정확한 장기 추적과 체류시간 운영에는 부족하다’고, 기능의 이름과 함께 명확하게 판단을 내린 거야.”
순간 솔라의 머릿속에서 모든 조각이 맞춰졌다. IDF1이라는 지표는 더 이상 독립적인 숫자가 아니었다. 그것은 ‘체류 시간’이라는 서비스 기능의 심장과 바로 연결된 생명선이었다. 점수가 특정 수준 이하로 떨어지면, 기능은 약속된 역할을 수행하지 못하고 멈춰버린다. ‘낮은 수치’라서가 아니라, ‘기능을 파괴하는 수치’라서 채택되지 않은 것이다.
솔라는 비로소 지표와 기능의 관계를 꿰뚫어 보게 되었다. 그녀는 다시 보고서의 한 구절로 시선을 옮겼다. 이전에는 미처 발견하지 못했던, 더 구체적인 숫자들이 적힌 문장이 눈에 들어왔다.
...사전 기준인 IDF1 +3%p와 ID Switch 30% 이상 감소를 충족하지 못했다.
“아, 알겠다. 그럼 이 기준들은…”
솔라가 무언가 깨달은 듯 입을 열었다.
“우리가 제공하려는 기능이 ‘거짓말’을 하지 않게 될 최소한의 개선 목표치였던 거구나. ‘이 정도는 나아져야 비로소 체류 시간 데이터가 의미를 갖기 시작한다’는, 일종의 문턱이었던 거네?”
4장: 서비스 채택을 위한 성능 게이트 설계
솔라의 시선은 보고서의 한 문장에 못 박혀 있었다.
...사전 기준인 IDF1 +3%p와 ID Switch 30% 이상 감소를 충족하지 못했다.
바로 직전까지 이 문장은 그저 또 하나의 기술적인 실패 기록처럼 보였다. 하지만 이제는 달랐다. ‘체류 시간’이라는 서비스 기능이 거짓말을 하지 않기 위한 최소한의 안전장치, 즉 ‘문턱’의 의미를 이해하고 나니 새로운 의문이 고개를 들었다.
솔라는 펜을 들어 방금 전 자신이 그렸던 너덜너덜한 선 조각들 옆에 새로운 목표를 적었다. ID Switch 30% 감소. 그리고는 생각했다. ‘왜 하필 30%일까? 10%나 20%는 안 되는 건가? 아니면 그냥 보수적으로, 대충 높게 잡은 숫자일까?’ 솔라의 마음속에는 이 기준이 자의적으로 설정되었을지도 모른다는 의심이 남아 있었다.
“우리가 제공하려는 기능이 ‘거짓말’을 하지 않게 될 최소한의 개선 목표치였던 거구나.” 솔라가 자신의 깨달음을 확인하듯 말했다. “’이 정도는 나아져야 비로소 체류 시간 데이터가 의미를 갖기 시작한다’는, 일종의 문턱이었던 거네?”
“정확해. 그게 바로 ‘성능 게이트(Performance Gate)’야.”
루나가 처음으로 그 용어를 입에 올렸다.
“새로운 모델이나 기능이 서비스라는 무대에 오르기 전에, 반드시 통과해야 하는 최소 자격 시험 같은 거지. 그런데 솔라, 네 생각엔 그 게이트의 높이, 즉 ‘IDF1 +3%p, ID Switch 30% 감소’라는 기준이 어떻게 정해졌을 것 같아? 그냥 엔지니어가 ‘이 정도면 좋겠다’고 정했을까?”
루나의 질문은 정확히 솔라의 의심을 파고들었다. 솔라는 잠시 망설이다가 대답했다.
“음… 기존 모델보다 좋아져야 하니까, 어느 정도 도전적인 목표를 설정한 게 아닐까? 너무 낮게 잡으면 발전이 없을 테니까.”
“그것도 일부 맞지만, 핵심은 아니야.”
루나는 솔라가 숫자를 적어놓은 메모장을 다시 가져왔다. 그리고는 완전히 새로운 질문을 던졌다.
“문제를 거꾸로 생각해 보자. 우리가 기술 지표에서 출발하는 게 아니라, 사업 목표에서 출발하는 거야. 예를 들어, 매장 관리자가 ‘고객들이 가장 오래 머무는 인기 상품 존 TOP 3’를 매일 아침 리포트로 받아보고 싶어 한다고 상상해 봐. 이게 우리의 비즈니스 목표야.”
“응. 좋은 기능이네.”
“이 기능을 만들려면, 당연히 고객별 체류 시간 데이터가 필요하겠지? 그런데 이 리포트가 얼마나 정확해야 관리자가 믿고 사용할 수 있을까? 만약 어제는 A, B, C 구역이 인기 존이라고 했다가 오늘은 완전히 엉뚱한 X, Y, Z 구역을 보여준다면, 관리자는 이 리포트를 쓰레기통에 버릴 거야.”
루나는 말을 이었다. “그래서 사업팀과 논의한 결과, ‘TOP 3 리포트의 정확도가 최소 80%는 되어야 한다’는 서비스 요구사항이 정해졌다고 가정해 보자. 즉, 열 번 리포트를 발행하면 여덟 번은 실제 인기 존과 일치해야 한다는 뜻이야.”
솔라는 루나의 이야기를 따라가며 머릿속으로 그림을 그렸다. 비즈니스 목표가 서비스 요구사항으로 구체화되는 과정이었다.
“자, 이제 솔라 네가 엔지니어로서 답해야 할 차례야.” 루나의 목소리에 장난기가 살짝 깃들었다. “‘TOP 3 리포트 정확도 80%’를 달성하려면, 우리 모델의 ID Switch는 기존 대비 몇 퍼센트나 줄어들어야 할까?”
순간 솔라의 머리가 복잡해졌다. 이전까지는 ‘ID Switch가 많으면 체류 시간이 부정확해진다’는 단방향으로만 생각했다. 하지만 이제는 ‘원하는 데이터 정확도를 얻기 위해 ID Switch를 어디까지 줄여야 하는가’라는 역방향의 계산이 필요했다.
그녀는 지난번 시뮬레이션을 떠올렸다. 10분짜리 고객 한 명이 ID Switch 5번 때문에 1.67분짜리 고객 여섯 명으로 둔갑했던 상황. 그런 데이터로는 인기 존을 제대로 뽑아낼 수 없음이 자명했다.
“음… 정확한 계산은 어렵지만… 만약 10분 이상 머무는 ‘진짜’ 인기 존 고객들의 ID가 거의 바뀌지 않아야만 TOP 3에 제대로 집계될 것 같아. 한두 번의 실수는 어쩔 수 없어도, 지난번처럼 대여섯 개로 쪼개지면 순위권 밖으로 밀려날 테니까. 기존 모델에서 평균 5번의 ID 스위치가 발생했다면, 이걸 1번 이하로 줄여야… 그러니까 최소 80%는 감소시켜야 그나마 ‘정확도 80%’라는 요구사항을 겨우 만족시킬 수 있을지도 몰라.”
말을 마친 솔라는 스스로 놀라 입을 다물었다. 방금 전까지 ‘30%도 너무 높은 거 아닐까’라고 생각했던 자신이, 이제는 ‘80%는 되어야 한다’고 말하고 있었다.
그 순간, 보고서의 ‘ID Switch 30% 이상 감소’라는 숫자가 완전히 다른 의미로 다가왔다. 그것은 결코 자의적이거나 과도하게 설정된 목표가 아니었다. 오히려 서비스가 최소한의 가치를 갖기 위한, 현실과 타협한 ‘최소한의’ 문턱이었을 가능성이 높았다. 80%라는 이상적인 목표에 도달하기 위한 첫걸음일 수도 있었다.
“이제 알겠어…”
솔라가 나지막이 말했다.
“‘성능 게이트’의 기준은 그냥 기술팀의 희망 사항이 아니었구나. ‘우리가 사용자에게 어떤 가치를 약속할 것인가?’라는 질문에서부터 역산해서 만들어진, 기능의 존재 이유와 직결된 숫자였어. 이 게이트를 통과하지 못했다는 건, 단순히 성능이 조금 부족하다는 뜻이 아니라, ‘우리가 약속한 서비스를 제공할 준비가 되지 않았다’는 선언이었던 거네.”
고개를 끄덕인 솔라는 새로운 자신감을 얻었다. 이제 그녀는 숫자를 숫자 자체로 보지 않고, 그 뒤에 숨은 약속과 기능을 읽어낼 수 있게 되었다.
“좋아! 그럼 이제 확실해졌네. 다음 모델이 이 성능 게이트 기준, 예를 들어 IDF1 +5%p, ID Switch 50% 감소 같은 기준을 만족하는 테스트 결과만 가져온다면, 그땐 바로 운영에 적용할 수 있는 거지?”
솔라의 확신에 찬 질문에, 루나는 예상했다는 듯 미소를 지었지만 곧바로 대답하지는 않았다. 대신 찻잔을 들어 한 모금 마신 뒤, 의미심장한 질문을 던졌다.
“우리가 만든 아주 깨끗하고 잘 정돈된 실험실 데이터에서 그 기준을 통과했다면, 정말 그걸로 충분할까? 시끄럽고, 조명도 제멋대로 바뀌고, 예상치 못한 물건들로 가득한 실제 매장에서도 그럴 거라고 어떻게 장담하지?”
5장: 현실 세계의 복병: 운영 환경 검증
솔라는 확신에 차 있었다. 머릿속에 흩어져 있던 지식의 조각들이 ‘성능 게이트’라는 단단한 틀 안에서 제자리를 찾았다. 그녀는 하얀 메모 패드 위에 새로운 모델을 위한 완벽한 채택 절차를 그려나가기 시작했다. 맨 위에는 ‘기능 목표: 정확한 체류 시간 분석’이라고 적었다. 그 아래에는 ‘1차 관문: 성능 게이트’라고 쓰고, ‘IDF1 +5%p, ID Switch 50% 감소’라는, 이전보다 더 과감한 목표치를 설정했다. 이제 이 게이트만 통과하면 된다. 모든 것이 명확해 보였다.
하지만 솔라의 펜이 잠시 멈칫했다. 바로 직전, 루나가 던졌던 질문이 귓가에 맴돌았다.
“우리가 만든 아주 깨끗하고 잘 정돈된 실험실 데이터에서 그 기준을 통과했다면, 정말 그걸로 충분할까?”
실험실 데이터. 그 단어가 솔라가 세운 깔끔한 계획표 위에 미세한 균열을 만들었다. 그녀가 지금까지 봐왔던 모든 평가 자료, IDF1과 ID Switch 수치들은 모두 잘 통제된 환경에서 나온 결과물이었다. 솔라는 문득 불안해졌다. 마치 온실 속에서 완벽하게 자란 식물이 거친 들판에서도 똑같이 살아남으리라 장담하는 것과 같다는 생각이 들었다.
“언니 말대로라면… 우리가 만든 성능 게이트는 그냥 ‘모의고사’ 같은 거네. 모의고사 1등이 실제 시험에서도 1등 한다는 보장은 없으니까.” 솔라가 루나를 보며 말했다.
“비유가 정확하네.”
루나는 솔라의 맞은편에 앉아, 모니터 화면에 두 개의 영상을 나란히 띄웠다. 왼쪽 영상은 솔라가 익히 봐왔던 테스트 데이터였다. 고정된 카메라 구도, 일정한 조명 아래 사람들이 겹치지 않고 걸어 다니는, 교과서처럼 깔끔한 영상.
하지만 오른쪽 영상은 완전히 다른 세상이었다.
“이건 우리 매장 중 한 곳에서 어제 오후 3시에 찍은 영상이야.”
오른쪽 영상은 혼돈 그 자체였다. 오후의 햇살이 창문을 통해 길게 늘어져 바닥의 일부를 하얗게 태워버렸고, 사람들은 서로 몸을 스치며 지나갔다. 거대한 쇼핑 카트가 진열대 앞을 가로막아 잠시 사람의 하반신을 완전히 가렸고, 반짝이는 비닐 포장지를 든 아이가 뛰어다니며 조명을 어지럽게 반사시켰다. 어떤 사람은 들어올 때 입고 있던 외투를 벗어 팔에 걸치고 다니기도 했다.
솔라는 오른쪽 영상을 멍하니 바라보았다. 만약 왼쪽 영상에서 90점을 받은 모델이 있다면, 오른쪽 영상에서는 몇 점을 받을까? 점수를 매기는 것 자체가 불가능해 보였다.
“완전히 다르네… 왼쪽은 통제된 실험실이고, 오른쪽은 그냥 현실이야. 저런 환경에서도 ID를 놓치지 않고 추적하는 게 가능하기는 해?”
“어려운 일이지. 그래서 보고서 작성자는 마지막 안전장치를 남겨둔 거야.”
루나는 보고서의 마지막 부분을 다시 화면에 띄웠다. 이전에는 그저 부가적인 조건처럼 보였던 문장이, 오른쪽 영상을 본 뒤로는 가장 중요하고 무거운 책임처럼 느껴졌다.
[후속 조건] 위 사전 기준을 충족하는 모델이 나올 경우, 즉시 채택하지 않고 아래 검증을 추가로 진행한다: 1) 실제 매장 영상 기반 정답 데이터셋 제작 및 성능 재검증, 2) 장기 Re-ID(재식별) 성공률 검증, 3) 24시간 연속 영상 처리 안정성 검증.
솔라는 그제야 깨달았다. 이것은 선택 사항이 아니었다. 실험실이라는 온실을 나온 모델이 실제 야생에서 살아남을 수 있는지 확인하는, 필수적인 생존 시험이었다.
“아…”
솔라는 각 항목을 천천히 짚어가며 그 의미를 되새겼다.
“‘실제 매장 정답 데이터셋’은, 방금 본 저 혼돈 속에서 직접 눈으로 ‘정답’을 만드는 거구나. 모델이 몇 번의 ID 스위치를 일으켰는지, 우리가 직접 사람을 따라다니며 채점하는 것처럼. 그래야 진짜 실력을 알 수 있으니까.”
그녀는 두 번째 항목으로 시선을 옮겼다. “‘장기 Re-ID 성공률 검증’은… 매장에 들어왔던 고객이 30분 뒤에 다른 층에서 다시 나타나거나, 잠시 밖에 나갔다 다시 들어왔을 때, 심지어 옷을 하나 벗었을 때도 같은 사람으로 알아볼 수 있는지를 시험하는 거네. 이건 그냥 추적보다 훨씬 어려운 문제잖아.”
마지막으로 그녀는 세 번째 항목을 보며 중얼거렸다. “그리고 ‘연속 영상 검증’은… 짧은 영상 클립이 아니라, 아침부터 밤까지 조명이 계속 바뀌고 손님 수가 달라지는 하루 종일의 영상 속에서 모델이 지치거나 오작동하지 않는지 확인하는 체력 시험이구나.”
솔라는 자신이 처음 그렸던 단순한 계획표가 얼마나 순진했는지 깨달았다. 높은 탐지 정확도만 보고 환호했던 처음의 자신, 성능 게이트라는 개념을 배우고 이제 다 안다고 생각했던 조금 전의 자신이 부끄러워졌다.
그녀는 들고 있던 펜으로 기존의 계획표를 지우는 대신, 그 아래에 새로운 단계를 추가하기 시작했다. 이것은 더 이상 단순한 체크리스트가 아니었다. 하나의 모델이 비로소 ‘신뢰할 수 있는 서비스’로 거듭나기 위한, 꼼꼼하고 현실적인 설계도였다.
[ 신규 Vision 모델 채택 검증 계획서 (초안) ]
1. 서비스 목표 정의:
- 기능: 매장 내 고객 동선 기반 ‘장기 체류 시간’ 분석
- 사용자 가치: ‘인기 상품 존 TOP 3’ 리포트 정확도 80% 이상 보장
2. 핵심 성능 지표(KPI) 및 1차 게이트 (실험실 환경):
- 대상: 표준화된 테스트 데이터셋
- 지표: IDF1, ID Switch
- 통과 기준 (Performance Gate): 기존 모델 대비 IDF1 +5%p 이상, ID Switch 30% 이상 감소
3. 2차 게이트: 운영 환경 검증 (실제 매장 환경):
- 대상: 실제 운영 매장에서 수집한 100시간 분량의 영상 데이터
- 검증 1: 실제 환경 성능 측정
- 내용: 수집 영상 일부를 수동으로 라벨링하여 ‘실제 매장 정답’ 생성, 이를 기준으로 IDF1 및 ID Switch 재측정
- 통과 기준: 실험실 대비 성능 하락률 10% 이내
- 검증 2: 장기 재식별(Re-ID) 시나리오
- 내용: 30분 이상 시야에서 사라졌다 재등장하는 객체에 대한 ID 유지율 측정
- 통과 기준: 재식별 성공률 70% 이상
- 검증 3: 안정성 및 내구성
- 내용: 24시간 연속 영상 스트림 처리 시, 메모리 누수나 처리 속도 저하 없이 안정적으로 운영되는지 확인
- 통과 기준: 오류 및 재시작 없음
메모 패드 위에 자신만의 언어로 완성된 새로운 ‘성능 게이트 설계 문서’를 내려다보며, 솔라는 비로소 전체 그림을 이해했다. 탐지 수치가 좋다고 섣불리 채택하지 않았던 이유, 복잡한 추적 지표를 들이댔던 이유, 그리고 까다로운 사전 기준을 통과했음에도 마지막 검증 단계를 남겨두었던 이유까지. 이 모든 과정은 단순히 기술을 평가하는 것이 아니라, 사용자에게 약속한 ‘가치’를 지키기 위한 치열한 노력의 증거였다.
숫자 너머의 진짜 문제를 보는 법을, 솔라는 이제 막 배우기 시작했다.