Ultralytics YOLO27: Iscriviti alla lista d'attesa.
Get Started
Lezioneintermedio

Scegli l'attività e pianifica la pipeline

Associa ogni domanda sul prodotto a una delle sette attività Ultralytics YOLO, indicando pesi, campo dei risultati, formato delle etichette e metrica di soglia, e verifica il piano eseguendo ogni attività su un'immagine.

Esempi di segmentazione, pose, bounding box orientate e classificazione affiancati

Quando un rilevatore viene rilasciato, le richieste successive raramente sono «più riquadri». Sono «quanto è grande la chiazza», «la schiena del lavoratore è piegata», «in che direzione punta la nave» e «questo componente è da scartare». Nella foto di strada usata in tutto il corso, la bounding box dell'autobus occupa il 48% dell'immagine, mentre l'autobus stesso ne copre il 29%; quindi una stima dell'area basata sul riquadro sarebbe sbagliata di oltre la metà. L'attività scelta determina il formato delle etichette: sceglierla prima che qualcuno inizi ad annotare è la decisione meno costosa del progetto; cambiarla in seguito significa ripetere le annotazioni.

Esito

Scrivi un piano delle attività che indichi attività, pesi, formato delle etichette, campo dei risultati e metrica di soglia per ogni modello della pipeline, quindi conferma il campo dei risultati eseguendo tutte e sette le attività su un'immagine.

Percorso rapido
Se sai già come muoverti, ecco la versione breve.
  1. Riformula la richiesta come la domanda a cui deve rispondere l'output: che tipo, dove, che forma, quali pixel, quali articolazioni, quale direzione o a che distanza.

  2. Segui il diagramma decisionale e fermati alla prima attività il cui output risponde alla domanda.

  3. Registra pesi, formato delle etichette, campo dei risultati e metrica di soglia in una tabella di pianificazione.

  4. Aggiungi un secondo modello solo se una singola attività non può rispondere alla domanda e calcolane il costo.

Pratico

Una foto, quattro risposte diverse#

Output delle attività Ultralytics YOLO affiancati su immagini di esempio: rilevamento, pose, segmentazione, classificazione, OBB, segmentazione semantica e profondità

Poni una domanda su una foto — quanta parte di questa immagine è occupata dall'autobus e quanto è lontano? — e lascia che quattro attività Ultralytics YOLO rispondano:

from ultralytics import YOLO

image = "https://ultralytics.com/images/bus.jpg"
det = YOLO("yolo26n.pt")(image, verbose=False)[0]
seg = YOLO("yolo26n-seg.pt")(image, retina_masks=True, verbose=False)[0]
sem = YOLO("yolo26n-sem.pt")(image, verbose=False)[0]
depth = YOLO("yolo26n-depth.pt")(image, verbose=False)[0]
frame = det.orig_shape[0] * det.orig_shape[1]  # pixels in the photo

i = [det.names[int(c)] for c in det.boxes.cls].index("bus")
x1, y1, x2, y2 = det.boxes.xyxy[i].tolist()
print(f"detect    bus box covers   {(x2 - x1) * (y2 - y1) / frame:.1%} of the frame")

i = [seg.names[int(c)] for c in seg.boxes.cls].index("bus")
bus_mask = seg.masks.data[i].bool()  # H x W, True on bus pixels
print(f"segment   bus mask covers  {bus_mask.sum().item() / frame:.1%} of the frame")

ratios = {row["name"]: row["pixel_ratio"] for row in sem.summary()}
print(f"semantic  'train' pixels   {ratios['train']:.1%} of the frame")

meters = depth.depth.data[bus_mask].median().item()  # depth map and mask share the original size
print(f"depth     bus is about     {meters:.1f} m from the camera")
detect    bus box covers   47.7% of the frame
segment   bus mask covers  29.2% of the frame
semantic  'train' pixels   30.9% of the frame
depth     bus is about     4.5 m from the camera

Esaminiamole una per una:

  • detect risponde a dove. Il riquadro include anche la strada sotto l'autobus e le quattro persone davanti a esso, quindi l'area risulta sovrastimata del 63%.
  • segment risponde a che forma. Il 29,2% è l'effettiva impronta dell'autobus nell'immagine: il valore da usare per qualsiasi regola relativa ad area, copertura o sovrapposizione.
  • semantic risponde a quali pixel appartengono a quale classe. L'area è simile a quella della maschera, ma il modello definisce l'autobus train: assegna alle superfici le classi del proprio set di addestramento (Cityscapes, lezione 4) e non distingue mai un veicolo dall'altro.
  • depth risponde a a che distanza. La profondità mediana all'interno della maschera dell'autobus è di 4,5 m: due attività combinate per rispondere a una domanda a cui nessuna delle due potrebbe rispondere da sola.
Regola decisionale

Se il valore restituito dal tuo prodotto è un'area, una percentuale di copertura o una sovrapposizione, un riquadro non è lo strumento giusto. Usa una maschera (segmentazione) per gli oggetti oppure una mappa di classi (semantica) per le superfici.

Panoramica dei sette task#

Fondamenti di Computer Vision spiega nel dettaglio come scegliere tra le attività: se la scelta non è ovvia, ripassa Le sette attività di visione. Questo è il riepilogo operativo per il resto del corso. Ogni riga corrisponde a un'attività che il pacchetto ultralytics installato addestra, convalida, usa per le previsioni ed esporta tramite la stessa API; la panoramica delle attività è il riferimento completo.

Domanda a cui risponde l'outputTaskPesi YOLO26Campo dei risultatiFormato delle etichetteMetrica di soglia
Dove si trova ogni oggetto?detectyolo26n.ptboxesclasse + riquadromAP50-95 dei riquadri
Qual è la forma e l'area esatta di ogni oggetto?segmentyolo26n-seg.ptmasks + boxesclasse + poligonomAP50-95 delle maschere
A quale classe appartiene ogni pixel?semanticyolo26n-sem.ptsemantic_maskMappa di classi PNG o poligonimIoU
Dove si trovano le articolazioni o i punti di riferimento?poseyolo26n-pose.ptkeypoints + boxesclasse + riquadro + punti chiavemAP50-95 delle pose (OKS)
Come è ruotato ogni oggetto?obbyolo26n-obb.ptobbclasse + 4 verticimAP50-95 OBB
Che cos'è l'intera immagine (o ritaglio)?classifyyolo26n-cls.ptprobsuna cartella per classeaccuratezza top-1
A quale distanza dalla fotocamera si trova ogni pixel?depthyolo26n-depth.ptdepthmappa di profondità per immagine (PNG a 16 bit o NPY)δ1 (delta1)

Hai già messo in produzione la prima riga. Le lezioni dalla 2 alla 8 insegnano le cinque righe centrali, mentre le lezioni 9 e 10 le concatenano e le mettono in produzione. L'ultima riga, la stima della profondità monoculare, prevede una distanza in metri per ogni pixel di una singola immagine. Le etichette provengono da sensori di profondità o renderer 3D, non da annotatori, quindi ha un proprio formato del dataset; il corso la include nei punti in cui il flusso di lavoro è condiviso: questo piano, il ciclo di convalida e il controllo dell'esportazione nell'ultima lezione.

Scegli una domanda alla volta#

Esamina le domande nell'ordine e fermati alla prima risposta affermativa:

Il diagramma copre i casi più comuni. Quattro criteri per dirimere i casi dubbi coprono gran parte degli altri:

Se la richiesta…ScegliPerché
richiede sia un conteggio sia un'area («quante chiazze ci sono e quanto sono grandi»)segmentla segmentazione semantica unisce gli oggetti a contatto in un'unica regione
riguarda oggetti lunghi e sottili, disposti uno accanto all'altro e ripresi dall'altoobbi riquadri allineati agli assi si sovrappongono e la NMS elimina oggetti reali, anche se non leggi mai l'angolo
richiede di distinguere la parte anteriore da quella posteriore o la sinistra dalla destraposeun OBB fornisce un asse, non una direzione
per costruzione, mostra esattamente un elemento per immagine (una stazione di ispezione fissa)classifyle etichette meno costose e il modello più veloce

L'attività viene definita quando crei il dataset — su Ultralytics Platform corrisponde al campo Tipo di attività della finestra di dialogo Nuovo dataset — quindi questa scelta va fatta prima della prima annotazione:

Finestra di dialogo Nuovo dataset di Ultralytics Platform con area di caricamento, nome del dataset, URL e descrizione, e selettore del tipo di attività accanto a Licenza, Sfoca i volti e Visibilità

Una API, sette campi dei risultati#

Tutte le attività usano la stessa chiamata; il modello ricava l'attività dal file dei pesi. Cambia il campo dei risultati che viene compilato: è quello che leggerà il tuo codice.

from ultralytics import YOLO

WEIGHTS = ["yolo26n.pt", "yolo26n-seg.pt", "yolo26n-sem.pt", "yolo26n-pose.pt", "yolo26n-obb.pt", "yolo26n-cls.pt", "yolo26n-depth.pt"]
FIELDS = ("boxes", "masks", "semantic_mask", "keypoints", "obb", "probs", "depth")

for weights in WEIGHTS:
    model = YOLO(weights)
    result = model("https://ultralytics.com/images/bus.jpg", verbose=False)[0]
    fields = [f for f in FIELDS if getattr(result, f) is not None]
    print(f"{weights:17s} task={model.task:9s} fields={fields}")
yolo26n.pt        task=detect    fields=['boxes']
yolo26n-seg.pt    task=segment   fields=['boxes', 'masks']
yolo26n-sem.pt    task=semantic  fields=['semantic_mask']
yolo26n-pose.pt   task=pose      fields=['boxes', 'keypoints']
yolo26n-obb.pt    task=obb       fields=['obb']
yolo26n-cls.pt    task=classify  fields=['probs']
yolo26n-depth.pt  task=depth     fields=['depth']

I risultati di segmentazione e pose mantengono boxes, quindi il codice di rilevamento che hai già continua a funzionare anche con loro. I risultati di classificazione, semantica e profondità descrivono l'intera immagine e non hanno campi per singolo oggetto.

I risultati OBB non contengono riquadri

Il codice di rilevamento che scorre result.boxes si interrompe con TypeError: 'NoneType' object is not iterable su un modello OBB: result.boxes è None e le rilevazioni ruotate si trovano solo in result.obb. Adatta il codice di rilevamento a OBB leggendo result.obb, invece di controllare None e ottenere zero rilevazioni.

Quando un modello non basta#

La maggior parte dei sistemi di produzione che vanno oltre il rilevamento adotta una di queste tre strutture:

  • Rileva, poi classifica. Il rilevatore trova gli oggetti piccoli in un'immagine grande; un classificatore di immagini assegna un'etichetta dettagliata a ogni ritaglio a piena risoluzione: tipo di casco, livello del difetto, codice SKU del prodotto.
  • Pose e tracking. I punti chiave descrivono un singolo fotogramma; un tracker li trasforma in una serie temporale per persona, da cui puoi contare le ripetizioni o rilevare le cadute.
  • Segmenta, poi misura. Il modello restituisce i pixel; il normale codice li converte in aree, larghezze, rapporti di copertura o distanze (con la profondità).

Le etichette di una pipeline di segmentazione e misurazione consistono in un poligono per oggetto, come per questi pacchi sui robot da magazzino nell'editor di Ultralytics Platform:

Editor di annotazione di Ultralytics Platform in modalità Disegno, con maschere poligonali rosa tracciate intorno ai pacchi sui robot da magazzino e l'elenco delle classi aperto

Ogni fase moltiplica i costi

Un secondo modello aggiunge latenza di inferenza, un secondo dataset da etichettare e gestire e un secondo modello da monitorare. Crea una catena solo quando un singolo task non può rispondere alla domanda: un piano con un modello che puoi distribuire è meglio di un piano con tre modelli che non puoi etichettare.

Insidie#

Scegliere in base all'effetto dimostrativo

Sintomo: il team etichetta poligoni perché le maschere fanno bella figura nelle demo, ma poi il prodotto legge solo un conteggio. Soluzione: prima di etichettare, individua la riga di codice che usa il risultato. Se nessun componente utilizza il contorno, distribuisci un rilevatore: i riquadri sono più rapidi da etichettare e da elaborare.

Pianificare senza specificare il campo del risultato

Sintomo: dopo un mese di etichettatura, qualcuno si accorge che il prodotto ha bisogno di un orientamento e il dataset contiene etichette OBB, che forniscono solo un asse. Soluzione: inserisci nel piano l'attributo esatto (result.masks.xy, result.keypoints.xy, result.obb.xywhr) ed esegui tasks.py con i pesi scelti prima di creare la prima etichetta.

Una seconda fase addestrata sulle immagini sbagliate

Sintomo: un classificatore con un punteggio del 95% su foto pulite dei prodotti sbaglia la maggior parte dei ritagli del rilevatore in produzione. Soluzione: crea il dataset della seconda fase usando i ritagli prodotti dalla prima fase, con il loro effettivo sfocato e inquadramento; la lezione 9 spiega come.

Provalo

Scegli una richiesta di funzionalità dal tuo backlog — oppure usa «segnala i pallet che sporgono dal bordo della scaffalatura ripresi da una telecamera fissa in magazzino» — e crea una tabella di pianificazione con queste righe: domanda, attività, pesi, formato delle etichette, campo dei risultati, metrica di soglia e seconda fase (oppure «nessuna», con il motivo). Poi esegui tasks.py e verifica che il campo indicato sia compilato.

Criteri di completamento
La lezione è completata quando tutte le seguenti condizioni sono soddisfatte.
  • La tabella di pianificazione indica attività, pesi, formato delle etichette, campo dei risultati e metrica di soglia per ogni modello.

  • Sai spiegare in una frase perché un'attività meno costosa (rilevamento o classificazione) non risponderebbe alla domanda.

  • Hai eseguito tasks.py e il campo dei risultati indicato nel piano compare nel suo output.

Mostra la soluzione

Per la richiesta sui pallet:

VoceScelta
DomandaUna parte del pallet sporge oltre la linea della trave della scaffalatura?
Tasksegment — la sporgenza dipende dal contorno del pallet; il riquadro include anche lo spazio sotto il pallet e il carico sopra di esso
Pesiyolo26n-seg.pt, perfezionato su fotogrammi ripresi dalle telecamere del magazzino
Formato delle etichetteUn poligono per pallet
Campo dei risultatiresult.masks.data con retina_masks=True (pixel oltre la linea della trave)
Metrica di sogliamAP50-95 delle maschere su una telecamera esclusa dall'addestramento
Seconda faseNessuno — la linea del fascio è fissa per ogni telecamera, quindi è una configurazione, non un modello

La regola dello sbalzo richiede quindi tre righe di codice: traccia la linea del fascio una volta per telecamera, conta i pixel della maschera dal lato sbagliato e genera un avviso se superano una soglia di pixel che calibri su alcuni sbalzi noti. La lezione 3 mostra proprio questo tipo di test tra maschera e regione.

Prossimi passi

Ora etichettiamo e addestriamo un modello di segmentazione di istanze, controlliamo i suoi poligoni nel codice e vediamo cosa ci indicano i suoi due gruppi di metriche.

Accedi per salvare i progressi