Vai al contenuto

Analitica con l'utilizzo di Ultralytics YOLOv8

Introduzione

Questa guida fornisce una panoramica completa di tre tipi fondamentali di visualizzazioni di dati: grafici a linee, grafici a barre e grafici a torta. Ogni sezione include istruzioni passo-passo e snippet di codice su come creare queste visualizzazioni utilizzando Python.

Campioni visivi

Grafico a linee Trama della barra Grafico a torta
Grafico a linee Trama della barra Grafico a torta

Perché i grafici sono importanti

  • I grafici a linee sono ideali per monitorare i cambiamenti su periodi brevi e lunghi e per confrontare i cambiamenti di più gruppi nello stesso periodo.
  • I grafici a barre, invece, sono adatti a confrontare le quantità tra diverse categorie e a mostrare le relazioni tra una categoria e il suo valore numerico.
  • Infine, i grafici a torta sono efficaci per illustrare le proporzioni tra le categorie e mostrare le parti di un insieme.

Esempi di analisi

import cv2

from ultralytics import YOLO, solutions

model = YOLO("yolov8s.pt")

cap = cv2.VideoCapture("Path/to/video/file.mp4")
assert cap.isOpened(), "Error reading video file"
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))

out = cv2.VideoWriter("line_plot.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

analytics = solutions.Analytics(
    type="line",
    writer=out,
    im0_shape=(w, h),
    view_img=True,
)
total_counts = 0
frame_count = 0

while cap.isOpened():
    success, frame = cap.read()

    if success:
        frame_count += 1
        results = model.track(frame, persist=True, verbose=True)

        if results[0].boxes.id is not None:
            boxes = results[0].boxes.xyxy.cpu()
            for box in boxes:
                total_counts += 1

        analytics.update_line(frame_count, total_counts)

        total_counts = 0
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        break

cap.release()
out.release()
cv2.destroyAllWindows()
import cv2

from ultralytics import YOLO, solutions

model = YOLO("yolov8s.pt")

cap = cv2.VideoCapture("Path/to/video/file.mp4")
assert cap.isOpened(), "Error reading video file"
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))
out = cv2.VideoWriter("multiple_line_plot.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

analytics = solutions.Analytics(
    type="line",
    writer=out,
    im0_shape=(w, h),
    view_img=True,
    max_points=200,
)

frame_count = 0
data = {}
labels = []

while cap.isOpened():
    success, frame = cap.read()

    if success:
        frame_count += 1

        results = model.track(frame, persist=True)

        if results[0].boxes.id is not None:
            boxes = results[0].boxes.xyxy.cpu()
            track_ids = results[0].boxes.id.int().cpu().tolist()
            clss = results[0].boxes.cls.cpu().tolist()

            for box, track_id, cls in zip(boxes, track_ids, clss):
                # Store each class label
                if model.names[int(cls)] not in labels:
                    labels.append(model.names[int(cls)])

                # Store each class count
                if model.names[int(cls)] in data:
                    data[model.names[int(cls)]] += 1
                else:
                    data[model.names[int(cls)]] = 0

        # update lines every frame
        analytics.update_multiple_lines(data, labels, frame_count)
        data = {}  # clear the data list for next frame
    else:
        break

cap.release()
out.release()
cv2.destroyAllWindows()
import cv2

from ultralytics import YOLO, solutions

model = YOLO("yolov8s.pt")

cap = cv2.VideoCapture("Path/to/video/file.mp4")
assert cap.isOpened(), "Error reading video file"
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))

out = cv2.VideoWriter("pie_chart.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

analytics = solutions.Analytics(
    type="pie",
    writer=out,
    im0_shape=(w, h),
    view_img=True,
)

clswise_count = {}

while cap.isOpened():
    success, frame = cap.read()
    if success:
        results = model.track(frame, persist=True, verbose=True)
        if results[0].boxes.id is not None:
            boxes = results[0].boxes.xyxy.cpu()
            clss = results[0].boxes.cls.cpu().tolist()
            for box, cls in zip(boxes, clss):
                if model.names[int(cls)] in clswise_count:
                    clswise_count[model.names[int(cls)]] += 1
                else:
                    clswise_count[model.names[int(cls)]] = 1

            analytics.update_pie(clswise_count)
            clswise_count = {}

        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        break

cap.release()
out.release()
cv2.destroyAllWindows()
import cv2

from ultralytics import YOLO, solutions

model = YOLO("yolov8s.pt")

cap = cv2.VideoCapture("Path/to/video/file.mp4")
assert cap.isOpened(), "Error reading video file"
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))

out = cv2.VideoWriter("bar_plot.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

analytics = solutions.Analytics(
    type="bar",
    writer=out,
    im0_shape=(w, h),
    view_img=True,
)

clswise_count = {}

while cap.isOpened():
    success, frame = cap.read()
    if success:
        results = model.track(frame, persist=True, verbose=True)
        if results[0].boxes.id is not None:
            boxes = results[0].boxes.xyxy.cpu()
            clss = results[0].boxes.cls.cpu().tolist()
            for box, cls in zip(boxes, clss):
                if model.names[int(cls)] in clswise_count:
                    clswise_count[model.names[int(cls)]] += 1
                else:
                    clswise_count[model.names[int(cls)]] = 1

            analytics.update_bar(clswise_count)
            clswise_count = {}

        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        break

cap.release()
out.release()
cv2.destroyAllWindows()
import cv2

from ultralytics import YOLO, solutions

model = YOLO("yolov8s.pt")

cap = cv2.VideoCapture("path/to/video/file.mp4")
assert cap.isOpened(), "Error reading video file"
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))

out = cv2.VideoWriter("area_plot.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

analytics = solutions.Analytics(
    type="area",
    writer=out,
    im0_shape=(w, h),
    view_img=True,
)

clswise_count = {}
frame_count = 0

while cap.isOpened():
    success, frame = cap.read()
    if success:
        frame_count += 1
        results = model.track(frame, persist=True, verbose=True)

        if results[0].boxes.id is not None:
            boxes = results[0].boxes.xyxy.cpu()
            clss = results[0].boxes.cls.cpu().tolist()

            for box, cls in zip(boxes, clss):
                if model.names[int(cls)] in clswise_count:
                    clswise_count[model.names[int(cls)]] += 1
                else:
                    clswise_count[model.names[int(cls)]] = 1

        analytics.update_area(frame_count, clswise_count)
        clswise_count = {}
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        break

cap.release()
out.release()
cv2.destroyAllWindows()

Argomento Analytics

Ecco una tabella con i dati Analytics argomenti:

Nome Tipo Predefinito Descrizione
type str None Tipo di dati o di oggetto.
im0_shape tuple None Forma dell'immagine iniziale.
writer cv2.VideoWriter None Oggetto per la scrittura di file video.
title str ultralytics Titolo della visualizzazione.
x_label str x Etichetta per l'asse x.
y_label str y Etichetta per l'asse y.
bg_color str white Colore di sfondo.
fg_color str black Colore di primo piano.
line_color str yellow Colore delle linee.
line_width int 2 Larghezza delle linee.
fontsize int 13 Dimensione del carattere per il testo.
view_img bool False Bandiera per visualizzare l'immagine o il video.
save_img bool True Contrassegno per salvare l'immagine o il video.
max_points int 50 Per più linee, punti totali disegnati sulla cornice, prima di eliminare i punti iniziali.
points_width int 15 Evidenziatore della larghezza dei punti della linea.

Argomenti model.track

Argomento Tipo Predefinito Descrizione
source str None Specifies the source directory for images or videos. Supports file paths and URLs.
persist bool False Enables persistent tracking of objects between frames, maintaining IDs across video sequences.
tracker str botsort.yaml Specifies the tracking algorithm to use, e.g., bytetrack.yaml o botsort.yaml.
conf float 0.3 Sets the confidence threshold for detections; lower values allow more objects to be tracked but may include false positives.
iou float 0.5 Sets the Intersection over Union (IoU) threshold for filtering overlapping detections.
classes list None Filters results by class index. For example, classes=[0, 2, 3] only tracks the specified classes.
verbose bool True Controls the display of tracking results, providing a visual output of tracked objects.

Conclusione

Capire quando e come utilizzare i diversi tipi di visualizzazione è fondamentale per un'analisi efficace dei dati. I grafici a linee, a barre e a torta sono strumenti fondamentali che possono aiutarti a trasmettere la storia dei tuoi dati in modo più chiaro ed efficace.

DOMANDE FREQUENTI

Come posso creare un grafico a linee utilizzando Ultralytics YOLOv8 Analytics?

Per creare un grafico a linee utilizzando Ultralytics YOLOv8 Analytics, segui i seguenti passaggi:

  1. Carica un modello YOLOv8 e apri il tuo file video.
  2. Inizializza l'opzione Analytics con il tipo impostato su "linea".
  3. Itera i fotogrammi del video, aggiornando il grafico a linee con i dati rilevanti, come il numero di oggetti per fotogramma.
  4. Salva il video di uscita che visualizza il grafico a linee.

Esempio:

import cv2

from ultralytics import YOLO, solutions

model = YOLO("yolov8s.pt")
cap = cv2.VideoCapture("Path/to/video/file.mp4")
out = cv2.VideoWriter("line_plot.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

analytics = solutions.Analytics(type="line", writer=out, im0_shape=(w, h), view_img=True)

while cap.isOpened():
    success, frame = cap.read()
    if success:
        results = model.track(frame, persist=True)
        total_counts = sum([1 for box in results[0].boxes.xyxy])
        analytics.update_line(frame_count, total_counts)
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

cap.release()
out.release()
cv2.destroyAllWindows()

Per ulteriori dettagli sulla configurazione di Analytics visita il sito Analytics con Ultralytics YOLOv8 📊 sezione.

Quali sono i vantaggi dell'utilizzo di Ultralytics YOLOv8 per la creazione di grafici a barre?

L'utilizzo di Ultralytics YOLOv8 per la creazione di grafici a barre offre diversi vantaggi:

  1. Visualizzazione dei dati in tempo reale: Integra senza problemi i risultati del rilevamento degli oggetti in grafici a barre per aggiornamenti dinamici.
  2. Facilità d'uso: API e funzioni semplici rendono immediata l'implementazione e la visualizzazione dei dati.
  3. Personalizzazione: Personalizza titoli, etichette, colori e altro ancora per adattarli alle tue esigenze specifiche.
  4. Efficienza: Gestisci in modo efficiente grandi quantità di dati e aggiorna i grafici in tempo reale durante l'elaborazione dei video.

Usa il seguente esempio per generare un grafico a barre:

import cv2

from ultralytics import YOLO, solutions

model = YOLO("yolov8s.pt")
cap = cv2.VideoCapture("Path/to/video/file.mp4")
out = cv2.VideoWriter("bar_plot.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

analytics = solutions.Analytics(type="bar", writer=out, im0_shape=(w, h), view_img=True)

while cap.isOpened():
    success, frame = cap.read()
    if success:
        results = model.track(frame, persist=True)
        clswise_count = {
            model.names[int(cls)]: boxes.size(0)
            for cls, boxes in zip(results[0].boxes.cls.tolist(), results[0].boxes.xyxy)
        }
        analytics.update_bar(clswise_count)
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

cap.release()
out.release()
cv2.destroyAllWindows()

Per saperne di più, visita la sezione Trama delle barre della guida.

Perché dovrei utilizzare Ultralytics YOLOv8 per creare grafici a torta nei miei progetti di visualizzazione dei dati?

Ultralytics YOLOv8 è una scelta eccellente per creare grafici a torta perché:

  1. Integrazione con il rilevamento degli oggetti: Integra direttamente i risultati del rilevamento degli oggetti nei grafici a torta per ottenere informazioni immediate.
  2. API di facile utilizzo: Semplice da configurare e utilizzare con un codice minimo.
  3. Personalizzabile: Varie opzioni di personalizzazione per colori, etichette e altro ancora.
  4. Aggiornamenti in tempo reale: Gestisci e visualizza i dati in tempo reale, l'ideale per i progetti di analisi video.

Ecco un rapido esempio:

import cv2

from ultralytics import YOLO, solutions

model = YOLO("yolov8s.pt")
cap = cv2.VideoCapture("Path/to/video/file.mp4")
out = cv2.VideoWriter("pie_chart.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

analytics = solutions.Analytics(type="pie", writer=out, im0_shape=(w, h), view_img=True)

while cap.isOpened():
    success, frame = cap.read()
    if success:
        results = model.track(frame, persist=True)
        clswise_count = {
            model.names[int(cls)]: boxes.size(0)
            for cls, boxes in zip(results[0].boxes.cls.tolist(), results[0].boxes.xyxy)
        }
        analytics.update_pie(clswise_count)
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

cap.release()
out.release()
cv2.destroyAllWindows()

Per maggiori informazioni, consulta la sezione Grafico a torta della guida.

Ultralytics YOLOv8 può essere utilizzato per tracciare gli oggetti e aggiornare dinamicamente le visualizzazioni?

Sì, Ultralytics YOLOv8 può essere utilizzato per tracciare gli oggetti e aggiornare dinamicamente le visualizzazioni. Supporta il tracciamento di più oggetti in tempo reale e può aggiornare diverse visualizzazioni come grafici a linee, a barre e a torta in base ai dati degli oggetti tracciati.

Esempio di tracciamento e aggiornamento di un grafico a linee:

import cv2

from ultralytics import YOLO, solutions

model = YOLO("yolov8s.pt")
cap = cv2.VideoCapture("Path/to/video/file.mp4")
out = cv2.VideoWriter("line_plot.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

analytics = solutions.Analytics(type="line", writer=out, im0_shape=(w, h), view_img=True)

while cap.isOpened():
    success, frame = cap.read()
    if success:
        results = model.track(frame, persist=True)
        total_counts = sum([1 for box in results[0].boxes.xyxy])
        analytics.update_line(frame_count, total_counts)
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

cap.release()
out.release()
cv2.destroyAllWindows()

Per conoscere tutte le funzionalità, consulta la sezione Tracciamento.

Cosa rende Ultralytics YOLOv8 diverso da altre soluzioni di rilevamento degli oggetti come OpenCV e TensorFlow?

Ultralytics YOLOv8 si distingue da altre soluzioni di rilevamento degli oggetti come OpenCV e TensorFlow per diversi motivi:

  1. Precisione all'avanguardia: YOLOv8 offre una precisione superiore nel rilevamento, nella segmentazione e nella classificazione degli oggetti.
  2. Facilità d'uso: L'API di facile utilizzo consente un'implementazione e un'integrazione rapida senza dover ricorrere a una codifica approfondita.
  3. Prestazioni in tempo reale: Ottimizzato per l'inferenza ad alta velocità, adatto alle applicazioni in tempo reale.
  4. Diverse applicazioni: Supporta diverse attività, tra cui il tracciamento di più oggetti, la formazione di modelli personalizzati e l'esportazione in diversi formati come ONNX, TensorRT e CoreML.
  5. Documentazione completa: Un'ampia documentazione e risorse blog per guidare gli utenti in ogni fase.

Per confronti e casi d'uso più dettagliati, esplora il nostro blogUltralytics .


📅 Created 3 months ago ✏️ Updated 5 days ago

Commenti