Segment Anything Model (SAM)
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에는 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을 확인하시기 바랍니다.
SAM powers the smart annotation feature on Ultralytics Platform, enabling click-based intelligent masking for fast dataset labeling. See the annotation guide for details.
사용 가능한 모델, 지원되는 작업 및 작동 모드
이 표는 특정 사전 학습된 가중치를 가진 사용 가능한 모델, 해당 모델이 지원하는 작업, 그리고 Inference, Validation, Training, Export와 같은 다양한 작동 모드와의 호환성을 나타내며, 지원되는 모드는 ✅ 이모지로, 지원되지 않는 모드는 ❌ 이모지로 표시되어 있습니다.
| 모델 유형 | 사전 학습된 가중치 | 지원 작업 | 추론 | 검증 | 학습 | 내보내기 (Export) |
|---|---|---|---|---|---|---|
| SAM base | sam_b.pt | 인스턴스 세그멘테이션 | ✅ | ❌ | ❌ | ❌ |
| SAM large | sam_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)도 전달하지 않으면 전체 이미지를 세그먼트하는 것입니다.
이 방법을 사용하면 이미지를 한 번 설정하고 이미지 인코더를 여러 번 실행하지 않고도 프롬프트 추론을 여러 번 실행할 수 있습니다.
from ultralytics.models.sam import Predictor as SAMPredictor
# Create SAMPredictor
overrides = dict(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 = dict(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)위 예시에서 반환된 모든 results는 예측된 마스크와 원본 이미지에 쉽게 액세스할 수 있는 Results 객체입니다.
Segment everything에 대한 더 많은 추가 인수는Predictor/generate참조를 확인하십시오.
SAM과 YOLO 비교
여기에서는 Meta의 SAM-b 모델을 YOLO26n-seg를 포함한 Ultralytics 세그멘테이션 모델과 비교합니다:
| 모델 | 크기 (MB) | 매개변수 (M) | 속도 (CPU) (ms/im) |
|---|---|---|---|
| Meta SAM-b | 375 | 93.7 | 41703 |
| MobileSAM | 40.7 | 10.1 | 23802 |
| FastSAM-s with YOLOv8 backbone | 23.9 | 11.8 | 58.0 |
| Ultralytics YOLOv8n-seg | 7.1 (52.8배 작음) | 3.4 (27.6배 적음) | 24.8 (1682배 빠름) |
| Ultralytics YOLO11n-seg | 6.2 (60.5배 작음) | 2.9 (32.3배 적음) | 24.3 (1716배 빠름) |
| Ultralytics YOLO26n-seg | 6.7 (56.0배 작음) | 2.7 (34.7배 적음) | 25.2 (1655배 빠름) |
이 비교는 SAM 변형 모델들과 YOLO 세그멘테이션 모델 간의 모델 크기 및 속도 차이를 보여줍니다. SAM은 독보적인 자동 세그멘테이션 기능을 제공하지만, YOLO 모델, 특히 YOLOv8n-seg, YOLO11n-seg 및 YOLO26n-seg는 훨씬 더 작고 빠르며 계산 효율성이 뛰어납니다.
SAM 속도는 PyTorch로 측정되었으며, YOLO 속도는 ONNX Runtime으로 측정되었습니다. 테스트는 16GB RAM이 탑재된 2025 Apple M4 Air에서 torch==2.10.0, ultralytics==8.4.31, onnxruntime==1.24.4를 사용하여 실행되었습니다. 이 테스트를 재현하려면:
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)
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")| 인수(Argument) | 유형(Type) | 기본값(Default) | 설명 |
|---|---|---|---|
data | str | 필수 | 주석 또는 세그멘테이션을 위한 대상 이미지가 포함된 디렉토리 경로. |
det_model | str | 'yolo26x.pt' | 초기 객체 감지를 위한 YOLO 감지 모델 경로. |
sam_model | str | 'sam_b.pt' | 세그멘테이션을 위한 SAM 모델 경로(SAM, SAM2 변형 및 MobileSAM 모델 지원). |
device | str | '' | 계산 장치(예: 'cuda:0', 'cpu', 또는 자동 장치 감지를 위해 ''). |
conf | float | 0.25 | 약한 감지를 필터링하기 위한 YOLO 감지 신뢰도 임계값. |
iou | float | 0.45 | 겹치는 박스를 필터링하기 위한 NMS(Non-Maximum Suppression) IoU 임계값. |
imgsz | int | 640 | 이미지 크기 조정을 위한 입력 크기(32의 배수여야 함). |
max_det | int | 300 | 메모리 효율성을 위한 이미지당 최대 감지 수. |
classes | list[int] | None | 감지할 클래스 인덱스 목록(예: 사람 및 자전거를 위해 [0, 1]). |
output_dir | str | None | 주석 저장 디렉토리(데이터 경로 기준 기본값은 './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
Ultralytics의 Segment Anything Model (SAM)이란 무엇입니까?
Ultralytics의 Segment Anything Model (SAM)은 프롬프트 기반 세그멘테이션 작업을 위해 설계된 혁신적인 이미지 세그멘테이션 모델입니다. 이 모델은 이미지 및 프롬프트 인코더와 경량화된 마스크 디코더를 결합한 고급 아키텍처를 활용하여 공간적 또는 텍스트 단서와 같은 다양한 프롬프트에서 고품질 세그멘테이션 마스크를 생성합니다. 방대한 SA-1B 데이터셋으로 학습된 SAM은 제로샷 성능이 뛰어나며, 사전 지식 없이도 새로운 이미지 분포와 작업에 적응합니다.
이미지 세그멘테이션을 위해 Segment Anything Model (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더 자세한 사용 지침은 세그멘테이션 섹션을 방문하십시오.
성능 측면에서 SAM과 YOLO 모델은 어떻게 비교됩니까?
YOLO 모델과 비교했을 때, SAM-b, MobileSAM, FastSAM-s와 같은 SAM 변형 모델은 일반적으로 더 크고 느리지만 독보적인 제로샷 세그멘테이션 기능을 제공합니다. 예를 들어, YOLO26n-seg는 CPU에서 Meta의 오리지널 SAM-b 모델보다 56배 작고 1650배 이상 빠릅니다. 이로 인해 YOLO 모델은 빠르고 가벼우며 계산 효율적인 세그멘테이션이 필요한 애플리케이션에 이상적이며, SAM 모델은 유연한 프롬프트 기반의 제로샷 세그멘테이션 작업에서 탁월합니다.
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 세그멘테이션 모델을 위한 선택적 인수, 그리고 장치 및 출력 디렉토리 사양을 인자로 받습니다. 전체 가이드는 Auto-Annotation을 참조하십시오.
Segment Anything Model (SAM)을 학습시키는 데 어떤 데이터셋이 사용됩니까?
SAM은 1,100만 개의 이미지에 걸쳐 10억 개 이상의 마스크를 포함하는 방대한 SA-1B 데이터셋으로 학습되었습니다. SA-1B는 현재까지 가장 큰 세그멘테이션 데이터셋으로, 고품질의 다양한 학습 데이터를 제공하여 다양한 세그멘테이션 작업에서 뛰어난 제로샷 성능을 보장합니다. 자세한 내용은 Dataset 섹션을 방문하십시오.