Vai al contenuto

Conteggio degli oggetti con Ultralytics YOLOv8

Che cos'è il conteggio degli oggetti?

Il conteggio degli oggetti con Ultralytics YOLOv8YOLOv8 eccelle nelle applicazioni in tempo reale, fornendo un conteggio efficiente e preciso degli oggetti in vari scenari come l'analisi della folla e la sorveglianza, grazie ai suoi algoritmi all'avanguardia e alle capacità di deep learning.


Guarda: Conteggio degli oggetti con Ultralytics YOLOv8

Guarda: Conteggio degli oggetti in base alla classe utilizzando Ultralytics YOLOv8

Vantaggi del conteggio degli oggetti?

  • Ottimizzazione delle risorse: Il conteggio degli oggetti facilita una gestione efficiente delle risorse, fornendo conteggi accurati e ottimizzando l'allocazione delle risorse in applicazioni come la gestione dell'inventario.
  • Maggiore sicurezza: Il conteggio degli oggetti migliora la sicurezza e la sorveglianza grazie al tracciamento e al conteggio accurato delle entità, favorendo il rilevamento proattivo delle minacce.
  • Decisioni informate: Il conteggio degli oggetti offre spunti preziosi per il processo decisionale, ottimizzando i processi nella vendita al dettaglio, nella gestione del traffico e in vari altri settori.

Applicazioni nel mondo reale

Logistica Acquacoltura
Nastro trasportatore conta pacchetti utilizzando Ultralytics YOLOv8 Conteggio dei pesci in mare utilizzando Ultralytics YOLOv8
Nastro trasportatore conta pacchetti utilizzando Ultralytics YOLOv8 Conteggio dei pesci in mare utilizzando Ultralytics YOLOv8

Esempio di conteggio degli oggetti con YOLOv8

import cv2

from ultralytics import YOLO, solutions

model = YOLO("yolov8n.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))

# Define region points
region_points = [(20, 400), (1080, 404), (1080, 360), (20, 360)]

# Video writer
video_writer = cv2.VideoWriter("object_counting_output.avi", cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))

# Init Object Counter
counter = solutions.ObjectCounter(
    view_img=True,
    reg_pts=region_points,
    names=model.names,
    draw_tracks=True,
    line_thickness=2,
)

while cap.isOpened():
    success, im0 = cap.read()
    if not success:
        print("Video frame is empty or video processing has been successfully completed.")
        break
    tracks = model.track(im0, persist=True, show=False)

    im0 = counter.start_counting(im0, tracks)
    video_writer.write(im0)

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

from ultralytics import YOLO, solutions

model = YOLO("yolov8n.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))

# Define region points as a polygon with 5 points
region_points = [(20, 400), (1080, 404), (1080, 360), (20, 360), (20, 400)]

# Video writer
video_writer = cv2.VideoWriter("object_counting_output.avi", cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))

# Init Object Counter
counter = solutions.ObjectCounter(
    view_img=True,
    reg_pts=region_points,
    names=model.names,
    draw_tracks=True,
    line_thickness=2,
)

while cap.isOpened():
    success, im0 = cap.read()
    if not success:
        print("Video frame is empty or video processing has been successfully completed.")
        break
    tracks = model.track(im0, persist=True, show=False)

    im0 = counter.start_counting(im0, tracks)
    video_writer.write(im0)

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

from ultralytics import YOLO, solutions

model = YOLO("yolov8n.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))

# Define line points
line_points = [(20, 400), (1080, 400)]

# Video writer
video_writer = cv2.VideoWriter("object_counting_output.avi", cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))

# Init Object Counter
counter = solutions.ObjectCounter(
    view_img=True,
    reg_pts=line_points,
    names=model.names,
    draw_tracks=True,
    line_thickness=2,
)

while cap.isOpened():
    success, im0 = cap.read()
    if not success:
        print("Video frame is empty or video processing has been successfully completed.")
        break
    tracks = model.track(im0, persist=True, show=False)

    im0 = counter.start_counting(im0, tracks)
    video_writer.write(im0)

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

from ultralytics import YOLO, solutions

model = YOLO("yolov8n.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))

line_points = [(20, 400), (1080, 400)]  # line or region points
classes_to_count = [0, 2]  # person and car classes for count

# Video writer
video_writer = cv2.VideoWriter("object_counting_output.avi", cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))

# Init Object Counter
counter = solutions.ObjectCounter(
    view_img=True,
    reg_pts=line_points,
    names=model.names,
    draw_tracks=True,
    line_thickness=2,
)

while cap.isOpened():
    success, im0 = cap.read()
    if not success:
        print("Video frame is empty or video processing has been successfully completed.")
        break
    tracks = model.track(im0, persist=True, show=False, classes=classes_to_count)

    im0 = counter.start_counting(im0, tracks)
    video_writer.write(im0)

cap.release()
video_writer.release()
cv2.destroyAllWindows()
La regione è mobile

Puoi spostare la regione in qualsiasi punto della cornice cliccando sui suoi bordi.

Argomento ObjectCounter

Ecco una tabella con i dati ObjectCounter argomenti:

Nome Tipo Predefinito Descrizione
names dict None Dizionario dei nomi delle classi.
reg_pts list [(20, 400), (1260, 400)] Elenco dei punti che definiscono la regione di conteggio.
count_reg_color tuple (255, 0, 255) Colore RGB della regione di conteggio.
count_txt_color tuple (0, 0, 0) Colore RGB del testo del conteggio.
count_bg_color tuple (255, 255, 255) Colore RGB dello sfondo del testo del conteggio.
line_thickness int 2 Spessore delle linee per i riquadri di delimitazione.
track_thickness int 2 Spessore delle linee dei binari.
view_img bool False Flag per controllare se visualizzare il flusso video.
view_in_counts bool True Flag per controllare se visualizzare o meno i conteggi nel flusso video.
view_out_counts bool True Flag per controllare se visualizzare i conteggi di uscita nel flusso video.
draw_tracks bool False Flag per controllare se disegnare o meno le tracce dell'oggetto.
track_color tuple None Colore RGB delle tracce.
region_thickness int 5 Spessore della regione di conteggio dell'oggetto.
line_dist_thresh int 15 Soglia della distanza euclidea per il contatore di linee.
cls_txtdisplay_gap int 50 Visualizza l'intervallo tra il conteggio di ogni classe.

Argomenti model.track

Nome Tipo Predefinito Descrizione
source im0 None directory di origine per le immagini o i video
persist bool False persistenza dei brani tra i fotogrammi
tracker str botsort.yaml Metodo di tracciamento 'bytetrack' o 'botsort'
conf float 0.3 Soglia di fiducia
iou float 0.5 Soglia IOU
classes list None filtrare i risultati per classe, ad esempio classi=0 o classi=[0,2,3].
verbose bool True Visualizza i risultati del tracciamento dell'oggetto

DOMANDE FREQUENTI

Come faccio a contare gli oggetti in un video utilizzando Ultralytics YOLOv8 ?

Per contare gli oggetti in un video utilizzando Ultralytics YOLOv8 , puoi seguire i seguenti passaggi:

  1. Importa le librerie necessarie (cv2, ultralytics).
  2. Carica un modello preaddestrato di YOLOv8 .
  3. Definisci la regione di conteggio (ad esempio, un poligono, una linea, ecc.).
  4. Imposta l'acquisizione video e inizializza il contatore degli oggetti.
  5. Elabora ogni fotogramma per tracciare gli oggetti e contarli all'interno della regione definita.

Ecco un semplice esempio di conteggio in una regione:

import cv2

from ultralytics import YOLO, solutions


def count_objects_in_region(video_path, output_video_path, model_path):
    """Count objects in a specific region within a video."""
    model = YOLO(model_path)
    cap = cv2.VideoCapture(video_path)
    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))
    region_points = [(20, 400), (1080, 404), (1080, 360), (20, 360)]
    video_writer = cv2.VideoWriter(output_video_path, cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))
    counter = solutions.ObjectCounter(
        view_img=True, reg_pts=region_points, names=model.names, draw_tracks=True, line_thickness=2
    )

    while cap.isOpened():
        success, im0 = cap.read()
        if not success:
            print("Video frame is empty or video processing has been successfully completed.")
            break
        tracks = model.track(im0, persist=True, show=False)
        im0 = counter.start_counting(im0, tracks)
        video_writer.write(im0)

    cap.release()
    video_writer.release()
    cv2.destroyAllWindows()


count_objects_in_region("path/to/video.mp4", "output_video.avi", "yolov8n.pt")

Esplora altre configurazioni e opzioni nella sezione Conteggio oggetti.

Quali sono i vantaggi dell'utilizzo di Ultralytics YOLOv8 per il conteggio degli oggetti?

L'utilizzo di Ultralytics YOLOv8 per il conteggio degli oggetti offre diversi vantaggi:

  1. Ottimizzazione delle risorse: Facilita una gestione efficiente delle risorse fornendo conteggi accurati, aiutando a ottimizzare l'allocazione delle risorse in settori come la gestione dell'inventario.
  2. Maggiore sicurezza: Migliora la sicurezza e la sorveglianza grazie al tracciamento e al conteggio accurato delle entità, favorendo il rilevamento proattivo delle minacce.
  3. Processo decisionale informato: Offre preziosi spunti per il processo decisionale, ottimizzando i processi in settori come la vendita al dettaglio, la gestione del traffico e altri ancora.

Per applicazioni reali ed esempi di codice, visita la sezione Vantaggi del conteggio degli oggetti.

Come posso contare classi specifiche di oggetti utilizzando Ultralytics YOLOv8 ?

Per contare classi specifiche di oggetti utilizzando Ultralytics YOLOv8 , devi specificare le classi a cui sei interessato durante la fase di tracciamento. Di seguito è riportato un esempio Python :

import cv2

from ultralytics import YOLO, solutions


def count_specific_classes(video_path, output_video_path, model_path, classes_to_count):
    """Count specific classes of objects in a video."""
    model = YOLO(model_path)
    cap = cv2.VideoCapture(video_path)
    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))
    line_points = [(20, 400), (1080, 400)]
    video_writer = cv2.VideoWriter(output_video_path, cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))
    counter = solutions.ObjectCounter(
        view_img=True, reg_pts=line_points, names=model.names, draw_tracks=True, line_thickness=2
    )

    while cap.isOpened():
        success, im0 = cap.read()
        if not success:
            print("Video frame is empty or video processing has been successfully completed.")
            break
        tracks = model.track(im0, persist=True, show=False, classes=classes_to_count)
        im0 = counter.start_counting(im0, tracks)
        video_writer.write(im0)

    cap.release()
    video_writer.release()
    cv2.destroyAllWindows()


count_specific_classes("path/to/video.mp4", "output_specific_classes.avi", "yolov8n.pt", [0, 2])

In questo esempio, classes_to_count=[0, 2], il che significa che conta gli oggetti della classe 0 e 2 (ad esempio, persona e auto).

Perché dovrei usare YOLOv8 rispetto ad altri modelli di rilevamento degli oggetti per le applicazioni in tempo reale?

Ultralytics YOLOv8 offre diversi vantaggi rispetto ad altri modelli di rilevamento degli oggetti come Faster R-CNN, SSD e le precedenti versioni di YOLO :

  1. Velocità ed efficienza: YOLOv8 offre capacità di elaborazione in tempo reale, rendendolo ideale per le applicazioni che richiedono un'inferenza ad alta velocità, come la sorveglianza e la guida autonoma.
  2. Precisione: offre un'accuratezza all'avanguardia per le attività di rilevamento e tracciamento degli oggetti, riducendo il numero di falsi positivi e migliorando l'affidabilità complessiva del sistema.
  3. Facilità di integrazione: YOLOv8 offre un'integrazione perfetta con diverse piattaforme e dispositivi, compresi i dispositivi mobili ed edge, che sono fondamentali per le moderne applicazioni di intelligenza artificiale.
  4. Flessibilità: Supporta diverse attività come il rilevamento, la segmentazione e il tracciamento degli oggetti con modelli configurabili per soddisfare i requisiti di casi d'uso specifici.

Dai un'occhiata alladocumentazione di Ultralytics YOLOv8 per approfondire le sue caratteristiche e confrontare le prestazioni.

Posso utilizzare YOLOv8 per applicazioni avanzate come l'analisi della folla e la gestione del traffico?

Sì, Ultralytics YOLOv8 è perfettamente adatto ad applicazioni avanzate come l'analisi della folla e la gestione del traffico grazie alle sue capacità di rilevamento in tempo reale, alla scalabilità e alla flessibilità di integrazione. Le sue caratteristiche avanzate consentono di tracciare, contare e classificare gli oggetti con grande precisione in ambienti dinamici. Alcuni esempi di utilizzo sono:

  • Analisi delle folle: Controlla e gestisce i grandi raduni, garantendo la sicurezza e ottimizzando il flusso della folla.
  • Gestione del traffico: Traccia e conta i veicoli, analizza i modelli di traffico e gestisce la congestione in tempo reale.

Per maggiori informazioni e dettagli sull'implementazione, consulta la guida sulle applicazioni reali del conteggio degli oggetti con YOLOv8.



Creato 2023-12-02, Aggiornato 2024-07-14
Autori: RizwanMunawar (6), glenn-jocher (15), IvorZhu331 (1), AyushExel (1)

Commenti