Основные понятия
Каждую модель в LibreYOLO описывают четыре идеи: задача, которую она решает, семейство, к которому она относится, размер внутри этого семейства и уровень поддержки, на котором находится семейство. Имя файла чекпойнта кодирует первые три.
- Схема имени файла
Libre<FAMILY><size>[-<task>].pt- Канонические задачи
- 17
- Уровни поддержки
- Flagship, Core, Supported, Inference only, Museum, Sibling tier
Задачи
Задача — это то, что возвращает модель. В LibreYOLO семнадцать канонических имён
задач, и каждое из них даёт имя полю объекта Results, в котором лежит результат.
| Задача | Что возвращает |
|---|---|
detect | Выровненные по осям рамки с классом и уверенностью |
segment | Маски по экземплярам, по одной маске на каждый найденный объект |
semantic | Одна метка класса на пиксель, без разделения на экземпляры |
panoptic | Одна непересекающаяся метка на пиксель, объединяющая счётные объекты с аморфным фоном |
pose | Ключевые точки по экземплярам, строки выровнены с рамками |
classify | Вероятность по набору меток для всего изображения |
obb | Повёрнутые рамки с углом поворота |
point | Одна координата на изображении для каждой детекции вместо рамки |
depth | Плотная карта относительной обратной глубины |
normal | Плотное поле нормалей к поверхности в виде единичных векторов |
edge | Плотная карта вероятности границ |
restore | Восстановленное RGB-изображение — для устранения размытия, шумоподавления или суперразрешения |
matte | Мягкая карта переднего плана от 0 до 1, для удаления фона |
ocr | Текстовые четырёхугольники с распознанным текстом, в порядке чтения |
embed | L2-нормализованный вектор, скалярное произведение которого измеряет степень совпадения |
gaze | Направление взгляда для каждого найденного лица |
mesh | Трёхмерное тело с позой для каждого найденного человека |
Именно эти имена встречаются в метаданных чекпойнтов и в именах файлов.
Привычные псевдонимы принимаются везде, где передаётся задача, и нормализуются
раньше всего остального: detection и det становятся detect, keypoints
становится pose, cls становится classify, deblur, denoise и
super-resolution становятся restore, face-recognition и reid
становятся embed. Нераспознанное имя вызывает ошибку, а не молча подставляет
значение по умолчанию.
segment, semantic и panoptic — три разные задачи, а не три названия одной
и той же.
У масок экземпляров, у попиксельных меток и у объединённой карты «объекты плюс
фон» разная эталонная разметка (ground truth), разные метрики и разные поля
результата.
Семейства моделей
Семейство — это одна архитектурная линия со своим кодом загрузки, предобработки
и постобработки. Каждое семейство объявляет идентификатор FAMILY — например,
yolo9, rfdetr или dfine, — задачи, которые оно поддерживает, и входное
разрешение для каждого размера, который в нём выпущен.
LibreYOLO() — фабрика, а не класс. Получив путь, она загружает файл, определяет
семейство по метаданным чекпойнта или, если их нет, по самим ключам тензоров и
возвращает экземпляр модели этого семейства. Поэтому смена детектора — правка в
одну строку: полученный объект даёт тот же набор predict, train, val и
export и возвращает тот же тип Results.
# Задачи, размеры и входные разрешения каждого зарегистрированного семейства.libreyolo modelsfrom libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9t.pt") print(model.family, model.size, model.task)print(model.input_size)print(model.nb_classes, model.names[0])from libreyolo import LibreYOLO # Псевдонимы нормализуются на границе API: "keypoints" приводится# к "pose", "det" — к "detect", "semantic-segmentation" — к "semantic".model = LibreYOLO("LibreYOLO9t.pt", task="det")print(model.task)Семейство, которое решает больше одной задачи, обычно публикует отдельный чекпойнт под каждую задачу, часто со своим набором размеров для каждой; а некоторые вместо этого используют один артефакт сразу для двух задач во время работы. В любом случае поддерживаемые задачи — фиксированный список, и запрос задачи вне этого списка вызывает ошибку с перечислением поддерживаемых задач в сообщении, а не загружает что-то приблизительное.
Полный список с бенчмарками по семействам и опубликованными весами — на странице все модели.
Размеры
Размер — это вариант внутри семейства, записанный строчным кодом, который
присоединяется прямо к префиксу семейства. Обычные буквы — n для nano, t для
tiny, s для small, m для medium, l для large и x для xlarge, но коды
зависят от семейства, и несколько семейств используют совсем другое: коды по
имени бэкбона, такие как r50 или r101, где размер — это глубина ResNet; коды
составного масштабирования, такие как b0–b3; или имя, которое обозначает
единственный выпущенный чекпойнт. YOLOv9 использует c для compact там, где
другие семейства используют l.
Размер также фиксирует входное разрешение, а у семейств с несколькими задачами
разрешение может отличаться от задачи к задаче. И то и другое берётся из
семейства, а не угадывается; libreyolo models их выводит.
Имена файлов чекпойнтов
Все опубликованные файлы весов следуют одной схеме:
Libre<FAMILY><size>[-<task>].ptПрефикс семейства — фиксированная строка для каждого семейства, размер пишется
строчными буквами и присоединяется без разделителя, а суффикс задачи начинается с
дефиса. У детекции суффикса нет — по соглашению, которое чекпойнты YOLO
использовали всегда, — поэтому LibreYOLO9t.pt — это детектор, а
LibreRFDETRn-seg.pt — модель сегментации того же семейства.
| Задача | Суффикс |
|---|---|
detect | |
segment | -seg |
semantic | -sem |
panoptic | -panoptic |
pose | -pose |
classify | -cls |
gaze | -gaze |
obb | -obb |
point | -point |
depth | -depth |
edge | -edge |
normal | -normal |
restore | -restore |
matte | -matte |
ocr | -ocr |
embed | -embed |
mesh | -mesh |
Семейство, у которого нет задачи без суффикса, может требовать суффикс, так что имя без него не принимается как валидный чекпойнт этого семейства. Семейство, которое публикует веса, обученные на датасете, отличном от датасета по умолчанию, добавляет имя датасета ещё одним суффиксом, и этот вариант остаётся частью имени репозитория, откуда скачивается файл.
Три уровня остаются вне этой схемы. Семейства сегментации по промптам, семейства
vision-language и детекторы с открытым словарём не зарегистрированы в фабрике
чекпойнтов и не выпускают файла Libre<FAMILY><size>.pt. Вместо этого их префикс
указывает на скачанный снапшот Hugging Face или на чекпойнт для работы по
промптам, и регистр букв в исходном названии там сохраняется намеренно.
Как определяется задача
Когда задачу могут назвать сразу несколько сигналов, они проверяются в
фиксированном порядке, и побеждает первый из присутствующих: аргумент task,
который вы передали, затем задача, записанная в метаданных чекпойнта, затем
суффикс задачи в имени файла, затем задача семейства по умолчанию. Результат
сверяется с поддерживаемыми задачами семейства до того, как модель будет
построена, поэтому при несовпадении загрузка падает сразу, а не выдаёт
неправильный результат позже.
Уровни поддержки
Каждое семейство отнесено ровно к одному уровню. Уровень говорит о внимании разработчиков, а не о точности: он показывает, где новая возможность появляется первой и что держится зелёным.
| Уровень | Что это значит |
|---|---|
| Flagship | Возможности сначала проектируются и полностью проверяются на GPU именно здесь |
| Core | Основные обучаемые детекторы. Возможности приходят следом за flagship-семействами в той же волне релизов |
| Supported | Вспомогательные обучаемые семейства. Держатся зелёными в CI, возможности добавляются при случае |
| Inference only | Предсказание, валидация и экспорт. Возможности обучения неприменимы |
| Museum | Замороженный экспонат. Только исправление багов |
| Sibling tier | Отдельная часть продукта со своей фабрикой и своим контрактом |
На каждой странице модели уровень её семейства указан в шапке. Два flagship-семейства — YOLOv9 для свёрточных детекторов и RF-DETR для трансформерных детекторов; начинайте с них, если нет причины поступить иначе.
Уровень Inference only говорит о том, чего нет: цикла обучения в LibreYOLO.
Предсказание и валидация работают, как и экспорт там, где семейство его
поддерживает.
Вызов train() у такого семейства выбрасывает NotImplementedError с указанием
причины.