Segment Anything Model (SAM)
Добро пожаловать на передовую линию сегментации изображений с Segment Anything Model, или SAM. Эта революционная модель изменила правила игры, представив возможность сегментации изображений с подсказками и производительностью в реальном времени, установив новые стандарты в этой области.
Введение в SAM: модель Segment Anything
Segment Anything Model, или SAM, — это передовая модель сегментации изображений, которая обеспечивает сегментацию с подсказками, предоставляя беспрецедентную универсальность в задачах анализа изображений. SAM лежит в основе инициативы Segment Anything, новаторского проекта, который представляет новую модель, задачу и набор данных для сегментации изображений.
Продвинутая конструкция SAM позволяет ей адаптироваться к новым распределениям изображений и задачам без предварительных знаний, эта функция известна как zero-shot transfer. Обученная на обширном наборе данных SA-1B, который содержит более 1 миллиарда масок, распределенных по 11 миллионам тщательно отобранных изображений, SAM продемонстрировала впечатляющую производительность zero-shot, превзойдя предыдущие результаты, полученные при полном контроле, во многих случаях.
Примеры изображений SA-1B. Изображения dataset с наложенными масками из нового SA-1B dataset. SA-1B содержит 11 миллионов разнообразных лицензированных изображений высокого разрешения, защищающих конфиденциальность, и 1,1 миллиарда высококачественных масок сегментации. Эти маски были аннотированы полностью автоматически с помощью SAM и, как подтверждено оценками людей и многочисленными экспериментами, отличаются высоким качеством и разнообразием. Изображения сгруппированы по количеству масок на изображение для визуализации (в среднем ∼100 масок на изображение).
Ключевые особенности Segment Anything Model (SAM)
- Задача сегментации с запросами: SAM был разработан с учетом задачи сегментации с запросами, что позволяет ему генерировать допустимые маски сегментации из любого заданного запроса, такого как пространственные или текстовые подсказки, идентифицирующие объект.
- Продвинутая архитектура: Segment Anything Model использует мощный кодировщик изображений, кодировщик подсказок и легкий декодер масок. Эта уникальная архитектура обеспечивает гибкое управление подсказками, вычисление масок в реальном времени и учет неоднозначности в задачах сегментации.
- Набор данных SA-1B: Представленный проектом Segment Anything, набор данных SA-1B содержит более 1 миллиарда масок на 11 миллионах изображений. Являясь крупнейшим на сегодняшний день набором данных для сегментации, он предоставляет SAM разнообразный и масштабный источник данных для обучения.
- Производительность Zero-Shot: SAM демонстрирует выдающуюся производительность zero-shot в различных задачах сегментации, что делает его готовым к использованию инструментом для различных приложений с минимальной потребностью в разработке подсказок.
Для углубленного изучения модели Segment Anything и набора данных SA-1B посетите веб-сайт Segment Anything и ознакомьтесь с исследовательской работой Segment Anything.
Доступные модели, поддерживаемые задачи и режимы работы
В этой таблице представлены доступные модели с их конкретными предварительно обученными весами, задачи, которые они поддерживают, и их совместимость с различными режимами работы, такими как Inference, Validation, Training и Export, обозначенные эмодзи ✅ для поддерживаемых режимов и эмодзи ❌ для неподдерживаемых режимов.
Тип модели | Предварительно обученные веса | Поддерживаемые задачи | Инференс | Валидация | Обучение | Экспорт |
---|---|---|---|---|---|---|
SAM base | sam_b.pt | Сегментация экземпляров | ✅ | ❌ | ❌ | ❌ |
SAM large | sam_l.pt | Сегментация экземпляров | ✅ | ❌ | ❌ | ❌ |
Как использовать SAM: Универсальность и мощность в сегментации изображений
Segment Anything Model может быть использована для множества последующих задач, выходящих за рамки ее обучающих данных. К ним относятся обнаружение краев, генерация предложений объектов, сегментация экземпляров и предварительное прогнозирование масок по тексту. С помощью prompt engineering SAM может быстро адаптироваться к новым задачам и распределениям данных в режиме zero-shot, что делает ее универсальным и мощным инструментом для всех ваших потребностей в сегментации изображений.
Пример предсказания 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
- Логика здесь заключается в сегментации всего изображения, если вы не передаете никаких запросов (ограничивающие рамки/точки/маски).
Пример 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
в приведенных выше примерах это Results объект, который обеспечивает легкий доступ к прогнозируемым маскам и исходному изображению.
- Больше дополнительных аргументов для
Segment everything
см.Predictor/generate
Справочник.
Сравнение SAM и YOLO
Здесь мы сравниваем модель SAM-b от Meta с самой маленькой моделью сегментации Ultralytics, YOLO11n-seg:
Модель | Размер (МБ) |
Параметры (M) |
Скорость (CPU) (мс/изобр.) |
---|---|---|---|
Meta SAM-b | 375 | 93.7 | 49401 |
MobileSAM | 40.7 | 10.1 | 25381 |
FastSAM-s с backbone YOLOv8 | 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, значительно меньше, быстрее и более эффективны с вычислительной точки зрения.
Тесты выполняются на Apple M4 Pro 2025 года с 24 ГБ ОЗУ с использованием 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
функция, как показано ниже:
Пример
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 |
Порог IoU для Non-Maximum Suppression, используемый для фильтрации перекрывающихся ограничивающих прямоугольников. |
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 за создание и поддержку этого ценного ресурса для сообщества компьютерного зрения.
Часто задаваемые вопросы
Что такое Segment Anything Model (SAM) от Ultralytics?
Segment Anything Model (SAM) от Ultralytics — это революционная модель сегментации изображений, разработанная для задач сегментации с подсказками. Она использует передовую архитектуру, включая кодировщики изображений и подсказок в сочетании с легким декодером масок, для создания высококачественных масок сегментации из различных подсказок, таких как пространственные или текстовые указания. Обученная на обширном наборе данных SA-1B, SAM превосходно демонстрирует производительность zero-shot, адаптируясь к новым распределениям изображений и задачам без предварительных знаний.
Как я могу использовать 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]])
В качестве альтернативы, вы можете запустить вывод с SAM в интерфейсе командной строки (CLI):
yolo predict model=sam_b.pt source=path/to/image.jpg
Для получения более подробных инструкций по использованию посетите раздел Сегментация.
Как соотносятся модели SAM и YOLO с точки зрения производительности?
По сравнению с моделями YOLO, варианты SAM, такие как SAM-b, SAM2-t, MobileSAM и FastSAM-s, обычно больше и медленнее, но предлагают уникальные возможности сегментации zero-shot. Например, Ultralytics YOLOv8n-seg в 11.7 раз меньше и в 1069 раз быстрее, чем оригинальная модель SAM-b от Meta, что подчеркивает значительное преимущество YOLO в скорости и эффективности. Аналогично, новая YOLO11n-seg обеспечивает еще меньший размер и поддерживает впечатляющую скорость инференса. Это делает модели YOLO идеальными для приложений, требующих быстрой, легкой и вычислительно эффективной сегментации, в то время как модели SAM превосходны в гибких, управляемых и zero-shot задачах сегментации.
Как я могу автоматически аннотировать свой набор данных с помощью SAM?
SAM от Ultralytics предлагает функцию автоматической аннотации, которая позволяет генерировать наборы данных для сегментации с использованием предварительно обученной модели обнаружения. Вот пример на Python:
from ultralytics.data.annotator import auto_annotate
auto_annotate(data="path/to/images", det_model="yolov8x.pt", sam_model="sam_b.pt")
Эта функция принимает путь к вашим изображениям и необязательные аргументы для предварительно обученных моделей обнаружения и сегментации SAM, а также спецификации устройства и выходного каталога. Полное руководство см. в разделе Auto-Annotation.
Какие наборы данных используются для обучения Segment Anything Model (SAM)?
SAM обучена на обширном наборе данных SA-1B, который включает более 1 миллиарда масок на 11 миллионах изображений. SA-1B — крупнейший на сегодняшний день набор данных для сегментации, предоставляющий высококачественные и разнообразные данные для обучения, что обеспечивает впечатляющую производительность zero-shot в различных задачах сегментации. Для получения более подробной информации посетите раздел набора данных.