Ultralytics YOLO27:

Segment Anything Model (SAM)#

SAM의 발전

Meta의 오리지널 SAM 모델입니다. 향상된 기능은 동영상 세분화를 위한 SAM 2 또는 텍스트 및 이미지 예시 프롬프트를 사용한 프롬프트 기반 개념 세분화를 위한 SAM 3에서 확인할 수 있습니다.

How to use Segment Anything In Colab

Segment Anything Model, 즉 SAM과 함께 새로운 이미지 세분화의 최전선에 오신 것을 환영합니다. 이 혁신적인 모델은 실시간 성능을 갖춘 프롬프트 기반 이미지 세분화를 도입하여 해당 분야의 새로운 기준을 세우고 판도를 바꾸었습니다.

SAM 소개: Segment Anything Model#

Segment Anything Model, 즉 SAM은 프롬프트 기반 세분화를 지원하는 최첨단 이미지 세분화 모델로, 이미지 분석 작업에서 탁월한 유연성을 제공합니다. SAM은 이미지 세분화를 위한 새로운 모델, 작업, 데이터셋을 소개하는 획기적인 프로젝트인 Segment Anything 이니셔티브의 핵심입니다.

SAM의 고급 설계는 사전 지식 없이도 새로운 이미지 분포와 작업에 적응할 수 있도록 하며, 이를 제로샷 전이(zero-shot transfer)라고 합니다. 1,100만 개의 신중하게 큐레이션된 이미지에 10억 개가 넘는 마스크가 포함된 방대한 SA-1B 데이터셋으로 학습된 SAM은 인상적인 제로샷 성능을 보였으며, 많은 경우 이전의 완전 지도학습 결과를 능가했습니다.

자동 세분화 마스크가 포함된 SA-1B 데이터셋 샘플 SA-1B 예시 이미지. 새롭게 소개된 SA-1B 데이터셋의 이미지 위에 마스크를 표시했습니다. SA-1B에는 다양하고 고해상도이며 라이선스가 부여되고 개인정보를 보호하는 이미지 1,100만 개와 고품질 세분화 마스크 11억 개가 포함되어 있습니다. 이러한 마스크는 SAM이 완전히 자동으로 주석 처리했으며, 사람의 평가와 수많은 실험을 통해 높은 품질과 다양성을 갖춘 것으로 확인되었습니다. 시각화를 위해 이미지당 마스크 수에 따라 이미지를 그룹화했습니다(이미지당 평균 약 100개의 마스크가 있습니다).

Segment Anything Model (SAM)의 주요 기능#

  • 프롬프트 기반 세분화 작업: SAM은 프롬프트 기반 세분화 작업을 염두에 두고 설계되었으며, 객체를 식별하는 공간 단서나 텍스트 단서 등 주어진 모든 프롬프트에서 유효한 세분화 마스크를 생성할 수 있습니다.
  • 고급 아키텍처: Segment Anything Model은 강력한 이미지 인코더, 프롬프트 인코더, 경량 마스크 디코더를 사용합니다. 이 고유한 아키텍처는 세분화 작업에서 유연한 프롬프트 입력, 실시간 마스크 계산, 모호성 인식을 지원합니다.
  • SA-1B 데이터셋: Segment Anything 프로젝트에서 소개한 SA-1B 데이터셋은 1,100만 개의 이미지에 10억 개가 넘는 마스크를 포함합니다. 현재까지 가장 큰 세분화 데이터셋으로서, SAM에 다양하고 대규모인 학습 데이터 소스를 제공합니다.
  • 제로샷 성능: SAM은 다양한 세분화 작업에서 뛰어난 제로샷 성능을 보여주므로, 프롬프트 엔지니어링이 거의 필요 없는 다양한 애플리케이션에 즉시 사용할 수 있는 도구입니다.

Segment Anything Model과 SA-1B 데이터셋을 자세히 살펴보려면 Segment Anything GitHub를 방문하고 연구 논문 Segment Anything을 확인하시기 바랍니다.

Ultralytics Platform의 SAM

SAM은 Ultralytics Platform스마트 주석 기능을 구동하여 클릭 기반 지능형 마스킹으로 빠른 데이터셋 라벨링을 지원합니다. 자세한 내용은 주석 가이드를 참조하시기 바랍니다.

사용 가능한 모델, 지원 작업 및 운영 모드#

이 표에는 사용 가능한 모델과 해당 사전 학습 가중치, 지원되는 작업, 추론, 검증, 학습, 내보내기와 같은 다양한 운영 모드와의 호환성이 나와 있습니다. 지원되는 모드는 ✅ 이모지로, 지원되지 않는 모드는 ❌ 이모지로 표시합니다.

모델 유형사전 학습된 가중치지원되는 작업학습검증추론내보내기
SAM basesam_b.pt인스턴스 세그멘테이션
SAM largesam_l.pt인스턴스 세그멘테이션

SAM 사용 방법: 이미지 세분화의 유연성과 강력한 성능#

Segment Anything Model은 학습 데이터를 넘어서는 다양한 다운스트림 작업에 사용할 수 있습니다. 여기에는 에지 검출, 객체 제안 생성, 인스턴스 세분화, 초기 텍스트-마스크 예측이 포함됩니다. 프롬프트 엔지니어링을 사용하면 SAM은 새로운 작업과 데이터 분포에 제로샷 방식으로 신속하게 적응할 수 있어, 모든 이미지 세분화 요구 사항에 대응하는 다목적의 강력한 도구가 됩니다.

SAM 예측 예시#

프롬프트를 사용한 세분화

주어진 프롬프트로 이미지를 세분화합니다.

from ultralytics import SAM

# Load a model
model = SAM("sam_b.pt")

# Display model information (optional)
model.info()

# Run inference with bboxes prompt
results = model("ultralytics/assets/zidane.jpg", bboxes=[439, 437, 524, 709])

# Run inference with single point
results = model(points=[900, 370], labels=[1])

# Run inference with multiple points
results = model(points=[[400, 370], [900, 370]], labels=[1, 1])

# Run inference with multiple points prompt per object
results = model(points=[[[400, 370], [900, 370]]], labels=[[1, 1]])

# Run inference with negative points prompt
results = model(points=[[[400, 370], [900, 370]]], labels=[[1, 0]])
전체 세분화

이미지 전체를 세분화합니다.

from ultralytics import SAM

# Load a model
model = SAM("sam_b.pt")

# Display model information (optional)
model.info()

# Run inference
model("path/to/image.jpg")
  • 여기서는 프롬프트(bboxes/points/masks)를 전달하지 않으면 이미지 전체를 세분화합니다.
SAMPredictor 예시

이 방법을 사용하면 이미지를 한 번 설정한 후 이미지 인코더를 여러 번 실행하지 않고 프롬프트 추론을 여러 번 실행할 수 있습니다.

import cv2

from ultralytics.models.sam import Predictor as SAMPredictor

# Create SAMPredictor
overrides = {"conf": 0.25, "task": "segment", "mode": "predict", "imgsz": 1024, "model": "mobile_sam.pt"}
predictor = SAMPredictor(overrides=overrides)

# Set image
predictor.set_image("ultralytics/assets/zidane.jpg")  # set with image file
predictor.set_image(cv2.imread("ultralytics/assets/zidane.jpg"))  # set with np.ndarray
results = predictor(bboxes=[439, 437, 524, 709])

# Run inference with single point prompt
results = predictor(points=[900, 370], labels=[1])

# Run inference with multiple points prompt
results = predictor(points=[[400, 370], [900, 370]], labels=[1, 1])

# Run inference with negative points prompt
results = predictor(points=[[[400, 370], [900, 370]]], labels=[[1, 0]])

# Reset image
predictor.reset_image()

추가 인수와 함께 전체를 세분화합니다.

from ultralytics.models.sam import Predictor as SAMPredictor

# Create SAMPredictor
overrides = {"conf": 0.25, "task": "segment", "mode": "predict", "imgsz": 1024, "model": "mobile_sam.pt"}
predictor = SAMPredictor(overrides=overrides)

# Segment with additional args
results = predictor(source="ultralytics/assets/zidane.jpg", crop_n_layers=1, points_stride=64, min_mask_region_area=100)
참고

위 예시에서 반환되는 모든 results은 예측된 마스크와 원본 이미지에 쉽게 액세스할 수 있는 Results 객체입니다.

YOLO와 SAM 비교#

여기서는 Meta의 SAM-b 모델을 YOLO26n-seg를 포함한 Ultralytics 세분화 모델과 비교합니다.

모델크기
(MB)
파라미터
(M)
속도 (CPU)
(ms/이미지)
Meta SAM-b37593.741703
MobileSAM40.710.123802
YOLOv8 백본을 사용하는 FastSAM-s23.911.858.0
Ultralytics YOLOv8n-seg7.1 (52.8배 작음)3.4 (27.6배 적음)24.8 (1682배 빠름)
Ultralytics YOLO11n-seg6.2 (60.5배 작음)2.9 (32.3배 적음)24.3 (1716배 빠름)
Ultralytics YOLO26n-seg6.7 (56.0배 작음)2.7 (34.7배 적음)25.2 (1655배 빠름)

이 비교는 SAM 변형 모델과 YOLO 분할 모델 간의 모델 크기와 속도 차이가 상당함을 보여줍니다. SAM은 고유한 자동 분할 기능을 제공하지만, 특히 YOLOv8n-seg, YOLO11n-seg 및 YOLO26n-seg와 같은 YOLO 모델은 훨씬 작고 빠르며 계산 효율성이 높습니다.

SAM 속도는 PyTorch로 측정했으며, YOLO 속도는 ONNX Runtime으로 측정했습니다. 테스트는 torch==2.10.0, ultralytics==8.4.31onnxruntime==1.24.4를 사용하여 16GB RAM을 탑재한 2025 Apple M4 Air에서 실행했습니다. 이 테스트를 재현하려면 다음을 수행합니다:

예시
from ultralytics import ASSETS, SAM, YOLO, FastSAM

# Profile SAM-b, MobileSAM
for file in ["sam_b.pt", "mobile_sam.pt"]:
    model = SAM(file)
    model.info()
    model(ASSETS)

# Profile FastSAM-s
model = FastSAM("FastSAM-s.pt")
model.info()
model(ASSETS)

# Profile YOLO models (ONNX)
for file_name in ["yolov8n-seg.pt", "yolo11n-seg.pt", "yolo26n-seg.pt"]:
    model = YOLO(file_name)
    model.info()
    onnx_path = model.export(format="onnx", dynamic=True, nms=False)  # YOLO26 NMS-free head; no-op for YOLOv8/YOLO11
    model = YOLO(onnx_path)
    model(ASSETS)

자동 주석: 세분화 데이터셋으로 가는 빠른 경로#

자동 주석은 SAM의 핵심 기능으로, 사전 학습된 검출 모델을 사용하여 세분화 데이터셋을 생성할 수 있습니다. 이 기능을 사용하면 시간이 많이 걸리는 수동 라벨링 없이도 대량의 이미지에 신속하고 정확하게 주석을 추가할 수 있습니다.

검출 모델을 사용하여 세분화 데이터셋 생성하기#

Ultralytics 프레임워크로 데이터셋에 자동 주석을 추가하려면 다음과 같이 auto_annotate 함수를 사용합니다.

예시
from ultralytics.data.annotator import auto_annotate

auto_annotate(data="path/to/images", det_model="yolo26x.pt", sam_model="sam_b.pt")
인수유형기본값설명
datastr필수어노테이션 또는 분할 대상 이미지가 포함된 디렉터리의 경로입니다.
det_modelstr'yolo26x.pt'초기 객체 감지를 위한 YOLO 감지 모델 경로입니다.
sam_modelstr'sam_b.pt'분할을 위한 SAM 모델 경로입니다(SAM, SAM 2, MobileSAM 및 SAM 3 가중치를 지원합니다).
devicestr''계산 장치입니다(예: 'cuda:0', 'cpu' 또는 자동 장치 감지를 위한 ''입니다).
conffloat0.25낮은 신뢰도의 감지를 필터링하기 위한 YOLO 감지 신뢰도 임계값입니다.
ioufloat0.45겹치는 박스를 필터링하기 위한 Non-Maximum Suppression의 IoU 임계값입니다.
imgszint640이미지 크기 조정을 위한 입력 크기입니다(32의 배수여야 합니다).
max_detint300메모리 효율성을 위한 이미지당 최대 감지 수입니다.
classeslist[int]None감지할 클래스 인덱스 목록입니다(예: 사람 및 자전거의 경우 [0, 1]).
output_dirstrNone어노테이션 저장 디렉터리입니다(기본값: <data>_auto_annotate_labels의 형제 디렉터리).

auto_annotate 함수는 이미지 경로를 입력으로 받으며, 사전 학습된 검출 및 SAM 세분화 모델, 모델을 실행할 장치, 주석이 추가된 결과를 저장할 출력 디렉터리를 지정하는 선택적 인수를 제공합니다.

사전 학습된 모델을 사용한 자동 주석은 고품질 세분화 데이터셋을 만드는 데 필요한 시간과 노력을 크게 줄일 수 있습니다. 이 기능은 대규모 이미지 컬렉션을 다루는 연구자와 개발자에게 특히 유용하며, 수동 주석 대신 모델 개발과 평가에 집중할 수 있도록 합니다.

인용 및 감사의 글#

연구 또는 개발 업무에서 SAM이 유용하다고 판단되신다면 논문 인용을 고려해 주시기 바랍니다.

인용문
@misc{kirillov2023segment,
      title={Segment Anything},
      author={Alexander Kirillov and Eric Mintun and Nikhila Ravi and Hanzi Mao and Chloe Rolland and Laura Gustafson and Tete Xiao and Spencer Whitehead and Alexander C. Berg and Wan-Yen Lo and Piotr Dollár and Ross Girshick},
      year={2023},
      eprint={2304.02643},
      archivePrefix={arXiv},
      primaryClass={cs.CV}
}

컴퓨터 비전 커뮤니티를 위해 이 귀중한 리소스를 만들고 유지 관리해 준 Meta AI에 감사를 표합니다.

FAQ#

  • Meta의 Segment Anything Model(SAM)은 프롬프트 기반 분할 태스크를 위해 설계된 혁신적인 이미지 분할 모델입니다. 공간 또는 텍스트 단서와 같은 다양한 프롬프트에서 고품질 분할 마스크를 생성하기 위해 이미지 및 프롬프트 인코더와 경량 마스크 Decoder가 결합된 고급 아키텍처를 활용합니다. 방대한 SA-1B dataset으로 학습된 SAM은 사전 지식 없이도 새로운 이미지 분포와 태스크에 적응하는 제로샷 성능에서 뛰어난 역량을 발휘합니다.

  • 바운딩 박스나 포인트와 같은 다양한 프롬프트를 사용하여 추론을 실행하면 이미지 세분화에 Segment Anything Model (SAM)을 사용할 수 있습니다. 다음은 Python을 사용한 예시입니다.

    from ultralytics import SAM
    
    # Load a model
    model = SAM("sam_b.pt")
    
    # Segment with bounding box prompt
    model("ultralytics/assets/zidane.jpg", bboxes=[439, 437, 524, 709])
    
    # Segment with points prompt
    model("ultralytics/assets/zidane.jpg", points=[900, 370], labels=[1])
    
    # Segment with multiple points prompt
    model("ultralytics/assets/zidane.jpg", points=[[400, 370], [900, 370]], labels=[1, 1])
    
    # Segment with multiple points prompt per object
    model("ultralytics/assets/zidane.jpg", points=[[[400, 370], [900, 370]]], labels=[[1, 1]])
    
    # Segment with negative points prompt.
    model("ultralytics/assets/zidane.jpg", points=[[[400, 370], [900, 370]]], labels=[[1, 0]])

    또는 명령줄 인터페이스(CLI)에서 SAM으로 추론을 실행할 수 있습니다.

    yolo predict model=sam_b.pt source=path/to/image.jpg

    더 자세한 사용 지침은 세분화 섹션을 참조하시기 바랍니다.

  • YOLO 모델과 비교하면 SAM-b, MobileSAM, FastSAM-s와 같은 SAM 변형 모델은 일반적으로 더 크고 느리지만 고유한 제로샷 세분화 기능을 제공합니다. 예를 들어 YOLO26n-seg는 CPU에서 Meta의 오리지널 SAM-b 모델보다 56배 작고 1650배 이상 빠릅니다. 따라서 빠르고 가벼우며 계산 효율적인 세분화가 필요한 애플리케이션에는 YOLO 모델이 적합하고, 유연한 프롬프트 기반 제로샷 세분화 작업에는 SAM 모델이 뛰어납니다.

  • Ultralytics의 SAM은 사전 학습된 검출 모델을 사용하여 세분화 데이터셋을 생성할 수 있는 자동 주석 기능을 제공합니다. 다음은 Python을 사용한 예시입니다.

    from ultralytics.data.annotator import auto_annotate
    
    auto_annotate(data="path/to/images", det_model="yolo26x.pt", sam_model="sam_b.pt")

    이 함수는 이미지 경로와 사전 학습된 검출 및 SAM 세분화 모델을 위한 선택적 인수, 그리고 장치와 출력 디렉터리 지정 정보를 입력으로 받습니다. 전체 가이드는 자동 주석을 참조하시기 바랍니다.

  • SAM은 1,100만 개의 이미지에 10억 개가 넘는 마스크가 포함된 방대한 SA-1B 데이터셋으로 학습됩니다. SA-1B는 현재까지 가장 큰 세분화 데이터셋으로, 고품질의 다양한 학습 데이터를 제공하여 여러 세분화 작업에서 인상적인 제로샷 성능을 보장합니다. 자세한 내용은 데이터셋 섹션을 참조하시기 바랍니다.

댓글