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

Відновлення зображень

Відновлення зображень приймає погіршене зображення й повертає чисте. LibreYOLO надає його як задачу restore, що охоплює усунення шуму, розмиття та підвищення роздільної здатності за єдиним вихідним контрактом: одне зображення RGB на вході й одне на виході.

Визначення

Задача restore перетворює одне зображення на інше. Усунення шуму, розмиття та підвищення роздільної здатності тут є однією задачею, оскільки мають спільний контракт: модель приймає зображення RGB і повертає зображення RGB, а тип погіршення, яке вона навчена усувати, є властивістю контрольної точки, а не API.

Передбачення заповнює result.restored, об'єкт даних RestoredImage із масивом RGB типу uint8 у формі (H, W, 3). .array повертає його як NumPy, а .save(path) записує на диск. result.restore_scale зберігає коефіцієнт збільшення вихідного полотна, що дорівнює 1 для контрольної точки зі збереженням роздільної здатності. Поле result.boxes залишається порожнім, тому conf, iou і max_det приймаються для однакової сигнатури, але не мають впливу, а save=True записує безпосередньо відновлене зображення замість анотованої фотографії.

Моделі

Задачу restore виконують три сімейства, поділені за погіршенням, яке вони усувають.

NAFNet усуває шум і є єдиним сімейством відновлення, яке LibreYOLO може навчати. Його архітектура замінює нелінійні активації блока UNet поелементним множенням, а опубліковану контрольну точку навчено на шумі реальних зображень SIDD. Вихід зберігає роздільну здатність входу.

Real-ESRGAN є практичним засобом збільшення: три контрольні точки, навчені на синтетичних погіршеннях, а не лише бікубічному зменшенні, з масштабами 4x, 2x і меншим швидшим генератором 4x для нижчої затримки.

SwinIR збільшує у 4 рази за допомогою бекбона Swin Transformer у трьох розмірах, що охоплюють офіційний полегшений генератор і два генератори для реальних зображень.

Передбачення

Ваги завантажуються з Hugging Face під час першого використання та кешуються локально.

Збільшити зображення
from libreyolo import LibreYOLO, SAMPLE_IMAGE # Компактний генератор 4x; tile обмежує пікову пам'ять для великого джерела.model = LibreYOLO("LibreRealESRGANx4t-restore.pt")result = model(SAMPLE_IMAGE, tile=512, tile_pad=10) result.restored.save("upscaled.png")print(result.restored.array.shape)   # у 4 рази більше за кожною віссю
Усунути шум із зображення
from libreyolo import LibreYOLO, SAMPLE_IMAGE # Навчено на шумі реальних зображень SIDD; вихід зберігає розмір входу.model = LibreYOLO("LibreNAFNetl-restore-sidd.pt")result = model(SAMPLE_IMAGE) result.restored.save("denoised.png")print(result.restore_scale)   # 1: ця контрольна точка не збільшує зображення

Відновлення працює з власною роздільною здатністю початкового зображення, а не фіксованим полотном мережі, і доповнює його лише до коефіцієнта зменшення роздільної здатності мережі, тому час і пам'ять масштабуються з кількістю пікселів входу. tile ділить прямий прохід на тайли з перекриттям і змішує шви після складання, а tile_pad є ореолом, який додається навколо кожного тайла перед обрізанням; обидва є ключовими аргументами Python. Джерела, потокове оброблення й роботу з результатами описано в розділі передбачення.

Формат датасету

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

dataset/
  data.yaml
  inputs/
    train/photo.jpg
    val/photo.jpg
  targets/
    train/photo.jpg
    val/photo.jpg
yaml
path: dataset
train: inputs/train
val: inputs/val
input_dir: inputs
target_dir: targets
degradation: denoise
dataset: MyDataset
nc: 1
names: {0: image}

nc і names є заповнювачами схеми; модель відновлення повертає Results.restored, а не виявлення. degradation і dataset є необов'язковими мітками походження. target_stem_suffix підтримує датасети, що називають чисте зображення інакше, ніж його погіршену пару. Під час валідації зберігається нативна роздільна здатність і додається лише доповнення для складання батча, тому метрики обчислюються на початковому полотні. Повний контракт наведено в розділі форматів датасетів.

Навчання

NAFNet є єдиним сімейством відновлення з реалізацією навчання. Real-ESRGAN.train() і SwinIR.train() спричиняють NotImplementedError: ці контрольні точки походять із навчання GAN на пайплайнах синтетичного погіршення, а засіб навчання парного відновлення працював би без відтворення цього рецепта.

Донавчити NAFNet на парних зображеннях
from libreyolo import LibreYOLO model = LibreYOLO("LibreNAFNetl-restore-sidd.pt")model.train(data="my-dataset.yaml", epochs=100, imgsz=256, batch=16, lr0=1e-3)
Записати походження в контрольній точці
from libreyolo import LibreYOLO model = LibreYOLO("LibreNAFNetl-restore-sidd.pt") # degradation і dataset записуються до збереженої контрольної точки# для фіксації походження; вони не беруть участі в навчанні.model.train(    data="my-dataset.yaml",    epochs=100,    degradation="denoise",    dataset="MyDataset",)

Засіб навчання робить зв'язані кадрування вхідної та цільової пари, тому обидві сторони залишаються вирівняними. Датасети, кілька GPU й засоби журналювання описано в розділі навчання, а типові значення цього сімейства та об'єднання під час інференсу, яке від'єднується під час навчання, наведено на сторінці NAFNet.

Валідація

val() порівнює відновлений вихід із чистою ціллю в RGB на початковому полотні, без обрізання меж і зміни розміру.

Виконати валідацію та прочитати ключі метрик
from libreyolo import LibreYOLO model = LibreYOLO("LibreNAFNetl-restore-sidd.pt") # val() повертає звичайний словник, а не об'єкт.metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/PSNR"])   # fitnessprint(metrics["metrics/SSIM"])

metrics/PSNR є піковим відношенням сигналу до шуму в децибелах, а також fitness, числом для вибору найкращої контрольної точки. metrics/SSIM є структурною подібністю в діапазоні [0, 1], обчисленою з гаусовим вікном 11x11 із сигмою 1.5 та усередненою за трьома колірними каналами. Для обох метрик більше значення краще.

Експорт

Експортована модель відновлення завантажується назад через LibreYOLO() за суфіксом файла, тому файл .onnx або .engine поводиться як контрольна точка й повертає той самий об'єкт Results, де restored містить вихідне зображення.

Експорт
from libreyolo import LibreYOLO model = LibreYOLO("LibreNAFNetl-restore-sidd.pt") # imgsz фіксується у графі, тому передайте розмір, який фактично# надходитиме до моделі під час розгортання.model.export(format="onnx", imgsz=256)
Запустити експортований файл
from libreyolo import LibreYOLO, SAMPLE_IMAGE # Фабрика маршрутизує за суфіксом файла, тому експортований артефакт# завантажується як будь-яка контрольна точка й повертає той самий Results.model = LibreYOLO("LibreNAFNetl-restore-sidd.onnx")result = model(SAMPLE_IMAGE) result.restored.save("denoised.png")

Експорт відновлення фіксує просторову роздільну здатність у графі, тому передайте значення imgsz, яке фактично надходитиме до моделі під час розгортання. Для NAFNet цей розмір має ділитися на коефіцієнт зменшення роздільної здатності мережі, а за dynamic=True динамічним залишається лише вимір батча. Для Real-ESRGAN і SwinIR пропущений imgsz використовує невеликий внутрішній розмір патча замість вашої робочої роздільної здатності. Покриття окремих форматів наведено на сторінці кожної моделі та в повній матриці експорту. У розділі експорту наведено аргументи, які приймає кожен формат.

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