D-FINE

Ein Detection Transformer, der die Box-Regression als Wahrscheinlichkeitsverteilung über jede Box-Kante formuliert und über die Decoder-Schichten hinweg verfeinert. LibreYOLO unterstützt ihn für Objekterkennung und Instanzsegmentierung.

Aufgaben
detection, instance segmentation
Größen
n, s, m, l, x at 640 px
Installation
pip install libreyolo
Supportstufe
Kern, seit v1.1.0. Trainierbare Kerndetektoren: Funktionen folgen den Flaggschiffen in derselben Release-Welle.
Upstream
D-FINE von University of Science and Technology of China, Apache-2.0. Publikation, Quelle
Lizenzen
Code Apache-2.0, Gewichte Apache-2.0. Kommerzielle Nutzung

Installation

D-FINE braucht kein optionales Extra. Alles, was es importiert, steckt in der Basisinstallation.

bash
pip install libreyolo

Fine-Tuning per Adapter mit lora=True ist die Ausnahme und braucht das Extra lora.

bash
pip install "libreyolo[lora]"

Vorhersage

Die Gewichte werden beim ersten Aufruf von Hugging Face geladen und lokal zwischengespeichert.

Python
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreDFINEn.pt")result = model(SAMPLE_IMAGE, save=True) for box in result.boxes:    print(box.cls, box.conf, box.xyxy)
CLI
libreyolo predict model=LibreDFINEn.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=True
Instanzsegmentierung
from libreyolo import LibreYOLO, SAMPLE_IMAGE # Das Suffix -seg im Dateinamen wählt den Mask-Head, ein# task-Argument ist hier also nicht nötig.model = LibreYOLO("LibreDFINEn-seg.pt")result = model(SAMPLE_IMAGE, save=True) print(result.masks.data.shape)

Das zurückgegebene Results-Objekt ist dasselbe, das jede Familie liefert, ein Wechsel auf einen anderen Detektor ist also eine Sache von einer Zeile. Ein Dateiname mit -seg löst von sich aus auf die Segmentierungsaufgabe auf, und result.masks trägt dann die Instanzmasken neben den Boxen. conf und max_det filtern die Auswahl der Queries; iou wird aus API-Parität akzeptiert, hat aber keine Wirkung, weil der Decoder ein Set Predictor ohne NMS-Schritt ist. Siehe Vorhersage für Quellen, Streaming und die Behandlung der Ergebnisse.

Varianten

Fünf Größen. Sie laufen alle mit derselben Eingabeauflösung, die Tabelle trennt sie deshalb nach Parameterzahl und Accuracy.

CheckpointEingabe (px)mAP 50-95Parameter (M)
LibreDFINEl64060.031.24
LibreDFINEm64057.819.59
LibreDFINEn64045.83.78
LibreDFINEs64053.410.32
LibreDFINEx64061.462.62

COCO val2017, 500 images. Gemessen mit dem LibreYOLO-Benchmarksystem und auf Vision Analysis veröffentlicht. Dort werden Latenzen verschiedener Hardware und Runtimes verglichen und die vollständigen Laufprotokolle bereitgestellt.

Die Segmentierung nutzt Backbone, Encoder und Decoder der Detektion weiter und ergänzt einen Mask-Head, ein -seg-Checkpoint nimmt also dieselben Argumente wie sein Detect-Pendant. Die RT-DETRv4-Familie von LibreYOLO ist als Unterklasse des D-FINE-Wrappers geschrieben: Sie erbt diese Decoder-Linie und schränkt ihre Aufgabenliste dann wieder auf die Detektion ein, weil sie keinen Mask-Head trägt.

Training

Das Training startet für beide Aufgaben von einem publizierten Checkpoint.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreDFINEn.pt")model.train(data="my-dataset.yaml", epochs=50, imgsz=640, batch=8, lr0=2e-4)
CLI
libreyolo train model=LibreDFINEn.pt data=my-dataset.yaml \  epochs=50 imgsz=640 batch=8 lr0=2e-4
Instanzsegmentierung
# Setzt auf publizierten Segmentierungsgewichten auf, Mask-Head inklusive.libreyolo train model=LibreDFINEn-seg.pt data=my-dataset.yaml \  task=segment epochs=50 imgsz=640
Segmentierung aus Detect-Gewichten
# Detect-Gewichte haben keinen Mask-Head, das ist also ein expliziter# Transfer: Der Head startet untrainiert und ist erst nach dem Training# nützlich. task=segment autorisiert den Transfer hier.libreyolo train model=LibreDFINEn.pt data=my-dataset.yaml \  task=segment epochs=50 imgsz=640
LoRA
from libreyolo import LibreYOLO model = LibreYOLO("LibreDFINEn.pt")model.train(data="my-dataset.yaml", epochs=50, lora=True)
Multi-GPU
libreyolo train model=LibreDFINEn.pt data=my-dataset.yaml \  epochs=50 device=0,1 batch=16

Ohne Eingriff läuft der Trainer 132 Epochen mit lr0=2e-4 und amp=False, einem Batch von 16 und Early Stopping nach 50 Epochen ohne Verbesserung. Detect-Gewichte sind ein legitimer Startpunkt für ein Segmentierungstraining, aber nur als expliziter Transfer, denn der Mask-Head beginnt untrainiert und würde sonst bedeutungslose Masken liefern. Autorisiert wird das dadurch, dass du task=segment an die CLI übergibst. Der Python-Weg ist enger: LibreDFINE muss direkt mit allow_detect_to_segment_transfer=True konstruiert werden, weil die Factory LibreYOLO() kein solches Argument nimmt, und die direkte Konstruktion lädt nichts herunter, die Gewichtsdatei muss also schon auf der Platte liegen.

lora=True gilt für die Detektion. Das Segment-Training lehnt es ab und verweist stattdessen auf freeze='backbone', weil der Mask-Head nicht mit Adaptern getestet ist. Auf Apple Silicon verschiebt der Trainer den kompletten Lauf auf die CPU: Der Backward-Pass des gebinnten Matmuls des Integral läuft in einen Metal-Kompilierfehler. Die Inferenz auf MPS ist davon nicht betroffen.

Siehe Training für Datensätze, Augmentierung, Multi-GPU und Logger.

Validierung

val() gibt ein Dictionary zurück, das nach Metriknamen indiziert ist, und gibt Ergebnisse pro Klasse aus, solange verbose aktiv bleibt.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreDFINEn.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95"])print(metrics["metrics/mAP50"])
CLI
libreyolo val model=LibreDFINEn.pt data=my-dataset.yaml
Instanzsegmentierung
from libreyolo import LibreYOLO model = LibreYOLO("LibreDFINEn-seg.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95(M)"])   # Maskenprint(metrics["metrics/mAP50-95(B)"])   # Boxen

Bei einem -seg-Checkpoint trägt der schlichte Schlüssel metrics/mAP50-95 den Mask-Score, und derselbe Lauf meldet zusätzlich Boxen unter (B) und Masken unter (M), beides ist also aus einem Durchlauf verfügbar.

Export

AufgabeONNXTorchScriptExecuTorchTensorRTOpenVINOPaddleMNNRKNNncnnTFLiteCoreMLCore AI
DetectionDetection to ONNX: unterstütztDetection to TorchScript: unterstütztDetection to ExecuTorch: nicht unterstütztDetection to TensorRT: unterstütztDetection to OpenVINO: unterstütztDetection to Paddle: unterstütztDetection to MNN: unterstütztDetection to RKNN: nicht unterstütztDetection to ncnn: nicht unterstütztDetection to TFLite: nicht unterstütztDetection to CoreML: nicht unterstütztDetection to Core AI: unterstützt
Instance segmentationInstance segmentation to ONNX: unterstütztInstance segmentation to TorchScript: unterstütztInstance segmentation to ExecuTorch: nicht unterstütztInstance segmentation to TensorRT: unterstütztInstance segmentation to OpenVINO: unterstütztInstance segmentation to Paddle: nicht unterstütztInstance segmentation to MNN: nicht unterstütztInstance segmentation to RKNN: nicht unterstütztInstance segmentation to ncnn: nicht unterstütztInstance segmentation to TFLite: nicht unterstütztInstance segmentation to CoreML: nicht unterstütztInstance segmentation to Core AI: nicht unterstützt

Ein exportiertes Artefakt lädt über sein Dateisuffix wieder durch LibreYOLO(), eine .onnx- oder .engine-Datei verhält sich also wie ein Checkpoint und liefert dieselben Results. Die Wege über OpenVINO, Paddle, MNN und Core AI exportieren mit fester Canvas-Größe statt mit dynamischen Formen. Export listet die Argumente auf, die jedes Format akzeptiert, und die Extras, die einige davon ergänzen.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreDFINEn.pt")model.export(format="onnx", imgsz=640)model.export(format="tensorrt", imgsz=640, half=True)
CLI
libreyolo export model=LibreDFINEn.pt format=onnx imgsz=640libreyolo export model=LibreDFINEn.pt format=tensorrt imgsz=640 half=True
Die exportierte Datei nutzen
from libreyolo import LibreYOLO, SAMPLE_IMAGE # Die Factory routet über das Dateisuffix, ein exportiertes Artefakt# lädt also wie jeder Checkpoint und liefert dasselbe Results-Objekt.model = LibreYOLO("LibreDFINEn.onnx")result = model(SAMPLE_IMAGE) print(result.boxes.xyxy)

Checkpoints

Jede publizierte Gewichtsdatei dieser Familie.

DateiEingabe (px)Lizenz der Gewichte
Detection
LibreDFINEn.pt640apache-2.0
LibreDFINEs.pt640apache-2.0
LibreDFINEm.pt640apache-2.0
LibreDFINEl.pt640apache-2.0
LibreDFINEx.pt640apache-2.0
Instance segmentation
LibreDFINEn-seg.pt640apache-2.0
LibreDFINEs-seg.pt640apache-2.0
LibreDFINEm-seg.pt640apache-2.0
LibreDFINEl-seg.pt640apache-2.0
LibreDFINEx-seg.pt640apache-2.0

Jede oben aufgeführte Datei ist heute in der LibreYOLO-Organisation verfügbar und wird bei der ersten Verwendung heruntergeladen.

Lizenzierung

Prüfe die Lizenz im Hugging-Face-Repository der konkreten Gewichte, die du herunterlädst. Jeder Checkpoint in der LibreYOLO-Organisation hat eine Lizenz, und sie ist innerhalb einer Familie nicht immer gleich. Dieses Repository ist die maßgebliche Quelle. Die Zusammenfassung unten beschreibt den Stand bei der letzten Verifizierung dieser Seite.

Dies ist eine Beschreibung der beteiligten Lizenzen und keine Rechtsberatung. Wenn die Antwort kommerziell relevant ist, lies die Lizenzen selbst und hole eigenen Rechtsrat ein.

Originalarbeit
D-FINE, University of Science and Technology of China
Upstream-Lizenz
Apache-2.0
LibreYOLO-Code
MIT
Gewichte
Apache-2.0, erneut unter huggingface.co/LibreYOLO veröffentlicht
Einordnung
Apache-2.0 is a permissive license, so these weights can be used in commercial and closed-source products. It asks you to keep its license text and attribution notices with any copy of the weights you redistribute, and it grants a patent license. It places no obligation on your own application code, and weights you train yourself on your own data are yours. The segmentation weights carry a second Apache-2.0 upstream, ArgoHA/D-FINE-seg, under the same terms.

Die Segmentierungsgewichte haben einen zweiten Upstream: Ihr Mask-Decoder, ihr Mask-Matching und ihr Mask-Loss stammen aus ArgoHA/D-FINE-seg, ebenfalls Apache-2.0, dessen Maintainer die Nachnutzung mit Namensnennung genehmigt hat.

Zitieren

@misc{peng2024dfine,
      title={D-FINE: Redefine Regression Task in DETRs as Fine-grained Distribution Refinement},
      author={Yansong Peng and Hebei Li and Peixi Wu and Yueyi Zhang and Xiaoyan Sun and Feng Wu},
      year={2024},
      eprint={2410.13842},
      archivePrefix={arXiv},
      primaryClass={cs.CV}
}

Aus dem Zitierblock der Autoren unter github.com/Peterande/D-FINE#citation kopiert.

Mit LibreYOLO v1.5.0 verifiziert. Supporttabellen, Checkpoints und Benchmarkwerte auf dieser Seite werden aus der veröffentlichten Bibliothek und den publizierten Gewichten generiert und nicht von Hand geschrieben.