DEIM
Ein Detection Transformer, der mit dichtem Eins-zu-eins-Matching trainiert wird und dadurch in weit weniger Epochen konvergiert als die DETR-Rezepte, auf denen er aufbaut. LibreYOLO führt zwei Versionen davon, unterschieden durch den Checkpoint, den du lädst.
- Aufgaben
- detection
- Größen
- deim: n, s, m, l, x at 640 px
- Installation
pip install libreyolo- Supportstufe
- Kern, seit v1.2.0. Trainierbare Kerndetektoren: Funktionen folgen den Flaggschiffen in derselben Release-Welle.
- Upstream
- DEIM and DEIMv2 von Intellindust AI Lab, Apache-2.0; the DEIMv2 DINOv3 backbone adds Meta's DINOv3 License. Publikation, Quelle
- Lizenzen
- Code Apache-2.0, Gewichte Apache-2.0; the DEIMv2 DINOv3 backbone adds Meta's DINOv3 License. Kommerzielle Nutzung
Installation
Keine der beiden Versionen braucht ein optionales Extra. Alles, was sie importieren, steckt in der Basisinstallation.
pip install libreyoloFine-Tuning mit Adaptern über lora=True ist die Ausnahme und braucht das
lora-Extra.
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("LibreDEIMn.pt")result = model(SAMPLE_IMAGE, save=True) for box in result.boxes: print(box.cls, box.conf, box.xyxy)libreyolo predict model=LibreDEIMn.pt save=True \ source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpgfrom libreyolo import LibreYOLO # Die Version steckt im Dateinamen, und die Factory routet über den# Checkpoint, also laden beide gleich.model = LibreYOLO("LibreDEIMv2pico.pt") # Jede Quelle, die die Bibliothek akzeptiert: Datei, Ordner, URL,# Webcam-Index, RTSP-Stream oder eine .streams-Listefor result in model.predict("clip.mp4", stream=True, save=True): print(len(result.boxes))Das zurückgegebene Results-Objekt ist dasselbe, das jede Familie liefert, ein
anderer Detektor ist also eine Änderung von einer Zeile. conf und max_det
filtern eine Top-k-Dekodierung über Queries und Klassen; es gibt keinen
NMS-Schritt zum Einstellen, und iou wird akzeptiert, aber nicht genutzt.
Siehe Vorhersage für Quellen, Streaming und den Umgang mit
Ergebnissen.
DEIM akzeptiert rechteckiges imgsz=(height, width) für die Vorhersage. DEIMv2 weist rechteckige Vorhersage- und Validierungsanfragen ausdrücklich zurück. Daraus folgt keine Unterstützung für rechteckiges Training oder rechteckigen Export.
Varianten
Version 1 bringt fünf Größen mit, alle bei derselben Eingabegröße. Version 2
behält diese fünf Namen und ergänzt drei kleinere, atto, femto und pico,
von denen die ersten beiden nativ auf einer kleineren Eingabegröße laufen als
der Rest. Fünf Größenkürzel gibt es damit in beiden Versionen, und sie benennen
unterschiedliche Modelle; die Version steht im Dateinamen des Checkpoints.
| Checkpoint | Eingabe (px) | mAP 50-95 | Parameter (M) |
|---|---|---|---|
| LibreDEIMl | 640 | 57.8 | 31.24 |
| LibreDEIMm | 640 | 55.4 | 19.59 |
| LibreDEIMn | 640 | 46.8 | 3.78 |
| LibreDEIMs | 640 | 52.1 | 10.32 |
| LibreDEIMx | 640 | 59.6 | 62.62 |
| LibreDEIMv2atto | 320 | 27.5 | 0.51 |
| LibreDEIMv2femto | 416 | 34.5 | 0.98 |
| LibreDEIMv2l | 640 | 58.6 | 32.55 |
| LibreDEIMv2m | 640 | 56.0 | 18.36 |
| LibreDEIMv2n | 640 | 46.7 | 3.6 |
| LibreDEIMv2pico | 640 | 42.2 | 1.54 |
| LibreDEIMv2s | 640 | 53.0 | 9.78 |
| LibreDEIMv2x | 640 | 61.3 | 51.21 |
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.
Version 1 behält die Architektur von D-FINE und tauscht deren
Klassifikationsziel gegen den matchability-aware Loss aus dem dichten
Eins-zu-eins-Rezept, deshalb teilen sich die beiden Familien fast jeden
State-Dict-Key und werden über die Metadaten im Checkpoint unterschieden.
Version 2 behält diesen Trainingsvertrag bei und mischt die Backbones: HGNetv2
unterhalb von s, und ein DINOv3-Vision-Transformer mit einem
Spatial-Tuning-Adapter ab s aufwärts. Dieses Backbone ist der Grund, warum auf
diesen vier Checkpoints eine zweite Lizenz liegt, lies also
Lizenzierung, bevor du einen davon ausrollst.
Training
Das Training startet von einem veröffentlichten Checkpoint. pretrained
erreicht den Trainer nie: Version 1 warnt, dass der Key unbekannt ist, und
ignoriert ihn, Version 2 entfernt ihn. Keine der beiden gibt dir ein zufällig
initialisiertes Modell.
from libreyolo import LibreYOLO model = LibreYOLO("LibreDEIMn.pt") # coco128.yaml lädt beim ersten Aufruf 128 Beispielbilder. Für einen# echten Lauf zeigt `data` auf dein eigenes Dataset-YAML.model.train(data="coco128.yaml", epochs=50, batch=8, lr0=1e-4)libreyolo train model=LibreDEIMn.pt data=coco128.yaml \ epochs=50 batch=8 lr0=1e-4from libreyolo import LibreYOLO # Bleiben epochs, batch, imgsz und lr0 ungesetzt, kommen sie aus dem# veröffentlichten Rezept für die geladene Größe.model = LibreYOLO("LibreDEIMv2pico.pt")model.train(data="coco128.yaml", epochs=50)# Braucht das lora-Extra: pip install "libreyolo[lora]"from libreyolo import LibreYOLO model = LibreYOLO("LibreDEIMn.pt")model.train(data="coco128.yaml", epochs=50, lora=True)libreyolo train model=LibreDEIMn.pt data=coco128.yaml \ epochs=50 device=0,1Übergib lr0 bei Version 1 selbst. Ihre Python-Signatur von train() hat
4e-4 als Standard, die Rate aus dem veröffentlichten COCO-Rezept, während die
Trainingskonfiguration der Familie 1e-4 als Fine-Tuning-Standard führt, und
diesen niedrigeren Wert löst die CLI auf, wenn das Argument fehlt. Die
Konfiguration hält die Messung dahinter fest: bei den Batch-Größen, die ein
Fine-Tuning tatsächlich nutzt, und auf kleinen Datensätzen hat die COCO-Rate
den Transfer messbar verschlechtert.
Version 2 löst diese Standardwerte selbst auf. Lässt du epochs, batch,
imgsz und lr0 ungesetzt, liest sie jeden Wert aus dem veröffentlichten
Rezept für die geladene Größe, dadurch trainieren die kleinen Größen ohne
weitere Angabe in ihrer eigenen Eingabeauflösung, und ein Wert, den du
übergibst, überschreibt das Rezept. imgsz ist das Argument, das sie
einschränkt: Es muss ein positives Vielfaches von 32 sein, sonst wirft
Version 2 einen Fehler, bevor der Lauf startet.
Siehe Training für Datensätze, Augmentierung, Multi-GPU und Logger.
DEIM aktiviert AMP standardmäßig mit amp_dtype="float16". Übergib amp=False für FP32-Training.
Validierung
val() gibt ein Dictionary mit metrics/-Keys zurück, das Precision, Recall,
mAP 50 und mAP 50-95 abdeckt, gemessen an jedem Datensatz im Format, auf dem du
trainiert hast.
from libreyolo import LibreYOLO model = LibreYOLO("LibreDEIMn.pt") # val() gibt ein einfaches dict zurück, kein Objektmetrics = model.val(data="coco128.yaml") print(metrics["metrics/mAP50-95"])print(metrics["metrics/mAP50"])print(metrics["metrics/precision"], metrics["metrics/recall"])libreyolo val model=LibreDEIMn.pt data=coco128.yaml# coco-val-only.yaml holt die 5000 val2017-Bilder und lässt das# Trainingsset aus. Es enthält ein Download-Skript, braucht also# explizite Erlaubnis, sofern der Datensatz nicht schon lokal ist.libreyolo val model=LibreDEIMn.pt data=coco-val-only.yaml \ allow_download_scripts=TrueDie Zeilen in der Benchmark-Tabelle oben stammen aus dem Benchmark-Harness von LibreYOLO; die Notiz unter dieser Tabelle hält fest, welcher Datensatz sie erzeugt hat, und verlinkt die Laufprotokolle.
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 |
Die Matrix deckt beide Versionen auf einer Seite ab: Wo sie sich bei einem Format unterscheiden, zeigt die Zelle den schwächeren der beiden Werte, hier wird also für keine der Versionen zu viel versprochen.
Ein exportiertes Artefakt lädt über seine Dateiendung wieder durch
LibreYOLO(), eine .onnx- oder .engine-Datei verhält sich also wie ein
Checkpoint und liefert dieselben Results.
# Braucht das onnx-Extra: pip install "libreyolo[onnx]"from libreyolo import LibreYOLO model = LibreYOLO("LibreDEIMn.pt")path = model.export(format="onnx")print(path)libreyolo export model=LibreDEIMn.pt format=onnxfrom 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("LibreDEIMn.onnx")result = model(SAMPLE_IMAGE) print(result.boxes.xyxy)ONNX-Ein- und Ausgaben
LibreDEIM, and LibreDEIMv2 atto, femto, pico and n
| Tensor | images float32 [batch, 3, height, width] |
|---|---|
| Farbe | RGB |
| Skalierung | Pixel / 255 |
| Normalisierung | keine |
| Größenanpassung | auf Breite x Höhe strecken (ohne Auffüllen, Seitenverhältnis wird nicht beibehalten), Pillow bilinear |
So reproduzierst du die bilineare Skalierung von Pillow
LibreYOLO skaliert mit dem BILINEAR-Filter von Pillow (Image.resize). Das ist weder OpenCV INTER_LINEAR noch INTER_AREA: Beim Verkleinern weitet Pillow den Filter um den Verkleinerungsfaktor, und die Skalierungen von OpenCV verändern Detektionen und verschieben Boxen um mehrere Pixel. Um es ohne Pillow nachzubauen, skaliere eine Achse, runde auf 8 Bit, skaliere dann die andere Achse und runde erneut. Pro Achse gilt s = in_size / out_size und f = max(s, 1). Ausgabepixel i hat das Zentrum c = (i + 0.5) * s und liest Quellpixel j von int(c - f + 0.5) bis int(c + f + 0.5) - 1, auf das Bild begrenzt, jeweils mit dem Gewicht max(0, 1 - |j + 0.5 - c| / f), geteilt durch die Summe der Gewichte. Pillow rechnet in Festkomma und wählt die Achsenreihenfolge anhand der Bildform, daher können Gleitkomma-Gewichte bei einigen Pixeln um eine Stufe abweichen. Das ändert die Ergebnisse in unseren Prüfungen nicht.
Square input only. Export rejects a non-square imgsz. height and width equal the imgsz metadata key: 640 by default, 320 for DEIMv2 atto and 416 for DEIMv2 femto.
Batch size 1 only. The graph declares a dynamic batch axis, but batches of 2 or more fail in 1.7.0.
To run several images per call, export with batch=2. That graph takes any batch size and gives the same results per image.
Divide by 255 after the resize. There is no mean or std normalization for these sizes.
Only the default export exists. nms=True raises NotImplementedError for this family.
Detection, Standardexport
| Ausgabe | Form | Bedeutung |
|---|---|---|
pred_logits | [batch, queries, nc] | One logit per query and class. Sigmoid is not applied, and there is no background class. 300 queries, except DEIMv2 atto with 100 queries, femto with 150 queries and pico with 200 queries. |
pred_boxes | [batch, queries, 4] | cx, cy, w, h of each query, normalized 0 to 1 of the input. The input is the whole image stretched, so these are also fractions of the original image. |
Nachbearbeitung
- Apply sigmoid to pred_logits.
- Flatten the [queries, nc] scores and take the top 300 (max_det, 300 by default). For flat index k, the query is k // nc and the class is k % nc. One query can yield several classes.
- Keep the pairs whose score is above the confidence threshold (0.25 by default).
- Convert the query's box to x1 = cx - w / 2, y1 = cy - h / 2, x2 = cx + w / 2, y2 = cy + h / 2. Multiply x by the original image width and y by the original image height.
- There is no NMS and the iou threshold is not used. DEIM predicts a set of boxes.
- LibreYOLO does not clip these boxes, so an edge can sit slightly outside the image.
LibreDEIMv2 s, m, l and x
| Tensor | images float32 [batch, 3, height, width] |
|---|---|
| Farbe | RGB |
| Skalierung | Pixel / 255 |
| Normalisierung | Mittelwert [0.485,0.456,0.406], Standardabweichung [0.229,0.224,0.225] |
| Größenanpassung | auf Breite x Höhe strecken (ohne Auffüllen, Seitenverhältnis wird nicht beibehalten), Pillow bilinear |
So reproduzierst du die bilineare Skalierung von Pillow
LibreYOLO skaliert mit dem BILINEAR-Filter von Pillow (Image.resize). Das ist weder OpenCV INTER_LINEAR noch INTER_AREA: Beim Verkleinern weitet Pillow den Filter um den Verkleinerungsfaktor, und die Skalierungen von OpenCV verändern Detektionen und verschieben Boxen um mehrere Pixel. Um es ohne Pillow nachzubauen, skaliere eine Achse, runde auf 8 Bit, skaliere dann die andere Achse und runde erneut. Pro Achse gilt s = in_size / out_size und f = max(s, 1). Ausgabepixel i hat das Zentrum c = (i + 0.5) * s und liest Quellpixel j von int(c - f + 0.5) bis int(c + f + 0.5) - 1, auf das Bild begrenzt, jeweils mit dem Gewicht max(0, 1 - |j + 0.5 - c| / f), geteilt durch die Summe der Gewichte. Pillow rechnet in Festkomma und wählt die Achsenreihenfolge anhand der Bildform, daher können Gleitkomma-Gewichte bei einigen Pixeln um eine Stufe abweichen. Das ändert die Ergebnisse in unseren Prüfungen nicht.
These sizes use a DINOv3 backbone, so they take ImageNet mean and std. The atto, femto, pico and n sizes do not.
Square input only. Export rejects a non-square imgsz. height and width equal the imgsz metadata key, 640 by default.
Batch size 1 only. The graph declares a dynamic batch axis, but batches of 2 or more fail in 1.7.0.
To run several images per call, export with batch=2. That graph takes any batch size and gives the same results per image.
After the resize, divide by 255, then subtract the ImageNet mean and divide by the ImageNet std, per channel in RGB order.
Only the default export exists. nms=True raises NotImplementedError for this family.
Detection, Standardexport
| Ausgabe | Form | Bedeutung |
|---|---|---|
pred_logits | [batch, queries, nc] | One logit per query and class. Sigmoid is not applied, and there is no background class. 300 queries. |
pred_boxes | [batch, queries, 4] | cx, cy, w, h of each query, normalized 0 to 1 of the input. The input is the whole image stretched, so these are also fractions of the original image. |
Nachbearbeitung
- Apply sigmoid to pred_logits.
- Flatten the [queries, nc] scores and take the top 300 (max_det, 300 by default). For flat index k, the query is k // nc and the class is k % nc. One query can yield several classes.
- Keep the pairs whose score is above the confidence threshold (0.25 by default).
- Convert the query's box to x1 = cx - w / 2, y1 = cy - h / 2, x2 = cx + w / 2, y2 = cy + h / 2. Multiply x by the original image width and y by the original image height.
- There is no NMS and the iou threshold is not used. DEIM predicts a set of boxes.
- LibreYOLO does not clip these boxes, so an edge can sit slightly outside the image.
Um deine eigene Implementierung zu prüfen, lade dieselbe Datei mit LibreYOLO: LibreYOLO("model.onnx").predict("image.jpg") liefert die Referenzergebnisse. Geprüft mit LibreYOLO 1.7.0.
Checkpoints
Jede veröffentlichte Gewichtsdatei dieser Familie.
| Datei | Eingabe (px) | Lizenz der Gewichte |
|---|---|---|
| Detection | ||
| LibreDEIMn.pt | 640 | apache-2.0 |
| LibreDEIMs.pt | 640 | apache-2.0 |
| LibreDEIMm.pt | 640 | apache-2.0 |
| LibreDEIMl.pt | 640 | apache-2.0 |
| LibreDEIMx.pt | 640 | apache-2.0 |
| LibreDEIMv2n.pt | 640 | apache-2.0 |
| LibreDEIMv2s.pt | 640 | other |
| LibreDEIMv2m.pt | 640 | other |
| LibreDEIMv2l.pt | 640 | other |
| LibreDEIMv2x.pt | 640 | other |
| LibreDEIMv2atto.pt | apache-2.0 | |
| LibreDEIMv2femto.pt | apache-2.0 | |
| LibreDEIMv2pico.pt | 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
- DEIM and DEIMv2, Intellindust AI Lab
- Upstream-Lizenz
- Apache-2.0; the DEIMv2 DINOv3 backbone adds Meta's DINOv3 License
- Upstream-Quelle
- github.com/Intellindust-AI-Lab/DEIM
- LibreYOLO-Code
- MIT
- Gewichte
- Apache-2.0; the DEIMv2 DINOv3 backbone adds Meta's DINOv3 License, 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. DEIM is Apache-2.0 throughout, and so are the DEIMv2 sizes below S, which use an HGNetv2 backbone. The DEIMv2 S, M, L and X sizes take their backbone from DINOv3, so both their weights and the backbone source vendored in LibreYOLO are additionally governed by Meta's DINOv3 License Agreement, which is not an OSI license: redistribution has to carry the agreement with it, and it forbids use for military or warfare purposes, weapons development, espionage, nuclear industries and anything subject to ITAR. Their Hugging Face repositories declare both licenses, and DEIMv2 is also cited separately (arXiv 2509.20787).
Zitieren
@misc{huang2024deim,
title={DEIM: DETR with Improved Matching for Fast Convergence},
author={Shihua, Huang and Zhichao, Lu and Xiaodong, Cun and Yongjun, Yu and Xiao, Zhou and Xi, Shen},
booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition},
year={2025},
}Aus dem Zitierblock der Autoren unter github.com/Intellindust-AI-Lab/DEIM#5-citation kopiert.
DEIMv2 ist ein eigenes Paper und hat einen eigenen Zitierblock unter github.com/Intellindust-AI-Lab/DEIMv2; zitiere diesen, wenn du einen Checkpoint von Version 2 verwendet hast.