D-FINE

Un detection transformer che riformula la regressione dei box come una distribuzione di probabilità su ogni bordo del box, raffinata attraverso i layer del decoder. LibreYOLO lo supporta per il rilevamento e per la segmentazione di istanze.

Task
detection, instance segmentation
Dimensioni
n, s, m, l, x at 640 px
Installa
pip install libreyolo
Livello di supporto
Principale, dalla v1.1.0. Rilevatori addestrabili principali: le funzionalità seguono i modelli di punta nella stessa ondata di release.
Origine
D-FINE di University of Science and Technology of China, Apache-2.0. Articolo, sorgente
Licenze
Codice Apache-2.0, pesi Apache-2.0. Uso commerciale

Installazione

D-FINE non richiede nessun extra opzionale. Tutto ciò che importa è 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("LibreDFINEn.pt")result = model(SAMPLE_IMAGE, save=True) for box in result.boxes:    print(box.cls, box.conf, box.xyxy)
CLI
libreyolo predict model=LibreDFINEn.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=True
Segmentazione di istanze
from libreyolo import LibreYOLO, SAMPLE_IMAGE # Il suffisso -seg nel nome del file seleziona la testa delle maschere,# quindi qui non serve l'argomento task.model = LibreYOLO("LibreDFINEn-seg.pt")result = model(SAMPLE_IMAGE, save=True) print(result.masks.data.shape)

L'oggetto Results restituito è quello che restituisce ogni famiglia, quindi passare a un rilevatore diverso è una modifica di una riga. Un nome di file con -seg risolve da solo al task di segmentazione, e result.masks porta allora le maschere di istanza insieme ai box. conf e max_det filtrano la selezione delle query; iou è accettato per parità di API ma non ha effetto, perché il decoder è un predittore di insiemi senza passaggio di NMS. Vedi predizione per sorgenti, streaming e gestione dei risultati.

Varianti

Cinque dimensioni. Girano tutte alla stessa risoluzione di input, quindi la tabella le separa per numero di parametri e accuratezza.

CheckpointIngresso (px)mAP 50-95Parametri (M)
LibreDFINEl64060.031.24
LibreDFINEm64057.819.59
LibreDFINEn64045.83.78
LibreDFINEs64053.410.32
LibreDFINEx64061.462.62

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 segmentazione riutilizza il backbone, l'encoder e il decoder del rilevamento e aggiunge una testa per le maschere, quindi un checkpoint -seg accetta gli stessi argomenti del suo equivalente di rilevamento. La famiglia RT-DETRv4 di LibreYOLO è scritta come sottoclasse del wrapper di D-FINE: eredita questa linea di decoder e poi riporta la sua lista di task al solo rilevamento, perché non porta una testa delle maschere.

Addestramento

L'addestramento parte da un checkpoint pubblicato, per entrambi i task.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreDFINEn.pt")model.train(data="my-dataset.yaml", epochs=50, imgsz=640, batch=8, lr0=2e-4)
CLI
libreyolo train model=LibreDFINEn.pt data=my-dataset.yaml \  epochs=50 imgsz=640 batch=8 lr0=2e-4
Segmentazione di istanze
# Continua dai pesi di segmentazione pubblicati, testa delle maschere inclusa.libreyolo train model=LibreDFINEn-seg.pt data=my-dataset.yaml \  task=segment epochs=50 imgsz=640
Segmentazione dai pesi di rilevamento
# I pesi di rilevamento non portano una testa delle maschere, quindi# questo è un trasferimento esplicito: la testa parte non addestrata ed# è utile solo una volta addestrata. Chiedere task=segment qui è ciò# che autorizza il trasferimento.libreyolo train model=LibreDFINEn.pt data=my-dataset.yaml \  task=segment epochs=50 imgsz=640
LoRA
from libreyolo import LibreYOLO model = LibreYOLO("LibreDFINEn.pt")model.train(data="my-dataset.yaml", epochs=50, lora=True)
Multi-GPU
libreyolo train model=LibreDFINEn.pt data=my-dataset.yaml \  epochs=50 device=0,1 batch=16

Se non tocchi niente, il trainer esegue 132 epoche con lr0=2e-4 e amp=False, un batch di 16 ed early stopping dopo 50 epoche senza miglioramenti. I pesi di rilevamento sono un punto di partenza lecito per l'addestramento di segmentazione, ma solo come trasferimento esplicito, dato che la testa delle maschere parte non addestrata e altrimenti restituirebbe maschere prive di senso. Passare task=segment alla CLI è ciò che lo autorizza. La via Python è più stretta: LibreDFINE va costruito direttamente con allow_detect_to_segment_transfer=True, perché la factory LibreYOLO() non accetta un argomento del genere, e la costruzione diretta non scarica niente, quindi il file dei pesi deve già essere su disco.

lora=True si applica al rilevamento. L'addestramento di segmentazione lo rifiuta e rimanda invece a freeze='backbone', perché la testa delle maschere non è stata testata con gli adattatori. Su Apple silicon il trainer sposta l'intera esecuzione su CPU: il backward pass del matmul a bin dell'Integral incontra un errore di compilazione Metal. L'inferenza su MPS non ne risente.

Vedi addestramento per dataset, data augmentation, multi-GPU e logger.

Validazione

val() restituisce un dizionario indicizzato per nome della metrica, e stampa i risultati per classe se verbose resta attivo.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreDFINEn.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95"])print(metrics["metrics/mAP50"])
CLI
libreyolo val model=LibreDFINEn.pt data=my-dataset.yaml
Segmentazione di istanze
from libreyolo import LibreYOLO model = LibreYOLO("LibreDFINEn-seg.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95(M)"])   # maschereprint(metrics["metrics/mAP50-95(B)"])   # box

Su un checkpoint -seg la chiave metrics/mAP50-95 da sola contiene il punteggio delle maschere, e la stessa esecuzione riporta anche i box sotto (B) e le maschere sotto (M), così entrambi sono disponibili da una sola passata.

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
Instance segmentationInstance segmentation to ONNX: supportatoInstance segmentation to TorchScript: supportatoInstance segmentation to ExecuTorch: non supportatoInstance segmentation to TensorRT: supportatoInstance segmentation to OpenVINO: supportatoInstance segmentation to Paddle: non supportatoInstance segmentation to MNN: non supportatoInstance segmentation to RKNN: non supportatoInstance segmentation to ncnn: non supportatoInstance segmentation to TFLite: non supportatoInstance segmentation to CoreML: non supportatoInstance segmentation to Core AI: non supportato

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. I percorsi OpenVINO, Paddle, MNN e Core AI esportano a canvas fisso invece che con forme dinamiche. Esportazione elenca gli argomenti che ogni formato accetta e gli extra che qualcuno di essi aggiunge.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreDFINEn.pt")model.export(format="onnx", imgsz=640)model.export(format="tensorrt", imgsz=640, half=True)
CLI
libreyolo export model=LibreDFINEn.pt format=onnx imgsz=640libreyolo export model=LibreDFINEn.pt format=tensorrt imgsz=640 half=True
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("LibreDFINEn.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
LibreDFINEn.pt640apache-2.0
LibreDFINEs.pt640apache-2.0
LibreDFINEm.pt640apache-2.0
LibreDFINEl.pt640apache-2.0
LibreDFINEx.pt640apache-2.0
Instance segmentation
LibreDFINEn-seg.pt640apache-2.0
LibreDFINEs-seg.pt640apache-2.0
LibreDFINEm-seg.pt640apache-2.0
LibreDFINEl-seg.pt640apache-2.0
LibreDFINEx-seg.pt640apache-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
D-FINE, University of Science and Technology of China
Licenza upstream
Apache-2.0
Codice LibreYOLO
MIT
Pesi
Apache-2.0, 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. The segmentation weights carry a second Apache-2.0 upstream, ArgoHA/D-FINE-seg, under the same terms.

I pesi di segmentazione hanno un secondo upstream: il loro decoder delle maschere, il matching delle maschere e la loss delle maschere vengono da ArgoHA/D-FINE-seg, anch'esso Apache-2.0, il cui maintainer ha approvato il riutilizzo con attribuzione.

Citazione

@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}
}

Copiato dal blocco di citazione degli autori disponibile su github.com/Peterande/D-FINE#citation.

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.