YOLOv11 spiegato semplice: come funziona e come usarlo

Computer vision, o visione artificiale: un ambito poco noto, ma che ha un ruolo molto importante nella vita quotidiana, e soprattutto in ambiti come la sicurezza, la robotica e il monitoraggio ambientale. Uno dei modelli più popolari per la rilevazione di oggetti in immagini e video è YOLO, che sta per “You Only Look Once”. Ma cosa significa davvero questo nome? E come funziona YOLO?
In questa guida semplice e pratica, ti spieghiamo tutto quello che devi sapere su YOLOv11, dalla teoria alla pratica, con esempi concreti in Python.
La defizione di YOLO è semplice:
“The name ‘You Only Look Once’ refers to the fact that the algorithm requires only one forward propagation pass through the neural network to make predictions, unlike previous region proposal-based techniques like R-CNN that require thousands for a single image.”
Come si traduce tutto ciò? YOLO guarda l’immagine una sola volta e in quel passaggio trova gia cosa c’è e dove si trova. Modelli piu vecchi, come R-CNN, eseguivano diversi passaggi, separati, alla ricerca di possibili aree interessanti per poi classificarle. Risultato: più lentezza e più complessita.
In questa mini guida vediamo come funziona YOLO nel dettaglio, anche con un piccolo snippet che permette di mostrare come riusarlo in casi d’uso diversi.
Cosa vuol dire davvero “You Only Look Once”
Immagina di dover trovare tutte le auto in una foto.
- Con un approccio tipo R-CNN: prima proponi tante “regioni candidate” (anche migliaia), poi le analizzi una per una.
- Con YOLO: passi la foto nella rete una volta sola, e la rete restituisce direttamente bounding box + classe + confidenza.
Questa è la ragione del nome: una forward pass per prediction, e questo comporta meno passaggi e meno latenza. Meno latenza, si traduce anche in un perfetto candidato per attività di real-time (video, webcam, edge device).
All’atto pratico, il suo funzionamento può essere spiegato in questo modo: un’immagine viene passata come input e una una rete convoluzione profonda (una deep convolutional neural network) per rilevare oggetti nell’immagine. La rete ha una serie di livelli convoluzionali che sono stati pre-addrestrati utilizzando dataset più o meno noti (come ImageNet) per avere una baseline temporanea di strati che permettano di avere dell’average pooling, ossia il modo in cui viene ridotto lo spazio dimensionale dell’immagine, e di avere una rappresentazione più compatta e astratta dei dati. La rete è stata addestrata per riconoscere oggetti in immagini, e quindi è in grado di identificare e localizzare oggetti all’interno dell’immagine.
A quel punto, la rete pre-addestrata viene convertita per eseguire rilevazione, o detection, dividendo l’immagine di input in una griglia SxS, dove S è un numero intero che rappresenta la dimensione della griglia. Ogni cella della griglia viene associata a un bounding box, che rappresenta un rettangolo che circonda un oggetto rilevato dall’immagine. La rete pre-addestrata produce una serie di valori per ogni cella della griglia, che rappresentano la probabilità che l’oggetto rilevato sia di una determinata classe, e la posizione del bounding box all’interno dell’immagine. Soprattutto, se il centro di un oggetto si trova in una cella specifica, quella cella diventa responsabile del rilevamento complessivo e della predizione su quelli che sono i confini (bounding boxes) che contengono l’immagine.
La predizione viene misurata in termini di confidenza, ossia un punteggio che riflette la sicurezza con cui il modello ha rilevato l’oggetto all’interno di una certa serie di celle della griglia che rappresenta l’immagine.
L’aspetto interessante è che la rete predice più riquadri per ogni cella della griglia, e quindi è in grado di rilevare più oggetti all’interno di una stessa cella. Questo è particolarmente utile quando ci sono più oggetti vicini tra loro, o quando un oggetto è parzialmente nascosto da un altro. Infatti, tra i parametri fondamentali di YOLO, c’è proprio IoU, ossia Intersection over Union, che misura quanto i bounding box predetti si sovrappongono con quelli reali, e questo è fondamentale per gestire i casi di oggetti vicini o parzialmente nascosti.

Ultimo, ma non ultimo, c’è una delle tecniche chiave utilizzate da YOLO, ossia non-max suppression, che è una tecnica per eliminare i bounding box che si sovrappongono tra loro, mantenendo solo quelli più accurati e non ridondanti. Questo è fondamentale per gestire i casi di oggetti vicini o parzialmente nascosti. Si tratta di una fase di post-elaborazione utilizzata per migliorare l’accuratezza e l’efficienza del rilevamento degli oggetti.

Use case con YOLOv11 (Python)
Per una demo veloce puoi usare la libreria ultralytics: tieni conto che è disponibile per Python 3.8 e superiore e che usa PyTorch, che va installato. Se poi vuoi usare la GPU (di NVIDIA), puoi installare la versione con CUDA. Nel caso tu abbia una GPU integrata, la storia si fa più complicata, ma magari ne parleremo un’altra volta…
Intanto, per verificare se la libreria funziona, segui questi step:
Ecco i passaggi per usare la tua GPU con questo progetto:
1. Verificare quale GPU hai
# Per GPU NVIDIA (la più comune per deep learning):
nvidia-smi
Questo mostra modello GPU, driver installato e versione CUDA supportata.
2. Installare i driver NVIDIA e CUDA
Se nvidia-smi non funziona, devi installare i driver:
# Ubuntu/Debian
sudo apt update
sudo apt install nvidia-driver-535 # o versione più recente disponibile
sudo reboot
# Verifica dopo il reboot
nvidia-smi
3. Installare PyTorch con supporto CUDA
Il progetto usa Ultralytics che dipende da PyTorch. Devi installare la versione con CUDA:
# Controlla la versione CUDA supportata dal tuo driver (output di nvidia-smi, in alto a destra)
# Poi installa PyTorch corrispondente. Esempio per CUDA 12.4:
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu124
Consulta https://pytorch.org/get-started/locally/ per la combinazione esatta per il tuo sistema.
4. Verificare che PyTorch veda la GPU
python -c "import torch; print(torch.cuda.is_available()); print(torch.cuda.get_device_name(0))"
Deve stampare True e il nome della tua GPU.
5. Usare la GPU nel progetto
All’interno del tuo progetto, dovrai specificare la GPU da usare. In molti script di training, c’è un parametro --device che puoi impostare. Per default, spesso è impostato su cpu, quindi devi cambiarlo a 0 (o cuda:0) per usare la prima GPU.
DEFAULT_DEVICE = "0" # GPU 0
...
device = DEFAULT_DEVICE if torch.cuda.is_available() else "cpu"
Se hai più GPU, puoi specificare quale usare:
python scripts/train.py --device 0 # prima GPU
python scripts/train.py --device 1 # seconda GPU
python scripts/train.py --device 0,1 # multi-GPU
python scripts/train.py --device cpu # solo CPU (fallback)
1) Installazione
python -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
pip install ultralytics opencv-python
2) Inference su immagine
from ultralytics import YOLO
# Modello piccolo: buono per iniziare (veloce)
model = YOLO("yolo11n.pt")
# Inference su singola immagine
results = model.predict(
source="input.jpg", # path immagine
conf=0.25, # soglia confidenza
save=True # salva immagine con box
)
for r in results:
print("Numero oggetti trovati:", len(r.boxes))
3) Esecuzione
python detect_image.py --device 0
Se tutto va bene, troverai output annotati nella cartella runs/detect/....
Come adattarlo a use case diversi
Qui sta il vantaggio principale: cambiando source e pochi parametri, puoi coprire scenari molto diversi. Ti mostriamo 3 use case più o meno complessi ma comuni su come usare YOLO per immagini e video. Tutto quello che ti serve è un dataset o in input, e installare YOLO con le indicazioni seguite in precedenza.
Use case 1: foto da cartella (batch)
Perfetto per inventario, controllo qualità, etichettatura iniziale.
results = model.predict(source="./images", conf=0.3, save=True)
Suggerimento:
- usa
conftra0.25e0.5per ridurre falsi positivi; - usa il modello
nosse hai bisogno di velocità. Ne esistono di varie dimensioni: nano, small, medium e via dicendo, ma dipende dalle risorse a tua disposizione e dal tipo di lavoro. Se sono oggetti “comuni”, sicuramente YOLO è già in grado di riconoscere e classificare quei tipi di oggetti (considera che ha “in pancia” già x oggetti che è in grado di rilevare.
Use case 2: video registrato
Utile per analisi traffico, monitoraggio processi, conteggio oggetti.
results = model.predict(source="video.mp4", conf=0.35, save=True)
Suggerimento:
- se il video è pesante, valuta risoluzione inferiore;
- misura FPS reale prima di andare in produzione.
Use case 3: webcam live
Ottimo per demo real-time, prototipi di sicurezza, robotica.
results = model.predict(source=0, conf=0.4, show=True)
source=0 indica la webcam principale.
Suggerimento:
- su laptop senza GPU dedicata, parti da
yolo11n.pt; - aumenta
confse vedi troppe detection rumorose.
Errori comuni da evitare
- Aspettarsi precisione perfetta al primo run: serve tuning su dataset e soglie, anche in più passaggi.
- Ignorare il contesto hardware: CPU e GPU cambiano drasticamente le prestazioni: se non hai una GPU, valuta anche di usare il free tier di Google Colab.
- Usare dataset sbilanciati: classi rare vengono riconosciute male: valuta se non “associarle” a classi più note.
Conclusione
“You Only Look Once” non è solo un nome accattivante: descrive l’idea tecnica che rende YOLO così pratico. Un singolo passaggio nella rete rende la pipeline più diretta e spesso molto più veloce rispetto ai metodi più canonici.













