SAM 3와 오픈 보캐뷸러리 분할(Open-Vocabulary Segmentation)

모델에 텍스트 프롬프트(text prompt)와 이미지(image)를 주면, 일치하는 모든 객체의 마스크(mask)를 얻습니다. SAM 3는 이를 단일 순전파(single forward pass)로 만들었습니다.

유형: Use + Build 언어: Python 선수 지식: Phase 4 Lesson 07(U-Net), Phase 4 Lesson 08(Mask R-CNN), Phase 4 Lesson 18(CLIP) 예상 시간: 약 60분

학습 목표

  • SAM(시각 프롬프트 전용; visual prompts only), Grounded SAM / SAM 2(탐지기(detector) + SAM), SAM 3(네이티브 텍스트 프롬프트 기반 Promptable Concept Segmentation)를 구분합니다.
  • SAM 3 아키텍처(architecture)를 설명합니다. 공유 백본(shared backbone), 이미지 탐지기(image detector), 메모리 기반 영상 추적기(memory-based video tracker), 존재 헤드(presence head), 분리된 탐지기-추적기(decoupled detector-tracker) 설계를 포함합니다.
  • 허깅페이스(Hugging Face) transformers의 SAM 3 통합을 사용해 텍스트 프롬프트 기반 탐지(detection), 분할(segmentation), 영상 추적(video tracking)을 실행합니다.
  • 지연 시간(latency), 개념 복잡도(concept complexity), 배포 대상(deployment target)에 따라 SAM 3, Grounded SAM 2, YOLO-World, SAM-MI 중에서 선택합니다.

문제

2023년의 SAM은 시각 프롬프트 전용 모델이었습니다. 점(point)을 클릭하거나 박스(box)를 그리면 마스크를 반환했습니다. "이 사진의 모든 오렌지(orange)를 찾아줘" 같은 요청에는 탐지기(Grounding DINO)가 박스를 만들고, 그다음 SAM이 각 박스를 분할(segment)해야 했습니다. Grounded SAM은 이를 파이프라인(pipeline)으로 만들었지만, 결국 두 동결(frozen) 모델의 캐스케이드(cascade)였고 오류 누적은 피할 수 없었습니다.

SAM 3(Meta, 2025년 11월, ICLR 2026)는 이 캐스케이드를 접었습니다. 짧은 명사구(noun phrase) 또는 이미지 예시(image exemplar)를 프롬프트로 받아서, 일치하는 모든 마스크와 인스턴스 ID(instance ID)를 단일 순전파로 반환합니다. 이것이 바로 프롬프트 가능한 개념 분할(Promptable Concept Segmentation; PCS) 입니다. 2026년 3월의 Object Multiplex 업데이트(SAM 3.1)와 결합하면, 같은 개념의 여러 인스턴스를 영상에서 효율적으로 추적합니다.

이 강의는 이 구조적 변화가 무엇을 의미하는지 다룹니다. 2D 분할, 탐지, 텍스트-이미지 그라운딩(text-image grounding)이 하나의 모델로 합쳐졌습니다. 실무에서 던지는 질문은 더 이상 "어떤 파이프라인을 이어 붙일까"가 아니라 "내 사용 사례(use case)를 종단간(end-to-end)으로 처리할 프롬프트 가능한(promptable) 모델이 무엇인가"입니다.

사전 테스트

2문제 · 이 강의를 시작하기 전에 얼마나 알고 있는지 확인해보세요

1.SAM 3가 도입한 프롬프트 가능한 개념 분할(Promptable Concept Segmentation; PCS)은 무엇인가요?

2.SAM 3가 이미 텍스트 프롬프트 기반 분할을 한다면, 2026년에도 탐지기와 SAM 2를 분리해 잇는 파이프라인(Grounded SAM 2)을 유지하는 이유는 무엇인가요?

0/2 답변 완료

개념

세 세대의 흐름

flowchart LR
    subgraph SAM1["SAM (2023)"]
        A1["Image + point/box prompt"] --> A2["ViT encoder"] --> A3["Mask decoder"]
        A3 --> A4["해당 prompt의 mask"]
    end
    subgraph GSAM2["Grounded SAM 2 (2024)"]
        B1["Text"] --> B2["Grounding DINO"] --> B3["Boxes"] --> B4["SAM 2"] --> B5["Masks + tracking"]
        B6["Image"] --> B2
        B6 --> B4
    end
    subgraph SAM3["SAM 3 (2025)"]
        C1["Text 또는 image exemplar"] --> C2["Shared backbone"]
        C3["Image"] --> C2
        C2 --> C4["Image detector + memory tracker<br/>+ presence head"]
        C4 --> C5["일치하는 모든 mask<br/>+ instance IDs"]
    end

    style SAM1 fill:#e5e7eb,stroke:#6b7280
    style GSAM2 fill:#fef3c7,stroke:#d97706
    style SAM3 fill:#dcfce7,stroke:#16a34a

프롬프트 가능한 개념 분할(Promptable Concept Segmentation)

"개념 프롬프트(concept prompt)"는 "yellow school bus", "striped red umbrella", "hand holding a mug" 같은 짧은 명사구이거나 이미지 예시(image exemplar)입니다. 모델은 이미지에서 해당 개념과 일치하는 모든 인스턴스의 분할 마스크(segmentation mask)와 매치별로 고유한 인스턴스 ID를 반환합니다.

고전적인 시각 프롬프트 기반의 SAM과 차이점은 세 가지입니다.

  1. 인스턴스마다 별도의 프롬프팅(prompting)이 필요 없습니다. 텍스트 프롬프트 하나가 모든 매치를 반환합니다.
  2. 개방형 어휘(open-vocabulary) 방식입니다. 개념은 자연어로 설명할 수 있는 무엇이든 될 수 있습니다.
  3. 프롬프트 하나당 마스크 하나가 아니라 여러 인스턴스를 한 번에 반환합니다.

핵심 아키텍처 구성요소

  • 공유 백본(Shared backbone): 하나의 ViT가 이미지를 처리합니다. 탐지기 헤드(detector head)와 메모리 기반 추적기(memory-based tracker)가 모두 이 특징(feature)을 읽습니다.
  • 존재 헤드(Presence head): 개념이 이미지에 존재하는지 여부를 예측합니다. "여기 있는가?"라는 판단을 "어디 있는가?"라는 판단과 분리해, 존재하지 않는 개념에 대한 위양성(false positive)을 줄입니다.
  • 분리된 탐지기-추적기(Decoupled detector-tracker): 이미지 수준 탐지와 영상 수준 추적이 서로 간섭하지 않도록 별도의 헤드를 둡니다.
  • 메모리 뱅크(Memory bank): 영상 추적을 위해 프레임 간 인스턴스 특징을 저장합니다. SAM 2가 사용한 메커니즘과 같습니다.

대규모 학습

SAM 3는 인공지능(AI)과 사람 검토(human review)를 결합해 반복적으로 주석(annotation)을 달고 보정하는 데이터 엔진(data engine)이 만들어 낸 400만 개의 고유 개념(unique concepts) 으로 학습되었습니다. 새로 공개된 SA-CO 벤치마크(benchmark) 는 270K개의 고유 개념을 포함하며, 이전 개방형 어휘 벤치마크보다 50배 큽니다. SAM 3는 SA-CO에서 사람 수준 성능의 75~80%에 도달하고, 이미지와 영상 PCS 모두에서 기존 시스템을 두 배 이상 앞섭니다.

SAM 3.1 Object Multiplex

2026년 3월 업데이트인 Object Multiplex는 같은 개념의 많은 인스턴스를 동시 추적(joint tracking)하기 위한 공유 메모리(shared-memory) 메커니즘을 도입했습니다. 이전에는 N개의 인스턴스를 추적하려면 N개의 메모리 뱅크가 필요했습니다. Multiplex는 이를 인스턴스별 질의(per-instance query)를 가진 하나의 공유 메모리로 합칩니다. 그 결과, 정확도를 잃지 않으면서도 다중 객체 추적이 훨씬 빨라집니다.

2026년에도 Grounded SAM이 의미 있는 경우

  • DINO-X, Florence-2 같은 특정 개방형 어휘 탐지기를 교체해 넣어야 할 때
  • SAM 3의 라이선스(허깅페이스 게이트(gate) 포함)가 걸림돌일 때
  • SAM 3가 노출하는 것보다 탐지기 임계값(threshold)을 더 세밀하게 제어해야 할 때
  • 탐지기 구성요소에 대한 연구나 어블레이션(ablation) 실험을 할 때

모듈식 파이프라인(modular pipeline)에는 여전히 자리가 있습니다. 다만, 대부분의 실무에서는 SAM 3가 더 단순한 답입니다.

YOLO-World와 SAM 3 비교

  • YOLO-World: 개방형 어휘 탐지기 전용입니다. 마스크는 만들지 않습니다. 실시간(real-time)이며, 높은 프레임률(fps)의 박스가 필요할 때 가장 좋습니다.
  • SAM 3: 완전한 분할과 추적까지 제공합니다. 더 느리지만 출력이 풍부합니다.

운영 기준으로는 로보틱스 내비게이션(robotics navigation)이나 빠른 대시보드처럼 탐지만 필요할 때는 YOLO-World를, 마스크나 추적이 필요할 때는 SAM 3를 고릅니다.

SAM-MI의 효율성

SAM-MI(2025~2026)는 SAM의 디코더(decoder) 병목을 해소합니다. 핵심 아이디어는 다음과 같습니다.

  • 희소 점 프롬프팅(Sparse point prompting): 조밀한(dense) 프롬프트 대신 잘 고른 몇 개의 점을 사용해 디코더 호출을 96% 줄입니다.
  • 얕은 마스크 집계(Shallow mask aggregation): 거친(rough) 마스크 예측들을 합쳐 더 선명한 마스크 하나로 만듭니다.
  • 분리된 마스크 주입(Decoupled mask injection): 디코더가 다시 실행되는 대신, 미리 계산된(pre-computed) 마스크 특징을 받습니다.

그 결과, 개방형 어휘 벤치마크에서 Grounded-SAM보다 약 1.6배 빨라집니다.

세 모델의 출력 형식

세 모델 모두 일반적으로 같은 구조(박스 + 레이블 + 점수 + 마스크 + ID)를 반환합니다. 이는 하류(downstream) 파이프라인에 유리합니다. 어떤 모델을 실행했는지에 따라 분기할 필요가 줄어들기 때문입니다.

직접 만들기(Build It)

Step 1: 프롬프트 구성(Prompt construction)

사용자 문장을 SAM 3 개념 프롬프트의 리스트로 바꾸는 헬퍼(helper)를 만듭니다. 이 지점이 "사용자가 입력한 것"과 "모델이 소비하는 것"이 만나는 경계입니다.

def split_concepts(sentence):
    """
    여러 개념이 섞인 프롬프트를 분리하는 휴리스틱(heuristic) 분할기입니다.
    짧은 명사구 리스트를 반환합니다.
    """
    for sep in [",", ";", "and", "or", "&"]:
        if sep in sentence:
            parts = [p.strip() for p in sentence.replace("and ", ",").split(",")]
            return [p for p in parts if p]
    return [sentence.strip()]

print(split_concepts("cats, dogs and balloons"))

SAM 3는 순전파마다 개념 하나를 받습니다. 다중 개념 질의는 반복문으로 돌리거나 배치(batch)로 처리합니다.

Step 2: 후처리 헬퍼

SAM 3의 원시 출력을 Phase 4 Lesson 16 파이프라인 계약(pipeline contract)과 맞는 탐지 리스트로 바꿉니다.

from dataclasses import dataclass
from typing import List

@dataclass
class ConceptDetection:
    concept: str
    instance_id: int
    box: tuple          # (x1, y1, x2, y2)
    score: float
    mask_rle: str       # run-length encoded


def rle_encode(binary_mask):
    flat = binary_mask.flatten().astype("uint8")
    runs = []
    prev, count = flat[0], 0
    for v in flat:
        if v == prev:
            count += 1
        else:
            runs.append((int(prev), count))
            prev, count = v, 1
    runs.append((int(prev), count))
    return ";".join(f"{v}x{c}" for v, c in runs)

런길이 부호화(RLE; Run-Length Encoding)는 고해상도 마스크가 많을 때도 응답 페이로드를 작게 유지합니다. 같은 형식은 SAM 2, SAM 3, Grounded SAM 2에서 모두 쓸 수 있습니다.

Step 3: 통합 개방형 어휘 분할 인터페이스

가지고 있는 백엔드(SAM 3, Grounded SAM 2, YOLO-World + SAM 2)를 하나의 메서드 뒤에 감쌉니다. 백엔드가 바뀌어도 하류 코드는 바뀌지 않습니다.

from abc import ABC, abstractmethod
import numpy as np

class OpenVocabSeg(ABC):
    @abstractmethod
    def detect(self, image: np.ndarray, concept: str) -> List[ConceptDetection]:
        ...


class StubOpenVocabSeg(OpenVocabSeg):
    """
    실제 모델을 로드하지 않은 상태에서 파이프라인 테스트에 쓰는 결정적 스텁(deterministic stub)입니다.
    """
    def detect(self, image, concept):
        h, w = image.shape[:2]
        return [
            ConceptDetection(
                concept=concept,
                instance_id=0,
                box=(w * 0.2, h * 0.3, w * 0.5, h * 0.8),
                score=0.89,
                mask_rle="0x100;1x50;0x200",
            ),
            ConceptDetection(
                concept=concept,
                instance_id=1,
                box=(w * 0.55, h * 0.25, w * 0.85, h * 0.75),
                score=0.74,
                mask_rle="0x80;1x40;0x220",
            ),
        ]

실제 SAM3OpenVocabSeg 하위 클래스는 transformers.Sam3ModelSam3Processor를 감싸도록 구현하면 됩니다.

Step 4: 허깅페이스 SAM 3 사용법(참고)

실제 모델은 transformers 통합으로 다음처럼 사용합니다.

from transformers import Sam3Processor, Sam3Model
import torch

processor = Sam3Processor.from_pretrained("facebook/sam3")
model = Sam3Model.from_pretrained("facebook/sam3").eval()

inputs = processor(images=pil_image, return_tensors="pt")
inputs = processor.set_text_prompt(inputs, "yellow school bus")

with torch.no_grad():
    outputs = model(**inputs)

masks = processor.post_process_masks(
    outputs.masks, inputs.original_sizes, inputs.reshaped_input_sizes
)
boxes = outputs.boxes
scores = outputs.scores

프롬프트 하나로 모든 매치가 한 번의 호출로 반환됩니다.

Step 5: Grounded SAM 2가 공짜로 주던 것을 측정하기

정직한 벤치마크는 실제 파이프라인에서 Grounded SAM 2를 SAM 3로 바꿨을 때 무엇이 달라지는지 보는 것입니다.

  • 지연 시간: SAM 3는 별도의 탐지기가 없어 순전파를 한 번 줄이지만, 모델 자체는 더 무겁습니다. 보통 손익이 비슷하거나 약간 빨라집니다.
  • 정확도: SAM 3는 "striped red umbrella"처럼 드물거나 구성적인(compositional) 개념에서 크게 우수합니다. 흔한 단일 단어 개념에서는 비슷한 수준입니다.
  • 유연성: Grounded SAM 2는 탐지기(DINO-X, Florence-2, Grounding DINO 1.5)를 교체할 수 있습니다. SAM 3는 일체형(monolithic)입니다.

결론은 SAM 3가 2026년 개방형 어휘 분할의 기본 선택지라는 것입니다. 탐지기 유연성이나 라이선스 조건이 중요하면 Grounded SAM 2가 여전히 적절한 답입니다.

사용해보기(Use It)

운영 배포 패턴은 다음과 같습니다.

  • 실시간 주석(Real-time annotation): SAM 3와 CVAT의 "레이블을 텍스트 프롬프트처럼 쓰는(label-as-text-prompt)" 기능을 결합합니다. 작업자가 레이블 이름을 고르면 SAM 3가 일치하는 모든 인스턴스를 미리 레이블링(pre-label)합니다. 이후 검토하고 수정합니다.
  • 영상 분석(Video analytics): 다중 객체 추적에는 SAM 3.1 Object Multiplex를 사용하고, 프레임을 메모리 기반 추적기에 흘려보냅니다.
  • 로보틱스(Robotics): "pick up the red cup" 같은 개방형 어휘 조작(manipulation) 명령에 대해 계획 단계의 기본 동작(primitive)으로 SAM 3를 사용합니다.
  • 의료 영상(Medical imaging): 의료 개념으로 미세 조정(fine-tune)한 SAM 3를 사용합니다. 허깅페이스 접근 신청(access request)이 필요합니다.

울트라리틱스(Ultralytics)는 자사 파이썬 패키지에서 SAM 3를 감쌉니다.

from ultralytics import SAM

model = SAM("sam3.pt")
results = model(image_path, prompts="yellow school bus")

YOLO나 SAM 2와 같은 인터페이스입니다.

산출물 만들기(Ship It)

이 강의에서는 다음 산출물을 만듭니다.

  • outputs/prompt-open-vocab-stack-picker.md: 지연 시간, 개념 복잡도, 라이선스 요건에 따라 SAM 3 / Grounded SAM 2 / YOLO-World / SAM-MI 중에서 선택하는 프롬프트입니다.
  • outputs/skill-concept-prompt-designer.md: 사용자 발화(utterance)를 형식이 잘 갖춰진 SAM 3 개념 프롬프트로 바꾸는 스킬입니다. 분할, 모호성 해소(disambiguation), 폴백(fallback)을 포함합니다.

연습문제

  1. (쉬움) 직접 고른 개념 프롬프트로 이미지 10장에 SAM 3를 실행합니다. 같은 이미지에서 SAM 2 + Grounding DINO 1.5와 비교하고, 각 모델이 놓친 개념을 보고합니다.
  2. (중간) SAM 3 위에 "클릭으로 포함하기 / 클릭으로 제외하기(click-to-include / click-to-exclude)" UI를 만듭니다. 텍스트 프롬프트는 후보 인스턴스를 반환하고, 사용자는 어떤 인스턴스를 양성(positive)으로 볼지 클릭합니다. 최종 개념 집합을 JSON으로 출력합니다.
  3. (어려움) 전자 부품 5종 같은 사용자 정의 개념 집합에 대해 각 20장씩 레이블링한 이미지로 SAM 3를 미세 조정합니다. 같은 테스트 집합에서 제로샷(zero-shot) SAM 3와 비교하고, 마스크 IoU 향상량을 측정합니다.

핵심 용어

용어흔한 설명실제 의미
개방형 어휘 분할(Open-vocabulary segmentation)"텍스트로 분할"고정된 레이블 집합이 아니라 자연어로 설명된 객체의 마스크를 생성한다
PCS(Promptable Concept Segmentation)"프롬프트 가능한 개념 분할"SAM 3의 핵심 과제. 명사구나 이미지 예시를 받아 일치하는 모든 인스턴스를 분할한다
개념 프롬프트(Concept prompt)"텍스트 입력"짧은 명사구 또는 이미지 예시. 완전한 문장이 아니다
존재 헤드(Presence head)"여기 있는가?"위치 추정(localisation) 전에 개념이 이미지에 있는지 판단하는 SAM 3 모듈
SA-CO"SAM 3 벤치마크"270K개 개념의 개방형 어휘 분할 벤치마크. 이전 개방형 어휘 벤치마크보다 50배 크다
Object Multiplex"SAM 3.1 업데이트"공유 메모리 기반 다중 객체 추적. 많은 인스턴스를 빠르게 동시 추적한다
Grounded SAM 2"모듈식 파이프라인"탐지기와 SAM 2를 이은 캐스케이드. 탐지기 교체가 중요할 때 여전히 유효하다
SAM-MI"효율적인 SAM 변형"마스크 주입(Mask Injection)으로 Grounded-SAM보다 1.6배 빠른 변형

더 읽을거리

실습 코드

이 강의의 실습 코드 1개

main
Code

산출물

이 강의에서 생성된 프롬프트, 스킬, 코드 산출물 2개

skill-concept-prompt-designer

Turn user utterances into well-formed SAM 3 concept prompts with splitting, disambiguation, and fallbacks

Skill
prompt-open-vocab-stack-picker

Pick SAM 3 / Grounded SAM 2 / YOLO-World / SAM-MI based on latency, concept complexity, and licensing

Prompt

확인 문제

3문제 · 모두 맞추면 완료 표시가 가능합니다

1.SAM 3의 존재 헤드(presence head)는 무엇을 만들어 내나요?

2.SAM 3.1 Object Multiplex(2026년 3월)는 추적(tracking)을 위한 공유 메모리(shared-memory) 메커니즘을 도입했습니다. 이것은 무엇을 대체하나요?

3.엣지 디바이스(edge device)에서 실시간 개방형 어휘 탐지(박스만 필요, 마스크 불필요)가 필요합니다. 2026년 기준 어떤 모델 계열이 적합한가요?

0/3 답변 완료