Overslaan naar inhoud

Geavanceerde visualisatie van gegevens: Heatmaps met Ultralytics YOLOv8 🚀

Inleiding tot Heatmaps

Een heatmap gegenereerd met Ultralytics YOLOv8 transformeert complexe gegevens in een levendige, kleurgecodeerde matrix. Dit visuele hulpmiddel gebruikt een spectrum van kleuren om verschillende gegevenswaarden weer te geven, waarbij warmere tinten hogere intensiteiten aangeven en koelere tinten lagere waarden. Heatmaps blinken uit in het visualiseren van ingewikkelde gegevenspatronen, correlaties en anomalieën en bieden een toegankelijke en boeiende benadering voor het interpreteren van gegevens in verschillende domeinen.



Kijken: Heatmaps met Ultralytics YOLOv8

Waarom Heatmaps kiezen voor gegevensanalyse?

  • Intuïtieve visualisatie van gegevensverdeling: Heatmaps vereenvoudigen het begrip van gegevensconcentratie en -verdeling door complexe datasets om te zetten in eenvoudig te begrijpen visuele formaten.
  • Efficiënte patroonherkenning: Door gegevens te visualiseren in de vorm van een heatmap wordt het eenvoudiger om trends, clusters en uitschieters te ontdekken, waardoor analyses en inzichten sneller gaan.
  • Verbeterde ruimtelijke analyse en besluitvorming: Heatmaps zijn nuttig bij het illustreren van ruimtelijke relaties en helpen bij besluitvormingsprocessen in sectoren zoals bedrijfsinformatie, milieustudies en stadsplanning.

Toepassingen in de echte wereld

Vervoer Detailhandel
Ultralytics YOLOv8 Transport Heatmap Ultralytics YOLOv8 Heatmap detailhandel
Ultralytics YOLOv8 Transport Heatmap Ultralytics YOLOv8 Heatmap detailhandel

Configuratie heatmap

  • heatmap_alpha: Zorg ervoor dat deze waarde binnen het bereik (0,0 - 1,0) ligt.
  • decay_factor: Wordt gebruikt voor het verwijderen van de heatmap nadat een object niet langer in het frame is, de waarde moet ook in het bereik (0,0 - 1,0) liggen.

Heatmaps met Ultralytics YOLOv8 Voorbeeld

from ultralytics import YOLO
from ultralytics.solutions import heatmap
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))

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

# Init heatmap
heatmap_obj = heatmap.Heatmap()
heatmap_obj.set_args(colormap=cv2.COLORMAP_PARULA,
                     imw=w,
                     imh=h,
                     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()
from ultralytics import YOLO
from ultralytics.solutions import heatmap
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))

# 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 = heatmap.Heatmap()
heatmap_obj.set_args(colormap=cv2.COLORMAP_PARULA,
                     imw=w,
                     imh=h,
                     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()
from ultralytics import YOLO
import heatmap
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))

# 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 = heatmap.Heatmap()
heatmap_obj.set_args(colormap=cv2.COLORMAP_PARULA,
                     imw=w,
                     imh=h,
                     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()
from ultralytics import YOLO
from ultralytics.solutions import heatmap
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))

# 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 = heatmap.Heatmap()
heatmap_obj.set_args(colormap=cv2.COLORMAP_PARULA,
                     imw=w,
                     imh=h,
                     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()
from ultralytics import YOLO
from ultralytics.solutions import heatmap
import cv2

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 = heatmap.Heatmap()
heatmap_obj.set_args(colormap=cv2.COLORMAP_PARULA,
                     imw=w,
                     imh=h,
                     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)
from ultralytics import YOLO
from ultralytics.solutions import heatmap
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))

# 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 = heatmap.Heatmap()
heatmap_obj.set_args(colormap=cv2.COLORMAP_PARULA,
                     imw=w,
                     imh=h,
                     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()

Argumenten set_args

Naam Type Standaard Beschrijving
view_img bool False Het frame met heatmap weergeven
colormap cv2.COLORMAP None cv2.COLORMAP voor heatmap
imw int None Breedte van Heatmap
imh int None Hoogte van Heatmap
line_thickness int 2 Vergroot bounding boxes en tel tekstdikte
view_in_counts bool True In-tellingen alleen op videoframe weergeven
view_out_counts bool True Buitentellingen alleen op videoframe weergeven
classes_names dict model.model.names Woordenboek van klassenamen
heatmap_alpha float 0.5 Heatmap alfa-waarde
count_reg_pts list None Objecten tellen regiopunten
count_txt_color RGB Color (0, 0, 0) Voorgrondkleur voor tekst Objecttelling
count_reg_color RGB Color (255, 0, 255) Kleur telgebied
region_thickness int 5 Waarde telgebieddikte
decay_factor float 0.99 Vervalfactor voor verwijderen heatmapgebied na specifieke tijd
shape str circle Heatmapvorm voor weergave "rect" of "circle" ondersteund
line_dist_thresh int 15 Euclidische afstandsdrempel voor lijnteller
count_bg_color RGB Color (255, 255, 255) Kleur markeerstift tellen
cls_txtdisplay_gap int 50 De afstand tussen elke klassentelling weergeven

Argumenten model.track

Naam Type Standaard Beschrijving
source im0 None bronmap voor afbeeldingen of video's
persist bool False Blijvende sporen tussen frames
tracker str botsort.yaml Volgmethode 'bytetrack' of 'botsort'
conf float 0.3 Vertrouwensdrempel
iou float 0.5 Drempel IOU
classes list None filter resultaten op klasse, d.w.z. classes=0, of classes=[0,2,3]

Hittemap COLORMAPs

Naam kleurenkaart Beschrijving
cv::COLORMAP_AUTUMN Herfst kleurenkaart
cv::COLORMAP_BONE Kleurkaart botten
cv::COLORMAP_JET Jet kleurenkaart
cv::COLORMAP_WINTER Winter kleurenkaart
cv::COLORMAP_RAINBOW Regenboog kleurenkaart
cv::COLORMAP_OCEAN Oceaan kleurenkaart
cv::COLORMAP_SUMMER Zomer kleurenkaart
cv::COLORMAP_SPRING Lente kleurenkaart
cv::COLORMAP_COOL Coole kleurenkaart
cv::COLORMAP_HSV HSV (kleurtoon, verzadiging, waarde) kleurenkaart
cv::COLORMAP_PINK Roze kleurenkaart
cv::COLORMAP_HOT Hete kleurenkaart
cv::COLORMAP_PARULA Parula kleurenkaart
cv::COLORMAP_MAGMA Magma kleurenkaart
cv::COLORMAP_INFERNO Inferno kleurenkaart
cv::COLORMAP_PLASMA Plasmakleurkaart
cv::COLORMAP_VIRIDIS Viridis kleurenkaart
cv::COLORMAP_CIVIDIS Cividis kleurenkaart
cv::COLORMAP_TWILIGHT Schemering kleurenkaart
cv::COLORMAP_TWILIGHT_SHIFTED Verschoven schemeringskleurenkaart
cv::COLORMAP_TURBO Turbo kleurenkaart
cv::COLORMAP_DEEPGREEN Diepgroene kleurenkaart

Deze colormaps worden vaak gebruikt voor het visualiseren van gegevens met verschillende kleurweergaven.



Gemaakt op 2023-12-07, Bijgewerkt op 2024-04-05
Auteurs: RizwanMunawar (8), glenn-jocher (7), AyushExel (1), 1579093407@qq.com (1)

Reacties