Skip to content

Comptage d'objets à l'aide de Ultralytics YOLOv8 🚀

Qu'est-ce que le comptage d'objets ?

Le comptage d'objets avec Ultralytics YOLOv8 implique l'identification et le comptage précis d'objets spécifiques dans les vidéos et les flux de caméras. YOLOv8 excelle dans les applications en temps réel, en fournissant un comptage d'objets efficace et précis pour divers scénarios tels que l'analyse des foules et la surveillance, grâce à ses algorithmes de pointe et à ses capacités d'apprentissage profond.



Regarde : Comptage d'objets Ă  l'aide de Ultralytics YOLOv8

Avantages du comptage d'objets ?

  • Optimisation des ressources : Le comptage d'objets facilite la gestion efficace des ressources en fournissant des comptages prĂ©cis et en optimisant l'allocation des ressources dans des applications telles que la gestion des stocks.
  • SĂ©curitĂ© renforcĂ©e : Le comptage d'objets amĂ©liore la sĂ©curitĂ© et la surveillance en suivant et en comptant avec prĂ©cision les entitĂ©s, ce qui permet une dĂ©tection proactive des menaces.
  • Prise de dĂ©cision Ă©clairĂ©e : Le comptage d'objets offre des informations prĂ©cieuses pour la prise de dĂ©cision, l'optimisation des processus dans le commerce de dĂ©tail, la gestion du trafic et divers autres domaines.

Applications dans le monde réel

Logistique Aquaculture
Comptage de paquets sur bande transporteuse Utilisation Ultralytics YOLOv8 Compter les poissons dans la mer en utilisant Ultralytics YOLOv8
Comptage de paquets sur bande transporteuse Utilisation Ultralytics YOLOv8 Compter les poissons dans la mer en utilisant Ultralytics YOLOv8

Comptage d'objets Ă  l'aide de YOLOv8 Exemple

from ultralytics import YOLO
from ultralytics.solutions import object_counter
import cv2

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 = object_counter.ObjectCounter()
counter.set_args(view_img=True,
                 reg_pts=region_points,
                 classes_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()
from ultralytics import YOLO
from ultralytics.solutions import object_counter
import cv2

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 = object_counter.ObjectCounter()
counter.set_args(view_img=True,
                 reg_pts=region_points,
                 classes_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()
from ultralytics import YOLO
from ultralytics.solutions import object_counter
import cv2

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 = object_counter.ObjectCounter()
counter.set_args(view_img=True,
                 reg_pts=line_points,
                 classes_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()
from ultralytics import YOLO
from ultralytics.solutions import object_counter
import cv2

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 = object_counter.ObjectCounter()
counter.set_args(view_img=True,
                 reg_pts=line_points,
                 classes_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 région est mobile

Tu peux déplacer la région n'importe où dans le cadre en cliquant sur ses bords

Arguments facultatifs set_args

Nom Type DĂ©faut Description
view_img bool False Afficher les cadres avec les décomptes
view_in_counts bool True Afficher les entrées uniquement sur l'image vidéo
view_out_counts bool True Afficher les décomptes uniquement sur l'image vidéo
line_thickness int 2 Augmente les boîtes de délimitation et compte l'épaisseur du texte
reg_pts list [(20, 400), (1260, 400)] Points définissant la zone de la région
classes_names dict model.model.names Dictionnaire des noms de classe
count_reg_color RGB Color (255, 0, 255) Couleur de l'objet, de la région de comptage ou de la ligne
track_thickness int 2 Épaisseur des lignes de suivi
draw_tracks bool False Permettre de dessiner des lignes de suivi
track_color RGB Color (0, 255, 0) Couleur pour chaque ligne de piste
line_dist_thresh int 15 Seuil de la distance euclidienne pour le compteur de lignes
count_txt_color RGB Color (255, 255, 255) Couleur de premier plan pour le texte des comptes d'objets
region_thickness int 5 Épaisseur de la contre-région ou de la ligne de l'objet
count_bg_color RGB Color (255, 255, 255) Compte la couleur du surligneur

Arguments model.track

Nom Type DĂ©faut Description
source im0 None répertoire source pour les images ou les vidéos
persist bool False persistance des pistes entre les images
tracker str botsort.yaml MĂ©thode de suivi 'bytetrack' ou 'botsort'
conf float 0.3 Seuil de confiance
iou float 0.5 Seuil de reconnaissance de dette
classes list None filtre les résultats par classe, c'est-à-dire classes=0, ou classes=[0,2,3]
verbose bool True Affiche les résultats du suivi des objets


Créé le 2023-12-02, Mis à jour le 2024-04-18
Auteurs : glenn-jocher (9), RizwanMunawar (1), AyushExel (1)

Commentaires