Le prossime novità
I percorsi di rilevamento e segmentazione costituiscono il nucleo convalidato. Questa pagina documenta le nuove teste dei task e le tecniche di addestramento che stiamo sviluppando su questa base: classificazione, box orientati, posa e fine-tuning efficiente in termini di parametri.
Panoramica
LibreYOLO è un framework multi-task: la stessa famiglia di modelli può usare teste diverse. Accanto ai percorsi detect e segment convalidati, stanno arrivando diversi nuovi task per le due famiglie di punta, YOLO9 e RF-DETR. Si collegano tutti alla stessa factory LibreYOLO(...) e allo stesso contenitore Results, quindi una volta appresa l'API principale si tratta di piccole aggiunte.
- Classificazione per YOLO9 e RF-DETR. Etichette per l'intera immagine con probabilità top-1 / top-5.
- Box orientati (OBB) per YOLO9 e RF-DETR. Box ruotati per immagini aeree e documenti.
- Keypoint / posa per YOLO9 e RF-DETR. Keypoint COCO-17 delle persone.
- Rilevamento di piccoli oggetti con YOLO9-P2, una variante di YOLOv9 con una scala stride 4 per gli oggetti da 4-16 px nelle immagini aeree e dei droni, incluso un checkpoint VisDrone in anteprima di ricerca.
- Fine-tuning LoRA / DoRA per RF-DETR. Adatta il backbone transformer usando una frazione della memoria.
Leggi prima questa sezione
Tutto ciò che trovi in questa pagina è sperimentale e alcune parti sono ancora in lavorazione su branch di funzionalità. Le API, i valori predefiniti e i formati delle etichette possono cambiare prima di essere promossi nel nucleo convalidato. La sezione Stabilità indica esattamente lo stato di ogni funzionalità.
Selezionare un task
Ogni famiglia usa il rilevamento per impostazione predefinita. Puoi scegliere un altro task in uno dei tre modi seguenti, risolti in questo ordine di precedenza:
| Priorità | Meccanismo | Esempio |
|---|---|---|
| 1 | Argomento esplicito | task="obb" |
| 2 | Metadati del checkpoint | task registrato in un file .pt addestrato |
| 3 | Suffisso del nome file | -cls, -obb, -pose |
| 4 | Valore predefinito della famiglia | detect |
Poiché la factory pubblica LibreYOLO(...) richiede un file di pesi reale, il modo più semplice per avviare uno di questi task da zero è creare direttamente la classe della famiglia e passare task=. I checkpoint addestrati vengono ricaricati tramite la factory unificata, che ne rileva automaticamente il task.
1 from libreyolo import LibreYOLO, LibreYOLO9, LibreRFDETR 2 3 # Start a task from scratch via the family class 4 m = LibreYOLO9(None, size="t", task="classify", nb_classes=10) 5 6 # Load a trained checkpoint via the unified factory (task auto-detected) 7 m = LibreYOLO("LibreYOLO9t-obb.pt")
Classificazione delle immagini
La classificazione assegna una singola etichetta a un'intera immagine. YOLO9 mantiene il proprio backbone e aggiunge una testa di classificazione leggera; RF-DETR riutilizza il proprio encoder DINOv2 e aggiunge una testa lineare con pooling. Entrambi operano a 224 per 224.
Inferenza e risultato Probs
La predizione restituisce un oggetto Results il cui campo probs contiene una softmax sulle classi.
1 from libreyolo import LibreYOLO 2 3 model = LibreYOLO("LibreYOLO9t-cls.pt") 4 r = model.predict("cat.jpg") 5 6 print(r.probs.top1) # class id of the argmax 7 print(r.probs.top1conf) # its probability 8 print(r.probs.top5) # [id, id, id, id, id] 9 print(model.names[r.probs.top1]) # human-readable label
| Campo | Tipo | Significato |
|---|---|---|
probs.top1 | int | ID della classe argmax. |
probs.top5 | list[int] | ID delle classi top-5, in ordine decrescente. |
probs.top1conf | float | Probabilità della classe top-1. |
probs.top5conf | tensor | Probabilità delle classi top-5. |
probs.data | tensor | Vettore softmax completo. |
Formato del dataset e addestramento
La classificazione usa una struttura ImageFolder, non un file YAML. I nomi delle classi corrispondono ai nomi ordinati delle sottocartelle, fissati in base allo split di addestramento.
1 dataset/ 2 train/ 3 cat/ img001.jpg ... 4 dog/ img104.jpg ... 5 val/ 6 cat/ ... 7 dog/ ...
L'argomento data= accetta una cartella, l'URL di un file .zip o il nome di un download automatico noto (imagenette160 e imagenet10). La testa viene ricostruita automaticamente in base al numero di classi del dataset.
1 from libreyolo import LibreYOLO9 2 3 model = LibreYOLO9(None, size="t", task="classify", nb_classes=10) 4 result = model.train( 5 data="imagenette160", # folder, .zip URL, or known name 6 epochs=10, batch=64, imgsz=224, 7 optimizer="adamw", lr0=1e-3, 8 ) 9 # Validation reports metrics/accuracy_top1 and metrics/accuracy_top5
Esecuzioni di riferimento
Rapidi controlli di coerenza durante lo sviluppo: YOLO9-t ha raggiunto top-1 0,79 / top-5 0,975 su imagenette160 (10 epoche), mentre RF-DETR-n ha raggiunto top-1 0,69 / top-5 0,96 (6 epoche). RF-DETR trae vantaggio dall'accesso a Internet alla prima esecuzione per scaricare il backbone DINOv2; offline usa come fallback un'inizializzazione casuale.
Box orientati (OBB)
I box orientati includono un angolo di rotazione, necessario per immagini aeree, documenti e scene con elementi molto ravvicinati. YOLO9 aggiunge un ramo per l'angolo alla propria testa detect; RF-DETR aggiunge al decoder un embedding dell'angolo apprendibile.
Inferenza e risultato OBB
Results espone un campo obb. Gli angoli sono espressi in radianti.
1 from libreyolo import LibreYOLO 2 3 model = LibreYOLO("LibreYOLO9t-obb.pt") 4 r = model.predict("aerial.jpg") 5 6 for i in range(len(r.obb.cls)): 7 cx, cy, w, h, angle = r.obb.xywhr[i] # angle in radians 8 corners = r.obb.xyxyxyxy[i] # 4 (x, y) corner points 9 conf, cls = r.obb.conf[i], r.obb.cls[i]
| Campo | Forma | Significato |
|---|---|---|
obb.xywhr | N x 5 | [cx, cy, w, h, angle], angolo in radianti. |
obb.xyxyxyxy | N x 4 x 2 | Quattro punti d'angolo per box. |
obb.conf | N | Confidenza per box. |
obb.cls | N | ID della classe per box. |
Formato del dataset e addestramento
OBB usa un file YAML dei dati standard in stile detect, ma le etichette sono file di testo YOLO-OBB con esattamente nove campi per riga: un ID di classe seguito da quattro punti d'angolo normalizzati. L'angolo viene derivato dai vertici, non memorizzato.
1 # class_id x1 y1 x2 y2 x3 y3 x4 y4 (all normalized to [0, 1]) 2 0 0.51 0.32 0.66 0.38 0.62 0.55 0.47 0.49 3 2 0.10 0.71 0.18 0.69 0.20 0.80 0.12 0.82
Un normale checkpoint di rilevamento non può essere caricato direttamente in un modello OBB. Il passaggio da detect a OBB è consentito solo come inizializzazione dell'addestramento: passa pretrained=True per YOLO9 o il flag di trasferimento esplicito per RF-DETR. Mosaic e mixup sono disabilitati per OBB finché non sarà disponibile una data augmentation che gestisce i vertici, mentre l'inferenza a tasselli non è supportata.
1 from libreyolo import LibreYOLO9 2 3 model = LibreYOLO9(None, size="t", task="obb") 4 # Warm-start the backbone from a same-family detect checkpoint 5 result = model.train(data="dota8.yaml", pretrained=True, epochs=100, imgsz=640) 6 7 # CLI equivalent 8 # libreyolo train model=LibreYOLO9t.pt data=dota8.yaml --task obb
La validazione usa l'AP con IoU ruotata, riportata come mAP50 e mAP50-95 nel gruppo di metriche OBB.
Keypoint / Posa
La stima della posa predice i keypoint per ogni istanza rilevata. La struttura predefinita usa i keypoint COCO-17 delle persone. Nella prima versione, la posa di YOLO9 e RF-DETR supporta una sola classe, le persone; la posa di YOLO-NAS ed EdgeCrafter è già disponibile nel codice.
Inferenza e risultato Keypoints
Results espone un campo keypoints di forma (N, K, 3), dove l'ultimo canale rappresenta visibilità o confidenza, in coordinate pixel dell'immagine originale.
1 from libreyolo import LibreYOLO 2 3 model = LibreYOLO("LibreYOLO9t-pose.pt") 4 r = model.predict("athletes.jpg") 5 6 kp = r.keypoints 7 print(kp.xy.shape) # (N, 17, 2) pixel coordinates 8 print(kp.conf) # (N, 17) per-keypoint visibility / confidence 9 print(kp.xyn) # normalized coordinates 10 print(r.boxes.xyxy) # person boxes still come along
| Campo | Forma | Significato |
|---|---|---|
keypoints.xy | N x K x 2 | Coordinate pixel dei keypoint. |
keypoints.xyn | N x K x 2 | Coordinate normalizzate dei keypoint. |
keypoints.conf | N x K | Visibilità / confidenza per keypoint. |
keypoints.has_visible | N x K | Maschera booleana di visibilità. |
Formato del dataset e addestramento
La posa usa un file YAML dei dati che deve dichiarare kpt_shape: [K, 2|3] e, per la data augmentation con ribaltamento orizzontale, un flip_idx. Le etichette sono righe di testo YOLO-pose: un ID di classe, un box normalizzato, quindi K terne di keypoint (x, y, v) con visibilità v in {0, 1, 2}.
1 path: coco8-pose 2 train: images/train 3 val: images/val 4 nc: 1 5 names: 6 0: person 7 kpt_shape: [17, 3] 8 flip_idx: [0, 2, 1, 4, 3, 6, 5, 8, 7, 10, 9, 12, 11, 14, 13, 16, 15]
1 from libreyolo import LibreYOLO9 2 3 # Warm-start from a detection checkpoint; the keypoint head is reinitialized 4 model = LibreYOLO9("LibreYOLO9t.pt", size="t", task="pose") 5 model.train(data="coco8-pose.yaml", epochs=100, imgsz=640) 6 7 # Validation reports OKS-based AP via the pose validator
In sviluppo attivo
La posa di YOLO9 e RF-DETR si trova in un branch di funzionalità e non è ancora stata integrata; considera l'API precedente come il contratto previsto, non come definitivo. I pesi per la posa di YOLO-NAS sono collegati dal progetto upstream anziché duplicati e devono essere predisposti manualmente.
Rilevamento di piccoli oggetti (YOLO9-P2)
YOLO9-P2 è YOLOv9 con una quarta scala di rilevamento a stride 4. YOLOv9 standard rileva agli stride 8/16/32, quindi gli oggetti sotto ~16 px sfuggono alla griglia più fine; la testa P2 copre l'intervallo 4-16 px dominante nei filmati aerei e dei droni.
In un confronto A/B controllato su VisDrone, con stessa configurazione, risoluzione e inizializzazione e con la sola modifica della testa P2, l'AP dei piccoli oggetti è migliorata del +49% rispetto a YOLOv9 standard della stessa dimensione. L'aggiunta di una risoluzione di addestramento maggiore e della dimensione s più grande ha quasi raddoppiato l'AP dei piccoli oggetti nel progetto:
| Modello | AP | AP50 | AP_small |
|---|---|---|---|
| YOLO9-t standard @640 (controllo) | 0.123 | 0.220 | 0.047 |
| YOLO9-P2-t @640 (stessa configurazione A/B) | 0.138 | 0.254 | 0.070 |
| YOLO9-P2-s @768 (anteprima rilasciata) | 0.226 | 0.385 | 0.141 |
VisDrone2019-DET val (548 immagini), pycocotools, un singolo seed; considera ±1 punto come rumore.
L'anteprima di ricerca VisDrone
Un checkpoint addestrato è pubblicato come LibreYOLO9P2s-visdrone. La famiglia è integrata in dev ma non ancora in una release PyPI, quindi installala dal sorgente fino alla prossima release.
1 from libreyolo import LibreYOLO 2 3 # Auto-downloads from the LibreYOLO Hugging Face org 4 model = LibreYOLO("LibreYOLO9P2s-visdrone.pt") 5 6 # Evaluate/predict at 768 - the resolution it was trained at 7 results = model.predict("aerial.jpg", imgsz=768, conf=0.25)
Licenza non commerciale
Il checkpoint in anteprima è addestrato su VisDrone2019-DET (AISKYEYE, Tianjin University), con licenza CC BY-NC-SA 3.0: solo per uso non commerciale, a differenza del codice MIT di LibreYOLO e dei pesi predefiniti per COCO. Rileva le 10 classi aeree VisDrone, non quelle COCO. La scheda del modello include l'esatta configurazione di addestramento, le metriche per epoca e un convertitore del dataset sviluppato in clean room, così puoi riprodurlo o riaddestrarlo sui tuoi dati.
Quando usarlo e quando non usarlo
Adatta l'architettura al contesto. Su dati simili a COCO, dove "piccolo" significa 16-32 px, la testa P2 non aiuta; in quel caso YOLOv9 standard è la scelta migliore. Scegli YOLO9-P2 quando i tuoi oggetti sono sotto ~16 px: filmati di droni e aerei, videosorveglianza distante, tasselli satellitari. La scala aggiuntiva raddoppia approssimativamente il calcolo e il numero di anchor. È il prezzo della griglia stride 4.
Addestrare il tuo modello
YOLO9-P2 viene inizializzato per trasferimento dai checkpoint detect di YOLOv9 standard: vengono caricati il backbone, il neck condiviso e le torri delle teste esistenti; i nuovi moduli P2 partono da zero. La configurazione seguente raccoglie ciò che abbiamo imparato con fatica sui dati di oggetti minuscoli:
1 from libreyolo import LibreYOLO9P2 2 3 model = LibreYOLO9P2(None, size="s") 4 model.train( 5 data="/abs/path/tiny_objects.yaml", 6 imgsz=768, # resolution is the biggest lever for tiny objects 7 lr0=0.005, # the family default 0.01 diverges on transfer init 8 mosaic_prob=0.0, # mosaic tiling shrinks tiny objects below detectability 9 mixup_prob=0.0, 10 hsv_prob=1.0, flip_prob=0.5, 11 max_labels=600, # dense aerial frames exceed the default 100-box cap 12 pretrained="LibreYOLO9s.pt", # transfer init from stock YOLOv9 13 epochs=60, 14 )
Fine-tuning LoRA / DoRA
Gli adattatori in stile LoRA consentono di fare fine-tuning del backbone transformer di RF-DETR addestrando un piccolo insieme di matrici a rango ridotto, mentre i pesi di base restano congelati. In questo modo si riduce la memoria usata dall'ottimizzatore e dai gradienti, una soluzione ideale per adattare un checkpoint potente a un nuovo dominio con hardware modesto.
Abilitazione
L'intera API pubblica consiste in un singolo flag su train(). Non ci sono impostazioni di rank, alpha o moduli di destinazione da regolare; la procedura usa una configurazione fissa e ben collaudata. Dietro le quinte, l'implementazione usa DoRA (LoRA con scomposizione dei pesi, rank 16) applicato alle proiezioni query, key e value dell'attenzione DINOv2.
1 from libreyolo import LibreYOLO 2 3 model = LibreYOLO("rf-detr-nano.pth") # sizes n, s, m, l 4 result = model.train( 5 data="data.yaml", 6 lora=True, # DoRA on the frozen DINOv2 backbone 7 epochs=100, batch_size=4, lr=1e-4, 8 ) 9 10 # Resume: LoRA is auto-detected from the checkpoint, no need to repeat the flag 11 model.train(data="data.yaml", resume=True)
1 # CLI equivalent 2 libreyolo train --model rf-detr-nano.pth --data data.yaml --lora
Checkpoint ed esportazione
- I checkpoint di addestramento conservano i tensori degli adattatori e la configurazione registra l'uso di LoRA, quindi il caricamento e la ripresa ricostruiscono automaticamente il grafo degli adattatori.
- La testa di rilevamento resta sempre addestrabile, quindi puoi comunque adattarla a un nuovo numero di classi.
export()riunisce gli adattatori nei pesi densi. I modelli esportati sono standard e non richiedono la dipendenzapeft.- LoRA è disponibile solo per RF-DETR; passare
lora=Truead altre famiglie genera un errore chiaro.
Installa il pacchetto extra
L'addestramento LoRA richiede la dipendenza per gli adattatori: pip install "libreyolo[lora]", che installa lo stack RF-DETR e peft. I modelli esportati, con gli adattatori riuniti, non ne hanno bisogno durante l'inferenza.
Stabilità
Lo stato attuale di ogni funzionalità. Tutto ciò che trovi qui è sperimentale; questa tabella ne offre una panoramica trasparente.
| Funzionalità | Famiglie | Stato |
|---|---|---|
| Classificazione | YOLO9, RF-DETR | PR aperta |
| Box orientati (OBB) | YOLO9, RF-DETR | Sperimentale |
| Keypoint / posa | YOLO9, RF-DETR | In arrivo |
| Keypoint / posa | YOLO-NAS, EdgeCrafter | Disponibile |
| Rilevamento di piccoli oggetti | YOLO9-P2 | Anteprima di ricerca |
| LoRA / DoRA | RF-DETR | Revisionata |
Cerchi il percorso stabile?
Per l'uso in produzione, il nucleo convalidato comprende il rilevamento con YOLO9 e il rilevamento e la segmentazione con RF-DETR. Consulta la documentazione principale per questi modelli e LibreVLM per il rilevamento a vocabolario aperto.