YOLOv9

Un rilevatore convoluzionale a singolo stadio: una sola passata assegna un punteggio a una griglia densa di box e NMS scarta i duplicati. LibreYOLO ne porta tre varianti, una delle quali senza passaggio di NMS.

Task
detection
Dimensioni
yolo9: t, s, m, c at 640 px; yolo9_p2: t, s at 640 px
Installa
pip install libreyolo
Livello di supporto
Di punta, dalla v1.0.0. Le funzionalità vengono progettate e convalidate completamente su GPU prima per questo livello.
Origine
YOLOv9 di MultimediaTechLab, MIT. Articolo, sorgente
Licenze
Codice MIT, pesi MIT. Uso commerciale

Installazione

YOLOv9 non richiede nessun extra oltre al pacchetto base.

bash
pip install libreyolo

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("LibreYOLO9s.pt")result = model(SAMPLE_IMAGE, save=True) for box in result.boxes:    print(box.cls, box.conf, box.xyxy)
CLI
libreyolo predict model=LibreYOLO9s.pt save=True \  source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg
Senza NMS
from libreyolo import LibreYOLO, SAMPLE_IMAGE # Stessa chiamata, checkpoint diverso. La testa end-to-end restituisce# le sue predizioni migliori, quindi non viene eseguito NMS e iou è ignorato.model = LibreYOLO("LibreYOLO9E2Es.pt")result = model(SAMPLE_IMAGE, conf=0.25, max_det=300) print(len(result.boxes))

L'oggetto Results restituito è quello che restituisce ogni famiglia, quindi passare a un rilevatore diverso è una modifica di una riga. Sul modello base e su quello stride 4, conf fissa la soglia di confidenza e iou la soglia di NMS. Il modello end-to-end non esegue NMS e ignora iou, quindi sono conf e max_det a dare forma al suo output. Vedi predizione per sorgenti, streaming e gestione dei risultati.

Varianti

Tre varianti condividono un backbone. Tutte e tre fanno solo rilevamento, e accettano gli stessi argomenti.

Il modello base predice su tre scale di feature ed elimina i bounding box duplicati con NMS.

Il modello end-to-end mantiene quella testa e le affianca un ramo di matching uno-a-uno. L'inferenza legge soltanto il ramo uno-a-uno e ne prende le predizioni con il punteggio più alto, quindi non viene eseguito nessun NMS. Scegli questo quando il runtime su cui metti in produzione non ha un operatore NMS.

Il modello stride 4 fa affiorare un livello più in alto nel backbone, estende il neck fino a lì e predice su quattro scale invece che tre. La scala in più serve per gli oggetti che coprono pochi pixel; l'unico checkpoint pubblicato per questo modello è addestrato su immagini aeree. I checkpoint di rilevamento base si trasferiscono su di esso: il backbone e il neck si caricano invariati, le tre torri della testa preaddestrate salgono di una posizione e la torre stride 4 parte da un'inizializzazione casuale.

CheckpointIngresso (px)mAP 50-95Parametri (M)
LibreYOLO9c64056.425.5
LibreYOLO9m64055.320.12
LibreYOLO9s64055.97.2
LibreYOLO9t64054.02.02

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.

Addestramento

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9s.pt")model.train(data="my-dataset.yaml", epochs=100, imgsz=640, batch=16)
CLI
libreyolo train model=LibreYOLO9s.pt data=my-dataset.yaml \  epochs=100 imgsz=640 batch=16
Oggetti piccoli
from libreyolo import LibreYOLO9P2 # La variante stride 4 non ha un checkpoint COCO proprio: indicane uno# di rilevamento base, il backbone e il neck si caricano invariati e la# torre della testa stride 4 parte da un'inizializzazione casuale.model = LibreYOLO9P2(None, size="s")model.train(data="my-dataset.yaml", epochs=100, pretrained="LibreYOLO9s.pt")

pretrained decide da cosa parte l'esecuzione. Passa True per caricare il checkpoint pubblicato dello stesso modello e della stessa dimensione, oppure un nome o un percorso per qualsiasi altra cosa. I tensori la cui forma non coincide vengono saltati invece che rifiutati, e l'esecuzione registra quanti ne sono stati caricati, quindi un checkpoint addestrato su un numero di classi diverso resta un punto di partenza utilizzabile.

Il modello stride 4 non ha un checkpoint COCO pubblicato proprio, quindi lì True si risolve in un file che non esiste e il download fallisce. Indica invece un checkpoint di rilevamento base.

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("LibreYOLO9s.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95"])print(metrics["metrics/mAP50"])
CLI
libreyolo val model=LibreYOLO9s.pt data=my-dataset.yaml
Su COCO
# Il file yaml di COCO incluso porta uno script di download integrato,# quindi serve un permesso esplicito a meno che il dataset non sia già in locale.libreyolo val model=LibreYOLO9c.pt data=coco.yaml imgsz=640 \  allow_download_scripts=True

Esportazione

TaskONNXTorchScriptExecuTorchTensorRTOpenVINOPaddleMNNRKNNncnnTFLiteCoreMLCore AI
DetectionDetection to ONNX: supportatoDetection to TorchScript: supportatoDetection to ExecuTorch: supportatoDetection to TensorRT: supportatoDetection to OpenVINO: supportatoDetection to Paddle: supportatoDetection to MNN: supportatoDetection to RKNN: non supportatoDetection to ncnn: supportatoDetection to TFLite: non supportatoDetection to CoreML: non supportatoDetection to Core AI: supportato

Una spunta vale per tutte e tre le varianti: dove differiscono, la matrice riporta la più debole delle tre.

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. Eseguire il grafo in un runtime nudo, senza LibreYOLO installato, è supportato anche questo, ma allora il preprocessing e il postprocessing tocca scriverli a te.

Per il modello di rilevamento base, la metà di postprocessing può spostarsi dentro il grafo. nms=True su un'esportazione ONNX mette la soppressione dentro il modello, e il primo output diventa un tensore fisso (1, max_det, 6) le cui righe sono x1, y1, x2, y2, score, class, riempite di zeri oltre il numero di rilevamenti. Quel grafo è a batch 1 e non porta assi dinamici. I modelli end-to-end e stride 4 non accettano il flag.

Ogni formato installa un extra diverso e accetta qualche argomento suo. Entrambe le cose stanno nella pagina di quel formato.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9s.pt")model.export(format="onnx", imgsz=640)
CLI
libreyolo export model=LibreYOLO9s.pt format=onnx imgsz=640
Con NMS nel grafo
libreyolo export model=LibreYOLO9s.pt format=onnx nms=True \  conf=0.25 iou=0.45 max_det=300
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 Results.model = LibreYOLO("LibreYOLO9s.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
LibreYOLO9t.pt640mit
LibreYOLO9s.pt640mit
LibreYOLO9m.pt640mit
LibreYOLO9c.pt640mit
LibreYOLO9E2Et.pt640mit
LibreYOLO9E2Es.pt640mit
LibreYOLO9E2Em.pt640mit
LibreYOLO9E2Ec.pt640mit
LibreYOLO9P2s-visdrone.ptcc-by-nc-sa-3.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
YOLOv9, MultimediaTechLab
Licenza upstream
MIT
Codice LibreYOLO
MIT
Pesi
MIT, ripubblicati su huggingface.co/LibreYOLO
Interpretazione
MIT is a permissive license, so these weights can be used in commercial and closed-source products. The one standing obligation is to keep the license text and the copyright notice, Kin-Yiu Wong and Hao-Tang Tsui, with any copy you redistribute. It places no condition on your own application code, and a model you train yourself on your own data is yours. Two things are worth knowing beyond that. The port follows the authors' MIT re-release of YOLOv9, not the GPL-3.0 repository that carries the same model, so the permissive terms come from the source LibreYOLO actually derives from. And one checkpoint in this family is not MIT: the stride-4 model trained on VisDrone2019-DET inherits that dataset's CC BY-NC-SA 3.0 terms, which rule out commercial use and require share-alike on anything derived from it.

Un checkpoint qui non è MIT. Il modello stride 4 addestrato su VisDrone2019-DET eredita i termini CC BY-NC-SA 3.0 di quel dataset: solo uso non commerciale, share-alike su tutto ciò che ne deriva, e fuori dalla licenza permissiva con cui viene distribuito il resto di questa famiglia. Predice le classi aeree di VisDrone invece di quelle di COCO. La libreria stampa tutto questo prima di scaricare il file.

Citazione

@inproceedings{wang2024yolov9,
      title={{YOLOv9}: Learning What You Want to Learn Using Programmable Gradient Information},
      author={Wang, Chien-Yao and Yeh, I-Hau and Liao, Hong-Yuan Mark},
      year={2024},
      booktitle={Proceedings of the European Conference on Computer Vision (ECCV)},
}

Copiato dal blocco di citazione degli autori disponibile su github.com/MultimediaTechLab/YOLO#citations.

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.