article · 2026-08-10
이 이미지에 VLM까지 쓸 필요가 있었나
YOLO가 찾고, tracker가 이어 보고, DINO가 기억하고, VLM은 마지막에 묻는다.
이 글은 지난번에 쓴 「이 작업에 LLM까지 쓸 필요가 있었나」의 스핀오프다. 그때는 검색, 분류, 개체명 추출을 LLM 하나에 몰아줄 필요가 있는지 살펴봤다. 이번에는 같은 질문을 이미지 쪽에 던져 봤다.
직접적인 계기는 그 뒤 링크드인에 쓴 Human-AI Conversation과 Candidate Space에 관한 글이었다. “이거 환불돼?”, “이거 어디에 꽂아?” 같은 첫 발화에는 대상과 상태와 목적이 빠져 있다. 좋은 conversation은 곧바로 긴 답을 만드는 대신, 질문을 한두 번 더 주고받으며 가능한 intent를 줄인다.
이 관점을 vision 쪽으로 옮기면 질문이 달라진다. 스마트글래스가 보고 싶은 것은 대개 person이나 chair가 아니다. 세탁기 자체인지. 조작 패널인지. 방금 본 그 제품을 계속 보고 있는지. 사용자가 “이거 고장 난 거야?”라고 물었을 때 무엇을 근거로 답할지.
처음에는 이 질문을 큰 VLM 하나에 넘기면 되지 않을까 생각하기 쉽다. 사진을 보내고, 물어보고, 설명을 받는 방식. 실제로 Qwen2.5-VL 같은 모델은 이미지 속 물체의 box나 point를 만들고, 속성을 붙인 JSON을 낼 수 있다. 긴 영상에서 사건이 일어난 구간을 찾는 기능도 내세운다. Qwen2.5-VL
그런데 카메라가 계속 켜져 있으면 질문의 모양이 달라진다. 1초에 여러 장이 들어온다. 사용자는 같은 세탁기를 10초 동안 보고, 고개를 돌렸다가 다시 본다. 그때 매 frame마다 “이게 무엇인지 설명해줘”라고 물을 필요가 있을까.
아마 아닐 것이다.
이 문제는 이미지 이해의 수준보다, 같은 장면을 몇 번이나 처음 보는 것으로 취급할 것인가에 더 가깝다. 더 정확히 말하면, 넓게 열린 visual candidate space를 어느 단계에서 어떻게 줄일 것인가의 문제다.
문장 하나와 사진 한 장이 서로를 좁힌다
사용자가 “이거 어디에 꽂아?”라고 말하는 순간을 생각해 보자. 문장만 보면 이거가 케이블인지, 전원 어댑터인지, 메모리 카드인지 알 수 없다. 사진만 봐도 사정은 크게 다르지 않다. 책상 위에 노트북, 충전기, 케이블, 이어폰, 여러 개의 포트가 함께 놓여 있을 수 있다.
하지만 둘을 합치면 후보가 줄어든다. 꽂아라는 동사가 컵과 의자와 사람을 밀어내고, 카메라에 보이는 cable과 connector가 환불이나 배송 같은 언어 intent를 밀어낸다. language가 visual search space를 줄이고, vision이 query space를 줄이는 셈이다.
“이거 어디에 꽂아?” + 현재 장면
→ cable / connector / port 후보
→ 관련 영역만 grounding
→ 방금 보던 객체와 같은지 확인
→ 남은 후보만 의미 판단
이때 VLM은 전체 장면을 설명하는 모델이라기보다, 앞 단계가 지우지 못한 모호성을 판정하는 모델에 가까워진다. conversation은 query space를, detector는 observation space를, tracker와 representation model은 identity 후보를 줄인다. VLM은 마지막 후보 사이에서 관계와 상태를 읽는다.
이 구분이 이번 실험에서 detector, tracker, DINOv3를 따로 보게 된 이유다.
상자를 그리는 일과, 같은 물체를 기억하는 일
YOLO가 한 일은 선명하다. 현재 frame에서 물체가 있을 법한 위치를 box로 그리고, 미리 학습한 class와 confidence를 붙인다. Ultralytics의 detection 결과도 box 좌표, class ID, confidence로 구성된다. Ultralytics detect
이 출력은 화면에서 우선 볼 곳을 좁혀 준다. 수백만 개의 pixel을 몇 개의 box로 바꾸는 첫 번째 가지치기다. 하지만 washing_machine이라는 class가 나왔다고 해서 그 물체가 2초 전의 물체와 같은지는 알 수 없다. generic detector의 class 목록에는 조작 패널이나 부품의 이상 상태 같은 업무 단위가 없을 수도 있다. COCO의 80개 category가 서비스 도메인의 taxonomy를 대신하지는 않는다. COCO dataset
여기에서 tracker가 들어온다. tracker는 새 이름을 붙이는 모델이라기보다, 연속 frame의 detection을 이어서 같은 ID를 유지하려는 장치다. ByteTrack은 high-confidence box를 먼저 기존 tracklet에 연결한 뒤, 가림이나 blur로 confidence가 낮아진 box도 남은 tracklet과 한 번 더 연결한다. ByteTrack 물체를 “찾는” 것과 방금 찾은 물체를 “계속 보고 있다”고 말하는 일 사이에 한 층이 있는 셈이다.
tracker가 ID 17이라고 부르는 것은 영상 안에서의 임시 번호다. frame마다 생긴 box를 진행 중인 몇 개의 track 후보에 연결해 공간 후보를 시간 후보로 줄이지만, 장면이 바뀌거나 가림이 길어지면 같은 물체가 다른 ID를 받을 수 있다. track ID를 곧바로 “세탁기 A”라는 영구 지식으로 쓰면 cache가 어지러워진다.
상자는 찾았다. 시간도 이어 봤다. 남는 것은 그 상자 안의 모습을 어떻게 기억할 것인가다.
DINO는 이름을 붙이기보다 닮은 것을 남긴다
DINOv3를 여기에서 이해하면 자리가 조금 달라진다. DINOv3는 입력 이미지를 class 하나로 밀어 넣는 분류기가 아니다. 이미지 전체를 대표하는 feature뿐 아니라, 공간 위치별 patch feature를 낸다. 공식 모델 카드는 ViT 계열이 class token과 patch token을 반환하고, 224×224 입력에서 patch size 16 기준으로 196개의 patch token이 나온다고 설명한다. DINOv3 model card
그래서 DINOv3가 잘하는 질문은 “이것은 세탁기인가?”보다 “이 patch는 저 사진의 어느 patch와 닮았나?”에 가깝다. 공식 저장소도 두 이미지 사이의 dense/sparse matching과 feature 기반 video segmentation tracking 예제를 제공한다. DINOv3 repository
논문 수치도 이 방향을 보여 준다. DINOv3 7B/16은 다른 시점·각도에서 keypoint correspondence를 맞히는 NAVI benchmark에서 geometric recall 64.4, SPair에서 semantic recall 58.7을 기록했다. DINOv3 paper 의미가 비슷한 부분과 기하학적으로 이어지는 부분을 비교하는 representation으로는 강한 근거다.
다만 이 수치를 곧바로 스마트글래스의 “물체 인식률”로 옮길 수는 없다. DINOv3의 DAVIS video segmentation tracking 평가는 첫 frame의 ground-truth mask를 준 상태에서 이후 mask를 전파한다. 첫 물체를 누가 찾아 줄 것인가라는 문제는 이미 풀렸다고 가정한 조건이다. DINOv3 paper
그래서 DINO는 detector를 대신하지 않는다. detector가 첫 ROI를 만들고, tracker가 같은 흐름을 이으면 DINO가 그 ROI를 비교 가능한 벡터와 patch로 바꾼다. chair처럼 같은 class의 객체가 여럿 있어도 현재 crop과 닮은 이전 crop을 찾아, identity를 확정하기 전에 후보부터 좁힐 수 있다.
이때 저장할 것은 frame마다 새로 만든 설명문이 아니다. 대표 frame, normalized embedding, 필요하면 몇 장의 reference crop, 그리고 왜 다시 읽었는지를 남기는 refresh reason이다.
frame
→ detector: 새 box를 찾는다
→ tracker: frame 사이 box를 잇는다
→ DINO: crop의 visual representation을 만든다
→ cache: 전에 본 후보와 비교한다
→ VLM: 충돌하거나 질문이 있을 때만 해석한다
여기서 VLM의 역할도 조금 더 선명해진다. “이 panel의 표시가 무엇을 뜻하지?”, “이 제품이 지금 세탁 중인가?”, “이 두 후보 중 어느 것이 사용자가 가리킨 것인가?”처럼 box와 embedding만으로 끝나지 않는 의미 판단. VLM이 필요 없는 것이 아니라, 매번 맨 앞에서 일할 필요가 없는 것이다.
매 frame DINO를 돌리지 않는다는 말의 절반
여기까지 오면 자연스럽게 이런 설계가 떠오른다. 첫 frame에서 DINO를 한 번 돌리고, 이후에는 tracker만 돌리면 되지 않을까.
이 생각도 절반만 맞다.
tracker는 detector의 관측을 연결하는 계층이다. ByteTrack도 각 frame의 detection box를 high와 low confidence로 나눠 tracklet과 연결한다. detector가 완전히 사라지면 새 물체의 등장이나 크게 달라진 모습을 알아차리는 능력까지 tracker가 대신해 주지는 않는다. ByteTrack
그래서 “항상 실행”과 “필요할 때 실행”을 나눈다. detector와 tracker는 video stream을 따라가고, DINO는 새 track, 재등장, 큰 appearance 변화, 오래된 feature에서만 refresh한다. VLM은 retrieval 후보가 경쟁하거나 사용자가 질문했을 때 호출한다.
이 방식에는 오래된 전례가 있다. Deep Feature Flow는 비싼 feature network를 sparse keyframe에서만 돌리고, 나머지 frame에는 feature를 전파하는 식으로 video recognition을 다뤘다. Deep Feature Flow NoScope는 fixed-angle surveillance video에서 frame difference와 가벼운 specialized model, 무거운 reference model을 cascade로 묶었다. NoScope
NoScope가 보고한 큰 절감 폭을 스마트글래스에 옮겨 쓰면 안 된다. 고정 카메라와 머리에 쓴 카메라는 장면이 변하는 방식이 다르다. 스마트글래스에서는 “변화가 없으면 건너뛴다”보다 “변화했거나 너무 오래됐으면 다시 본다”가 정확하다.
학습은 그 다음에 온다
여기까지 읽고 나면 다시 DINO를 teacher로 두고 작은 detector를 학습시키고 싶어진다. 그 선택 자체가 틀린 것은 아니다. 다만 teacher/student는 모델을 더 똑똑하게 만드는 주문이라기보다, 이미 충분히 잘하는 큰 모델을 작은 배포 모델로 옮기는 일에 가깝다. knowledge distillation이 처음 다룬 문제도 큰 ensemble을 그대로 배포하기 어려울 때 지식을 더 작은 모델로 압축하는 것이었다. Hinton, Vinyals, Dean
DINOv3는 이미 작은 모델군을 내놓았다. ViT-S부터 ConvNeXt 계열까지의 여러 variant가 frozen ViT-7B teacher에서 distilled됐다고 모델 카드에 적혀 있다. DINOv3 model card 아직 ROI retrieval이 되는지조차 모르는 단계에서 다시 자체 distillation부터 시작할 이유는 약하다.
학습이 필요한 순간은 더 구체적이다. 같은 세탁기와 패널이 embedding 공간에서 자꾸 섞인다면 사람이 정한 label을 얹는 linear probe를 시험할 수 있다. detector가 panel이나 detergent compartment를 꾸준히 놓친다면 문제는 embedding이 아니라 detector label space다. 이때 control_panel의 포함·제외 기준과 unknown bucket을 정한 뒤 bbox label을 만든다.
이 순서를 거꾸로 하면 학습은 실패 원인을 덮는다. 라벨이 모호한데 detector를 fine-tune하고, ROI가 불안정한데 DINO를 teacher로 두고, 실제 병목은 frame의 중복인데 더 큰 VLM을 부르는 식이다.
그래서 다음 실험은 모델 교체가 아니다
다음에 할 일은 새 모델을 더 받는 것이 아니다. 짧은 영상 몇 개와 frame별 entity/bbox gold set을 준비하는 일이다. 그 위에서 세 가지를 비교하면 된다.
첫째, YOLO11n과 tracker가 target object를 놓치지 않는가. 둘째, 같은 물체가 하나의 track으로 얼마나 오래 유지되는가. 셋째, DINO embedding으로 찾은 top-5 후보 안에 같은 물체가 들어오는가.
여기에 p95 latency와 peak memory를 같이 붙인다. detector mAP, tracker의 ID consistency, embedding retrieval, 시스템 자원은 서로 대신할 수 없는 숫자다. HOTA가 detection과 association을 함께 보되 각 성분으로 나눠 보는 이유도 여기에 있다. HOTA
이렇게 보면 “이 이미지에 VLM까지 쓸 필요가 있었나”라는 질문은 VLM을 덜 쓰자는 구호가 아니다. 찾기, 이어 보기, 닮은 것을 기억하기, 의미를 판단하기. 네 가지 일을 한 모델에게 몰아주지 말자는 설계 문제다.
링크드인 글에서 적었던 구조도 이 지점에서 다시 이어진다. conversation은 query의 후보를 줄이고, vision은 observation의 후보를 줄인다. ontology는 가능한 관계와 행동의 범위를 줄이고, LLM과 VLM은 앞 단계가 지우지 못한 ambiguity를 맡는다. 비싼 추론이 시작되기 전에 문제 공간부터 작게 만드는 구조다.
아직 세탁기를 알아보는 시스템이 완성된 것은 아니다. 다만 같은 장면을 계속 처음 보는 시스템에서 벗어나는 첫 단계는, 더 긴 설명을 생성하는 데 있지 않을 가능성이 크다. 먼저 봤던 것을 기억할 수 있게 만드는 데 있다.