DEIM
Un detection transformer addestrato con matching denso uno a uno, che converge in molte meno epoche rispetto alle ricette DETR su cui si basa. LibreYOLO ne porta due versioni, distinte dal checkpoint che carichi.
- Task
- detection
- Dimensioni
- deim: n, s, m, l, x at 640 px
- Installa
pip install libreyolo- Livello di supporto
- Principale, dalla v1.2.0. Rilevatori addestrabili principali: le funzionalità seguono i modelli di punta nella stessa ondata di release.
- Origine
- DEIM and DEIMv2 di Intellindust AI Lab, Apache-2.0; the DEIMv2 DINOv3 backbone adds Meta's DINOv3 License. Articolo, sorgente
- Licenze
- Codice Apache-2.0, pesi Apache-2.0; the DEIMv2 DINOv3 backbone adds Meta's DINOv3 License. Uso commerciale
Installazione
Nessuna delle due versioni richiede un extra opzionale. Tutto ciò che importano è già nell'installazione di base.
pip install libreyoloIl fine-tuning con adattatori tramite lora=True è l'eccezione, e richiede
l'extra lora.
pip install "libreyolo[lora]"Predizione
I pesi vengono scaricati da Hugging Face al primo utilizzo e restano nella cache locale.
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 versione fa parte del nome del file, e la factory smista in base# al checkpoint, quindi entrambe si caricano allo stesso modo.model = LibreYOLO("LibreDEIMv2pico.pt") # Qualsiasi sorgente accettata dalla libreria: file, cartella, URL,# indice della webcam, stream RTSP o una lista .streamsfor result in model.predict("clip.mp4", stream=True, save=True): print(len(result.boxes))L'oggetto Results restituito è quello che restituisce ogni famiglia, quindi
passare a un rilevatore diverso è una modifica di una riga. conf e max_det
filtrano un decode top-k su query e classi; non c'è nessun passaggio di NMS da
regolare, e iou è accettato ma non usato. Vedi predizione per
sorgenti, streaming e gestione dei risultati.
DEIM accetta imgsz=(height, width) rettangolare per la predizione. DEIMv2 rifiuta esplicitamente le richieste rettangolari di predizione/validazione. Questo non implica il supporto dell'addestramento o dell'esportazione rettangolare.
Varianti
La versione 1 porta cinque dimensioni, tutte alla stessa dimensione di input. La
versione 2 conserva quei cinque nomi e ne aggiunge tre più piccole, atto,
femto e pico, le prime due native a una dimensione di input più bassa
rispetto alle altre. Cinque codici di dimensione esistono quindi in entrambe le
versioni e indicano modelli diversi; la versione è scritta nel nome del file del
checkpoint.
| Checkpoint | Ingresso (px) | mAP 50-95 | Parametri (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. Misurato con il sistema di benchmark di LibreYOLO e pubblicato su Vision Analysis, dove vengono confrontate le latenze tra hardware e runtime e sono disponibili i record completi delle esecuzioni.
La versione 1 mantiene l'architettura di D-FINE e sostituisce il suo obiettivo
di classificazione con la loss sensibile alla matchability della ricetta densa
uno a uno, quindi le due famiglie condividono quasi tutte le chiavi dello state
dict e si distinguono per i metadati nel checkpoint. La versione 2 mantiene quel
contratto di addestramento e mescola i backbone: HGNetv2 sotto s, e un vision
transformer DINOv3 con un adattatore di tuning spaziale da s in su. È quel
backbone a mettere una seconda licenza su quei quattro checkpoint, quindi leggi
licenze prima di metterne uno in produzione.
Addestramento
L'addestramento parte da un checkpoint pubblicato. pretrained non arriva mai
al trainer: la versione 1 avvisa che la chiave è sconosciuta e la ignora, la
versione 2 la rimuove. Nessuna delle due ti dà un modello inizializzato a caso.
from libreyolo import LibreYOLO model = LibreYOLO("LibreDEIMn.pt") # coco128.yaml scarica un campione di 128 immagini al primo utilizzo.# Punta `data` al YAML del tuo dataset per un'esecuzione reale.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 # Se non vengono indicati, epochs, batch, imgsz e lr0 arrivano dalla# ricetta pubblicata per la dimensione caricata.model = LibreYOLO("LibreDEIMv2pico.pt")model.train(data="coco128.yaml", epochs=50)# Serve 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,1Sulla versione 1 passa lr0 tu. La firma Python di train() usa 4e-4 come
valore predefinito, il learning rate della ricetta COCO pubblicata, mentre la
configurazione di addestramento della famiglia porta 1e-4 come valore
predefinito per il fine-tuning, ed è quel valore più basso che la CLI risolve
quando l'argomento manca. La configurazione registra la misurazione che c'è
dietro: alle dimensioni di batch che un fine-tuning usa davvero, su dataset
piccoli, il learning rate di COCO peggiorava il trasferimento in modo
misurabile.
La versione 2 risolve quei valori predefiniti da sola. Se lasci epochs,
batch, imgsz e lr0 non impostati, legge ciascuno di essi dalla ricetta
pubblicata per la dimensione caricata, così le dimensioni piccole si addestrano
alla loro risoluzione di input senza doverglielo dire, e un valore che passi tu
ha la precedenza sulla ricetta. imgsz è l'argomento che vincola: deve essere
un multiplo positivo di 32, altrimenti la versione 2 solleva un errore prima che
l'esecuzione parta.
Vedi addestramento per dataset, data augmentation, multi-GPU e logger.
DEIM attiva AMP di default con amp_dtype="float16". Passa amp=False per l'addestramento FP32.
Validazione
val() restituisce un dizionario di chiavi metrics/ che coprono precisione,
recall, mAP 50 e mAP 50-95, misurate su qualsiasi dataset nel formato con cui
hai addestrato.
from libreyolo import LibreYOLO model = LibreYOLO("LibreDEIMn.pt") # val() restituisce un dict semplice, non un oggettometrics = 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 scarica le 5000 immagini di val2017 e salta il# set di addestramento. Porta con sé uno script di download# incorporato, quindi serve un permesso esplicito a meno che il# dataset non sia già in locale.libreyolo val model=LibreDEIMn.pt data=coco-val-only.yaml \ allow_download_scripts=TrueLe righe della tabella di benchmark qui sopra vengono dall'harness di benchmark di LibreYOLO; la nota sotto quella tabella indica quale dataset le ha prodotte e rimanda ai record delle esecuzioni.
Esportazione
| Task | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Detection | Detection to ONNX: supportato | Detection to TorchScript: supportato | Detection to ExecuTorch: non supportato | Detection to TensorRT: supportato | Detection to OpenVINO: supportato | Detection to Paddle: supportato | Detection to MNN: supportato | Detection to RKNN: non supportato | Detection to ncnn: non supportato | Detection to TFLite: non supportato | Detection to CoreML: non supportato | Detection to Core AI: supportato |
La matrice copre entrambe le versioni in una sola pagina: dove non concordano su un formato, la cella mostra la più debole delle due, così niente qui è sopravvalutato per la versione che carichi.
Un artefatto esportato si ricarica con LibreYOLO() in base al suffisso del
file, quindi un file .onnx o .engine si comporta come un checkpoint e
restituisce lo stesso Results.
# Serve 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 smista in base al suffisso del file, quindi un artefatto# esportato si carica come qualsiasi checkpoint e restituisce lo stesso# oggetto Results.model = LibreYOLO("LibreDEIMn.onnx")result = model(SAMPLE_IMAGE) print(result.boxes.xyxy)Input e output ONNX
LibreDEIM, and LibreDEIMv2 atto, femto, pico and n
| Tensore | images float32 [batch, 3, height, width] |
|---|---|
| Colore | RGB |
| Scala | pixel / 255 |
| Normalizzazione | nessuna |
| Ridimensionamento | allungare a larghezza x altezza (senza riempimento, il rapporto d'aspetto non viene mantenuto), Pillow bilinear |
Come riprodurre il ridimensionamento bilineare di Pillow
LibreYOLO ridimensiona con il filtro BILINEAR di Pillow (Image.resize). Non è OpenCV INTER_LINEAR né INTER_AREA: in riduzione, Pillow allarga il filtro del fattore di riduzione, e i ridimensionamenti di OpenCV cambiano le rilevazioni e spostano i riquadri di diversi pixel. Per riprodurlo senza Pillow, ridimensiona un asse, arrotonda a 8 bit, poi ridimensiona l'altro asse e arrotonda di nuovo. Per ogni asse, siano s = in_size / out_size e f = max(s, 1). Il pixel di uscita i ha centro c = (i + 0.5) * s e legge i pixel sorgente j da int(c - f + 0.5) a int(c + f + 0.5) - 1, limitati all'immagine, ciascuno con peso max(0, 1 - |j + 0.5 - c| / f), diviso per la somma dei pesi. Pillow lavora in virgola fissa e sceglie l'ordine degli assi dalla forma dell'immagine, quindi i pesi in virgola mobile possono differire di un livello su pochi pixel. Questo non cambia i risultati nei nostri controlli.
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, esportazione predefinita
| Output | Forma | Significato |
|---|---|---|
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-elaborazione
- 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
| Tensore | images float32 [batch, 3, height, width] |
|---|---|
| Colore | RGB |
| Scala | pixel / 255 |
| Normalizzazione | media [0.485,0.456,0.406], deviazione standard [0.229,0.224,0.225] |
| Ridimensionamento | allungare a larghezza x altezza (senza riempimento, il rapporto d'aspetto non viene mantenuto), Pillow bilinear |
Come riprodurre il ridimensionamento bilineare di Pillow
LibreYOLO ridimensiona con il filtro BILINEAR di Pillow (Image.resize). Non è OpenCV INTER_LINEAR né INTER_AREA: in riduzione, Pillow allarga il filtro del fattore di riduzione, e i ridimensionamenti di OpenCV cambiano le rilevazioni e spostano i riquadri di diversi pixel. Per riprodurlo senza Pillow, ridimensiona un asse, arrotonda a 8 bit, poi ridimensiona l'altro asse e arrotonda di nuovo. Per ogni asse, siano s = in_size / out_size e f = max(s, 1). Il pixel di uscita i ha centro c = (i + 0.5) * s e legge i pixel sorgente j da int(c - f + 0.5) a int(c + f + 0.5) - 1, limitati all'immagine, ciascuno con peso max(0, 1 - |j + 0.5 - c| / f), diviso per la somma dei pesi. Pillow lavora in virgola fissa e sceglie l'ordine degli assi dalla forma dell'immagine, quindi i pesi in virgola mobile possono differire di un livello su pochi pixel. Questo non cambia i risultati nei nostri controlli.
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, esportazione predefinita
| Output | Forma | Significato |
|---|---|---|
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-elaborazione
- 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.
Per verificare la tua implementazione, passa lo stesso file a LibreYOLO: LibreYOLO("model.onnx").predict("image.jpg") restituisce i risultati di riferimento. Verificato con LibreYOLO 1.7.0.
Checkpoint
Tutti i file di pesi pubblicati per questa famiglia.
| File | Ingresso (px) | Licenza dei pesi |
|---|---|---|
| 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 | |
Oggi tutti i file elencati sopra sono presenti nell<link>organizzazione LibreYOLO</link> e vengono scaricati al primo utilizzo.
Licenze
Controlla la licenza nel repository Hugging Face degli specifici pesi che scarichi. Ogni checkpoint nell<link>organizzazione LibreYOLO</link> ne include una e non è sempre la stessa per tutta la famiglia. Quel repository è la fonte autorevole; il riepilogo seguente descrive le condizioni applicabili al momento dellultima verifica di questa pagina.
Questa è una descrizione delle licenze coinvolte, non una consulenza legale. Se la risposta è importante a fini commerciali, leggi personalmente le licenze e chiedi una consulenza indipendente.
- Lavoro originale
- DEIM and DEIMv2, Intellindust AI Lab
- Licenza upstream
- Apache-2.0; the DEIMv2 DINOv3 backbone adds Meta's DINOv3 License
- Sorgente upstream
- github.com/Intellindust-AI-Lab/DEIM
- Codice LibreYOLO
- MIT
- Pesi
- Apache-2.0; the DEIMv2 DINOv3 backbone adds Meta's DINOv3 License, ripubblicati su huggingface.co/LibreYOLO
- Interpretazione
- 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).
Citazione
@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},
}Copiato dal blocco di citazione degli autori disponibile su github.com/Intellindust-AI-Lab/DEIM#5-citation.
DEIMv2 è un articolo a parte e ha il suo blocco di citazione su github.com/Intellindust-AI-Lab/DEIMv2; cita quello se hai usato un checkpoint della versione 2.