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

Схема контрольної точки

Файл LibreYOLO .pt є плоским словником, збереженим через torch.save. Ключ model містить словник стану; інші ключі верхнього рівня є метаданими, що ідентифікують контрольну точку без аналізу назви файла чи словника стану.

Схема v1.0

Кожна офіційна контрольна точка LibreYOLO .pt містить:

python
{
    "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_versionstrВерсія контракту метаданих; v1.0 використовує рядок "1.0"
libreyolo_versionstrВерсія, що створила контрольну точку
model_familystrЗареєстроване сімейство, наприклад yolo9, rfdetr, dfine, ec
sizestrВаріант у межах сімейства, наприклад t, s, r18, atto
taskstrКанонічна назва завдання
ncintДодатна кількість класів
namesdictdict[int, str] із ключами в 0..nc-1
imgszintДодатна квадратна роздільна здатність вхідних даних або застарілий скаляр для прямокутного контракту

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_dim2 для міток 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-вектор неоднозначний

Заповнювачі для щільних завдань

Кілька завдань передбачають щільні карти, а не класи, тому поля, подібні до класів, існують лише для сумісності зі схемою.

Завданняncnames
depth1{0: "depth"}
edge1{0: "edge"}
restore1{0: "image"}
ocr1{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"). Основні ваги вилучаються, і кожен квантований модуль натомість містить упаковані ваги:

РецептУпаковані тензориДеквантування
int8weight_packed int8 із початковою формою ваг, _q_w_scale FP32 для кожного каналуweight_packed * scale
fp8weight_packed float8_e4m3fn із початковою формою, _q_w_scale FP32 з одним елементом на вихідний каналweight_packed * scale
w4a16, w4a8weight_packed uint8, два 4-бітні коди на байт, молодший напівбайт перший, код q + 8; _q_w_gscale FP32 [out, ngroups], група 128 уздовж in_featuresМасштаб для груп
int2Чотири 2-бітні коди на байт, код q + 2, група 64Масштаб для груп
nvfp4weight_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", для неквантованих тензорів. Розпакування побітово відтворює симуляцію, тому інференс фіналізованої моделі точно збігається з інференсом підготовленої на пристрої фіналізації. Ця структура є стабільним контрактом для зовнішніх експортерів і середовищ виконання.

Контрольні точки навчання

Контрольні точки засобу навчання використовують те саме обов'язкове ядро метаданих і можуть додавати плоскі поля навчання та відновлення:

python
{
    "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:

python
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).

Відтворює docs/checkpoint_schema.md у репозиторії libreyolo для v1.5.0; дані звірено з libreyolo/utils/serialization.py і BaseModel.save.