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.
pip install libreyoloFine-Tuning per Adapter mit lora=True ist die Ausnahme und braucht das Extra
lora.
pip install "libreyolo[lora]"Vorhersage
Die Gewichte werden beim ersten Aufruf von Hugging Face geladen und lokal zwischengespeichert.
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)libreyolo predict model=LibreDFINEn.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=Truefrom 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.
| Checkpoint | Eingabe (px) | mAP 50-95 | Parameter (M) |
|---|---|---|---|
| LibreDFINEl | 640 | 60.0 | 31.24 |
| LibreDFINEm | 640 | 57.8 | 19.59 |
| LibreDFINEn | 640 | 45.8 | 3.78 |
| LibreDFINEs | 640 | 53.4 | 10.32 |
| LibreDFINEx | 640 | 61.4 | 62.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.
from libreyolo import LibreYOLO model = LibreYOLO("LibreDFINEn.pt")model.train(data="my-dataset.yaml", epochs=50, imgsz=640, batch=8, lr0=2e-4)libreyolo train model=LibreDFINEn.pt data=my-dataset.yaml \ epochs=50 imgsz=640 batch=8 lr0=2e-4# Setzt auf publizierten Segmentierungsgewichten auf, Mask-Head inklusive.libreyolo train model=LibreDFINEn-seg.pt data=my-dataset.yaml \ task=segment epochs=50 imgsz=640# 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=640from libreyolo import LibreYOLO model = LibreYOLO("LibreDFINEn.pt")model.train(data="my-dataset.yaml", epochs=50, lora=True)libreyolo train model=LibreDFINEn.pt data=my-dataset.yaml \ epochs=50 device=0,1 batch=16Ohne 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.
from libreyolo import LibreYOLO model = LibreYOLO("LibreDFINEn.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95"])print(metrics["metrics/mAP50"])libreyolo val model=LibreDFINEn.pt data=my-dataset.yamlfrom 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)"]) # BoxenBei 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
| Aufgabe | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Detection | Detection to ONNX: unterstützt | Detection to TorchScript: unterstützt | Detection to ExecuTorch: nicht unterstützt | Detection to TensorRT: unterstützt | Detection to OpenVINO: unterstützt | Detection to Paddle: unterstützt | Detection to MNN: unterstützt | Detection to RKNN: nicht unterstützt | Detection to ncnn: nicht unterstützt | Detection to TFLite: nicht unterstützt | Detection to CoreML: nicht unterstützt | Detection to Core AI: unterstützt |
| Instance segmentation | Instance segmentation to ONNX: unterstützt | Instance segmentation to TorchScript: unterstützt | Instance segmentation to ExecuTorch: nicht unterstützt | Instance segmentation to TensorRT: unterstützt | Instance segmentation to OpenVINO: unterstützt | Instance segmentation to Paddle: nicht unterstützt | Instance segmentation to MNN: nicht unterstützt | Instance segmentation to RKNN: nicht unterstützt | Instance segmentation to ncnn: nicht unterstützt | Instance segmentation to TFLite: nicht unterstützt | Instance segmentation to CoreML: nicht unterstützt | Instance 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.
from libreyolo import LibreYOLO model = LibreYOLO("LibreDFINEn.pt")model.export(format="onnx", imgsz=640)model.export(format="tensorrt", imgsz=640, half=True)libreyolo export model=LibreDFINEn.pt format=onnx imgsz=640libreyolo export model=LibreDFINEn.pt format=tensorrt imgsz=640 half=Truefrom 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.
| Datei | Eingabe (px) | Lizenz der Gewichte |
|---|---|---|
| Detection | ||
| LibreDFINEn.pt | 640 | apache-2.0 |
| LibreDFINEs.pt | 640 | apache-2.0 |
| LibreDFINEm.pt | 640 | apache-2.0 |
| LibreDFINEl.pt | 640 | apache-2.0 |
| LibreDFINEx.pt | 640 | apache-2.0 |
| Instance segmentation | ||
| LibreDFINEn-seg.pt | 640 | apache-2.0 |
| LibreDFINEs-seg.pt | 640 | apache-2.0 |
| LibreDFINEm-seg.pt | 640 | apache-2.0 |
| LibreDFINEl-seg.pt | 640 | apache-2.0 |
| LibreDFINEx-seg.pt | 640 | apache-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
- Upstream-Quelle
- github.com/Peterande/D-FINE
- 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.