Видалення тла
Видалення тла відокремлює об'єкт від усього позаду нього. LibreYOLO надає цю можливість як задачу matte, що повертає м'яке альфа-значення для кожного пікселя замість жорсткої маски переднього плану.
Визначення
Задача matte передбачає одне альфа-значення для кожного пікселя одного
зображення RGB: 1 означає повністю передній план, а 0 повністю тло. Значення
є безперервним, а не бінарним, і це визначає суть задачі. Жорстку маску можна
отримати одним порогом 0.5, тоді як м'яка матова маска додатково зберігає
часткове покриття волосся, хутра та розмитих рухом країв, яке відкидає бінарна
маска.
Передбачення заповнює result.matte, об'єкт даних Matte з масивом float32
у формі (H, W) у діапазоні [0, 1] на полотні початкового зображення,
доступним як NumPy через .array. result.cutout() поєднує початкове
зображення з цим альфа-каналом у масив RGBA типу uint8 у формі (H, W, 4),
а result.save(path) записує те саме у PNG із прозорим тлом. Поле
result.boxes залишається порожнім, тому conf, iou і max_det не мають
впливу.
Моделі
Задачу matte виконують два сімейства, що мають спільний шлях прямого проходу.
BiRefNet є мережею з двосторонніми посиланнями, навколо якої побудовано задачу; тут опубліковано одну контрольну точку рівня Swin-L.
FeyNobg є поглибленим варіантом від Feyn Inc.: архітектура BiRefNet, у якій третій етап Swin збільшено з 18 до 24 блоків, а потім виконано повторне навчання. LibreYOLO повторно використовує для нього шлях прямого проходу, попереднє оброблення й вихід з одним логітом від BiRefNet, тому передбачення, валідація та оброблення контрольних точок поводяться однаково; ваги й ідентичність сімейства належать FeyNobg.
Ваги цих двох сімейств мають різні ліцензії. Обидві наведено на сторінках моделей, а авторитетною є ліцензія в репозиторії Hugging Face конкретної контрольної точки.
Передбачення
Ваги завантажуються з Hugging Face під час першого використання та кешуються локально.
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreBiRefNetl-matte.pt")result = model(SAMPLE_IMAGE) matte = result.matteprint(matte.array.shape, matte.array.dtype) # (H, W) float32 у [0, 1]from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreBiRefNetl-matte.pt")result = model(SAMPLE_IMAGE) # save() поєднує джерело з матовою маскою як альфа-каналом.result.save("subject.png") rgba = result.cutout() # той самий масив (H, W, 4) uint8 у пам'ятіprint(rgba.shape)import numpy as npfrom libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreBiRefNetl-matte.pt")result = model(SAMPLE_IMAGE) rgba = result.cutout()alpha = rgba[..., 3:4].astype(np.float32) / 255.0backdrop = np.full_like(rgba[..., :3], 255) # білийcomposited = (rgba[..., :3] * alpha + backdrop * (1 - alpha)).astype(np.uint8)print(composited.shape)Обидва сімейства працюють на фіксованому нативному полотні 1024x1024 і
повертають матову маску до розміру початкового зображення. Інша роздільна
здатність не підтримується, оскільки таблиці відносних позицій бекбона Swin
прив'язано до цього розміру, а невідповідність спричиняє їх невдалу
інтерполяцію замість помилки. Results.save() визначено лише для результатів
із матовою маскою; метод потребує початкового зображення, яке повторно
завантажує з Results.path, якщо ви його не передали. Джерела, потокове
оброблення та роботу з результатами описано в розділі
передбачення.
Формат датасету
Під час валідації матових масок кожне зображення RGB зіставляється з одноканальною еталонною альфа-маскою з тією самою основою назви, де 0 означає тло, а 255 передній план.
my-matte-dataset/
images/
subject.jpg
mattes/
subject.pngДостатньо передати кореневий каталог як data=: каталог матових масок
автоматично визначається серед mattes/, matte/, gt/, masks/, mask/
і alpha/. Альтернативою є YAML датасету з path, а також val_images і
val_mattes, які називають каталоги відносно нього:
path: my-matte-dataset
val_images: images
val_mattes: mattes
nc: 1
names: {0: matte}nc і names є заповнювачами схеми; модель матової маски повертає
Results.matte, а не виявлення. Значення маски читаються як альфа-канал у
діапазоні [0, 1] шляхом ділення на 255, а маска, форма якої відрізняється від
полотна передбачення, змінює розмір білінійно для відповідності. Повний
контракт наведено в розділі
форматів датасетів.
Навчання
Жодне сімейство матових масок не має реалізації навчання: train() спричиняє
NotImplementedError в обох, а підтримка задачі matte охоплює лише
передбачення, валідацію та експорт. На сторінці кожної моделі названо
upstream-проєкт із кодом навчання та скрипт перетворення контрольної точки.
Валідація
val() запускає власний метод predict моделі, тому валідація використовує
точне попереднє оброблення сімейства, а обидві метрики обчислюються на полотні
початкового зображення.
from libreyolo import LibreYOLO model = LibreYOLO("LibreBiRefNetl-matte.pt") # Замість YAML датасету можна використати каталог, що містить# images/ і каталог матових масок.metrics = model.val(data="my-matte-dataset/") print(metrics["metrics/MAE"]) # менше кращеprint(metrics["metrics/Smeasure"]) # fitness, більше кращеmetrics/MAE є середньою абсолютною похибкою відносно еталонного альфа-каналу
в діапазоні [0, 1]; менше значення краще. metrics/Smeasure є S-мірою Fan
et al. (ICCV 2017), структурною подібністю, що враховує правильність форми
об'єкта та отворів у ній, чого не охоплює лише попіксельне середнє; більше
значення краще. S-measure також є fitness, числом, яке використовується для
вибору найкращої контрольної точки. Жодна метрика не залежить від роздільної
здатності.
Експорт
Експортована модель матової маски завантажується назад через LibreYOLO() за
суфіксом файла, тому артефакт поводиться як контрольна точка й повертає той
самий об'єкт Results.
from libreyolo import LibreYOLO model = LibreYOLO("LibreBiRefNetl-matte.pt")model.export(format="torchscript")from libreyolo import LibreYOLO, SAMPLE_IMAGE # Фабрика маршрутизує за суфіксом файла, тому експортований артефакт# завантажується як будь-яка контрольна точка й повертає той самий Results.model = LibreYOLO("LibreBiRefNetl-matte.torchscript")result = model(SAMPLE_IMAGE) print(result.matte.array.shape)TorchScript є валідованим шляхом для цієї задачі. Перетворення ONNX виконується, але ще не пройшло ту саму перевірку паритету, а решта форматів недоступна. Покриття окремих форматів наведено на сторінках BiRefNet і FeyNobg, а також у повній матриці експорту.