콘텐츠로 건너뛰기

Segment Anything Model (SAM)

Colab에서 Segment Anything을 사용하는 방법

Segment Anything Model, 즉 SAM을 통해 이미지 분할의 최전선에 오신 것을 환영합니다. 이 혁신적인 모델은 실시간 성능으로 프롬프트 가능한 이미지 분할을 도입하여 업계의 새로운 표준을 세웠습니다.

SAM 소개: Segment Anything Model

Segment Anything Model, 즉 SAM은 프롬프트 가능한 분할을 가능하게 하여 이미지 분석 작업에서 비교할 수 없는 다재다능함을 제공하는 최첨단 이미지 분할 모델입니다. SAM은 이미지 분할을 위한 새로운 모델, 작업 및 데이터 세트를 소개하는 획기적인 프로젝트인 Segment Anything 이니셔티브의 핵심을 형성합니다.

SAM의 고급 디자인은 사전 지식 없이도 새로운 이미지 배포 및 작업에 적응할 수 있도록 지원하며, 이는 제로샷 전송이라고 하는 기능입니다. 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 웹사이트를 방문하여 연구 논문 Segment Anything을 확인하십시오.

사용 가능한 모델, 지원되는 작업 및 작동 모드

이 표는 사용 가능한 모델과 특정 사전 훈련된 가중치, 지원하는 작업, 그리고 추론, 유효성 검사, 훈련내보내기와 같은 다양한 작동 모드와의 호환성을 나타냅니다. 지원되는 모드는 ✅ 이모지로, 지원되지 않는 모드는 ❌ 이모지로 표시됩니다.

모델 유형 사전 훈련된 가중치 지원되는 작업 추론 검증 훈련 내보내기
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")
# Run inference with a SAM model
yolo predict model=sam_b.pt source=path/to/image.jpg
  • 여기에 사용된 로직은 프롬프트(bounding box/points/masks)를 전달하지 않을 경우 전체 이미지를 분할하는 것입니다.

SAMPredictor 예시

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

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 위의 예시에서 결과 예측된 마스크와 소스 이미지에 쉽게 접근할 수 있는 객체입니다.

SAM 대 YOLO 비교

여기서는 Meta의 SAM-b 모델을 Ultralytics의 가장 작은 분할 모델인 YOLO11n-seg와 비교합니다.

모델 크기
(MB)
파라미터
(M)
속도 (CPU)
(ms/im)
Meta SAM-b 375 93.7 49401
MobileSAM 40.7 10.1 25381
YOLOv8 백본을 사용하는 FastSAM-s 23.7 11.8 55.9
Ultralytics YOLOv8n-seg 6.7 (11.7배 더 작음) 3.4 (11.4배 적음) 24.5 (1061배 빠름)
Ultralytics YOLO11n-seg 5.9 (13.2배 작음) 2.9 (13.4배 적음) 30.1 (864배 빠름)

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

24GB RAM을 갖춘 2025 Apple M4 Pro에서 실행되는 테스트 (사용) torch==2.6.0ultralytics==8.3.90를 사용했습니다. 이 테스트를 재현하려면:

예시

from ultralytics import ASSETS, SAM, YOLO, FastSAM

# Profile SAM2-t, SAM2-b, SAM-b, MobileSAM
for file in ["sam_b.pt", "sam2_b.pt", "sam2_t.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
for file_name in ["yolov8n-seg.pt", "yolo11n-seg.pt"]:
    model = YOLO(file_name)
    model.info()
    model(ASSETS)

자동 어노테이션: 분할 데이터 세트로 가는 빠른 길

자동 어노테이션은 SAM의 핵심 기능으로, 사용자가 사전 훈련된 감지 모델을 사용하여 분할 데이터셋을 생성할 수 있도록 합니다. 이 기능을 통해 많은 수의 이미지에 대해 빠르고 정확한 어노테이션이 가능하며, 시간이 많이 소요되는 수동 레이블링의 필요성을 없앨 수 있습니다.

Detection 모델을 사용하여 분할 데이터 세트 생성

Ultralytics 프레임워크를 사용하여 데이터 세트를 자동 어노테이션하려면 다음을 사용하십시오. auto_annotate 아래와 같이 함수를 사용합니다.

예시

from ultralytics.data.annotator import auto_annotate

auto_annotate(data="path/to/images", det_model="yolo11x.pt", sam_model="sam_b.pt")
인수 유형 기본값 설명
data str 필수 어노테이션 또는 세분화를 위한 대상 이미지가 포함된 디렉토리 경로입니다.
det_model str 'yolo11x.pt' 초기 객체 탐지를 위한 YOLO 탐지 모델 경로입니다.
sam_model str 'sam_b.pt' 분할을 위한 SAM 모델 경로 (SAM, SAM2 변형 및 mobile_sam 모델 지원).
device str '' 계산 장치(예: 'cuda:0', 'cpu' 또는 자동 장치 감지를 위한 '')
conf float 0.25 미약한 탐지를 필터링하기 위한 YOLO 탐지 신뢰도 임계값입니다.
iou float 0.45 겹치는 상자를 필터링하기 위한 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 함수는 이미지 경로를 입력으로 받으며, 사전 훈련된 detection 및 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의 SAM(Segment Anything Model)은 프롬프트 가능한 분할 작업을 위해 설계된 혁신적인 이미지 분할 모델입니다. 공간적 또는 텍스트 신호와 같은 다양한 프롬프트에서 고품질 분할 마스크를 생성하기 위해 경량 마스크 디코더와 결합된 이미지 및 프롬프트 인코더를 포함한 고급 아키텍처를 활용합니다. 광범위한 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, SAM2-t, MobileSAM, FastSAM-s와 같은 SAM 변형 모델은 일반적으로 크기가 더 크고 속도가 느리지만 고유한 제로샷 분할 기능을 제공합니다. 예를 들어, Ultralytics YOLOv8n-seg는 Meta의 원래 SAM-b 모델보다 11.7배 더 작고 1069배 더 빠르며, 이는 속도와 효율성 면에서 YOLO가 상당한 이점을 가지고 있음을 강조합니다. 마찬가지로, 최신 YOLO11n-seg는 크기가 훨씬 작으면서도 인상적인 추론 속도를 유지합니다. 따라서 YOLO 모델은 빠르고 가벼우며 계산 효율적인 분할이 필요한 애플리케이션에 이상적이며, SAM 모델은 유연하고 프롬프트 가능한 제로샷 분할 작업에 탁월합니다.

SAM을 사용하여 데이터 세트를 자동 어노테이션하는 방법은 무엇입니까?

Ultralytics의 SAM은 사전 훈련된 detection 모델을 사용하여 분할 데이터 세트를 생성할 수 있는 자동 어노테이션 기능을 제공합니다. 다음은 Python의 예입니다.

from ultralytics.data.annotator import auto_annotate

auto_annotate(data="path/to/images", det_model="yolov8x.pt", sam_model="sam_b.pt")

이 함수는 이미지 경로와 사전 훈련된 detection 및 SAM 분할 모델, 장치 및 출력 디렉토리 사양에 대한 선택적 인수를 사용합니다. 전체 가이드는 자동 어노테이션을 참조하십시오.

Segment Anything Model (SAM)을 훈련하는 데 사용되는 데이터 세트는 무엇입니까?

SAM은 1,100만 개 이미지에 걸쳐 10억 개 이상의 마스크로 구성된 광범위한 SA-1B 데이터 세트에서 훈련되었습니다. SA-1B는 현재까지 가장 큰 분할 데이터 세트로, 다양하고 고품질의 학습 데이터를 제공하여 다양한 분할 작업에서 인상적인 zero-shot 성능을 보장합니다. 자세한 내용은 데이터 세트 섹션을 참조하십시오.



📅 1년 전에 생성됨 ✏️ 16일 전에 업데이트됨

댓글