Zum Inhalt springen

Fortgeschrittene Datenvisualisierung: Heatmaps mit Ultralytics YOLOv8 🚀

EinfĂŒhrung in Heatmaps

Eine Heatmap, die mit Ultralytics YOLOv8 erstellt wird, verwandelt komplexe Daten in eine lebendige, farbcodierte Matrix. Dieses visuelle Werkzeug verwendet ein Farbspektrum, um unterschiedliche Datenwerte darzustellen, wobei wĂ€rmere Farbtöne fĂŒr höhere IntensitĂ€ten und kĂŒhlere Töne fĂŒr niedrigere Werte stehen. Heatmaps eignen sich hervorragend zur Visualisierung komplexer Datenmuster, Korrelationen und Anomalien und bieten einen zugĂ€nglichen und ansprechenden Ansatz fĂŒr die Interpretation von Daten in verschiedenen Bereichen.



Pass auf: Heatmaps mit Ultralytics YOLOv8

Warum sollten wir Heatmaps fĂŒr die Datenanalyse wĂ€hlen?

  • Intuitive Visualisierung der Datenverteilung: Heatmaps vereinfachen das VerstĂ€ndnis der Datenkonzentration und -verteilung und wandeln komplexe DatensĂ€tze in leicht verstĂ€ndliche visuelle Formate um.
  • Effiziente Erkennung von Mustern: Durch die Visualisierung der Daten im Heatmap-Format ist es einfacher, Trends, Cluster und Ausreißer zu erkennen, was schnellere Analysen und Erkenntnisse ermöglicht.
  • Verbesserte rĂ€umliche Analyse und Entscheidungsfindung: Heatmaps dienen der Veranschaulichung rĂ€umlicher ZusammenhĂ€nge und helfen bei Entscheidungsprozessen in Bereichen wie Business Intelligence, Umweltstudien und Stadtplanung.

Anwendungen in der realen Welt

Transport Einzelhandel
Ultralytics YOLOv8 Transport Heatmap Ultralytics YOLOv8 Einzelhandel Heatmap
Ultralytics YOLOv8 Transport Heatmap Ultralytics YOLOv8 Einzelhandel Heatmap

Heatmap-Konfiguration

  • heatmap_alpha: Achte darauf, dass dieser Wert innerhalb des Bereichs (0,0 - 1,0) liegt.
  • decay_factor: Wird verwendet, um die Heatmap zu entfernen, wenn ein Objekt nicht mehr im Bild ist. Der Wert sollte ebenfalls im Bereich (0,0 - 1,0) liegen.

Heatmaps mit Ultralytics 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))

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

# Init heatmap
heatmap_obj = solutions.Heatmap(
    colormap=cv2.COLORMAP_PARULA,
    view_img=True,
    shape="circle",
    classes_names=model.names,
)

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 = heatmap_obj.generate_heatmap(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))

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

line_points = [(20, 400), (1080, 404)]  # line for object counting

# Init heatmap
heatmap_obj = solutions.Heatmap(
    colormap=cv2.COLORMAP_PARULA,
    view_img=True,
    shape="circle",
    count_reg_pts=line_points,
    classes_names=model.names,
)

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 = heatmap_obj.generate_heatmap(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))

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

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

# Init heatmap
heatmap_obj = solutions.Heatmap(
    colormap=cv2.COLORMAP_PARULA,
    view_img=True,
    shape="circle",
    count_reg_pts=region_points,
    classes_names=model.names,
)

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 = heatmap_obj.generate_heatmap(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))

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

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

# Init heatmap
heatmap_obj = solutions.Heatmap(
    colormap=cv2.COLORMAP_PARULA,
    view_img=True,
    shape="circle",
    count_reg_pts=region_points,
    classes_names=model.names,
)

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 = heatmap_obj.generate_heatmap(im0, tracks)
    video_writer.write(im0)

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

from ultralytics import YOLO, solutions

model = YOLO("yolov8s.pt")  # YOLOv8 custom/pretrained model

im0 = cv2.imread("path/to/image.png")  # path to image file
h, w = im0.shape[:2]  # image height and width

# Heatmap Init
heatmap_obj = solutions.Heatmap(
    colormap=cv2.COLORMAP_PARULA,
    view_img=True,
    shape="circle",
    classes_names=model.names,
)

results = model.track(im0, persist=True)
im0 = heatmap_obj.generate_heatmap(im0, tracks=results)
cv2.imwrite("ultralytics_output.png", im0)
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))

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

classes_for_heatmap = [0, 2]  # classes for heatmap

# Init heatmap
heatmap_obj = solutions.Heatmap(
    colormap=cv2.COLORMAP_PARULA,
    view_img=True,
    shape="circle",
    classes_names=model.names,
)

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

    im0 = heatmap_obj.generate_heatmap(im0, tracks)
    video_writer.write(im0)

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

Argumente Heatmap()

Name Typ Standard Beschreibung
classes_names dict None Wörterbuch der Klassennamen.
imw int 0 Bildbreite.
imh int 0 Bildhöhe.
colormap int cv2.COLORMAP_JET Farbkarte, die fĂŒr die Heatmap verwendet werden soll.
heatmap_alpha float 0.5 Alpha-Blending-Wert fĂŒr die Überlagerung der Heatmap.
view_img bool False Ob das Bild mit dem Heatmap-Overlay angezeigt werden soll.
view_in_counts bool True Ob die Anzahl der Objekte angezeigt werden soll, die die Region betreten.
view_out_counts bool True Ob die Anzahl der Objekte, die die Region verlassen, angezeigt werden soll.
count_reg_pts list oder None None Punkte, die den ZĂ€hlbereich definieren (entweder eine Linie oder ein Polygon).
count_txt_color tuple (0, 0, 0) Textfarbe fĂŒr die Anzeige der ZĂ€hlungen.
count_bg_color tuple (255, 255, 255) Hintergrundfarbe fĂŒr die Anzeige der ZĂ€hlungen.
count_reg_color tuple (255, 0, 255) Farbe fĂŒr die ZĂ€hlregion.
region_thickness int 5 Die Dicke der Regionslinie.
line_dist_thresh int 15 Abstandsschwelle fĂŒr die zeilenbasierte ZĂ€hlung.
line_thickness int 2 Dicke der beim Zeichnen verwendeten Linien.
decay_factor float 0.99 Abklingfaktor fĂŒr die Heatmap, um die IntensitĂ€t mit der Zeit zu verringern.
shape str "circle" Form der Heatmap-Blobs ("Kreis" oder "Rechteck").

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]

Heatmap COLORMAPs

Colormap Name Beschreibung
cv::COLORMAP_AUTUMN Farbkarte Herbst
cv::COLORMAP_BONE Knochen-Farbkarte
cv::COLORMAP_JET Jet-Farbkarte
cv::COLORMAP_WINTER Farbkarte Winter
cv::COLORMAP_RAINBOW Regenbogen-Farbkarte
cv::COLORMAP_OCEAN Farbkarte Ozean
cv::COLORMAP_SUMMER Sommer Farbkarte
cv::COLORMAP_SPRING Farbkarte FrĂŒhling
cv::COLORMAP_COOL Coole Farbkarte
cv::COLORMAP_HSV HSV (Farbton, SĂ€ttigung, Wert) Farbkarte
cv::COLORMAP_PINK Rosa Farbkarte
cv::COLORMAP_HOT Heiße Farbkarte
cv::COLORMAP_PARULA Parula Farbkarte
cv::COLORMAP_MAGMA Magma Farbkarte
cv::COLORMAP_INFERNO Inferno Farbkarte
cv::COLORMAP_PLASMA Plasma-Farbkarte
cv::COLORMAP_VIRIDIS Viridis Farbkarte
cv::COLORMAP_CIVIDIS Cividis Farbkarte
cv::COLORMAP_TWILIGHT Farbkarte der DĂ€mmerung
cv::COLORMAP_TWILIGHT_SHIFTED Verschobene Farbkarte der DĂ€mmerung
cv::COLORMAP_TURBO Turbo Farbkarte
cv::COLORMAP_DEEPGREEN Deep Green Farbkarte

Diese Farbkarten werden hÀufig zur Visualisierung von Daten mit verschiedenen Farbdarstellungen verwendet.



Created 2023-12-07, Updated 2024-06-10
Authors: glenn-jocher (11), IvorZhu331 (1), RizwanMunawar (8), AyushExel (1), 1579093407@qq.com (1)

Kommentare