Zum Inhalt springen

Analytik mit Ultralytics YOLOv8

EinfĂŒhrung

Dieser Leitfaden bietet einen umfassenden Überblick ĂŒber drei grundlegende Arten von Datenvisualisierungen: Liniendiagramme, Balkendiagramme und Kreisdiagramme. Jeder Abschnitt enthĂ€lt Schritt-fĂŒr-Schritt-Anleitungen und Codeschnipsel, wie du diese Visualisierungen mit Python erstellen kannst.

Visuelle Muster

Liniendiagramm Bar Plot Tortendiagramm
Liniendiagramm Bar Plot Tortendiagramm

Warum Diagramme wichtig sind

  • Liniendiagramme sind ideal, um VerĂ€nderungen ĂŒber kurze und lange ZeitrĂ€ume zu verfolgen und um VerĂ€nderungen fĂŒr mehrere Gruppen ĂŒber denselben Zeitraum zu vergleichen.
  • Balkendiagramme hingegen eignen sich fĂŒr den Vergleich von Mengen ĂŒber verschiedene Kategorien hinweg und zeigen Beziehungen zwischen einer Kategorie und ihrem Zahlenwert.
  • Schließlich sind Kreisdiagramme gut geeignet, um die Proportionen zwischen den Kategorien zu veranschaulichen und Teile eines Ganzen darzustellen.

Analytik Beispiele

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

Argument Analytics

Hier ist eine Tabelle mit den Analytics Argumente:

Name Typ Standard Beschreibung
type str None Art der Daten oder des Objekts.
im0_shape tuple None Die Form des Ausgangsbildes.
writer cv2.VideoWriter None Objekt zum Schreiben von Videodateien.
title str ultralytics Titel fĂŒr die Visualisierung.
x_label str x Beschriftung fĂŒr die x-Achse.
y_label str y Beschriftung fĂŒr die y-Achse.
bg_color str white Hintergrundfarbe.
fg_color str black Vordergrundfarbe.
line_color str yellow Farbe der Linien.
line_width int 2 Breite der Linien.
fontsize int 13 SchriftgrĂ¶ĂŸe fĂŒr Text.
view_img bool False Flagge, um das Bild oder Video anzuzeigen.
save_img bool True Flagge, um das Bild oder Video zu speichern.
max_points int 50 Bei mehreren Linien die Gesamtzahl der auf dem Rahmen gezeichneten Punkte, bevor die Anfangspunkte gelöscht werden.
points_width int 15 Textmarker fĂŒr die Breite der Linienpunkte.

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

Fazit

FĂŒr eine effektive Datenanalyse ist es wichtig zu wissen, wann und wie du die verschiedenen Arten von Visualisierungen einsetzen solltest. Liniendiagramme, Balkendiagramme und Tortendiagramme sind grundlegende Werkzeuge, die dir helfen können, die Geschichte deiner Daten klarer und effektiver zu vermitteln.

FAQ

Wie erstelle ich ein Liniendiagramm mit Ultralytics YOLOv8 Analytics?

Um mit Ultralytics YOLOv8 Analytics ein Liniendiagramm zu erstellen, befolge diese Schritte:

  1. Lade ein YOLOv8 Modell und öffne deine Videodatei.
  2. Initialisiere die Analytics Klasse, wobei der Typ auf "Linie" eingestellt ist.
  3. Iteriere durch die Videobilder und aktualisiere das Liniendiagramm mit relevanten Daten, z. B. der Anzahl der Objekte pro Bild.
  4. Speichere das Ausgabevideo, das das Liniendiagramm anzeigt.

Beispiel:

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

FĂŒr weitere Details zur Konfiguration der Analytics class, visit the Analytik mit Ultralytics YOLOv8 📊 Abschnitt.

Welche Vorteile hat die Verwendung von Ultralytics YOLOv8 fĂŒr die Erstellung von Balkendiagrammen?

Die Verwendung von Ultralytics YOLOv8 zur Erstellung von Balkendiagrammen bietet mehrere Vorteile:

  1. Real-time Data Visualization: Seamlessly integrate object detection results into bar plots for dynamic updates.
  2. Ease of Use: Simple API and functions make it straightforward to implement and visualize data.
  3. Customization: Customize titles, labels, colors, and more to fit your specific requirements.
  4. Efficiency: Efficiently handle large amounts of data and update plots in real-time during video processing.

Verwende das folgende Beispiel, um ein Balkendiagramm zu erstellen:

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

To learn more, visit the Bar Plot section in the guide.

Warum sollte ich Ultralytics YOLOv8 fĂŒr die Erstellung von Kreisdiagrammen in meinen Datenvisualisierungsprojekten verwenden?

Ultralytics YOLOv8 eignet sich hervorragend fĂŒr die Erstellung von Kreisdiagrammen, denn:

  1. Integration with Object Detection: Directly integrate object detection results into pie charts for immediate insights.
  2. User-Friendly API: Simple to set up and use with minimal code.
  3. Customizable: Various customization options for colors, labels, and more.
  4. Real-time Updates: Handle and visualize data in real-time, which is ideal for video analytics projects.

Hier ist ein kurzes Beispiel:

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

For more information, refer to the Pie Chart section in the guide.

Kann Ultralytics YOLOv8 verwendet werden, um Objekte zu verfolgen und Visualisierungen dynamisch zu aktualisieren?

Ja, Ultralytics YOLOv8 kann verwendet werden, um Objekte zu verfolgen und Visualisierungen dynamisch zu aktualisieren. Es unterstĂŒtzt die Verfolgung mehrerer Objekte in Echtzeit und kann verschiedene Visualisierungen wie Liniendiagramme, Balkendiagramme und Kreisdiagramme auf der Grundlage der Daten der verfolgten Objekte aktualisieren.

Beispiel fĂŒr das Verfolgen und Aktualisieren eines Liniendiagramms:

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

To learn about the complete functionality, see the Tracking section.

Was unterscheidet Ultralytics YOLOv8 von anderen Objekterkennungslösungen wie OpenCV und TensorFlow?

Ultralytics YOLOv8 hebt sich aus mehreren GrĂŒnden von anderen Objekterkennungslösungen wie OpenCV und TensorFlow ab:

  1. State-of-the-art Accuracy: YOLOv8 provides superior accuracy in object detection, segmentation, and classification tasks.
  2. Ease of Use: User-friendly API allows for quick implementation and integration without extensive coding.
  3. Real-time Performance: Optimized for high-speed inference, suitable for real-time applications.
  4. Diverse Applications: Supports various tasks including multi-object tracking, custom model training, and exporting to different formats like ONNX, TensorRT, and CoreML.
  5. Comprehensive Documentation: Extensive documentation and blog resources to guide users through every step.

For more detailed comparisons and use cases, explore our Ultralytics Blog.



Created 2024-05-23, Updated 2024-07-05
Authors: glenn-jocher (4), IvorZhu331 (1), RizwanMunawar (3)

Kommentare