FOMO

FOMO — это локализатор точек на сетке: каждая ячейка сетки низкого разрешения классифицируется как фон или как центр объекта, без всякой регрессии ограничивающих рамок. LibreYOLO поддерживает его для задачи point.

Задачи
point
Размеры
Установка
pip install libreyolo
Уровень поддержки
Поддерживаемый, начиная с v. Дополнительные обучаемые модели: тесты CI поддерживаются в рабочем состоянии, а функции добавляются по возможности.
Исходный проект
FOMO (Faster Objects, More Objects) от Edge Impulse, MIT. Статья, исходный код
Лицензии
Код: MIT, веса: MIT. Коммерческое использование

Установка

FOMO не требует ничего сверх базового пакета.

bash
pip install libreyolo

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

В отличие от всех остальных семейств на этом сайте, веса LibreFOMO не скачиваются автоматически: LibreYOLO("LibreFOMOs-point.pt") ищет этот файл на диске и вызывает ValueError с его именем, а не скачивает его с Hugging Face. Сначала скачайте чекпойнт со страницы организации LibreYOLO и загрузите его по локальному пути — или обучите свой (см. «Обучение» ниже).

Python
from libreyolo import LibreYOLO, SAMPLE_IMAGE # Веса LibreFOMO не скачиваются автоматически (см. «Чекпойнты» ниже).# Укажите здесь путь к чекпойнту, который уже скачан локально.model = LibreYOLO("./LibreFOMOs-point.pt")result = model(SAMPLE_IMAGE, save=True) for point in result.points:    print(point.cls, point.conf, point.xy)
CLI
libreyolo predict model=./LibreFOMOs-point.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=True

В результате вместо boxes лежит points: каждая строка — это x, y, class, confidence, доступные как result.points.data или через аксессоры .xy, .xyn, .cls и .conf. Порог iou задавать не нужно, потому что подавлять нечего — рамок здесь нет; predict(..., nms_radius=1) задаёт, на сколько ячеек сетки должны отстоять друг от друга две детекции, чтобы уцелели обе, а в имени файла должен быть суффикс задачи FOMO -point, иначе загрузчик его не распознает. Про источники, стриминг и обработку результатов см. предсказание.

Варианты

Три размера — s, m и l — используют всё более широкие бэкбоны в стиле MobileNetV2 при соответственно больших фиксированных входных разрешениях, и за каждым из них стоит одна классификационная голова 1x1. Таблицы бенчмарков у этого семейства здесь нет; размер файла чекпойнта в таблице ниже — самый внятный из опубликованных на сегодня признаков разницы между размерами.

Обучение

Python
from libreyolo import LibreYOLO model = LibreYOLO("./LibreFOMOs-point.pt")model.train(    data="my-dataset.yaml",    epochs=40, batch=32, lr0=3e-4,)
CLI
# imgsz нужно передать явно: в CLI по умолчанию 640, а чекпойнт s# принимает только своё родное значение 96.libreyolo train model=./LibreFOMOs-point.pt data=my-dataset.yaml imgsz=96 epochs=40 batch=32 lr0=3e-4

imgsz выбирается не свободно: по умолчанию берётся родное разрешение загруженного чекпойнта, а передача другого значения вызывает ValueError с указанием ожидаемого размера. Эти размеры — 96 для s, 192 для m и 224 для l. В CLI imgsz по умолчанию равен 640, поэтому в команде libreyolo train его приходится задавать явно, чтобы он совпал с чекпойнтом.

Если больше ничего не менять, обучение идёт 40 эпох с размером батча 32, оптимизатором Adam при lr0=3e-4, без weight decay и с классом переднего плана, взвешенным в 100 раз сильнее фона в поячеечной кросс-энтропийной функции потерь, — потому что в типичной сцене почти каждая ячейка сетки это фон. EMA и смешанная точность по умолчанию выключены, и ни одна из геометрических или цветовых аугментаций, применяемых в LibreYOLO в других местах, здесь не работает: mosaic, mixup, HSV-джиттер, отражение, поворот, сдвиг и наклон — всё по нулям.

Именно этим путём обучались опубликованные чекпойнты LibreFOMO — с нуля на COCO.

Про датасеты и логгеры см. обучение.

Валидация

val() уходит в валидатор уровня сетки, сделанный под это семейство. Помимо ключей metrics/precision, metrics/recall и metrics/mAP@ с сопоставлением по точкам, общих с другими point-задачами, он перебирает пороги уверенности и значения nms_radius и публикует комбинацию с лучшим F1 под ключами metrics/grid_F1, metrics/grid_precision, metrics/grid_recall и metrics/grid_mean_distance, а породившие её порог и радиус — под decode/threshold и decode/nms_radius.

Python
from libreyolo import LibreYOLO model = LibreYOLO("./LibreFOMOs-point.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/grid_F1"])print(metrics["metrics/grid_precision"], metrics["metrics/grid_recall"])
CLI
libreyolo val model=./LibreFOMOs-point.pt data=my-dataset.yaml

Экспорт

ЗадачаONNXTorchScriptExecuTorchTensorRTOpenVINOPaddleMNNRKNNncnnTFLiteCoreMLCore AI
pointpoint to ONNX: поддерживаетсяpoint to TorchScript: поддерживаетсяpoint to ExecuTorch: поддерживаетсяpoint to TensorRT: поддерживаетсяpoint to OpenVINO: поддерживаетсяpoint to Paddle: не поддерживаетсяpoint to MNN: не поддерживаетсяpoint to RKNN: не поддерживаетсяpoint to ncnn: поддерживаетсяpoint to TFLite: не поддерживаетсяpoint to CoreML: не поддерживаетсяpoint to Core AI: поддерживается

Экспортированный артефакт загружается обратно через LibreYOLO() по суффиксу файла, поэтому файл .onnx или .engine ведёт себя как чекпойнт и возвращает тот же Results. Запуск графа в чистой среде выполнения, без установленной LibreYOLO, тоже поддерживается, но тогда препроцессинг и постпроцессинг придётся писать самостоятельно.

Python
from libreyolo import LibreYOLO model = LibreYOLO("./LibreFOMOs-point.pt")model.export(format="onnx")model.export(format="tensorrt", half=True)
CLI
libreyolo export model=./LibreFOMOs-point.pt format=onnx
Использование экспортированного файла
from libreyolo import LibreYOLO, SAMPLE_IMAGE # Фабрика выбирает загрузчик по суффиксу файла, поэтому экспортированный# артефакт загружается как любой чекпойнт и возвращает тот же объект Results.model = LibreYOLO("./LibreFOMOs-point.onnx")result = model(SAMPLE_IMAGE) print(result.points.xy)

Чекпойнты

Все опубликованные файлы весов этого семейства. Ни один из них не скачивается автоматически: возьмите нужный файл со связанной страницы Hugging Face и передайте его локальный путь в LibreYOLO().

ФайлВход (пикс.)Лицензия весов
point
LibreFOMOs-point.ptmit
LibreFOMOm-point.ptmit
LibreFOMOl-point.ptmit

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

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

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

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

Оригинальная работа
FOMO (Faster Objects, More Objects), Edge Impulse
Лицензия исходного проекта
MIT
Код LibreYOLO
MIT
Веса
MIT, повторно опубликованы на huggingface.co/LibreYOLO
Толкование
FOMO is a technique Edge Impulse introduced through a blog post and its product documentation, not a code release, so there is no upstream repository or license to inherit. LibreYOLO's architecture is an original MobileNetV2-style reimplementation of the published description, and the LibreFOMO checkpoints are trained from scratch on COCO, so both the code and these weights are MIT, LibreYOLO's own. They are also not auto-downloaded: LibreYOLO("LibreFOMOs-point.pt") looks for that file locally and raises rather than fetching it, so get the checkpoint from the Hugging Face repository first. The name FOMO and the technique it describes remain Edge Impulse's.

Ссылаться на исходный репозиторий FOMO не на что: компания Edge Impulse описывает эту технику в блог-посте и в документации своего продукта, но код обучения или инференса FOMO не выпускала. Архитектура и обучение здесь — собственная реализация LibreYOLO по этому опубликованному описанию, а опубликованные чекпойнты LibreFOMO обучены с нуля на COCO, поэтому и код, и эти веса — MIT и собственность самой LibreYOLO. Название FOMO и описываемая им техника остаются за Edge Impulse.

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