Caricamento di YOLOv5 da PyTorch Hub#
📚 Questa guida spiega come caricare YOLOv5 🚀 da PyTorch Hub all'indirizzo https://pytorch.org/hub/ultralytics_yolov5.
Prima di iniziare#
Installa requirements.txt in un ambiente Python>=3.8.0, includendo PyTorch>=1.8. I modelli e i dataset vengono scaricati automaticamente dall'ultima release di YOLOv5.
pip install -r https://raw.githubusercontent.com/ultralytics/yolov5/master/requirements.txtNon è necessario clonare ultralytics/yolov5: PyTorch Hub recupera automaticamente il codice.
Caricare YOLOv5 con PyTorch Hub#
Esempio semplice#
Questo esempio carica un modello YOLOv5s preaddestrato da PyTorch Hub come model e passa un'immagine per l'inferenza. 'yolov5s' è un modello YOLOv5 piccolo e veloce. Per informazioni su tutti i modelli disponibili, consulta il README.
import torch
# Model
model = torch.hub.load("ultralytics/yolov5", "yolov5s")
# Image
im = "https://ultralytics.com/images/zidane.jpg"
# Inference
results = model(im)
results.pandas().xyxy[0]
# xmin ymin xmax ymax confidence class name
# 0 749.50 43.50 1148.0 704.5 0.874023 0 person
# 1 433.50 433.50 517.5 714.5 0.687988 27 tie
# 2 114.75 195.75 1095.0 708.0 0.624512 0 person
# 3 986.00 304.00 1028.0 420.0 0.286865 27 tieEsempio dettagliato#
Questo esempio mostra l'inferenza in batch con immagini sorgenti PIL e OpenCV. results può essere stampato nella console, salvato in runs/hub, visualizzato sullo schermo negli ambienti supportati e restituito come tensori o DataFrame pandas.
import cv2
import torch
from PIL import Image
# Model
model = torch.hub.load("ultralytics/yolov5", "yolov5s")
# Images
for f in "zidane.jpg", "bus.jpg":
torch.hub.download_url_to_file(f"https://ultralytics.com/images/{f}", f) # download 2 images
im1 = Image.open("zidane.jpg") # PIL image
im2 = cv2.imread("bus.jpg")[..., ::-1] # OpenCV image (BGR to RGB)
# Inference
results = model([im1, im2], size=640) # batch of images
# Results
results.print()
results.save() # or .show()
results.xyxy[0] # im1 predictions (tensor)
results.pandas().xyxy[0] # im1 predictions (pandas)
# xmin ymin xmax ymax confidence class name
# 0 749.50 43.50 1148.0 704.5 0.874023 0 person
# 1 433.50 433.50 517.5 714.5 0.687988 27 tie
# 2 114.75 195.75 1095.0 708.0 0.624512 0 person
# 3 986.00 304.00 1028.0 420.0 0.286865 27 tie
Per tutte le opzioni di inferenza, consulta il metodo forward di YOLOv5 AutoShape().
Impostazioni di inferenza#
I modelli YOLOv5 includono vari attributi di inferenza, come la soglia di confidenza, la soglia IoU e così via, che puoi impostare nel modo seguente:
model.conf = 0.25 # Soglia di confidenza NMS
model.iou = 0.45 # Soglia IoU NMS
model.agnostic = False # NMS senza distinzione tra classi
model.multi_label = False # NMS con più etichette per riquadro
model.classes = None # (lista facoltativa) filtra per classe, ad esempio = [0, 15, 16] per persone, gatti e cani COCO
model.max_det = 1000 # numero massimo di rilevamenti per immagine
model.amp = False # inferenza con precisione mista automatica (AMP)
results = model(im, size=320) # dimensione di inferenza personalizzataDispositivo#
Dopo la creazione, puoi trasferire i modelli su qualsiasi dispositivo:
model.cpu() # CPU
model.cuda() # GPU
model.to(device) # ad es. device=torch.device(0)Puoi anche creare i modelli direttamente su qualsiasi device:
model = torch.hub.load("ultralytics/yolov5", "yolov5s", device="cpu") # carica su CPUPrima dell'inferenza, le immagini di input vengono trasferite automaticamente sul dispositivo corretto del modello.
Disattivare l'output#
Puoi caricare i modelli senza output con _verbose=False:
model = torch.hub.load("ultralytics/yolov5", "yolov5s", _verbose=False) # carica senza outputCanali di input#
Per caricare un modello YOLOv5s preaddestrato con 4 canali di input anziché i 3 predefiniti:
model = torch.hub.load("ultralytics/yolov5", "yolov5s", channels=4)In questo caso, il modello sarà composto da pesi preaddestrati tranne che per il primissimo livello di input, che non ha più la stessa forma del livello di input preaddestrato. Il livello di input manterrà i pesi inizializzati casualmente.
Numero di classi#
Per caricare un modello YOLOv5s preaddestrato con 10 classi di output anziché le 80 predefinite:
model = torch.hub.load("ultralytics/yolov5", "yolov5s", classes=10)In questo caso, il modello sarà composto da pesi preaddestrati tranne che per i livelli di output, che non hanno più la stessa forma dei livelli di output preaddestrati. I livelli di output manterranno i pesi inizializzati casualmente.
Forza ricaricamento#
Se riscontri problemi con i passaggi precedenti, impostare force_reload=True può essere d'aiuto: elimina la cache esistente e forza il nuovo download dell'ultima versione di YOLOv5 da PyTorch Hub. Le copie memorizzate nella cache si trovano in ~/.cache/torch/hub; eliminare quella cartella produce lo stesso effetto.
model = torch.hub.load("ultralytics/yolov5", "yolov5s", force_reload=True) # forza ricaricamentoInferenza da screenshot#
Per eseguire l'inferenza sullo schermo del tuo desktop:
import torch
from PIL import ImageGrab
# Model
model = torch.hub.load("ultralytics/yolov5", "yolov5s")
# Image
im = ImageGrab.grab() # acquisisci uno screenshot
# Inference
results = model(im)Inferenza multi-GPU#
Puoi caricare i modelli YOLOv5 su più GPU in parallelo, usando l'inferenza con thread:
import threading
import torch
def run(model, im):
"""Performs inference on an image using a given model and saves the output; model must support `.save()` method."""
results = model(im)
results.save()
# Models
model0 = torch.hub.load("ultralytics/yolov5", "yolov5s", device=0)
model1 = torch.hub.load("ultralytics/yolov5", "yolov5s", device=1)
# Inference
threading.Thread(target=run, args=[model0, "https://ultralytics.com/images/zidane.jpg"], daemon=True).start()
threading.Thread(target=run, args=[model1, "https://ultralytics.com/images/bus.jpg"], daemon=True).start()Addestramento#
Per caricare un modello YOLOv5 per l'addestramento anziché per l'inferenza, imposta autoshape=False. Per caricare un modello con pesi inizializzati casualmente (per addestrarlo da zero), usa pretrained=False. In questo caso, devi fornire il tuo script di addestramento. In alternativa, consulta il nostro Tutorial per addestrare modelli con dati personalizzati di YOLOv5 per l'addestramento dei modelli.
import torch
model = torch.hub.load("ultralytics/yolov5", "yolov5s", autoshape=False) # carica preaddestrato
model = torch.hub.load("ultralytics/yolov5", "yolov5s", autoshape=False, pretrained=False) # carica da zeroRisultati Base64#
Da usare con i servizi API. Per i dettagli, consulta l'esempio Flask REST API.
import base64
from io import BytesIO
from PIL import Image
results = model(im) # inference
results.ims # array delle immagini originali (come array np) passate al modello per l'inferenza
results.render() # aggiorna results.ims con riquadri ed etichette
for im in results.ims:
buffered = BytesIO()
im_base64 = Image.fromarray(im)
im_base64.save(buffered, format="JPEG")
print(base64.b64encode(buffered.getvalue()).decode("utf-8")) # immagine codificata in base64 con i risultatiRisultati ritagliati#
Puoi restituire e salvare i risultati come ritagli dei rilevamenti:
results = model(im) # inference
crops = results.crop(save=True) # dizionario dei rilevamenti ritagliatiRisultati Pandas#
Puoi restituire i risultati come DataFrame Pandas:
results = model(im) # inference
results.pandas().xyxy[0] # DataFrame PandasOutput pandas (fai clic per espandere)
print(results.pandas().xyxy[0])
# xmin ymin xmax ymax confidence class name
# 0 749.50 43.50 1148.0 704.5 0.874023 0 person
# 1 433.50 433.50 517.5 714.5 0.687988 27 tie
# 2 114.75 195.75 1095.0 708.0 0.624512 0 person
# 3 986.00 304.00 1028.0 420.0 0.286865 27 tieRisultati ordinati#
Puoi ordinare i risultati per colonna, ad esempio per ordinare da sinistra a destra (asse x) i numeri delle targhe rilevate:
results = model(im) # inference
results.pandas().xyxy[0].sort_values("xmin") # ordinati da sinistra a destraRisultati JSON#
Puoi restituire i risultati in formato JSON dopo averli convertiti in DataFrame .pandas() usando il metodo .to_json(). Puoi modificare il formato JSON con l'argomento orient. Per i dettagli, consulta la documentazione di pandas .to_json().
results = model(im) # inference
results.pandas().xyxy[0].to_json(orient="records") # previsioni JSON img1Output JSON (fai clic per espandere)
[
{
"xmin": 749.5,
"ymin": 43.5,
"xmax": 1148.0,
"ymax": 704.5,
"confidence": 0.8740234375,
"class": 0,
"name": "person"
},
{
"xmin": 433.5,
"ymin": 433.5,
"xmax": 517.5,
"ymax": 714.5,
"confidence": 0.6879882812,
"class": 27,
"name": "tie"
},
{
"xmin": 115.25,
"ymin": 195.75,
"xmax": 1096.0,
"ymax": 708.0,
"confidence": 0.6254882812,
"class": 0,
"name": "person"
},
{
"xmin": 986.0,
"ymin": 304.0,
"xmax": 1028.0,
"ymax": 420.0,
"confidence": 0.2873535156,
"class": 27,
"name": "tie"
}
]Modelli personalizzati#
Questo esempio carica un modello YOLOv5s personalizzato, addestrato su 20 classi VOC, 'best.pt', con PyTorch Hub.
import torch
model = torch.hub.load("ultralytics/yolov5", "custom", path="path/to/best.pt") # modello locale
model = torch.hub.load("path/to/yolov5", "custom", path="path/to/best.pt", source="local") # repository localeModelli TensorRT, ONNX e OpenVINO#
PyTorch Hub supporta l'inferenza con la maggior parte dei formati di esportazione YOLOv5, compresi i modelli addestrati su dati personalizzati. Consulta il tutorial sull'esportazione in TFLite, ONNX, CoreML e TensorRT per i dettagli sull'esportazione dei modelli.
- TensorRT può essere 2-5× più veloce di PyTorch nei benchmark GPU.
- ONNX e OpenVINO possono essere 2-3× più veloci di PyTorch nei benchmark CPU.
import torch
model = torch.hub.load("ultralytics/yolov5", "custom", path="yolov5s.pt") # PyTorch
model = torch.hub.load("ultralytics/yolov5", "custom", path="yolov5s.torchscript") # TorchScript
model = torch.hub.load("ultralytics/yolov5", "custom", path="yolov5s.onnx") # ONNX
model = torch.hub.load("ultralytics/yolov5", "custom", path="yolov5s_openvino_model/") # OpenVINO
model = torch.hub.load("ultralytics/yolov5", "custom", path="yolov5s.engine") # TensorRT
model = torch.hub.load("ultralytics/yolov5", "custom", path="yolov5s.mlpackage") # CoreML (solo macOS)
model = torch.hub.load("ultralytics/yolov5", "custom", path="yolov5s.tflite") # TFLite
model = torch.hub.load("ultralytics/yolov5", "custom", path="yolov5s_paddle_model/") # PaddlePaddleAmbienti supportati#
Ultralytics offre una gamma di ambienti pronti all'uso, ciascuno con le dipendenze essenziali già installate, come CUDA, CUDNN, Python e PyTorch, per dare il via ai tuoi progetti.
- Notebook GPU gratuiti:
- Google Cloud: Guida rapida a GCP
- Amazon: Guida rapida ad AWS
- Azure: Guida rapida ad AzureML
- Docker: Guida rapida a Docker
Stato del progetto#
Questo badge indica che tutti i test di integrazione continua (CI) di YOLOv5 GitHub Actions sono superati correttamente. Questi test CI verificano rigorosamente la funzionalità e le prestazioni di YOLOv5 in diversi ambiti chiave: addestramento, validazione, inferenza, esportazione e benchmark. Garantiscono un funzionamento coerente e affidabile su macOS, Windows e Ubuntu, con test eseguiti ogni 24 ore e a ogni nuovo commit.
Domande frequenti#
No.
torch.hub.load("ultralytics/yolov5", ...)scarica il codice in~/.cache/torch/hube i pesi al primo utilizzo. È necessario installare solo i pacchetti inrequirements.txt.Usa il punto di ingresso
customcon il percorso del checkpoint:torch.hub.load("ultralytics/yolov5", "custom", path="runs/train/exp/weights/best.pt"). Aggiungisource="local"e un percorso al repository locale per caricarlo senza accesso alla rete.Sì. Passa il file esportato allo stesso loader
custome YOLOv5 seleziona il backend corrispondente in base all'estensione, ad esempioyolov5s.onnx,yolov5s.engineoyolov5s_openvino_model/.Passa
force_reload=Trueper eliminare il repository memorizzato nella cache e scaricare il codice più recente, oppure elimina manualmente~/.cache/torch/hub. In questo modo vengono acquisiti anche i nuovi rilasci di YOLOv5.results.xyxy[0]restituisce un tensore con righe[x1, y1, x2, y2, confidence, class],results.pandas().xyxy[0]restituisce un DataFrame con i nomi delle classi e.to_json(orient="records")applicato a quel DataFrame genera JSON.