Usuwanie tła

Usuwanie tła oddziela obiekt od wszystkiego, co znajduje się za nim. LibreYOLO udostępnia je jako zadanie matte, które zwraca miękką wartość alfa dla każdego piksela zamiast twardej maski pierwszego planu.

Definicja

Zadanie matte przewiduje jedną wartość alfa na piksel pojedynczego obrazu RGB: 1 oznacza w całości pierwszy plan, a 0 w całości tło. Wartość jest ciągła, a nie binarna, co stanowi istotę zadania. Twardą maskę można uzyskać przez zastosowanie progu 0.5, natomiast miękka mapa alfa zachowuje dodatkowo częściowe pokrycie włosów, sierści i krawędzi rozmytych ruchem, które maska binarna odrzuca.

Predykcja wypełnia result.matte, czyli strukturę Matte zawierającą tablicę float32 (H, W) w zakresie [0, 1] na płótnie oryginalnego obrazu. Przez .array jest ona dostępna jako tablica NumPy. Funkcja result.cutout() łączy obraz źródłowy z tą wartością alfa w tablicę RGBA uint8 (H, W, 4), a result.save(path) zapisuje ten sam wynik jako plik PNG z przezroczystym tłem. result.boxes pozostaje pusty, więc conf, iou i max_det nie mają wpływu.

Modele

BiRefNet i FeyNobg współdzielą ścieżkę przebiegu w przód.

BiRefNet to sieć bilateral-reference, wokół której zbudowano zadanie. Jest tutaj publikowana jako jeden checkpoint poziomu Swin-L.

FeyNobg to pogłębiony wariant firmy Feyn Inc.: architektura BiRefNet, w której trzeci etap Swin zwiększono z 18 do 24 bloków, a następnie ponownie przeprowadzono trenowanie. LibreYOLO ponownie wykorzystuje dla niego ścieżkę forward, przetwarzanie wstępne i wyjście z jednym logitem z BiRefNet. Dzięki temu predykcja, walidacja i obsługa checkpointów działają identycznie, natomiast wagi i tożsamość rodziny należą do FeyNobg.

Obie rodziny mają inne licencje wag. Podano je na stronach modeli, a rozstrzygająca jest licencja w repozytorium Hugging Face konkretnego checkpointu.

BEN2 dodaje usuwanie tła przy stałym rozmiarze 1024. ViTMatte przyjmuje obraz i trójpoziomowe trimap= oznaczające piksele tła, nieznane i pierwszego planu.

WeVisOne-VL przyjmuje podpowiedź tekstową: LibreVLM("wevisone-vl", names=["person"], task="matte") zwraca sumę masek alfa każdej instancji pasującej do frazy. Jest to model wizyjno-językowy, który wymaga dodatku vlm, a jego val() i export() zgłaszają błąd.

Predykcja

Przy pierwszym użyciu wagi są pobierane z Hugging Face i zapisywane w lokalnej pamięci podręcznej.

Predykcja mapy alfa
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 w zakresie [0, 1]
Zapis przezroczystego pliku PNG
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreBiRefNetl-matte.pt")result = model(SAMPLE_IMAGE) # save() łączy obraz źródłowy z mapą alfa jako kanałem alfa.result.save("subject.png") rgba = result.cutout()   # ta sama tablica uint8 (H, W, 4) w pamięciprint(rgba.shape)
Kompozycja na nowym tle
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)          # bielcomposited = (rgba[..., :3] * alpha + backdrop * (1 - alpha)).astype(np.uint8)print(composited.shape)

BiRefNet i FeyNobg działają na stałym natywnym obszarze 1024x1024 i skalują maskę mattingu do oryginalnego obrazu. Inne rozdzielczości nie są obsługiwane, ponieważ tablice pozycji względnych bloku backbone Swin są związane z tym rozmiarem; niedopasowanie daje słabą interpolację zamiast błędu. Results.save() używa obrazu źródłowego do wycięcia obiektu z maską mattingu i wczytuje go ponownie z Results.path, chyba że obraz podano jawnie. Źródła, streaming i obsługę wyników opisano w sekcji predykcji.

Results.save() zapisuje wycięty obiekt z maską mattingu jako RGBA. plot() renderuje obraz do kontroli. BEN2 obsługuje natywną predykcję w batchach; ViTMatte wymaga wskazówek dla pojedynczego obrazu.

Format zbioru danych

Walidacja matte łączy każdy obraz RGB z jednokanałową referencyjną mapą alfa o tej samej nazwie bazowej. Wartość 0 oznacza tło, a 255 pierwszy plan.

my-matte-dataset/  images/    subject.jpg  mattes/    subject.png

Wystarczy przekazać ten katalog główny jako data=. Katalog matte jest automatycznie wykrywany wśród mattes/, matte/, gt/, masks/, mask/ i alpha/. Alternatywą jest plik YAML zbioru danych zawierający path oraz val_images i val_mattes wskazujące katalogi względem tej ścieżki:

yaml
path: my-matte-datasetval_images: imagesval_mattes: mattesnc: 1names: {0: matte}

nc i names są polami wymaganymi przez schemat. Model matte zwraca Results.matte, a nie detekcje. Wartości mapy alfa są odczytywane w zakresie [0, 1] przez podzielenie przez 255. Jeśli kształt mapy różni się od płótna predykcji, jest ona przeskalowywana biliniowo. Pełny kontrakt opisują formaty zbiorów danych.

Trenowanie

Te rodziny mattingu nie mają implementacji trenowania. Obsługa eksportu zależy od rodziny; ViTMatte nie obsługuje eksportu. Każda strona modelu podaje projekt źródłowy udostępniający kod trenowania oraz skrypt konwersji pozwalający wczytać checkpoint.

Walidacja

Funkcja val() steruje własną funkcją predict modelu, dlatego walidacja używa dokładnego przetwarzania wstępnego danej rodziny, a obie metryki są obliczane na płótnie oryginalnego obrazu.

Walidacja i odczyt kluczy metryk
from libreyolo import LibreYOLO model = LibreYOLO("LibreBiRefNetl-matte.pt") # Zamiast pliku YAML zbioru danych można użyć katalogu zawierającego# podkatalogi images/ i matte.metrics = model.val(data="my-matte-dataset/") print(metrics["metrics/MAE"])        # im mniej, tym lepiejprint(metrics["metrics/Smeasure"])   # fitness, im więcej, tym lepiej

metrics/MAE jest średnim błędem bezwzględnym względem referencyjnej wartości alfa w zakresie [0, 1]. Im mniej, tym lepiej. metrics/Smeasure jest miarą S-measure autorstwa Fana i współautorów (ICCV 2017), czyli podobieństwem strukturalnym oceniającym poprawność kształtu obiektu i otworów w jego wnętrzu, których nie uwzględnia sama średnia dla pikseli. Im więcej, tym lepiej. S-measure jest również wartością fitness, używaną przy wyborze najlepszego checkpointu. Żadna z metryk nie zależy od rozdzielczości.

Eksport

Wyeksportowany model matte wczytuje się ponownie przez LibreYOLO() na podstawie sufiksu pliku, więc artefakt działa jak checkpoint i zwraca ten sam obiekt Results.

Eksport
from libreyolo import LibreYOLO model = LibreYOLO("LibreBiRefNetl-matte.pt")model.export(format="torchscript")
Uruchomienie wyeksportowanego pliku
from libreyolo import LibreYOLO, SAMPLE_IMAGE # Funkcja fabrykująca wybiera ścieżkę na podstawie sufiksu pliku, więc# wyeksportowany artefakt wczytuje się jak checkpoint i zwraca ten sam obiekt Results.model = LibreYOLO("LibreBiRefNetl-matte.torchscript")result = model(SAMPLE_IMAGE) print(result.matte.array.shape)

TorchScript jest zweryfikowaną ścieżką dla tego zadania. Konwersja ONNX działa, ale nie osiągnęła tego samego poziomu zgodności, a pozostałe formaty są niedostępne. Zakres poszczególnych formatów podano na stronach BiRefNet i FeyNobg oraz w pełnej macierzy eksportu.

Zweryfikowano z LibreYOLO v1.6.0.