Переглянути як Markdown

Імпорт наявних ваг

LibreYOLO переносить сімейства моделей із проєктів upstream, тому їхні випущені контрольні точки вже майже можна завантажити. Їм бракує метаданих, які автоматичне перетворення додає під час завантаження.

Точка входу
LibreYOLO("path/to/upstream.pth")
Запис поруч із джерелом як
<source>-<Prefix><size>[-task].pt
Скриптові перетворювачі
weights/ у репозиторії

Ця сторінка стосується контрольних точок з інших проєктів. Якщо ви переносите власний код зі старішої LibreYOLO, перегляньте оновлення до 1.5.0.

Що відбувається під час завантаження стороннього файла

LibreYOLO() спочатку завантажує будь-який файл ваг через обмежений шлях лише для ваг. Якщо результат містить повні метадані LibreYOLO, він використовується безпосередньо. Якщо ні, файл передається автоматичному перетворювачу до будь-яких інших спроб. Якщо обмежене завантаження повністю не вдається, що трапляється, коли контрольна точка містить серіалізований сторонній об'єкт, автоматичний перетворювач запускається із завантажувачем, який нейтралізує такі об'єкти.

Автоматичне перетворення виконує чотири дії. Воно витягує словник тензорів зі структури, яку використав проєкт upstream. Воно запитує кожне зареєстроване сімейство, чи розпізнає те отримані ключі, перейменовуючи їх, якщо схема назв upstream відрізняється від перенесення LibreYOLO. Потім обгортає переможця в контрольну точку, що відповідає схемі метаданих v1.0, визначаючи розмір, задачу й кількість класів із самих тензорів. Нарешті записує результат поруч із вихідним файлом і завантажує його.

Python
from libreyolo import LibreYOLO # Підставте шлях до наявної контрольної точки. Розпізнана структура# upstream перетворюється на льоту, записується поруч із# джерелом, а потім завантажується.model = LibreYOLO("path/to/upstream-checkpoint.pth") # Кількість і назви класів походять із тензорів і власних# метаданих файла, тому донавчена модель зберігає свій набір міток, а не COCO.print(model.family, model.size, model.task, model.nb_classes)print(model.names)
CLI
libreyolo predict model=path/to/upstream-checkpoint.pth \  source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg
Перевірка результату
# Перетворений файл відповідає тій самій схемі, що й опублікований.libreyolo metadata path=path/to/upstream-checkpoint-LibreYOLO9t.pt

Перетворення не приховується. Для перетвореного файла реєструються сімейство, ім'я джерела, ім'я виводу й отримана кількість класів, тому журнал запуску точно фіксує завантажені дані.

Структури, які він розгортає

Контрольні точки upstream вкладають ваги в кілька усталених місць, і перетворювач перевіряє їх за порядком, доки не знайде тензори: блок EMA в ema.module або плоский ema, ema_state_dict із вилученим префіксом module., потім params_ema, params, ema_net, net, model, state_dict і нарешті сам об'єкт. Перевірка кількох місць замість першого гарантує, що блок ema лише з лічильниками не приховає справжні ваги нижче.

Префікси обгорток також вилучаються: module. з розподіленого навчання, _orig_mod. зі скомпільованої моделі та вкладення model.model., яке додають деякі повторні розповсюдження.

Що й звідки читається

Розмір, задача й кількість класів походять із тензорів, а не з імені файла, тому донавчена контрольна точка перетворюється з власною кількістю класів, а не зі стандартною для архітектури. Назви класів беруться з власних метаданих контрольної точки, якщо вони є, або з блоку args чи hyper_parameters, якщо назви містяться там. Їх обрізають до виявленої кількості класів, щоб донавчена модель зі збереженим базовим набором міток не містила індексів, яких уже немає в її голові.

Щільні задачі обробляються явно, без вигаданих міток. Контрольна точка глибини отримує один клас depth, а відновлення, один клас image. Контрольна точка пози має дати кількість ключових точок із тензорів або сімейства; якщо жодне джерело її не визначає, перетворення відхиляється замість запису неповного файла.

RF-DETR має власний розпізнавач, оскільки для визначення розміру потрібна вся контрольна точка, а її голова має 91 вихід там, де LibreYOLO використовує угоду COCO з 80 класами. Контрольна точка нормалізується до 80 класів, якщо має рівно 80 назв, оголошує 80 класів, називає COCO своїм датасетом або взагалі не містить метаданих класів чи датасету. Справжня модель із 90 класами, яку визначають її назви, явна кількість не 80 або підказка про датасет не COCO, зберігається без змін.

Розташування перетвореного файла

Вивід записується поруч із джерелом та отримує похідне від нього ім'я:

<source stem>-<FilenamePrefix><size>[-<task suffix>].pt

Тому малий детектор YOLOv9, збережений як upstream-checkpoint.pth, стає upstream-checkpoint-LibreYOLO9t.pt. Ім'я за джерелом, а не за сімейством, дає змогу двом донавченим моделям одного сімейства й розміру в одному каталозі не перезаписувати одна одну та не конфліктувати з офіційною контрольною точкою. Файл перезаписується під час кожного завантаження, тому не застаріває відносно джерела. Якщо каталог доступний лише для читання, перетворений файл потрапляє до нового приватного тимчасового каталогу, розташування якого вказується в журналі.

Відтоді це звичайна контрольна точка LibreYOLO: вона завантажується через шлях метаданих, а libreyolo metadata повідомляє, що вона дійсна.

Випадки, що потребують ручної роботи

Два сімейства не використовують загальний розпізнавач. Сімейство погляду повністю виключено: воно підтримує лише інференс, а умови його випущених ваг обмежують повторне розповсюдження. RF-DETR виключено, оскільки його обробляє описаний вище спеціальний розпізнавач.

Необроблені контрольні точки PIDNet upstream відхиляються з повідомленням про weights/convert_pidnet_weights.py. Цей скрипт записує потрібні контрольній точці семантичні метадані Cityscapes.

D-FINE і DEIM мають однакові ключі архітектури, тому самі тензори не можуть їх розрізнити. Якщо обидва претендують на файл і в розгляді немає суміжного сімейства з відмінною ознакою, вибір визначає ім'я файла: форма dfine_hgnetv2_n_coco.pth або deim_hgnetv2_n_coco.pth розв'язує питання, а неінформативне ім'я відхиляється з поясненням замість припущення. Безпосереднє створення LibreDFINE або LibreDEIM також усуває неоднозначність.

Коли один файл обґрунтовано розпізнають кілька сімейств, підклас має перевагу над базовим класом, який він уточнює, а решту визначає порядок реєстру, що кодує специфічність перевірок сімейств. Ім'я файла враховується лише для нічиєї між D-FINE і DEIM, тому воно ніколи не може піднести загальний збіг над точним.

Скриптові перетворювачі

Репозиторій містить скрипти перетворення для окремих сімейств у weights/ і спільні допоміжні засоби для повторюваної роботи. Вони призначені для файлів, які відхиляє шлях виконання, для завчасного створення контрольної точки замість перетворення під час завантаження та для сімейств, метадані яких потрібно задавати, а не визначати з тензорів.

Ці скрипти є частиною репозиторію, а не встановленого пакета, тому для їх використання потрібно клонувати:

bash
git clone https://github.com/LibreYOLO/libreyolo.git
cd libreyolo
python weights/convert_pidnet_weights.py --help

Кожен скрипт записує контрольну точку, що відповідає схемі v1.0, тобто тому самому рівню, що й автоматичне перетворення та опубліковані ваги. Вміст схеми описано в розділі контрольні точки й ваги.

Перевірено з LibreYOLO v1.5.0.