객체부터 픽셀까지, 한 모델로 — WeVisOne-VL 설계 뜯어보기

텐센트 WeChat Vision의 VLM. 위치 찾기와 픽셀 단위 오려내기를 한 모델로 묶고, 사진에 없는 대상은 지어내지 않고 "없다"고 답하게 설계했다.
English  ·  日本語  ·  한국어
← 목록으로
온
온틀 리서치
2026년 10월 24일 읽기 18분 조회 0

사진 한 장을 주고 "왼쪽 사람이 든 유리잔"을 배경에서 깨끗이 오려내 달라고 해보자. 컴퓨터는 두 가지 일을 순서대로 한다. 먼저 그 유리잔이 어디 있는지 찾고, 그다음 경계를 따라 잘라낸다.

잘라내는 일에도 두 단계가 있다. 분할(segmentation)은 유리잔이 사진에서 차지한 영역을 통째로 표시한다. 여기까지가 유리잔, 저기부터는 배경. 매팅(matting)은 한 걸음 더 간다. 경계의 픽셀이 각각 얼마나 투명한지까지 매긴다. 유리 너머로 비치는 배경은 반쯤 유리고 반쯤 배경이다. 이 "반쯤"을 0과 1 사이 숫자로 적어 놓은 결과물이 알파 매트(alpha matte)다. 머리카락 한 올, 유리의 투명한 테두리가 깔끔하게 합성되려면 분할의 "영역"만으로는 부족하고, 매팅의 "투명도"가 있어야 한다.

지금까지 위치 찾기와 오려내기는 보통 서로 다른 모델이 나눠 맡았다. 텐센트 WeChat Vision 팀이 공개한 WeVisOne-VL은 이 둘을 한 모델 안에서 해내는 VLM(비전-언어 모델, 이미지를 보고 말로 답하는 AI)이다. 그리고 한 가지를 더 한다. 찾는 대상이 사진에 없으면, 억지로 어딘가를 가리키는 대신 "없다"고 답한다. 이 글이 끝까지 따라갈 축이 바로 이것이다. 모델이 내놓은 답, 특히 "없다"는 답을 사용자가 믿을 수 있게 만드는 설계.

여섯 과제를 한 모델로 — "통일"의 진짜 의미

이 모델이 다루는 과제는 여섯 가지다. 크게 두 묶음으로 보면 쉽다.

  • 위치를 찾는 일: 물체가 어디 있는지 찾는 검출, 말로 지목한 대상을 찾는 지시 기반 위치 찾기(referring localization), 개수를 세는 카운팅, 글자를 읽는 OCR.
  • 영역을 따내는 일: 영역을 통째로 구분하는 분할, 투명도까지 매기는 매팅.

"여섯 과제를 한 모델로 통일했다"는 말은 오해를 부르기 쉽다. 모든 출력을 똑같은 모양으로 찍어낸다는 뜻이 아니다. 대상과 좌표는 언어 모델이 토큰(token, 모델이 읽고 내놓는 글자 조각 같은 기본 단위)으로 지정하고, 픽셀 영역은 그 정보를 넘겨받은 전용 디코더가 그린다. 통일된 것은 출력의 모양이 아니라 경로다. 어떤 과제든 같은 방식으로 지시를 받아, 대상을 하나의 표현으로 붙잡고, 거기서 점·박스·마스크·알파 매트 중 필요한 형태를 뽑는다. 사진에 대상이 없으면 그 자리를 "없음"으로 채운다.

왜 한 모델이어야 했나

픽셀 마스크가 필요하면 흔히 쓰던 방법이 있다. 박스까지는 VLM이 내고, 그 박스를 SAM 같은 별도의 큰 분할 모델에 넘겨 마스크를 받는 식이다. 두 모델을 이어 붙이는 이 구성에는 값이 따라붙는다.

하나는 무게다. 모델을 하나 더 얹으면 그만큼 느리고 무거워진다.

다른 하나가 더 고약하다. VLM이 "저 유리잔"이라고 가리킨 대상과, 분할 모델이 실제로 오려낸 영역이 같은 것이라는 보장이 없다. VLM은 왼쪽 잔을 말했는데 분할 모델은 그 옆 물컵의 윤곽을 따낼 수 있다. 둘은 서로 다른 눈을 가졌고, 중간에서 주고받는 것은 박스 하나뿐이기 때문이다. 말로 지목한 대상과 픽셀로 따낸 대상이 어긋나면, 결과가 아무리 정교해도 틀린 물건을 깨끗하게 오려낸 셈이 된다.

WeVisOne-VL은 분할에 넘기는 신호를 외부 모델이 아니라 VLM 자신이 방금 만든 표현에서 뽑는다. 지목한 주체와 오려내는 주체가 같은 표현을 쓰니, 둘이 다른 대상을 가리킬 여지가 줄어든다. 두 모델을 접어 하나로 만드는 이유가 여기 있다.

핵심 아이디어: 지목에서 투명도까지 한 줄로

흐름은 한 줄로 읽힌다.

유리잔을 지목한다 → 그 대상을 박스와 <OBJ> 토큰 하나로 표현한다 → 그 표현에서 영역과 투명도를 예측한다.

언어 모델이 "무엇을, 어디에서"를 정하고 박스를 낸다. 그 직후 <OBJ>라는 특수 토큰을 하나 더 만든다. 이 토큰의 내부 상태가 "방금 가리킨 그 대상"을 압축한 표현 역할을 한다. 그러면 경량 픽셀 디코더가 이 표현과 이미지 특징, 그리고 방금 낸 박스를 받아 마스크나 알파 매트를 그린다.

여기서 박스의 역할을 눈여겨볼 만하다. 픽셀 디코더에게 박스는 "이 근처를 집중해서 보라"는 지시다. 그러니 지목 단계가 엉뚱한 곳에 박스를 치면, 디코더는 엉뚱한 자리에서 정교한 윤곽을 따낸다. 모양은 그럴듯한데 대상이 틀린 마스크가 나온다. 뒷단이 아무리 좋아도 이 오류는 복구되지 않는다. 그래서 이 설계에서 위치를 얼마나 정확히 잡느냐가 영역 품질의 상한을 정한다. 지목이 흔들리면 그 아래가 전부 흔들린다.

좌표를 토큰 하나로

언어 모델은 토큰을 하나씩 순서대로 내놓는다. "이 고양이는 가로 0.37, 세로 0.52"처럼 좌표를 보통 숫자로 적으면 숫자 하나가 여러 토큰으로 쪼개져 출력이 길어진다. WeVisOne-VL은 0~1 비율 좌표를 나타내는 전용 토큰 <0>부터 <1000>까지를 어휘에 미리 넣어 뒀다. 좌표 하나가 토큰 하나로 끝나니 출력이 짧아지고 처리 비용도 준다.[^1]

출력 형식은 과제가 정한다. 박스가 필요하면 좌표 네 개, 점이 필요하면 한 쌍. 대상이 없으면 좌표 자리를 None으로 채운다. "없음"은 에러도 빈 응답도 아니라, 모델이 정식으로 내놓는 하나의 출력이다. 뒤에서 다룰 거부 학습이 바로 이 None을 겨냥한다.

<OBJ> 토큰으로 픽셀까지 잇기

분할과 매팅은 이미지 전체를 픽셀 단위로 덮어야 해서 토큰 몇 개로 끝나지 않는다. <OBJ> 토큰이 둘 사이의 다리다. 디코더는 이 토큰으로 "어떤 대상인지"를 확인한 뒤, 이미지 특징과 박스를 참고해 윤곽을 따낸다.

이 상자가 푸는 문제 — 외부 분할 모델 없이 픽셀 디코더는 정제 모듈까지 합쳐 약 960만(9.6M) 파라미터로 가볍다. SAM 같은 별도의 큰 분할 모델을 붙이지 않고도, 박스 수준의 띄엄띄엄한 예측과 픽셀 수준의 조밀한 예측을 한 모델에서 함께 낸다. 디코더가 <OBJ> 표현에서 "이 대상을 찾겠다"는 질의를 시작하도록 설계한 것이 핵심이다.[^2]

가르치는 순서

학습은 쉬운 것부터 올린다. 지시를 따르고 형식에 맞는 출력을 내는 기초를 먼저 잡고, 고해상도 데이터로 작은 객체와 붐비는 장면을 놓치지 않게 다진 뒤, 마지막에 픽셀 과제를 넣어 위치 찾기에서 영역 따내기로 넓힌다. 그 위에 강화학습을 얹는다.

이 상자가 푸는 문제 — 환각을 학습 목표 안으로 강화학습 단계에서 모델이 가장 헷갈려 하는 샘플을 골라, 없는 걸 지어내거나 같은 예측을 반복하는 버릇을 눌러가며 위치 정확도를 높인다. 환각을 줄이는 일이 사후에 붙인 필터가 아니라 학습 목표 안에 들어가 있다는 뜻이다.[^3]

데이터를 만드는 엔진

이만한 범용성은 방대한 데이터 위에서만 나온다. 그래서 논문의 절반 가까이가 데이터 엔진(WDE)에 쓰였다. WDE는 GRIT·CC3M·LAION·SA-1B 같은 공개 데이터를 끌어와 1억(100M) 장이 넘는 이미지와 약 36억(3.6 billion) 개의 바운딩 박스 주석을 재고로 갖춘다.

주석을 만드는 방식에 이 모델의 성격이 드러난다. 전용 검출기와 VLM은 성향이 반대다. 검출기(YOLO·DETR 계열)는 빽빽한 장면에서 후보를 촘촘히 쏟아내지만 처음 보는 개념에 약하고, VLM은 개념은 잘 알아보지만 붐비는 장면에서 놓친다. 엔진은 이 둘을 역할로 나눠 쓴다. 전문가 모델들이 후보를 잔뜩 만들면,[^4] Qwen3-VL이 "이 영역이 이 설명에 맞나"를 하나하나 검증한다. 많이 만드는 쪽과 걸러내는 쪽을 분리한 것이다. 박스에서 마스크로, 다시 매트로 넘어갈 때도 원래의 대상 설명을 그대로 물려주어, 처음부터 끝까지 같은 인스턴스를 가리키게 한다.

엔진이 가장 공들인 대목은 "없다"를 가르치는 데이터다. 모델에게 없는 것을 없다고 말하게 하려면 함정을 일부러 보여줘야 한다. 이것을 하드 네거티브(hard-negative)라고 부른다. 그런데 함정 만들기가 까다롭다. "빨간 차"를 "파란 차"로 바꿨다고 그 사진에 파란 차가 없으란 법은 없고, 검출기가 아무것도 못 찾았다고 대상이 정말 없는 것도 아니다. 그래서 후보 함정을 사진 전체와 다시 대조해, 진짜 대상이 발견되면 함정에서 빼 정상 사례로 되돌린다. 검수를 통과한 "진짜 없는" 사례인데도 모델이 기어이 뭔가를 가리키면, 그 사례를 하드 네거티브로 삼는다.

여기에 짝을 맞춰, 놓치기 쉬운 진짜 대상(하드 포지티브)도 함께 넣는다. 거부만 세게 가르치면 모델은 "모르겠으면 없다고 하기"라는 게으른 요령을 익힌다. 둘을 짝으로 넣어야 거부가 핑계로 굳지 않는다. "없으면 거부"와 "있으면 포착"을 한 묶음으로 학습시키는 것이 이 엔진의 균형추다.[^5]

평가에서 확인할 질문

논문은 30개가 넘는 벤치마크에서 평가했고, 비교 상대는 여러 과제를 두루 하는 범용 모델과 과제 하나에 특화된 전문 시스템이다. 이 글은 과제별 점수를 다루지 않는다. 대신 이 설계를 평가하려면 무엇을 봐야 하는지를 짚는다.

평균 점수 한 줄로는 이 모델을 제대로 못 읽는다. 설계가 서로 당기는 두 목표를 동시에 좇기 때문이다. 거부를 세게 걸수록 진짜 대상을 놓칠 위험이 커지고, 놓치지 않으려 할수록 없는 걸 있다고 할 위험이 커진다. 그러니 봐야 할 첫 번째 결과는 거부와 재현율(recall, 실제 있는 대상을 얼마나 빠짐없이 찾는지)을 함께 보여주는 수치다. 하나만 높은 건 쉽다. 둘을 동시에 지키는지가 이 설계의 성패다.

어느 쪽을 더 조일지는 현장의 비용이 정한다. 산업 검사 라인에서 멀쩡한 부품을 불량이라 잘못 보고하면 재검사 비용이 늘고(오탐), 진짜 결함을 놓치면 불량이 그대로 출하된다(누락). 오탐이 비싼 곳은 거부를 강하게, 누락이 비싼 곳은 재현율을 민다. 이 지점을 찾으려면 정답을 아는 별도 표본에서 오탐과 누락을 따로 세어야 한다.

두 번째로 볼 것은 통합의 손익이다. 여러 모델을 하나로 접으면 운영은 가벼워지지만, 과제별로 특화 모델에 못 미치는 지점이 생길 수 있다. 이 손익은 과제별로 따로 재야 평균 점수 뒤에 가려지지 않는다.

벤치마크는 잘 정제된 테스트셋 위의 수치다. 실제 배포 환경의 분포 변화·지연·비용까지 보장하지는 않는다. 어떤 모델이든 공통된 한계다.

한계와 남은 질문

저자들은 환각, 의도 오독, 눈에 안 띄는 대상 누락이라는 제품 수준의 결함을 출발점으로 삼았다. 이 결함들이 사라졌다기보다 "줄이려 공들인 대상"으로 읽는 게 정확하다. 설계를 따라가면 균형이 깨지는 조건이 보인다.

데이터 엔진이 자기 자신을 참조한다. WDE는 기존 모델들의 예측을 검증·필터링해 라벨을 만든다. 표본 점검과 "모델 오류 대 주석 오류" 분리로 완화하지만, 라벨 상당수를 가짜 라벨로 채우는 이상 그 전문가 모델들이 공유하는 맹점까지 물려받지 않는다는 보장은 없다. 거부의 기준 자체가 그 맹점 위에 서 있을 수 있다.

균형점은 도메인마다 움직인다. 학습으로 잡은 거부와 포착의 균형이 모든 현장에서 같은 자리에 머무르지는 않는다. 조명이 나쁘거나, 대상이 학습 분포와 다르거나, 비용 구조가 특이한 현장에서 어느 쪽으로 기우는지는 평균 점수에 안 나온다. 앞 절의 "별도 표본에서 오탐·누락 따로 재기"가 필요한 이유다.

2B·4B라는 크기. 백본은 Qwen3-VL이고 모델은 20억(2B)·40억(4B) 파라미터 두 종이다. 픽셀 디코더는 가볍지만 백본은 VLM이라 결코 작지 않다. 그리고 파라미터 수가 곧 속도는 아니다. 입력 해상도, 출력 길이, 배치 방식에 따라 실제 지연과 처리량은 크게 달라진다. 엣지·실시간 환경에서 특화 검출기 대비 어떤지는 "효율" 주장과 별개로 운영 수치로 따로 재봐야 한다.

온틀 관점: "없다"를 제품의 동작으로

고객이 QA 스크린샷 수십 장을 올리며 온틀(ONTLE)의 AI PM에게 맡긴다. "결제 버튼이 잘못 겹친 화면만 뽑아줘." 흔한 실패는 둘이다. "겹친 걸 찾아내야 한다"는 압박에 멀쩡한 화면에서도 그럴듯한 좌표를 지어내거나(거짓 보고), 애매한 진짜 결함을 "확실치 않다"며 통째로 빠뜨리거나(누락). PM에게는 둘 다 치명적이다.

온틀은 사람 PM이 하던 프로젝트 관리를 대신 맡는 서비스다. WeVisOne-VL에서 가져올 것은 픽셀 디코더 구조가 아니라, "없는 것은 없다고 한다"를 프롬프트 한 줄("사실만 말해")이 아니라 제품 구조로 넣는 방법이다. 아래는 지금 제공하는 기능이 아니라 설계 제안이며, 비전 모델의 학습법이 PM 에이전트에 그대로 옮겨지지도 않는다. 같은 문제를 다시 풀 때의 밑그림으로 읽어 달라.

핵심은 모델의 None을 세 갈래로 벌리는 것이다. 모델이 한 화면을 보고 내릴 수 있는 판정은 셋이고, 각각이 고객에게 요구하는 다음 동작이 다르다.

  • 결함 있음 → 수정 작업 생성. 겹친 화면을 찾으면 보고로 끝내지 않고, 해당 화면·좌표를 붙여 수정 작업 카드를 바로 만든다. 발견이 곧 처리의 시작이 되게 한다.
  • 해당 없음 → 검토 완료 보고. 선명하게 다 봤는데 겹친 화면이 없을 때다. 침묵이나 "못 찾음"이 아니라, 검토한 화면 목록과 판정 근거를 붙여 "N장 검토, 해당 없음"으로 보고한다. 고객은 그 거부가 성실한 검토인지 회피인지 구분할 수 있다.
  • 판단 불가 → 추가 자료 요청. 화면이 흐려 겹침 여부를 못 가릴 때다. 이걸 "해당 없음"에 섞으면 진짜 결함이 조용히 묻힌다. 따로 떼어 "이 화면은 해상도가 낮아 판정 불가, 원본을 주세요"라고 요청한다.

여기에 WeVisOne-VL의 두 가지 습관을 더 빌려 온다. 하나, 거부(하드 네거티브)와 포착(하드 포지티브)을 짝으로 평가해, 거부가 게으른 핑계로 굳지 않는지 본다. 둘, 보고를 거짓 보고와 빠뜨림으로 갈라서 잰다. 흔히 "보고 전에 한 번 더 훑는" 재검토를 붙이는데, 같은 모델이 같은 눈으로 다시 보면 처음과 똑같은 맹점을 그대로 통과시킨다. 재검토가 뜻을 가지려면 최초 판단과 다른 기준 — 이를테면 정답을 아는 표본과의 대조 — 으로 걸러야 한다.

겹친 화면을 못 찾았다는 보고가, 안 찾은 게 아니라 정말 없어서라는 걸 고객이 믿을 수 있을 때, 그 보고는 비로소 쓸모가 생긴다.

FAQ

WeVisOne-VL은 어떤 라이선스로, 어디서 받나요?

논문 HTML 판은 CC BY 4.0으로 표기돼 있고, 프로젝트 페이지(tencent.github.io/WeVisOne-VL), 코드(GitHub의 Tencent/WeVisOne-VL), 가중치(HuggingFace의 tencent/wevisone-vl 컬렉션)가 공개돼 있습니다. 모델 가중치 자체의 사용 라이선스는 해당 HuggingFace 페이지에서 확인하세요.

분할과 매팅, 실무에선 어느 쪽을 써야 하나요?

영역만 알면 되는 일 — 어디에 무엇이 있는지 표시하거나 특정 물체만 지우는 경우 — 에는 분할 마스크로 충분합니다. 반면 머리카락, 유리, 연기처럼 경계가 반투명한 대상을 다른 배경에 자연스럽게 합성(누끼)해야 할 때는 투명도 값을 담은 알파 매트가 필요합니다. 매팅이 더 정밀한 대신 더 무겁습니다.

이 글은 분할·매팅 중심인데, 검출·카운팅·OCR도 똑같은 경로로 처리되나요?

앞단은 공유합니다. 어떤 과제든 대상을 지목하고 좌표를 전용 토큰으로 내놓는 단계까지는 같습니다. 다만 픽셀 영역이 필요 없는 과제(검출·카운팅·OCR·포인팅)는 `` 토큰과 픽셀 디코더 단계를 거치지 않고, 토큰 출력에서 바로 끝납니다. 픽셀 디코더는 분할·매팅처럼 조밀한 출력이 필요할 때만 작동합니다.

참고자료

[^1]: 비율 좌표를 전용 토큰으로 두는 방식은 Rex-Omni, LocateAnything에서 가져왔다. [^2]: 픽셀 디코더는 Deformable DETR 설계를 따르되(deformable 블록 6개), 질의 슬롯을 학습된 고정값이 아니라 <OBJ> 표현에서 직접 초기화한다. 중간 ViT 특징은 어댑터가 정리하고, 매팅은 미세 경계와 반투명도를 위한 경량 정제 모듈을 하나 더 쓴다. [^3]: 3단계 지도학습(SFT) 뒤에 혼합 과제 강화학습을 얹는 커리큘럼이다. 강화학습은 불확실한 샘플을 먼저 고른 뒤 GRPO(Group Relative Policy Optimization)를 적용하는 온-폴리시(모델이 스스로 만든 답으로 학습하는) 방식이다. [^4]: 후보 생성에는 SAM3, 사내 DINO 계열 검출기, Rex-Omni 등이 쓰인다. 어떤 이미지를 더 모을지는 Wikipedia·WordNet에서 출발한 지식 그래프로 방향을 잡는다. 박스→마스크 변환에는 SAM2를 쓴다. [^5]: 매팅용 라벨은 BiRefNet·MatAnyone2로 알파 후보를 뽑아 여러 기준으로 거른 뒤, 전용 매팅 어노테이터(동결된 SAM2.1-Base+에 알파 정제 헤드를 붙인 구조, SAM2Matting에서 영감)로 전체 코퍼스를 다시 주석해 만든다. 학습 라운드마다 오류를 유형별로 분류하되 "모델 예측 오류"와 "주석 자체 오류"를 구분해, 주석 결함일 때만 라벨을 고친다. 공식 벤치마크는 학습 데이터에서 격리한다.