Перейти к содержанию

Segment Anything Model (SAM)

Как использовать Segment Anything в Colab

Добро пожаловать на передовую линию сегментации изображений с 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 объект, который обеспечивает легкий доступ к прогнозируемым маскам и исходному изображению.

Сравнение 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 в различных задачах сегментации. Для получения более подробной информации посетите раздел набора данных.



📅 Создано 1 год назад ✏️ Обновлено 16 дней назад

Комментарии