세그먼트 애니씽 모델(SAM)#
세그먼트 애니씽 모델(SAM)을 통해 이미지 세그멘테이션의 새로운 지평을 열어 보세요. 이 혁신적인 모델은 실시간 성능을 갖춘 프롬프트 기반 이미지 세그멘테이션을 도입해 판도를 바꾸고, 해당 분야의 새로운 기준을 세웠습니다.
SAM 소개: 세그먼트 애니씽 모델#
세그먼트 애니씽 모델(SAM)은 프롬프트 기반 세그멘테이션을 지원하는 최첨단 이미지 세그멘테이션 모델로, 이미지 분석 작업에서 탁월한 유연성을 제공합니다. SAM은 이미지 세그멘테이션을 위한 새로운 모델, 작업, 데이터셋을 선보이는 획기적인 프로젝트인 세그먼트 애니씽 이니셔티브의 핵심입니다.
SAM의 고급 설계는 사전 지식 없이도 새로운 이미지 분포와 작업에 적응할 수 있도록 하며, 이 기능을 제로샷 전이(zero-shot transfer)라고 합니다. 1,100만 개의 신중하게 선별된 이미지에 10억 개가 넘는 마스크가 포함된 방대한 SA-1B 데이터셋으로 학습된 SAM은 뛰어난 제로샷 성능을 보였으며, 여러 사례에서 기존 완전 지도 학습 결과를 능가했습니다.
SA-1B 예시 이미지. 새로 소개된 SA-1B 데이터셋의 이미지에 마스크를 덧씌웠습니다. SA-1B에는 다양하고 고해상도이며 사용 허가를 받았고 개인정보를 보호하는 이미지 1,100만 개와 고품질 세그멘테이션 마스크 11억 개가 포함됩니다. 이 마스크는 모두 SAM이 자동으로 주석 처리했으며, 사람의 평가와 다수의 실험을 통해 높은 품질과 다양성을 갖춘 것으로 확인되었습니다. 시각화를 위해 이미지당 마스크 수를 기준으로 이미지를 그룹화했습니다(이미지당 평균 마스크 수는 약 100개입니다).
세그먼트 애니씽 모델(SAM)의 주요 기능#
- 프롬프트 기반 세그멘테이션 작업: SAM은 프롬프트 기반 세그멘테이션 작업을 염두에 두고 설계되었으며, 객체를 식별하는 공간 정보나 텍스트 단서 등 주어진 프롬프트에 따라 유효한 세그멘테이션 마스크를 생성할 수 있습니다.
- 고급 아키텍처: 세그먼트 애니씽 모델은 강력한 이미지 인코더, 프롬프트 인코더, 경량 마스크 디코더를 사용합니다. 이 독특한 아키텍처를 통해 유연한 프롬프트 입력, 실시간 마스크 계산, 세그멘테이션 작업에서의 모호성 인식이 가능합니다.
- SA-1B 데이터셋: 세그먼트 애니씽 프로젝트에서 소개한 SA-1B 데이터셋에는 1,100만 개의 이미지에 걸쳐 10억 개가 넘는 마스크가 포함됩니다. 현재까지 가장 큰 세그멘테이션 데이터셋인 SA-1B는 SAM에 다양하고 대규모인 학습 데이터 소스를 제공합니다.
- 제로샷 성능: SAM은 다양한 세그멘테이션 작업에서 뛰어난 제로샷 성능을 보여, 프롬프트 엔지니어링이 거의 필요하지 않은 즉시 사용 가능한 도구입니다.
세그먼트 애니씽 모델과 SA-1B 데이터셋을 자세히 알아보려면 Segment Anything GitHub를 방문하고 연구 논문 Segment Anything을 확인하세요.
SAM은 Ultralytics Platform의 스마트 주석 기능을 지원하여 클릭 기반 지능형 마스킹으로 데이터셋에 빠르게 라벨을 지정할 수 있습니다. 자세한 내용은 주석 가이드를 참조하세요.
사용 가능한 모델, 지원 작업 및 작동 모드#
이 표에는 사용 가능한 모델과 각 모델의 사전 학습 가중치, 지원 작업, 추론, 검증, 학습, 내보내기와 같은 다양한 작동 모드와의 호환성이 나와 있습니다. 지원되는 모드는 ✅ 이모지로, 지원되지 않는 모드는 ❌ 이모지로 표시됩니다.
SAM 사용 방법: 이미지 세그멘테이션의 유연성과 강력한 기능#
세그먼트 애니씽 모델은 학습 데이터의 범위를 넘어 다양한 다운스트림 작업에 활용할 수 있습니다. 여기에는 에지 감지, 객체 후보 생성, 인스턴스 세그멘테이션, 초기 텍스트-마스크 예측이 포함됩니다. 프롬프트 엔지니어링을 사용하면 SAM은 제로샷 방식으로 새로운 작업과 데이터 분포에 빠르게 적응할 수 있어, 모든 이미지 세그멘테이션 요구 사항을 충족하는 다재다능하고 강력한 도구가 됩니다.
SAM 예측 예시#
주어진 프롬프트를 사용해 이미지를 세그먼트 분할합니다.
from ultralytics import SAM
# 모델 로드
model = SAM("sam_b.pt")
# 모델 정보 표시(선택 사항)
model.info()
# bboxes 프롬프트로 추론 실행
results = model("ultralytics/assets/zidane.jpg", bboxes=[439, 437, 524, 709])
# 단일 점으로 추론 실행
results = model(points=[900, 370], labels=[1])
# 여러 점으로 추론 실행
results = model(points=[[400, 370], [900, 370]], labels=[1, 1])
# 객체마다 여러 점 프롬프트로 추론 실행
results = model(points=[[[400, 370], [900, 370]]], labels=[[1, 1]])
# 음수 점 프롬프트로 추론 실행
results = model(points=[[[400, 370], [900, 370]]], labels=[[1, 0]])이미지 전체를 세그먼트 분할합니다.
from ultralytics import SAM
# 모델 로드
model = SAM("sam_b.pt")
# 모델 정보 표시(선택 사항)
model.info()
# 추론 실행
model("path/to/image.jpg")- 여기서는 프롬프트(bbox/포인트/마스크)를 전달하지 않으면 이미지 전체를 세그먼트 분할합니다.
이 방법을 사용하면 이미지를 한 번 설정한 뒤 이미지 인코더를 반복 실행하지 않고 여러 번 프롬프트 추론을 수행할 수 있습니다.
import cv2
from ultralytics.models.sam import Predictor as SAMPredictor
# SAMPredictor 생성
overrides = {"conf": 0.25, "task": "segment", "mode": "predict", "imgsz": 1024, "model": "mobile_sam.pt"}
predictor = SAMPredictor(overrides=overrides)
# 이미지를 설정합니다.
predictor.set_image("ultralytics/assets/zidane.jpg") # 이미지 파일로 설정
predictor.set_image(cv2.imread("ultralytics/assets/zidane.jpg")) # np.ndarray로 설정
results = predictor(bboxes=[439, 437, 524, 709])
# 단일 포인트 프롬프트로 추론 실행
results = predictor(points=[900, 370], labels=[1])
# 여러 포인트 프롬프트로 추론 실행
results = predictor(points=[[400, 370], [900, 370]], labels=[1, 1])
# 음수 점 프롬프트로 추론 실행
results = predictor(points=[[[400, 370], [900, 370]]], labels=[[1, 0]])
# 이미지 초기화
predictor.reset_image()추가 인수로 모든 영역을 세그먼트 분할합니다.
from ultralytics.models.sam import Predictor as SAMPredictor
# SAMPredictor 생성
overrides = {"conf": 0.25, "task": "segment", "mode": "predict", "imgsz": 1024, "model": "mobile_sam.pt"}
predictor = SAMPredictor(overrides=overrides)
# 추가 인수로 세그먼트 분할
results = predictor(source="ultralytics/assets/zidane.jpg", crop_n_layers=1, points_stride=64, min_mask_region_area=100)위 예시에서 반환되는 모든 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와 YOLOv8 백본 | 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은 고유한 자동 세그멘테이션 기능을 제공하지만, 특히 YOLOv8n-seg, YOLO11n-seg, YOLO26n-seg와 같은 YOLO 모델은 크기가 훨씬 작고 속도가 빠르며 연산 효율성이 더 높습니다.
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
# SAM-b, MobileSAM 프로파일링
for file in ["sam_b.pt", "mobile_sam.pt"]:
model = SAM(file)
model.info()
model(ASSETS)
# FastSAM-s 프로파일링
model = FastSAM("FastSAM-s.pt")
model.info()
model(ASSETS)
# YOLO 모델 프로파일링(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 없는 헤드; 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")| 인수 | 유형 | 기본값 | 설명 |
|---|---|---|---|
data | str | 필수 | 어노테이션 또는 세분화 대상 이미지가 포함된 디렉터리 경로입니다. |
det_model | str | 'yolo26x.pt' | 초기 객체 탐지를 위한 YOLO 탐지 모델 경로입니다. |
sam_model | str | 'sam_b.pt' | 세분화를 위한 SAM 모델 경로입니다(SAM, SAM 2, MobileSAM 및 SAM 3 가중치 지원). |
device | str | '' | 연산 장치입니다(예: 'cuda:0', 'cpu' 또는 자동 장치 감지를 위한 ''). |
conf | float | 0.25 | 약한 탐지를 필터링하기 위한 YOLO 탐지 신뢰도 임계값입니다. |
iou | float | 0.45 | 겹치는 박스를 필터링하기 위한 비최대 억제의 IoU 임계값입니다. |
imgsz | int | 640 | 이미지 크기 조정에 사용할 입력 크기입니다(필요한 경우 32의 배수로 올림). |
max_det | int | 300 | 메모리 효율성을 위한 이미지당 최대 탐지 수입니다. |
classes | list[int] | None | 탐지할 클래스 인덱스 목록입니다(예: 사람 및 자전거의 경우 [0, 1]). |
output_dir | str | None | 어노테이션 저장 디렉터리입니다(기본값: 동일한 상위 디렉터리의 <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에 감사의 뜻을 전합니다.
자주 묻는 질문#
Meta의 세그먼트 애니씽 모델(SAM)은 프롬프트 기반 세그멘테이션 작업을 위해 설계된 혁신적인 이미지 세그멘테이션 모델입니다. 이미지 인코더와 프롬프트 인코더를 경량 마스크 디코더와 결합한 고급 아키텍처를 활용해 공간 정보나 텍스트 단서 등 다양한 프롬프트에서 고품질 세그멘테이션 마스크를 생성합니다. 방대한 SA-1B 데이터셋으로 학습된 SAM은 사전 지식 없이도 새로운 이미지 분포와 작업에 적응하는 뛰어난 제로샷 성능을 제공합니다.
바운딩 박스나 포인트와 같은 다양한 프롬프트로 추론을 실행해 이미지 세그멘테이션에 세그먼트 애니씽 모델(SAM)을 사용할 수 있습니다. 다음은 Python을 사용하는 예시입니다.
from ultralytics import SAM # 모델 로드 model = SAM("sam_b.pt") # 바운딩 박스 프롬프트로 세분화 model("ultralytics/assets/zidane.jpg", bboxes=[439, 437, 524, 709]) # 포인트 프롬프트로 세그먼트 분할 model("ultralytics/assets/zidane.jpg", points=[900, 370], labels=[1]) # 여러 포인트 프롬프트로 세그먼트 분할 model("ultralytics/assets/zidane.jpg", points=[[400, 370], [900, 370]], labels=[1, 1]) # 객체별로 여러 포인트 프롬프트를 사용해 세그먼트 분할 model("ultralytics/assets/zidane.jpg", points=[[[400, 370], [900, 370]]], labels=[[1, 1]]) # 음수 포인트 프롬프트로 세그먼트 분할. 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는 고품질의 다양한 학습 데이터를 제공하여 여러 세그멘테이션 작업에서 뛰어난 제로샷 성능을 뒷받침합니다. 자세한 내용은 데이터셋 섹션을 참조하세요.