이미지 세그멘테이션은 픽셀 수준에서 객체를 분리하는 태스크다. 그동안의 모델들은 특정 도메인에 특화됐다. 의료 영상 세그멘테이션 모델, 자율주행 도로 세그멘테이션 모델, 위성 영상 모델이 각각 별도로 존재했다.

Meta AI가 2023년 발표한 SAM(Segment Anything Model)은 다른 접근을 택했다. “어떤 이미지에서도 어떤 객체든 분리할 수 있는 범용 모델"이다.

세 가지 구성요소

이미지 인코더: MAE로 사전학습된 ViT-H. 이미지를 한 번만 인코딩해 임베딩을 만든다. 계산 비용이 크므로 미리 계산해 캐시한다.

프롬프트 인코더: 다양한 형태의 프롬프트를 임베딩으로 변환한다.

  • 점(Point): 객체 안이면 positive, 배경이면 negative
  • 박스(Bounding Box): 객체를 감싸는 직사각형
  • 마스크: 이전 마스크 예측 결과를 다음 단계 힌트로 사용
  • 텍스트: CLIP 텍스트 임베딩 (실험적)

마스크 디코더: 이미지 임베딩과 프롬프트 임베딩을 받아 마스크를 생성한다. 경량 트랜스포머 구조라 추론이 빠르다(CPU에서 50ms 미만).

프롬프트 방식 세그멘테이션

from segment_anything import SamPredictor, sam_model_registry
from PIL import Image
import numpy as np

sam = sam_model_registry["vit_h"](checkpoint="sam_vit_h_4b8939.pth")
predictor = SamPredictor(sam)

image = np.array(Image.open("image.jpg"))
predictor.set_image(image)  # 이미지 인코딩 (한 번만 실행)

# 점 프롬프트: 객체 내부 좌표
masks, scores, logits = predictor.predict(
    point_coords=np.array([[500, 375]]),  # 객체 안의 점
    point_labels=np.array([1]),           # 1=positive, 0=negative
    multimask_output=True,                # 여러 후보 마스크 반환
)
# masks.shape: (3, H, W) — 3개 후보 마스크
# 박스 프롬프트
masks, _, _ = predictor.predict(
    box=np.array([425, 600, 700, 875]),  # [x1, y1, x2, y2]
    multimask_output=False,
)

자동 마스크 생성

프롬프트 없이 이미지 전체의 모든 객체를 자동으로 분리한다.

from segment_anything import SamAutomaticMaskGenerator

mask_generator = SamAutomaticMaskGenerator(sam)
masks = mask_generator.generate(image)
# 이미지 내 모든 객체의 마스크 목록
# 각 마스크: {segmentation, area, bbox, stability_score, ...}

이미지를 격자로 나눠 각 점에서 마스크를 예측하고, NMS로 중복을 제거한다. 결과적으로 이미지의 모든 분리 가능한 객체가 마스크로 나온다.

SA-1B 데이터셋

11억 개 마스크, 1100만 장 이미지로 구성된 역대 최대 세그멘테이션 데이터셋이다. 세 단계로 구축했다.

  1. 전문가가 수동으로 일부 마스크 레이블링
  2. SAM이 나머지 마스크를 예측하면 전문가가 수정(Semi-automatic)
  3. 충분히 학습된 SAM이 자동으로 마스크 생성

이 부트스트래핑 과정으로 수동 레이블링만으로는 불가능한 규모의 데이터를 만들었다.

SAM 2 (2024)

비디오 세그멘테이션으로 확장했다. 비디오의 한 프레임에서 객체를 지정하면 전체 비디오에서 추적한다. 스트리밍 추론을 지원해 실시간 처리가 가능하다.

활용 사례

  • 사진 편집: 배경 제거, 객체 선택
  • 의료 영상: 병변, 기관 윤곽 추출
  • 위성 영상: 건물, 도로, 농경지 추출
  • 로봇: 조작 대상 객체 인식
  • 데이터 레이블링: 어노테이션 보조 도구

트레이드오프

SAM은 “어떤 객체"를 분리하는 능력이 강하지만, 특정 도메인의 의미론적 레이블(이것은 “종양"이다, 이것은 “자전거 도로"다)은 없다. 세그멘테이션 마스크만 제공하고 클래스 분류는 별도 모델이 담당해야 한다.

ViT-H 기반 전체 모델은 추론이 느리다. 이미지 인코딩이 GPU에서 수백 밀리초 걸린다. 실시간 요구가 있다면 MobileSAM, EfficientSAM 같은 경량화 버전이 있다.