Hintergrundentfernung
Die Hintergrundentfernung trennt ein Motiv von allem, was dahinter liegt. LibreYOLO stellt sie als matte-Task bereit, der pro Pixel einen weichen Alphawert zurückgibt statt einer harten Vordergrundmaske.
Definition
Der matte-Task sagt aus einem einzelnen RGB-Bild einen Alphawert pro Pixel
vorher: 1 ist vollständig Vordergrund und 0 vollständig Hintergrund. Der Wert
ist kontinuierlich statt binär, und genau darum geht es bei dieser Aufgabe. Eine
harte Maske ist nur einen Schwellenwert entfernt, bei 0.5, während die weiche
Matte zusätzlich die teilweise Deckung an Haaren, Fell und bewegungsunscharfen
Kanten trägt, die eine binäre Maske wegwirft.
Eine Vorhersage füllt result.matte, ein Matte-Payload mit einem (H, W)
float32-Array in [0, 1] auf der ursprünglichen Bildfläche, über .array als
NumPy erreichbar. result.cutout() kombiniert das Quellbild mit diesem Alpha zu
einem (H, W, 4) uint8-RGBA-Array, und result.save(path) schreibt dasselbe in
ein PNG mit transparentem Hintergrund. result.boxes bleibt leer, deshalb haben
conf, iou und max_det keine Wirkung.
Modelle
Zwei Familien bedienen matte, und sie teilen sich einen Forward-Pfad.
BiRefNet ist das bilaterale Referenznetz, um das die Aufgabe herum gebaut ist, hier als ein Checkpoint der Swin-L-Stufe veröffentlicht.
FeyNobg ist die vertiefte Variante von Feyn Inc.: die Architektur von BiRefNet, deren dritte Swin-Stufe von 18 auf 24 Blöcke gewachsen ist und die danach neu trainiert wurde. LibreYOLO nutzt dafür den Forward-Pfad, die Vorverarbeitung und die Single-Logit-Ausgabe von BiRefNet weiter, deshalb verhalten sich Vorhersage, Validierung und Checkpoint-Handling identisch; die Gewichte und die Familienidentität gehören FeyNobg selbst.
Die beiden tragen unterschiedliche Lizenzen für ihre Gewichte. Beide sind auf den Modellseiten angegeben, und maßgeblich ist die Lizenz im Hugging-Face-Repository des konkreten Checkpoints.
Vorhersage
Die Gewichte werden beim ersten Aufruf von Hugging Face geladen und lokal zwischengespeichert.
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 in [0, 1]from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreBiRefNetl-matte.pt")result = model(SAMPLE_IMAGE) # save() legt die Matte als Alphakanal über das Quellbild.result.save("subject.png") rgba = result.cutout() # dasselbe (H, W, 4) uint8-Array im Speicherprint(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) # weißcomposited = (rgba[..., :3] * alpha + backdrop * (1 - alpha)).astype(np.uint8)print(composited.shape)Beide Familien laufen auf einer festen nativen 1024x1024-Fläche und skalieren
die Matte zurück auf das Originalbild. Eine andere Auflösung wird nicht
unterstützt, weil die Tabellen für relative Positionen im Swin-Backbone an diese
Größe gebunden sind und eine Abweichung sie schlecht interpoliert, statt einen
Fehler auszulösen. Results.save() ist nur für Matte-Ergebnisse definiert und
braucht das Quellbild, das es aus Results.path neu lädt, sofern du keines
übergibst. Siehe Vorhersage für Quellen, Streaming und den
Umgang mit Ergebnissen.
Datensatzformat
Die Matte-Validierung paart jedes RGB-Bild mit einer einkanaligen Ground-Truth-Alpha-Matte mit demselben Dateistamm, wobei 0 Hintergrund und 255 Vordergrund ist.
my-matte-dataset/
images/
subject.jpg
mattes/
subject.pngEs genügt, dieses Wurzelverzeichnis als data= zu übergeben: Das
Matte-Verzeichnis wird unter mattes/, matte/, gt/, masks/, mask/ und
alpha/ automatisch erkannt. Eine Datensatz-YAML ist die Alternative, mit path
sowie val_images und val_mattes, die Verzeichnisse relativ dazu benennen:
path: my-matte-dataset
val_images: images
val_mattes: mattes
nc: 1
names: {0: matte}nc und names sind Schema-Platzhalter; ein Matte-Modell liefert
Results.matte, keine Detektionen. Matte-Werte werden durch Division durch 255
als Alpha in [0, 1] gelesen, und eine Matte, deren Form von der
Vorhersagefläche abweicht, wird bilinear passend skaliert. Siehe
Datensatzformate für den vollständigen
Vertrag.
Training
Keine der beiden Matte-Familien hat eine Trainingsimplementierung: train()
löst bei beiden NotImplementedError aus, und die Matte-Unterstützung deckt nur
Vorhersage, Validierung und Export ab. Jede Modellseite nennt das
Upstream-Projekt, das Trainingscode mitliefert, und das Konvertierungsskript,
das einen Checkpoint zurückbringt.
Validierung
val() treibt das eigene predict des Modells an, deshalb nutzt die
Validierung genau die Vorverarbeitung der Familie, und beide Metriken werden auf
der ursprünglichen Bildfläche berechnet.
from libreyolo import LibreYOLO model = LibreYOLO("LibreBiRefNetl-matte.pt") # Statt einer Datensatz-YAML genügt ein Verzeichnis mit images/ und# einem Matte-Verzeichnis.metrics = model.val(data="my-matte-dataset/") print(metrics["metrics/MAE"]) # kleiner ist besserprint(metrics["metrics/Smeasure"]) # fitness, größer ist bessermetrics/MAE ist der mittlere absolute Fehler gegenüber dem
Ground-Truth-Alpha, in [0, 1], und kleiner ist besser. metrics/Smeasure ist
das S-Measure von Fan et al. (ICCV 2017), eine strukturelle Ähnlichkeit, die es
honoriert, die Form des Motivs und seine Löcher richtig zu treffen, was ein
reiner Mittelwert pro Pixel übersieht; größer ist besser. Das S-Measure ist
zugleich fitness, die Zahl, die die Auswahl des besten Checkpoints liest.
Keine der beiden Metriken hängt von der Auflösung ab.
Export
Ein exportiertes Matte-Modell lädt über LibreYOLO() anhand seiner Dateiendung
zurück, deshalb verhält sich das Artefakt wie ein Checkpoint und liefert
dieselben Results.
from libreyolo import LibreYOLO model = LibreYOLO("LibreBiRefNetl-matte.pt")model.export(format="torchscript")from libreyolo import LibreYOLO, SAMPLE_IMAGE # Die Factory routet über die Dateiendung: Ein exportiertes Artefakt# lädt wie jeder Checkpoint und liefert dasselbe Results-Objekt.model = LibreYOLO("LibreBiRefNetl-matte.torchscript")result = model(SAMPLE_IMAGE) print(result.matte.array.shape)TorchScript ist der validierte Pfad für diese Aufgabe. Die ONNX-Konvertierung läuft durch, hat dieselbe Paritätshürde aber nicht genommen, und die übrigen Formate sind nicht verfügbar. Die Abdeckung pro Format steht auf den Seiten BiRefNet und FeyNobg sowie in der vollständigen Export-Matrix.