Схема контрольної точки
Файл LibreYOLO .pt є плоским словником, збереженим через torch.save. Ключ model містить словник стану; інші ключі верхнього рівня є метаданими, що ідентифікують контрольну точку без аналізу назви файла чи словника стану.
Схема v1.0
Кожна офіційна контрольна точка LibreYOLO .pt містить:
{
"model": state_dict,
"schema_version": "1.0",
"libreyolo_version": "0.x.y",
"model_family": "yolo9",
"size": "t",
"task": "detect",
"nc": 80,
"names": {0: "cat", 1: "dog"},
"imgsz": 640,
}| Ключ | Тип | Значення |
|---|---|---|
model | словник стану | Ваги моделі |
schema_version | str | Версія контракту метаданих; v1.0 використовує рядок "1.0" |
libreyolo_version | str | Версія, що створила контрольну точку |
model_family | str | Зареєстроване сімейство, наприклад yolo9, rfdetr, dfine, ec |
size | str | Варіант у межах сімейства, наприклад t, s, r18, atto |
task | str | Канонічна назва завдання |
nc | int | Додатна кількість класів |
names | dict | dict[int, str] із ключами в 0..nc-1 |
imgsz | int | Додатна квадратна роздільна здатність вхідних даних або застарілий скаляр для прямокутного контракту |
task має одне зі значень detect, segment, semantic, panoptic, pose,
classify, gaze, obb, point, depth, edge, normal, restore,
matte, ocr, embed або mesh.
Офіційні контрольні точки записують кожен ключ names. Засоби читання можуть
доповнювати відсутні ключі мітками class_i для застарілих розріджених
відповідностей, але ключі поза діапазоном недійсні.
Прямокутні контрольні точки зберігають скаляр imgsz для застарілих засобів
читання, установлений як max(imgsz_h, imgsz_w), і додатково записують
imgsz_h та imgsz_w зі справжніми розмірами. Засіб читання, що розуміє
прямокутні поля, має надавати їм перевагу над скаляром. Сімейства з фіксованим
прямокутним контрактом, як-от HRNet pose, відхиляють несумісні розміри середовища виконання.
Схема навмисно плоска, а model навмисно є словником стану.
from libreyolo import LibreYOLOfrom libreyolo.utils.serialization import unwrap_libreyolo_checkpointimport torch # Завантажити контрольну точку, а потім зберегти її повторно, щоб отримати локальний шлях.LibreYOLO("LibreYOLO9t.pt").save("roundtrip.pt") loaded = torch.load("roundtrip.pt", map_location="cpu", weights_only=False)state_dict, metadata = unwrap_libreyolo_checkpoint(loaded) print(metadata["schema_version"], metadata["model_family"])print(metadata["size"], metadata["task"], metadata["nc"], metadata["imgsz"])print(len(state_dict), "tensors")Доповнення для пози
Поза зазвичай однокласова, nc: 1 із person, але голова пози YOLO-NAS також
підтримує багатокласову позу з одним спільним скелетом ключових точок. У такому
разі nc і names описують класи як у виявленні. Експортовані моделі пози для
середовища виконання повертають scores із формою [batch, anchors, nc].
| Ключ | Значення |
|---|---|
num_keypoints | Додатна кількість ключових точок, використана головою пози |
keypoint_dim | 2 для міток x,y або 3 для міток x,y,visibility; вивід моделі завжди надає x,y,visibility |
oks_sigmas | Необов'язкові значення OKS sigma для кожної ключової точки; за відсутності використовується типове значення завдання для num_keypoints |
num_keypoints_per_class | Необов'язкова кількість ключових точок для кожного класу в головах стилю GroupPose, де тензор ключових точок доповнено за класами; 0 для класів без ключових точок |
Доповнення для сітки
Контрольні точки сітки використовують task: "mesh", nc: 1 і
names: {0: "person"}. Структури параметрів відрізняються між моделями тіла,
тому розміри записуються, а не припускаються.
| Ключ | Значення |
|---|---|
body_model | Параметризація, наприклад mhr; обов'язкова й використовується для інтерпретації кожного поля нижче |
num_betas | Кількість коефіцієнтів ідентичності та форми; 45 для MHR |
num_body_pose | Ширина блоку параметрів пози тіла; 130 для MHR. Плоский вектор, а не один триплет на суглоб, оскільки суглоби рига мають різну кількість ступенів свободи |
num_vertices | Кількість вершин, які повертає декодер; 18439 для MHR |
num_joints | Кількість суглобів, які повертає декодер; 127 для MHR |
rotation_format | Спосіб кодування поворотів, наприклад euler_zyx для MHR або axis_angle. Ніколи не визначається за формою тензора, оскільки 3-вектор неоднозначний |
Заповнювачі для щільних завдань
Кілька завдань передбачають щільні карти, а не класи, тому поля, подібні до класів, існують лише для сумісності зі схемою.
| Завдання | nc | names |
|---|---|---|
depth | 1 | {0: "depth"} |
edge | 1 | {0: "edge"} |
restore | 1 | {0: "image"} |
ocr | 1 | {0: "text"} |
Передбачення країв є щільними картами ймовірностей float32 у [0, 1].
Контрольні точки відновлення можуть додавати degradation, коротку мітку
спотворення на кшталт deblur, denoise або super-resolution; dataset,
мітку походження на кшталт GoPro або SIDD; і scale, додатний цілий
коефіцієнт масштабування виходу відносно входу, наприклад 4 для моделі
підвищення роздільної здатності x4. Відсутнє значення або 1 означає, що
відновлене зображення зберігає роздільну здатність вхідного. Середовище виконання
також визначає масштаб із сімейства й розміру, тому scale є метаданими
походження, а не вимогою під час завантаження.
Доповнення для OCR
Сімейство ppocr постачає одну складену контрольну точку на рівень, де словник
стану model містить дві підмоделі в просторах ключів det.* і rec.*.
| Ключ | Значення |
|---|---|
charset | Повний алфавіт CTC у порядку індексів виходу: індекс 0 є порожнім символом CTC, далі словник розпізнавання та символ пробілу. Завантажувачі мають читати його з контрольної точки, а не з окремого файла |
pipeline | Типові значення пайплайна, вбудовані під час перетворення: det_limit_side_len, det_db_thresh, det_db_box_thresh, det_db_unclip_ratio, rec_image_shape. Аргументи середовища виконання можуть перевизначати їх для кожного виклику |
components | Зарезервовано для необов'язкових етапів пайплайна, як-от орієнтація документа, усунення викривлення та поворот рядка тексту. Порожнє у v1 |
Метадані середовища виконання експорту
Експортовані артефакти використовують ту саму домовленість подвійного запису
для прямокутників: imgsz_h і imgsz_w записуються поруч із застарілим
скаляром imgsz, а засіб читання, що не розуміє прямокутних полів, не повинен
непомітно трактувати скаляр як квадратний контракт.
Підтримка прямокутників у середовищі виконання залежить від сімейства та формату.
Експортовані моделі сімейства YOLO9, HRNet, NAFNet і Real-ESRGAN можуть
використовувати неквадратні imgsz_h та imgsz_w у підтримуваних форматах;
сімейства чи формати без явної підтримки прямокутників відхиляють метадані, а не
обробляють такі артефакти як квадратні. Експортовані моделі HRNet є фіксованими
головами кадрування людини з батчем один і FP32, де W32 приймає 256x192, а W48
приймає 384x288; детектор людей у граф не вбудовано.
Експортовані моделі з убудованим NMS можуть додавати такі плоскі ключі:
| Ключ | Значення |
|---|---|
nms | Рядкове булеве значення; "true" означає, що граф містить убудований вихід постоброблення |
nms_conf | Поріг упевненості, убудований у вихід |
nms_iou | Поріг IoU, убудований у вихід |
max_det | Максимальна кількість рядків виявлення після NMS, які повертає вбудований вихід |
nms_raw_output | Рядкове булеве значення; "true" означає, що граф також надає допоміжний необроблений вихід детектора |
Для експортованих моделей виявлення ONNX YOLO9 з nms=true вихід 0 (названий
output) є самостійним тензором після NMS із порогами часу експорту. Коли
nms_raw_output=true, вихід 1 (названий raw) зарезервовано для бекендів
LibreYOLO, щоб вони могли застосовувати власне обрізання за початковим полотном
і семантику середовища виконання predict(conf=..., iou=..., max_det=...).
Стороннім споживачам слід використовувати перший вихід.
Експортовані моделі пози можуть додавати num_keypoints; keypoint_dim, де
необроблений експорт у стилі GroupPose може використовувати більші значення,
наприклад 8, коли тензор містить поля точності чи логітів класу;
num_keypoints_per_class як список у кодуванні JSON, де потрібно зберігати
позиції класів із нульовою кількістю ключових точок, бо вони визначають схему;
і pose_input, де "person_crop" означає, що граф приймає один уже виділений
фрагмент і не містить детектора. Експорт HRNet для середовища виконання потребує
цього значення.
Експортовані моделі класифікації можуть додавати crop_pct, коефіцієнт
центрального обрізання з рухомою комою, де цільовим розміром до обрізання є
round(imgsz / crop_pct) і типове значення за відсутності дорівнює 0.875,
а також interpolation, "bilinear" або "bicubic", типово "bilinear".
Експорт ExecuTorch записує плоскі метадані до обов'язкового супровідного файла
<program>.pte.json. Контракт v1 передбачає CPU, FP32, батч 1 і фіксоване
полотно вхідних даних, а також вимагає executorch_version,
executorch_delegate зі значенням "xnnpack" і додатне
executorch_delegate_partitions. Завантажувач відхиляє супровідний файл, що
вказує інший делегат, динамічні форми або точність, відмінну від FP32.
Експорт MNN записує плоскі метадані до обов'язкового супровідного файла
<model>.mnn.json. Контракт v1 передбачає CPU, FP32, лише виявлення об'єктів і
фіксовану форму входу NCHW, а також вимагає mnn_version, mnn_backend зі
значенням "cpu", упорядковані непорожні mnn_input_names і
mnn_output_names, mnn_input_shape як чотири додатні цілі числа в порядку
[batch, channels, height, width] і mnn_batch, що дорівнює
mnn_input_shape[0]. Завантажувач відхиляє динамічні метадані, відмінну від
FP32 точність, інше завдання, непідтримуване сімейство чи неузгоджену форму.
Файли .pte і .mnn є артефактами окремих бекендів, а не контрольними точками PyTorch.
Квантовані контрольні точки
Квантована модель додає один необов'язковий плоский ключ quant, що містить
словник маніфесту зі schema, recipe, keep_high_precision, execution,
походженням калібрування, module_count і state. Маніфести FP8 також можуть
містити fp8_tensorwise_weights, точний список назв модулів QuantLinear, для
яких масштаб ваг застосовується до всього тензора, а не до кожного вихідного
каналу. Завантажувач, що бачить quant, відтворює структуру квантованих модулів
і політику масштабування перед load_state_dict.
state розрізняє дві форми артефакту.
"prepared", типове значення, містить основні ваги FP32 разом із буферами
масштабу _q_* і придатне до навчання. Засіб читання без підтримки квантування
може ігнорувати ключ quant і завантажити основні ваги як модель із рухомою комою.
"finalized" є формою для розгортання, яку записує export(format="pt").
Основні ваги вилучаються, і кожен квантований модуль натомість містить упаковані ваги:
| Рецепт | Упаковані тензори | Деквантування |
|---|---|---|
| int8 | weight_packed int8 із початковою формою ваг, _q_w_scale FP32 для кожного каналу | weight_packed * scale |
| fp8 | weight_packed float8_e4m3fn із початковою формою, _q_w_scale FP32 з одним елементом на вихідний канал | weight_packed * scale |
| w4a16, w4a8 | weight_packed uint8, два 4-бітні коди на байт, молодший напівбайт перший, код q + 8; _q_w_gscale FP32 [out, ngroups], група 128 уздовж in_features | Масштаб для груп |
| int2 | Чотири 2-бітні коди на байт, код q + 2, група 64 | Масштаб для груп |
| nvfp4 | weight_packed uint8 [out, ceil(in/16)*8], код sign<<3 | E2M1 level; weight_block_scale float8_e4m3fn [out, ceil(in/16)]; _q_w_amax FP32 для тензора | block_scale * amax / (448 * 6) |
| mxfp4 | Як nvfp4, але з блоками по 32 елементи, плюс weight_block_exp int8 [out, ceil(in/32)] | 2 ** exponent |
Буфери діапазону активацій _q_act_lo, _q_act_hi та _q_calibrated
зберігаються для int8. Маніфест записує remainder, "fp16" або "fp32",
для неквантованих тензорів. Розпакування побітово відтворює симуляцію, тому
інференс фіналізованої моделі точно збігається з інференсом підготовленої на
пристрої фіналізації. Ця структура є стабільним контрактом для зовнішніх
експортерів і середовищ виконання.
Контрольні точки навчання
Контрольні точки засобу навчання використовують те саме обов'язкове ядро метаданих і можуть додавати плоскі поля навчання та відновлення:
{
"model": state_dict,
"epoch": 42,
"optimizer": optimizer_state_dict,
"config": {},
"loss": 1.23,
"best_metric_key": "metrics/mAP50-95",
"best_metric_value": 0.51,
"best_epoch": 39,
"is_ema_weights": True,
"train_model": raw_state_dict,
"ema": ema_state_dict,
"ema_updates": 12345,
}is_ema_weights оголошує, чи згладжено model верхнього рівня за допомогою EMA.
Коли EMA ввімкнено, train_model, ema та ema_updates зберігають стан для
відновлення. Опубліковані ваги для інференсу мають бути компактними й не повинні
містити оптимізатор, епоху, конфігурацію, функцію втрат або стан відновлення EMA,
якщо їх навмисно не розповсюджують як контрольні точки навчання.
Для сумісності з випусками засоби читання приймають застарілі псевдоніми
найкращої метрики best_mAP50_95, best_mAP50, best_metric і best_metric_name.
Зовнішні знімки стану
Схема регулює файли .pt, створені LibreYOLO. Вона не перейменовує й не
обгортає багатофайлові знімки стану оригінальних реалізацій, які використовують
окремі рівні моделей.
Розмір LibreMODUS 14b-a7b є явним винятком: псевдонім через LibreVLM(...)
визначається як каталог із закріпленими файлами оригінальної реалізації, а
LibreYOLO не додає до нього метадані v1.0 і не публікує його повторно як .pt.
Застарілі та сторонні ваги
Нові засоби запису виконують сувору валідацію та мають створювати метадані v1.0. Коли метадані відсутні або неповні, застарілі контрольні точки, схожі на LibreYOLO, завантажуються через шлях сумісності з попередженням та інструкціями з перетворення, а сторонні контрольні точки оригінальних реалізацій спрямовуються до автоматичного перетворення. Дивіться контрольні точки оригінальних реалізацій.
Допоміжні функції
Допоміжні функції схеми розташовано в libreyolo.utils.serialization:
wrap_libreyolo_checkpoint(
state_dict,
*,
model_family,
size,
task,
nc,
names=None,
imgsz=None,
libreyolo_version=None,
schema_version="1.0",
**extra_metadata,
) -> dict
validate_checkpoint_metadata(checkpoint, *, strict=False) -> list[str]
unwrap_libreyolo_checkpoint(loaded, *, strict=False) -> tuple[dict, dict]validate_checkpoint_metadata не змінює дані й повертає список помилок; зі
strict=True натомість спричиняє CheckpointMetadataError. Підтримуваним
способом запису сумісної контрольної точки є model.save(path).