Видалення тла
Видалення тла відокремлює об'єкт від усього позаду нього. 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 не мають
впливу.
Моделі
BiRefNet і FeyNobg мають спільний шлях прямого проходу.
BiRefNet є мережею з двосторонніми посиланнями, навколо якої побудовано задачу; тут опубліковано одну контрольну точку рівня Swin-L.
FeyNobg є поглибленим варіантом від Feyn Inc.: архітектура BiRefNet, у якій третій етап Swin збільшено з 18 до 24 блоків, а потім виконано повторне навчання. LibreYOLO повторно використовує для нього шлях прямого проходу, попереднє оброблення й вихід з одним логітом від BiRefNet, тому передбачення, валідація та оброблення контрольних точок поводяться однаково; ваги й ідентичність сімейства належать FeyNobg.
Ваги цих двох сімейств мають різні ліцензії. Обидві наведено на сторінках моделей, а авторитетною є ліцензія в репозиторії Hugging Face конкретної контрольної точки.
BEN2 додає видалення фону з фіксованим розміром 1024. ViTMatte приймає зображення й трирівневу trimap=, що позначає пікселі фону, невідомої ділянки та переднього плану.
WeVisOne-VL керується текстом:
LibreVLM("wevisone-vl", names=["person"], task="matte") повертає об'єднання
альфа-матів усіх екземплярів, що відповідають фразі. Це візуально-мовна модель,
якій потрібен додатковий пакет vlm, а її val() та export() спричиняють
помилку.
Передбачення
Ваги завантажуються з 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)BiRefNet і FeyNobg працюють на фіксованому нативному полотні 1024x1024 і
повертають матову маску до розміру початкового зображення. Інша роздільна
здатність не підтримується, оскільки таблиці відносних позицій бекбона Swin
прив'язано до цього розміру, а невідповідність спричиняє їх невдалу
інтерполяцію замість помилки. Results.save() використовує початкове зображення для вирізання за маскою й повторно
завантажує його з Results.path, якщо ви його не передали. Джерела, потокове
оброблення та роботу з результатами описано в розділі
передбачення.
Results.save() записує вирізані за маскою об'єкти як RGBA. plot() відображає зображення для перевірки. BEN2 підтримує батчеве нативне передбачення; ViTMatte потребує допоміжних даних для одного зображення.
Формат датасету
Під час валідації матових масок кожне зображення 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-datasetval_images: imagesval_mattes: mattesnc: 1names: {0: matte}nc і names є заповнювачами схеми; модель матової маски повертає
Results.matte, а не виявлення. Значення маски читаються як альфа-канал у
діапазоні [0, 1] шляхом ділення на 255, а маска, форма якої відрізняється від
полотна передбачення, змінює розмір білінійно для відповідності. Повний
контракт наведено в розділі
форматів датасетів.
Навчання
Ці сімейства матування не мають реалізації навчання. Підтримка експорту залежить від сімейства; ViTMatte не експортує. Сторінка кожної моделі вказує вихідний проєкт із кодом навчання й скрипт конверсії контрольної точки для зворотного завантаження.
Валідація
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, а також у повній матриці експорту.