무엇이든 세그먼트 모델 (SAM)
이미지 세그 먼테이션의 새로운 지평을 연 Segment Anything 모델( SAM)에 오신 것을 환영합니다. 이 혁신적인 모델은 실시간 성능을 갖춘 신속한 이미지 세그먼테이션을 도입하여 업계의 판도를 바꾸고 이 분야의 새로운 표준을 세웠습니다.
소개 SAM: 세그먼트 애니씽 모델
세그먼트 애니씽 모델( SAM)은 이미지 분석 작업에서 비교할 수 없는 다용도성을 제공하며 즉각적인 분할을 가능하게 하는 최첨단 이미지 분할 모델로, 이미지 분할을 위한 새로운 모델, 작업 및 데이터 세트를 도입하는 획기적인 프로젝트인 세그먼트 애니씽 이니셔티브( SAM )의 핵심을 형성하고 있습니다.
SAM의 고급 설계 덕분에 사전 지식 없이도 새로운 이미지 분포와 작업에 적응할 수 있으며, 이 기능을 제로 샷 전송이라고 합니다. 1,100만 개의 엄선된 이미지에 10억 개 이상의 마스크가 포함된 방대한 SA-1B 데이터 세트에서 학습된 SAM 은 많은 경우 이전의 완전 감독 결과를 능가하는 인상적인 제로 샷 성능을 보여주었습니다.
SA-1B 예시 이미지. 새로 도입된 SA-1B 데이터 세트의 마스크를 오버레이한 데이터 세트 이미지. SA-1B에는 1100만 개의 다양한 고해상도, 라이선스 및 개인정보 보호가 적용된 이미지와 11억 개의 고품질 세분화 마스크가 포함되어 있습니다. 이러한 마스크는 SAM 에 의해 완전 자동으로 주석을 달았으며, 사람의 평가와 수많은 실험을 통해 확인된 바와 같이 높은 품질과 다양성을 갖추고 있습니다. 이미지는 시각화를 위해 이미지당 마스크 수에 따라 그룹화됩니다(평균적으로 이미지당 100개 정도의 마스크가 있음).
세그먼트 애니씽 모델의 주요 기능 (SAM)
- 프롬프트 가능한 세그멘테이션 작업: SAM 은 프롬프트 가능한 세그멘테이션 작업을 염두에 두고 설계되어 객체를 식별하는 공간 또는 텍스트 단서 등 주어진 프롬프트에서 유효한 세그멘테이션 마스크를 생성할 수 있습니다.
- 고급 아키텍처: Segment Anything 모델은 강력한 이미지 인코더, 프롬프트 인코더, 경량 마스크 디코더를 사용합니다. 이 고유한 아키텍처는 유연한 프롬프트, 실시간 마스크 계산, 세그먼트 작업의 모호성 인식을 가능하게 합니다.
- SA-1B 데이터 세트: Segment Anything 프로젝트에서 도입한 SA-1B 데이터 세트는 1100만 개의 이미지에 10억 개 이상의 마스크를 포함하고 있습니다. 현재까지 가장 큰 규모의 세분화 데이터 세트인 이 데이터 세트는 SAM 에 다양하고 대규모의 학습 데이터 소스를 제공합니다.
- 제로 샷 성능: SAM 은 다양한 세분화 작업에서 뛰어난 제로 샷 성능을 보여 주며, 신속한 엔지니어링 없이도 다양한 애플리케이션에 바로 사용할 수 있는 도구입니다.
세그먼트 애니씽 모델과 SA-1B 데이터 세트에 대해 자세히 알아보려면 세그먼트 애니씽 웹사이트를 방문하여 연구 논문 ' 세그먼트 애니씽'을 확인하시기 바랍니다.
사용 가능한 모델, 지원되는 작업 및 작동 모드
이 표에는 사용 가능한 모델과 함께 특정 사전 학습된 가중치, 지원되는 작업, 추론, 검증, 학습 및 내보내기와 같은 다양한 작동 모드와의 호환성이 표시되어 있으며, 지원되는 모드의 경우 ✅ 이모티콘, 지원되지 않는 모드의 경우 ❌ 이모티콘으로 표시되어 있습니다.
사용 방법 SAM: 이미지 세분화의 다양성과 강력함
세그먼트 애니씽 모델은 학습 데이터를 넘어서는 다양한 다운스트림 작업에 활용할 수 있습니다. 여기에는 에지 감지, 객체 제안 생성, 인스턴스 세분화, 예비 텍스트-마스크 예측 등이 포함됩니다. 신속한 엔지니어링을 통해 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]])
모든 것을 세분화
전체 이미지를 분할합니다.
- 여기서 로직은 프롬프트(b박스/포인트/마스크)를 전달하지 않으면 전체 이미지를 분할하는 것입니다.
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
위의 예에서 결과 객체를 사용하여 예측된 마스크와 소스 이미지에 쉽게 액세스할 수 있습니다.
- 다음에 대한 추가 인수
Segment everything
참조Predictor/generate
참조.
SAM YOLO 비교
여기서는 Meta의 SAM 모델과 Ultralytics 최소 세분화 모델인 YOLO11n-seg를 비교합니다:
모델 | 크기 (MB) |
매개변수 (M) |
속도 (CPU) (ms/im) |
---|---|---|---|
메타 SAM-b | 375 | 93.7 | 49401 |
MobileSAM | 40.7 | 10.1 | 25381 |
YOLOv8 백본이 포함된 FastSAM | 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 YOLO11n-seg는 훨씬 더 작고 빠르며 계산 효율이 높습니다.
테스트는 24GB RAM이 장착된 2025 Apple M4 Pro에서 다음을 사용하여 실행되었습니다. torch==2.6.0
그리고 ultralytics==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 의 핵심 기능으로, 사용자가 사전 학습된 감지 모델을 사용하여 세분화 데이터 세트를 생성할 수 있습니다. 이 기능을 사용하면 많은 수의 이미지에 빠르고 정확하게 주석을 달 수 있어 시간이 많이 걸리는 수동 라벨링 작업을 생략할 수 있습니다.
탐지 모델을 사용하여 세분화 데이터 세트 생성하기
Ultralytics 프레임워크를 사용하여 데이터 집합에 자동 주석을 달려면, 다음을 사용하십시오. auto_annotate
함수를 호출합니다:
예
인수 | 유형 | 기본값 | 설명 |
---|---|---|---|
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 |
겹치는 상자를 필터링하는 비 최대 억제에 대한 IoU 임계값입니다. |
imgsz |
int |
640 |
이미지 크기 조정을 위한 입력 크기(32의 배수여야 함). |
max_det |
int |
300 |
메모리 효율성을 위해 이미지당 최대 감지 횟수를 제한합니다. |
classes |
list[int] |
None |
감지할 클래스 인덱스 목록(예, [0, 1] 사람 및 자전거용). |
output_dir |
str |
None |
주석을 저장할 디렉터리(기본값은 데이터 경로를 기준으로 './레이블'입니다). |
그리고 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에 감사의 말씀을 전합니다.
자주 묻는 질문
Ultralytics 의 세그먼트 애니씽 모델(SAM)이란 무엇인가요?
Ultralytics Segment Anything Model(SAM)은 프롬프트 분할 작업을 위해 설계된 혁신적인 이미지 분할 모델입니다. 이 모델은 경량 마스크 디코더와 결합된 이미지 및 프롬프트 인코더를 포함한 고급 아키텍처를 활용하여 공간 또는 텍스트 단서와 같은 다양한 프롬프트에서 고품질 세그먼테이션 마스크를 생성합니다. 방대한 SA-1B 데이터 세트에서 학습된 SAM 은 제로 샷 성능이 뛰어나 사전 지식 없이도 새로운 이미지 분포와 작업에 적응할 수 있습니다. 여기에서 자세히 알아보세요.
이미지 분할을 위해 Segment Anything 모델(SAM)을 사용하려면 어떻게 해야 하나요?
경계 상자나 점과 같은 다양한 프롬프트를 사용하여 추론을 실행하여 이미지 분할을 위해 Segment Anything 모델(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 를 사용하여 추론을 실행할 수 있습니다:
자세한 사용 방법은 세분화 섹션을 참조하세요.
SAM 모델과 YOLO 모델은 성능 측면에서 어떻게 비교되나요?
SAM, SAM2, MobileSAM, FastSAM 같은 SAM 변형은 YOLO 모델에 비해 일반적으로 더 크고 느리지만 고유한 제로 샷 세분화 기능을 제공합니다. 예를 들어, Ultralytics YOLOv8n 메타의 기존 SAM 모델보다 11.7배 작고 1069배 빠르며, 속도와 효율성 측면에서 YOLO 상당한 이점을 강조합니다. 마찬가지로, 최신 YOLO11n-seg는 더 작은 크기와 인상적인 추론 속도를 제공합니다. 따라서 YOLO 모델은 빠르고 가벼우며 계산 효율이 높은 세분화가 필요한 애플리케이션에 이상적인 반면, SAM 모델은 유연하고 즉각적이며 제로 샷 세분화 작업에 탁월합니다.
SAM 을 사용하여 데이터 집합에 자동 주석을 달려면 어떻게 해야 하나요?
Ultralytics' SAM 에서는 사전 학습된 탐지 모델을 사용하여 세분화 데이터 세트를 생성할 수 있는 자동 주석 기능을 제공합니다. 다음은 Python 에 있는 예제입니다:
from ultralytics.data.annotator import auto_annotate
auto_annotate(data="path/to/images", det_model="yolov8x.pt", sam_model="sam_b.pt")
이 함수는 이미지 경로와 사전 학습된 감지 및 SAM 세분화 모델에 대한 선택적 인수를 장치 및 출력 디렉토리 사양과 함께 가져옵니다. 전체 가이드는 자동 주석을 참조하세요.
세그먼트 애니씽 모델(SAM)을 학습하는 데 어떤 데이터 세트가 사용되나요?
SAM 는 1100만 개의 이미지에 걸쳐 10억 개 이상의 마스크로 구성된 방대한 SA-1B 데이터 세트를 기반으로 학습됩니다. SA-1B는 현재까지 가장 큰 세분화 데이터 세트로, 고품질의 다양한 학습 데이터를 제공하여 다양한 세분화 작업에서 인상적인 제로 샷 성능을 보장합니다. 자세한 내용은 데이터 세트 섹션을 참조하세요.