Zum Inhalt springen

ObjektzÀhlung mit Ultralytics YOLOv8

Was ist ObjektzÀhlung?

ObjektzĂ€hlung mit Ultralytics YOLOv8 Bei der ObjektzĂ€hlung geht es um die genaue Identifizierung und ZĂ€hlung bestimmter Objekte in Videos und Kamerastreams. YOLOv8 eignet sich hervorragend fĂŒr Echtzeitanwendungen und bietet dank modernster Algorithmen und Deep Learning-FĂ€higkeiten eine effiziente und prĂ€zise ObjektzĂ€hlung fĂŒr verschiedene Szenarien wie die Analyse von Menschenmengen und die Überwachung.


Pass auf: ObjektzÀhlung mit Ultralytics YOLOv8

Pass auf: Klassenweise ObjektzÀhlung mit Ultralytics YOLOv8

Vorteile des ObjektzÀhlens?

  • Ressourcen-Optimierung: Das ZĂ€hlen von Objekten erleichtert eine effiziente Ressourcenverwaltung, indem es genaue ZĂ€hlungen liefert und die Ressourcenzuweisung in Anwendungen wie der Bestandsverwaltung optimiert.
  • Erhöhte Sicherheit: Die ObjektzĂ€hlung verbessert die Sicherheit und Überwachung, indem sie Objekte genau verfolgt und zĂ€hlt und so zur proaktiven Erkennung von Bedrohungen beitrĂ€gt.
  • Informierte Entscheidungsfindung: Die ObjektzĂ€hlung bietet wertvolle Erkenntnisse fĂŒr die Entscheidungsfindung und die Optimierung von Prozessen im Einzelhandel, im Verkehrsmanagement und in vielen anderen Bereichen.

Anwendungen in der realen Welt

Logistik Aquakultur
Förderband Pakete zÀhlen mit Ultralytics YOLOv8 FischzÀhlung im Meer mit Ultralytics YOLOv8
Förderband Pakete zÀhlen mit Ultralytics YOLOv8 FischzÀhlung im Meer mit Ultralytics YOLOv8

ObjektzÀhlung mit YOLOv8 Beispiel

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()
Region ist beweglich

Du kannst die Region an eine beliebige Stelle im Rahmen verschieben, indem du auf ihre Kanten klickst

Argument ObjectCounter

Hier ist eine Tabelle mit den ObjectCounter Argumente:

Name Typ Standard Beschreibung
names dict None Wörterbuch der Klassennamen.
reg_pts list [(20, 400), (1260, 400)] Liste der Punkte, die die ZĂ€hlregion definieren.
count_reg_color tuple (255, 0, 255) RGB-Farbe der ZĂ€hlregion.
count_txt_color tuple (0, 0, 0) RGB-Farbe des ZĂ€hltextes.
count_bg_color tuple (255, 255, 255) RGB-Farbe des Hintergrunds des ZĂ€hltextes.
line_thickness int 2 LinienstĂ€rke fĂŒr Begrenzungsrahmen.
track_thickness int 2 Dicke der Spurlinien.
view_img bool False Flagge zur Steuerung, ob der Videostream angezeigt werden soll.
view_in_counts bool True Flagge, um festzulegen, ob die ZĂ€hlungen im Video-Stream angezeigt werden sollen.
view_out_counts bool True Flagge, um festzulegen, ob die Anzahl der AusgÀnge im Video-Stream angezeigt werden soll.
draw_tracks bool False Flagge, um festzulegen, ob die Objektspuren gezeichnet werden sollen.
track_color tuple None RGB-Farbe der Spuren.
region_thickness int 5 Dicke der ZĂ€hlregion des Objekts.
line_dist_thresh int 15 Euklidischer Abstandsschwellenwert fĂŒr den ZeilenzĂ€hler.
cls_txtdisplay_gap int 50 Zeigt den Abstand zwischen den einzelnen Klassen an.

Argumente model.track

Name Typ Standard Beschreibung
source im0 None Quellverzeichnis fĂŒr Bilder oder Videos
persist bool False Spuren zwischen Frames beibehalten
tracker str botsort.yaml Tracking-Methode 'bytetrack' oder 'botsort'
conf float 0.3 Konfidenzschwelle
iou float 0.5 IOU-Schwelle
classes list None Ergebnisse nach Klassen filtern, d.h. classes=0, oder classes=[0,2,3]
verbose bool True Anzeige der Ergebnisse der Objektverfolgung

FAQ

Wie zÀhle ich Objekte in einem Video mit Ultralytics YOLOv8 ?

Um Objekte in einem Video mit Ultralytics YOLOv8 zu zĂ€hlen, kannst du die folgenden Schritte ausfĂŒhren:

  1. Importiere die notwendigen Bibliotheken (cv2, ultralytics).
  2. Lade ein vortrainiertes YOLOv8 Modell.
  3. Definiere den ZĂ€hlbereich (z. B. ein Polygon, eine Linie usw.).
  4. Richte die Videoaufnahme ein und initialisiere den ObjektzÀhler.
  5. Verarbeite jedes Bild, um Objekte zu verfolgen und sie innerhalb der festgelegten Region zu zÀhlen.

Hier ist ein einfaches Beispiel fĂŒr das ZĂ€hlen in einer Region:

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")

Weitere Konfigurationen und Optionen findest du im Abschnitt " ObjektzÀhlung ".

Welche Vorteile hat die Verwendung von Ultralytics YOLOv8 fĂŒr die ObjektzĂ€hlung?

Die Verwendung von Ultralytics YOLOv8 fĂŒr die ObjektzĂ€hlung bietet mehrere Vorteile:

  1. Ressourcen-Optimierung: Es erleichtert ein effizientes Ressourcenmanagement, indem es genaue ZĂ€hlungen liefert und so die Ressourcenzuweisung in Branchen wie der Lagerverwaltung optimiert.
  2. Erhöhte Sicherheit: Es erhöht die Sicherheit und Überwachung, indem es Personen genau verfolgt und zĂ€hlt und so hilft, Bedrohungen proaktiv zu erkennen.
  3. Informierte Entscheidungsfindung: Sie bietet wertvolle Erkenntnisse fĂŒr die Entscheidungsfindung und optimiert Prozesse in Bereichen wie Einzelhandel, Verkehrsmanagement und mehr.

Praktische Anwendungen und Codebeispiele findest du im Abschnitt Vorteile der ObjektzÀhlung.

Wie kann ich mit Ultralytics YOLOv8 bestimmte Klassen von Objekten zÀhlen?

Um bestimmte Klassen von Objekten mit Ultralytics YOLOv8 zu zÀhlen, musst du wÀhrend der Tracking-Phase die Klassen angeben, an denen du interessiert bist. Im Folgenden findest du ein Python Beispiel:

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 diesem Beispiel, classes_to_count=[0, 2]was bedeutet, dass es Objekte der Klasse 0 und 2 (z. B. Person und Auto).

Warum sollte ich YOLOv8 gegenĂŒber anderen Objekterkennungsmodellen fĂŒr Echtzeitanwendungen verwenden?

Ultralytics YOLOv8 bietet mehrere Vorteile gegenĂŒber anderen Objekterkennungsmodellen wie Faster R-CNN, SSD und frĂŒheren Versionen von YOLO :

  1. Geschwindigkeit und Effizienz: YOLOv8 bietet Echtzeitverarbeitungsfunktionen und ist damit ideal fĂŒr Anwendungen, die Hochgeschwindigkeitsinferenzen erfordern, wie z. B. Überwachung und autonomes Fahren.
  2. Genauigkeit: Sie bietet eine hochmoderne Genauigkeit bei der Objekterkennung und -verfolgung, reduziert die Anzahl der Fehlalarme und verbessert die ZuverlÀssigkeit des Systems.
  3. Einfache Integration: YOLOv8 bietet eine nahtlose Integration mit verschiedenen Plattformen und GerĂ€ten, einschließlich Mobil- und Edge-GerĂ€ten, was fĂŒr moderne KI-Anwendungen entscheidend ist.
  4. FlexibilitĂ€t: UnterstĂŒtzt verschiedene Aufgaben wie Objekterkennung, -segmentierung und -verfolgung mit konfigurierbaren Modellen, um spezifische AnwendungsfĂ€lle zu erfĂŒllen.

Unter Ultralytics YOLOv8 findest du eine ausfĂŒhrlicheDokumentation ĂŒber die Funktionen und Leistungsvergleiche.

Kann ich YOLOv8 fĂŒr fortgeschrittene Anwendungen wie Crowd-Analyse und Verkehrsmanagement nutzen?

Ja, Ultralytics YOLOv8 eignet sich aufgrund seiner Echtzeit-Erkennungsfunktionen, seiner Skalierbarkeit und seiner IntegrationsflexibilitĂ€t perfekt fĂŒr fortschrittliche Anwendungen wie die Analyse von Menschenmengen und das Verkehrsmanagement. Seine fortschrittlichen Funktionen ermöglichen eine hochprĂ€zise Objektverfolgung, ZĂ€hlung und Klassifizierung in dynamischen Umgebungen. Beispiele fĂŒr AnwendungsfĂ€lle sind:

  • Menschenmengenanalyse: Überwache und verwalte große Versammlungen, um die Sicherheit zu gewĂ€hrleisten und den Menschenstrom zu optimieren.
  • Verkehrsmanagement: Verfolge und zĂ€hle Fahrzeuge, analysiere Verkehrsmuster und manage Staus in Echtzeit.

Weitere Informationen und Details zur Implementierung findest du im Leitfaden Real World Applications of object counting with YOLOv8.



Erstellt am 2023-12-02, Aktualisiert am 2024-07-14
Autoren: RizwanMunawar (6), glenn-jocher (15), IvorZhu331 (1), AyushExel (1)

Kommentare