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.

bash
pip install libreyolo

Il fine-tuning con adattatori tramite lora=True è l'eccezione, e richiede l'extra lora.

bash
pip install "libreyolo[lora]"

Predizione

I pesi vengono scaricati da Hugging Face al primo utilizzo e restano nella cache locale.

Python
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)
CLI
libreyolo predict model=LibreDEIMn.pt save=True \  source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg
Video
from 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.

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.

CheckpointIngresso (px)mAP 50-95Parametri (M)
LibreDEIMl64057.831.24
LibreDEIMm64055.419.59
LibreDEIMn64046.83.78
LibreDEIMs64052.110.32
LibreDEIMx64059.662.62
LibreDEIMv2atto32027.50.51
LibreDEIMv2femto41634.50.98
LibreDEIMv2l64058.632.55
LibreDEIMv2m64056.018.36
LibreDEIMv2n64046.73.6
LibreDEIMv2pico64042.21.54
LibreDEIMv2s64053.09.78
LibreDEIMv2x64061.351.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.

Python
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)
CLI
libreyolo train model=LibreDEIMn.pt data=coco128.yaml \  epochs=50 batch=8 lr0=1e-4
DEIMv2
from 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)
LoRA
# 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)
Multi-GPU
libreyolo train model=LibreDEIMn.pt data=coco128.yaml \  epochs=50 device=0,1

Sulla 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.

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.

Python
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"])
CLI
libreyolo val model=LibreDEIMn.pt data=coco128.yaml
Contro COCO
# 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=True

Le 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

TaskONNXTorchScriptExecuTorchTensorRTOpenVINOPaddleMNNRKNNncnnTFLiteCoreMLCore AI
DetectionDetection to ONNX: supportatoDetection to TorchScript: supportatoDetection to ExecuTorch: non supportatoDetection to TensorRT: supportatoDetection to OpenVINO: supportatoDetection to Paddle: supportatoDetection to MNN: supportatoDetection to RKNN: non supportatoDetection to ncnn: non supportatoDetection to TFLite: non supportatoDetection to CoreML: non supportatoDetection 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.

Python
# Serve l'extra onnx: pip install "libreyolo[onnx]"from libreyolo import LibreYOLO model = LibreYOLO("LibreDEIMn.pt")path = model.export(format="onnx")print(path)
CLI
libreyolo export model=LibreDEIMn.pt format=onnx
Usare il file esportato
from 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)

Checkpoint

Tutti i file di pesi pubblicati per questa famiglia.

FileIngresso (px)Licenza dei pesi
Detection
LibreDEIMn.pt640apache-2.0
LibreDEIMs.pt640apache-2.0
LibreDEIMm.pt640apache-2.0
LibreDEIMl.pt640apache-2.0
LibreDEIMx.pt640apache-2.0
LibreDEIMv2n.pt640apache-2.0
LibreDEIMv2s.pt640other
LibreDEIMv2m.pt640other
LibreDEIMv2l.pt640other
LibreDEIMv2x.pt640other
LibreDEIMv2atto.ptapache-2.0
LibreDEIMv2femto.ptapache-2.0
LibreDEIMv2pico.ptapache-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
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).
Le quattro dimensioni di DEIMv2 da S in su prendono il backbone da DINOv3, quindi i loro repository di pesi portano sia Apache-2.0 sia la DINOv3 License di Meta, e LibreYOLO distribuisce il codice sorgente del backbone DINOv3 sotto lo stesso accordo. Il resto di questa famiglia, comprese tutte le dimensioni di DEIMv2 sotto S, è solo Apache-2.0.

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.

Verificato con LibreYOLO v1.5.0. Le tabelle di supporto, i checkpoint e i dati dei benchmark in questa pagina vengono generati dalla libreria rilasciata e dai pesi pubblicati, non scritti a mano.