Модель сегментации любых объектов (SAM)#
Добро пожаловать на передний край сегментации изображений с моделью сегментации любых объектов, или SAM. Эта революционная модель изменила подход к задаче, представив сегментацию изображений по подсказкам с производительностью в реальном времени и задав новые стандарты в этой области.
Введение в SAM: модель сегментации любых объектов#
Модель сегментации любых объектов, или SAM, — передовая модель сегментации изображений, которая позволяет выполнять сегментацию по подсказкам и обеспечивает беспрецедентную универсальность при анализе изображений. SAM лежит в основе инициативы Segment Anything — новаторского проекта, представляющего новую модель, задачу и набор данных для сегментации изображений.
Продуманная архитектура SAM позволяет модели адаптироваться к новым распределениям изображений и задачам без предварительных знаний — эта особенность называется переносом с нулевым обучением. Обученная на обширном наборе данных SA-1B, содержащем более 1 миллиарда масок на 11 миллионах тщательно отобранных изображений, SAM продемонстрировала впечатляющие результаты при переносе с нулевым обучением и во многих случаях превзошла предыдущие результаты полностью контролируемого обучения.
Примеры изображений SA-1B. На изображения из нового набора данных SA-1B наложены маски. SA-1B содержит 11 млн разнообразных изображений высокого разрешения, полученных на законных основаниях и защищающих конфиденциальность, а также 1,1 млрд высококачественных масок сегментации. Эти маски были полностью автоматически размечены с помощью SAM и, как подтверждают оценки людей и многочисленные эксперименты, отличаются высоким качеством и разнообразием. Для визуализации изображения сгруппированы по количеству масок на изображение (в среднем около 100 масок на изображение).
Ключевые особенности модели сегментации любых объектов (SAM)#
- Задача сегментации по подсказкам: SAM создана для сегментации по подсказкам и позволяет генерировать корректные маски сегментации на основе любой заданной подсказки, например пространственных или текстовых указаний, обозначающих объект.
- Продвинутая архитектура: модель сегментации любых объектов использует мощный кодировщик изображений, кодировщик подсказок и облегчённый декодировщик масок. Эта уникальная архитектура обеспечивает гибкую работу с подсказками, вычисление масок в реальном времени и учёт неоднозначности при сегментации.
- Набор данных SA-1B: представленный проектом Segment Anything набор данных SA-1B содержит более 1 миллиарда масок на 11 миллионах изображений. Будучи крупнейшим на сегодняшний день набором данных для сегментации, он предоставляет SAM разнообразный и масштабный источник обучающих данных.
- Результаты при нулевом обучении: SAM демонстрирует выдающиеся результаты при нулевом обучении в различных задачах сегментации, что делает её готовым к использованию инструментом для самых разных приложений с минимальной потребностью в разработке подсказок.
Чтобы подробнее узнать о модели сегментации любых объектов и наборе данных SA-1B, посети репозиторий Segment Anything на GitHub и ознакомься с исследовательской статьёй Segment Anything.
SAM обеспечивает работу функции интеллектуальной разметки на платформе Ultralytics, позволяя создавать маски с помощью щелчков и быстро размечать наборы данных. Подробности смотри в руководстве по разметке.
Доступные модели, поддерживаемые задачи и режимы работы#
В этой таблице представлены доступные модели и соответствующие предварительно обученные веса, поддерживаемые задачи и совместимость с различными режимами работы, такими как инференс, валидация, обучение и экспорт. Поддерживаемые режимы отмечены эмодзи ✅, а неподдерживаемые — ❌.
| Тип модели | Предобученные веса | Поддерживаемые задачи | Обучение | Валидация | Инференс | Экспорт |
|---|---|---|---|---|---|---|
| SAM base | sam_b.pt | Сегментация экземпляров | ❌ | ❌ | ✅ | ❌ |
| SAM large | sam_l.pt | Сегментация экземпляров | ❌ | ❌ | ✅ | ❌ |
Как использовать 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")- Логика здесь такова: сегментировать всё изображение, если не передать подсказки (bboxes/points/masks).
Так можно задать изображение один раз и многократно запускать инференс по подсказкам, не запуская кодировщик изображений повторно.
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#
Здесь мы сравниваем модель SAM-b от Meta с моделями сегментации Ultralytics, включая YOLO26n-seg:
| Модель | Размер (МБ) | Параметры (M) | Скорость (CPU) (мс/изобр.) |
|---|---|---|---|
| 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 предоставляет уникальные возможности автоматической сегментации, модели YOLO, особенно YOLOv8n-seg, YOLO11n-seg и YOLO26n-seg, значительно компактнее, быстрее и эффективнее используют вычислительные ресурсы.
Скорость SAM измерялась с помощью PyTorch, скорость YOLO — с помощью ONNX Runtime. Тесты проводились на Apple M4 Air 2025 года с 16 ГБ оперативной памяти с использованием 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 за создание и поддержку этого ценного ресурса для сообщества компьютерного зрения.
Часто задаваемые вопросы#
Модель сегментации любых объектов (SAM) от Meta — революционная модель сегментации изображений, созданная для задач сегментации по подсказкам. В ней используется продвинутая архитектура, включающая кодировщики изображений и подсказок, а также облегчённый декодировщик масок, чтобы создавать высококачественные маски сегментации по различным подсказкам, например пространственным или текстовым указаниям. Обученная на обширном наборе данных 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]])Также можно запустить инференс SAM через интерфейс командной строки (CLI):
yolo predict model=sam_b.pt source=path/to/image.jpgПодробные инструкции по использованию смотри в разделе «Сегментация».
По сравнению с моделями YOLO варианты SAM, такие как SAM-b, MobileSAM и FastSAM-s, обычно крупнее и медленнее, но обладают уникальными возможностями сегментации с нулевым обучением. Например, YOLO26n-seg в 56 раз меньше и более чем в 1650 раз быстрее оригинальной модели SAM-b от Meta при запуске на CPU. Поэтому модели YOLO идеально подходят для приложений, которым нужна быстрая, компактная и вычислительно эффективная сегментация, а модели SAM отлично справляются с гибкой сегментацией по подсказкам и с нулевым обучением.
SAM от Ultralytics поддерживает автоматическую разметку, позволяющую создавать наборы данных для сегментации с помощью предварительно обученной модели обнаружения. Вот пример на 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 обучена на обширном наборе данных SA-1B, который содержит более 1 миллиарда масок на 11 миллионах изображений. SA-1B — крупнейший на сегодняшний день набор данных для сегментации; он предоставляет высококачественные и разнообразные обучающие данные, обеспечивая впечатляющие результаты при нулевом обучении в различных задачах сегментации. Подробнее смотри в разделе «Наборы данных».