MobileSAM

MobileSAM заменяет энкодер изображения ViT-H из SAM на дистиллированный энкодер TinyViT, поэтому тот же сценарий с промптами-точками и промптами-рамками работает на более скромном железе. В LibreYOLO есть его нативный порт через отдельную фабрику LibreSAM, не связанную с фабрикой детекторов LibreYOLO().

Задачи
instance segmentation
Размеры
tiny at 1024 px
Установка
pip install libreyolo
Уровень поддержки
Смежный уровень, начиная с v. Отдельная часть продукта со своей фабрикой и контрактом.
Исходный проект
MobileSAM от Kyung Hee University, Apache-2.0. Статья, исходный код
Лицензии
Код: Apache-2.0, веса: Apache-2.0. Коммерческое использование

Установка

Для MobileSAM нужен extra sam: скачивание весов в LibreYOLO по-прежнему идёт через инструменты снапшотов Hugging Face из transformers, хотя сам инференс выполняет нативный декодер, не связанный с transformers.

bash
pip install "libreyolo[sam]"

Предсказание

LibreSAM(...) (или специфичный для семейства LibreMobileSAM(...)) — отдельная от LibreYOLO(...) точка входа: она возвращает сегментатор по промптам, а не детектор, потому что прямой проход здесь бессмыслен без пространственного промпта. CLI-команды libreyolo predict для этого семейства нет; используйте Python API.

Промпты точкой и рамкой
from libreyolo import LibreSAM, SAMPLE_IMAGE # У MobileSAM один размер, "tiny", поэтому другие псевдонимы не нужны.model = LibreSAM("mobilesam") # Точечный промпт: [x, y] в пиксельных координатах, метка 1 = передний план.result = model.predict(SAMPLE_IMAGE, points=[640, 420], labels=[1])print(result.masks.xy)      # полигон на каждую маскуprint(result.boxes.xyxy)    # плотная рамка, полученная из маски # Промпт-рамка вместо точки.result = model.predict(SAMPLE_IMAGE, bboxes=[300, 200, 900, 700]) # Без промптов сегментируется всё изображение (упрощённый# автоматический генератор масок, а не исчерпывающий эталонный).result = model.predict(SAMPLE_IMAGE)
Одно кодирование, много промптов
from libreyolo import LibreMobileSAM, SAMPLE_IMAGE model = LibreMobileSAM() # Энкодер изображения — дорогая часть. set_image() запускает его один# раз; каждый следующий вызов predict() переиспользует закэшированный# эмбеддинг.model.set_image(SAMPLE_IMAGE)a = model.predict(points=[640, 420], labels=[1])b = model.predict(bboxes=[300, 200, 900, 700])model.reset_image()

Точечный промпт принимает [x, y] для одного объекта, [[x, y], ...] для нескольких или массивы numpy; labels помечает каждую точку как 1 (передний план) или 0 (фон), а по умолчанию все точки относятся к переднему плану. Промпт-рамка принимает [x1, y1, x2, y2] или список рамок, по одной маске на рамку. Если не задать ни того ни другого, сегментируется всё изображение: по плотной сетке подаются промпты и остаются уверенные непересекающиеся маски; этот режим «сегментировать всё» упрощён по сравнению с эталонным автоматическим генератором масок и на насыщенных сценах может сегментировать слишком грубо, поэтому настоящий промпт точкой или рамкой — путь к точному результату. conf фильтрует по предсказанному качеству маски (IoU), а не по уверенности детекции: передайте 0.0, чтобы оставить всех кандидатов. multimask=True возвращает на каждый промпт все три маски SAM для неоднозначности «целое или часть» вместо одной лучшей. device= переносит модель, а если активна сессия set_image() — и её закэшированный эмбеддинг. У каждой маски идентификатор класса 0 с именем "object", потому что у маски по промпту нет фиксированного набора классов. train(), val(), export() и track() для этого семейства вызывают NotImplementedError: в LibreYOLO MobileSAM работает только на предсказание. Типы источников описаны в разделе предсказание.

Варианты

Один размер, tiny, с фиксированным входом 1024 px: у MobileSAM один энкодер TinyViT, а не лестница base/large/huge, как в SAM-1.

Чекпойнты

Все опубликованные файлы весов этого семейства.

ФайлВход (пикс.)Лицензия весов
Instance segmentation
LibreMobileSAM.ptapache-2.0

Все перечисленные выше файлы уже доступны в организации LibreYOLO и скачиваются при первом использовании.

Лицензирование

Проверяйте лицензию в репозитории конкретных весов на Hugging Face. Она указана для каждого чекпойнта в организации LibreYOLO и может различаться даже внутри одного семейства. Этот репозиторий считается авторитетным источником, а сводка ниже описывает условия на момент последней проверки страницы.

Это описание соответствующих лицензий, а не юридическая консультация. Если ответ важен для коммерческого использования, прочитайте лицензии самостоятельно и проконсультируйтесь с юристом.

Оригинальная работа
MobileSAM, Kyung Hee University
Лицензия исходного проекта
Apache-2.0
Исходный код проекта
github.com/ChaoningZhang/MobileSAM
Код LibreYOLO
MIT
Веса
Apache-2.0, повторно опубликованы на huggingface.co/LibreYOLO
Толкование
Apache-2.0 is a permissive license, so this code and these weights can be used in commercial and closed-source products. It asks you to keep the license text and attribution notices with any copy you redistribute, and it grants a patent license. LibreYOLO carries a native port of the TinyViT image encoder, prompt encoder, two-way transformer and mask decoder rather than vendoring upstream files unmodified, checked for bit-exact parity against the original Apache-2.0 implementation, with a NOTICE recording that provenance. The converted checkpoint is hosted as LibreMobileSAM.pt on the LibreYOLO Hugging Face org, tagged Apache-2.0 there as well.

Цитирование

@article{mobile_sam,
  title={Faster Segment Anything: Towards Lightweight SAM for Mobile Applications},
  author={Zhang, Chaoning and Han, Dongshen and Qiao, Yu and Kim, Jung Uk and Bae, Sung-Ho and Lee, Seungkyu and Hong, Choong Seon},
  journal={arXiv preprint arXiv:2306.14289},
  year={2023}
}

Скопировано из блока цитирования авторов на странице github.com/ChaoningZhang/MobileSAM#bibtex-of-our-mobilesam.

Проверено с LibreYOLO v1.5.0. Таблицы поддержки, чекпойнты и результаты бенчмарков на этой странице сгенерированы из выпущенной библиотеки и опубликованных весов, а не написаны вручную.