DEIM
Un transformer de détection entraîné par appariement dense un-à-un, qui converge en bien moins d'époques que les recettes DETR dont il hérite. LibreYOLO en embarque deux versions, distinguées par le checkpoint que vous chargez.
- Tâches
- detection
- Tailles
- deim: n, s, m, l, x at 640 px
- Installer
pip install libreyolo- Niveau de support
- Cœur, depuis v1.2.0. Détecteurs entraînables du cœur : les fonctionnalités suivent les fers de lance dans la même vague de publication.
- Origine
- DEIM and DEIMv2 par Intellindust AI Lab, Apache-2.0; the DEIMv2 DINOv3 backbone adds Meta's DINOv3 License. Article, source
- Licences
- Code Apache-2.0, poids Apache-2.0; the DEIMv2 DINOv3 backbone adds Meta's DINOv3 License. Usage commercial
Installation
Aucune des deux versions ne demande d'extra optionnel. Tout ce qu'elles importent fait partie de l'installation de base.
pip install libreyoloLe fine-tuning par adaptateurs avec lora=True fait exception, et demande
l'extra lora.
pip install "libreyolo[lora]"Prédire
Les poids sont téléchargés depuis Hugging Face au premier usage, puis mis en cache localement.
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 # La version fait partie du nom de fichier, et la factory route sur# le checkpoint, donc les deux se chargent de la même façon.model = LibreYOLO("LibreDEIMv2pico.pt") # Toute source acceptée par la bibliothèque : fichier, dossier, URL,# index de webcam, flux RTSP ou liste .streamsfor result in model.predict("clip.mp4", stream=True, save=True): print(len(result.boxes))L'objet Results renvoyé est celui que renvoie chaque famille, si bien que
remplacer le détecteur par un autre tient en une seule ligne. conf et
max_det filtrent un décodage top-k sur les queries et les classes ; il n'y a
pas d'étape de NMS à régler, et iou est accepté mais inutilisé. Voir
la prédiction pour les sources, le streaming et le traitement
des résultats.
DEIM accepte une valeur rectangulaire imgsz=(height, width) pour la prédiction. DEIMv2 rejette explicitement les demandes de prédiction/validation rectangulaires. Cela n'implique pas la prise en charge de l'entraînement ou de l'export rectangulaires.
Variantes
La version 1 propose cinq tailles, toutes à la même taille d'entrée. La
version 2 conserve ces cinq noms et en ajoute trois plus petits, atto,
femto et pico, dont les deux premiers sont natifs à une taille d'entrée
plus basse que les autres. Cinq codes de taille existent donc dans les deux
versions et désignent des modèles différents ; la version est inscrite dans le
nom de fichier du checkpoint.
| Checkpoint | Entrée (px) | mAP 50-95 | Paramètres (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. Mesuré par le banc de benchmark de LibreYOLO et publié sur Vision Analysis, où sont comparées la latence selon le matériel et les runtimes et où sont conservés les enregistrements complets des exécutions.
La version 1 conserve l'architecture de D-FINE et remplace son objectif de
classification par la fonction de perte sensible à l'appariabilité issue de la
recette dense un-à-un, si bien que les deux familles partagent presque toutes
les clés du state dict et se distinguent par les métadonnées du checkpoint. La
version 2 conserve ce contrat d'entraînement et mélange les backbones :
HGNetv2 en dessous de s, et un vision transformer DINOv3 avec un adaptateur
d'ajustement spatial à partir de s. C'est ce backbone qui ajoute une seconde
licence à ces quatre checkpoints, alors lisez la licence avant
d'en mettre un en production.
Entraîner
L'entraînement démarre depuis un checkpoint publié. pretrained n'atteint
jamais l'entraîneur : la version 1 avertit que la clé est inconnue et l'ignore,
la version 2 la supprime. Aucune des deux ne vous donne un modèle initialisé
aléatoirement.
from libreyolo import LibreYOLO model = LibreYOLO("LibreDEIMn.pt") # coco128.yaml télécharge un échantillon de 128 images au premier# usage. Pointez `data` vers votre propre YAML de dataset pour un# vrai run.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 # Laissés non renseignés, epochs, batch, imgsz et lr0 viennent de la# recette publiée pour la taille chargée.model = LibreYOLO("LibreDEIMv2pico.pt")model.train(data="coco128.yaml", epochs=50)# Demande l'extra lora : 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,1Passez lr0 vous-même sur la version 1. Sa signature Python train() a pour
défaut 4e-4, le taux de la recette COCO publiée, alors que la configuration
d'entraînement de la famille porte 1e-4 comme défaut de fine-tuning, et c'est
cette valeur plus basse que la CLI résout quand l'argument est absent. La
configuration consigne la mesure qui la justifie : aux tailles de batch qu'un
fine-tuning utilise réellement, sur de petits datasets, le taux COCO dégradait
le transfert de façon mesurable.
La version 2 résout ces défauts elle-même. Laisser epochs, batch, imgsz
et lr0 non renseignés lui fait lire chacun d'eux dans la recette publiée pour
la taille chargée, si bien que les petites tailles s'entraînent à leur propre
résolution d'entrée sans qu'on le leur dise, et une valeur que vous passez
l'emporte sur la recette. imgsz est l'argument qu'elle contraint : il doit
être un multiple positif de 32, sinon la version 2 lève une erreur avant le
démarrage du run.
Voir l'entraînement pour les datasets, l'augmentation, le multi-GPU et les loggers.
DEIM active AMP par défaut avec amp_dtype="float16". Passez amp=False pour un entraînement FP32.
Valider
val() renvoie un dictionnaire de clés metrics/ couvrant la précision, le
rappel, la mAP 50 et la mAP 50-95, mesurées sur n'importe quel dataset au
format sur lequel vous avez entraîné.
from libreyolo import LibreYOLO model = LibreYOLO("LibreDEIMn.pt") # val() renvoie un simple dict, pas un objetmetrics = 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 récupère les 5000 images de val2017 et ignore le# set d'entraînement. Il embarque un script de téléchargement, il faut# donc une autorisation explicite si le dataset n'est pas déjà local.libreyolo val model=LibreDEIMn.pt data=coco-val-only.yaml \ allow_download_scripts=TrueLes lignes de la table de benchmark ci-dessus proviennent du harnais de benchmark LibreYOLO ; la note sous cette table indique quel dataset les a produites et renvoie vers les enregistrements de run.
Exporter
| Tâche | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Detection | Detection to ONNX : pris en charge | Detection to TorchScript : pris en charge | Detection to ExecuTorch : non pris en charge | Detection to TensorRT : pris en charge | Detection to OpenVINO : pris en charge | Detection to Paddle : pris en charge | Detection to MNN : pris en charge | Detection to RKNN : non pris en charge | Detection to ncnn : non pris en charge | Detection to TFLite : non pris en charge | Detection to CoreML : non pris en charge | Detection to Core AI : pris en charge |
La matrice couvre les deux versions sur une seule page : là où elles divergent sur un format, la cellule affiche la plus faible des deux, si bien que rien n'est survendu ici, quelle que soit la version que vous chargez.
Un artefact exporté se recharge via LibreYOLO() selon son extension de
fichier, si bien qu'un fichier .onnx ou .engine se comporte comme un
checkpoint et renvoie le même Results.
# Demande l'extra onnx : 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 # La factory route selon l'extension du fichier, donc un artefact# exporté se charge comme un checkpoint et renvoie le même Results.model = LibreYOLO("LibreDEIMn.onnx")result = model(SAMPLE_IMAGE) print(result.boxes.xyxy)Entrées et sorties ONNX
LibreDEIM, and LibreDEIMv2 atto, femto, pico and n
| Tenseur | images float32 [batch, 3, height, width] |
|---|---|
| Couleur | RGB |
| Mise à l'échelle | pixel / 255 |
| Normalisation | aucune |
| Redimensionnement | étirer à largeur x hauteur (sans remplissage, le rapport d'aspect n'est pas conservé), Pillow bilinear |
Comment reproduire le redimensionnement bilinéaire de Pillow
LibreYOLO redimensionne avec le filtre BILINEAR de Pillow (Image.resize). Ce n'est ni OpenCV INTER_LINEAR ni INTER_AREA : en réduction, Pillow élargit le filtre du facteur de réduction, et les redimensionnements d'OpenCV modifient les détections et déplacent les boîtes de plusieurs pixels. Pour le reproduire sans Pillow, redimensionnez un axe, arrondissez sur 8 bits, puis redimensionnez l'autre axe et arrondissez de nouveau. Par axe, posons s = in_size / out_size et f = max(s, 1). Le pixel de sortie i a pour centre c = (i + 0.5) * s et lit les pixels source j de int(c - f + 0.5) à int(c + f + 0.5) - 1, limités à l'image, chacun avec le poids max(0, 1 - |j + 0.5 - c| / f), divisé par la somme des poids. Pillow calcule en virgule fixe et choisit l'ordre des axes selon la forme de l'image, donc des poids en virgule flottante peuvent s'en écarter d'un niveau sur quelques pixels. Cela ne change pas les résultats dans nos vérifications.
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, export par défaut
| Sortie | Forme | Signification |
|---|---|---|
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. |
Post-traitement
- 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
| Tenseur | images float32 [batch, 3, height, width] |
|---|---|
| Couleur | RGB |
| Mise à l'échelle | pixel / 255 |
| Normalisation | moyenne [0.485,0.456,0.406], écart type [0.229,0.224,0.225] |
| Redimensionnement | étirer à largeur x hauteur (sans remplissage, le rapport d'aspect n'est pas conservé), Pillow bilinear |
Comment reproduire le redimensionnement bilinéaire de Pillow
LibreYOLO redimensionne avec le filtre BILINEAR de Pillow (Image.resize). Ce n'est ni OpenCV INTER_LINEAR ni INTER_AREA : en réduction, Pillow élargit le filtre du facteur de réduction, et les redimensionnements d'OpenCV modifient les détections et déplacent les boîtes de plusieurs pixels. Pour le reproduire sans Pillow, redimensionnez un axe, arrondissez sur 8 bits, puis redimensionnez l'autre axe et arrondissez de nouveau. Par axe, posons s = in_size / out_size et f = max(s, 1). Le pixel de sortie i a pour centre c = (i + 0.5) * s et lit les pixels source j de int(c - f + 0.5) à int(c + f + 0.5) - 1, limités à l'image, chacun avec le poids max(0, 1 - |j + 0.5 - c| / f), divisé par la somme des poids. Pillow calcule en virgule fixe et choisit l'ordre des axes selon la forme de l'image, donc des poids en virgule flottante peuvent s'en écarter d'un niveau sur quelques pixels. Cela ne change pas les résultats dans nos vérifications.
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, export par défaut
| Sortie | Forme | Signification |
|---|---|---|
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. |
Post-traitement
- 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.
Pour vérifier votre propre implémentation, passez le même fichier dans LibreYOLO : LibreYOLO("model.onnx").predict("image.jpg") renvoie les résultats de référence. Vérifié avec LibreYOLO 1.7.0.
Checkpoints
Tous les fichiers de poids publiés pour cette famille.
| Fichier | Entrée (px) | Licence des poids |
|---|---|---|
| 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 | |
Tous les fichiers ci-dessus sont actuellement disponibles dans l<link>organisation LibreYOLO</link> et sont téléchargés à la première utilisation.
Licence
Vérifiez la licence dans le dépôt Hugging Face des poids précis que vous téléchargez. Chaque checkpoint de l<link>organisation LibreYOLO</link> en possède une, et elles ne sont pas toujours identiques au sein dune même famille. Ce dépôt fait autorité ; le résumé ci-dessous décrit les conditions applicables lors de la dernière vérification de cette page.
Ceci décrit les licences concernées et ne constitue pas un conseil juridique. Si la réponse a une importance commerciale, lisez vous-même les licences et consultez votre propre avocat.
- Travail d'origine
- DEIM and DEIMv2, Intellindust AI Lab
- Licence du projet d'origine
- Apache-2.0; the DEIMv2 DINOv3 backbone adds Meta's DINOv3 License
- Source du projet d'origine
- github.com/Intellindust-AI-Lab/DEIM
- Code de LibreYOLO
- MIT
- Poids
- Apache-2.0; the DEIMv2 DINOv3 backbone adds Meta's DINOv3 License, republiés sur huggingface.co/LibreYOLO
- Interprétation
- 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).
Citation
@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},
}Copié depuis le bloc de citation des auteurs sur github.com/Intellindust-AI-Lab/DEIM#5-citation.
DEIMv2 est un article distinct et possède son propre bloc de citation sur github.com/Intellindust-AI-Lab/DEIMv2 ; citez celui-là si vous avez utilisé un checkpoint de version 2.