Saltar al contenido

Visualización avanzada de datos: Mapas de calor con Ultralytics YOLOv8 🚀

Introducción a los mapas de calor

Un mapa de calor generado con Ultralytics YOLOv8 transforma datos complejos en una vibrante matriz codificada por colores. Esta herramienta visual emplea un espectro de colores para representar los distintos valores de los datos, donde los tonos más cálidos indican intensidades más altas y los tonos más fríos significan valores más bajos. Los mapas de calor destacan en la visualización de intrincados patrones de datos, correlaciones y anomalías, ofreciendo un enfoque accesible y atractivo para la interpretación de datos en diversos dominios.



Observa: Mapas de calor con Ultralytics YOLOv8

¿Por qué elegir mapas de calor para el análisis de datos?

  • Visualización intuitiva de la distribución de los datos: Los mapas de calor simplifican la comprensión de la concentración y distribución de los datos, convirtiendo conjuntos de datos complejos en formatos visuales fáciles de entender.
  • Detección eficaz de patrones: Al visualizar los datos en formato de mapa de calor, resulta más fácil detectar tendencias, agrupaciones y valores atípicos, lo que facilita un análisis y una comprensión más rápidos.
  • Mejora del análisis espacial y la toma de decisiones: Los mapas de calor son fundamentales para ilustrar las relaciones espaciales, ayudando en los procesos de toma de decisiones en sectores como la inteligencia empresarial, los estudios medioambientales y la planificación urbana.

Aplicaciones en el mundo real

Transporte Venta al por menor
Ultralytics YOLOv8 Mapa de calor del transporte Ultralytics YOLOv8 Mapa de calor del comercio minorista
Ultralytics YOLOv8 Mapa de calor del transporte Ultralytics YOLOv8 Mapa de calor del comercio minorista

Configuración del mapa de calor

  • heatmap_alpha: Asegúrate de que este valor está dentro del intervalo (0,0 - 1,0).
  • decay_factor: Se utiliza para eliminar el mapa de calor cuando un objeto ya no está en el fotograma, su valor también debe estar en el intervalo (0,0 - 1,0).

Mapas de calor utilizando Ultralytics YOLOv8 Ejemplo

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

Argumentos set_args

Nombre Tipo Por defecto Descripción
view_img bool False Visualizar el marco con mapa térmico
colormap cv2.COLORMAP None cv2.COLORMAP para el mapa térmico
imw int None Anchura del mapa térmico
imh int None Altura del mapa térmico
line_thickness int 2 Aumentar los cuadros delimitadores y contar el grosor del texto
view_in_counts bool True Mostrar recuentos de entradas sólo en el fotograma de vídeo
view_out_counts bool True Mostrar recuentos de salida sólo en el fotograma de vídeo
classes_names dict model.model.names Diccionario de nombres de clase
heatmap_alpha float 0.5 Valor alfa del mapa de calor
count_reg_pts list None Puntos de la región de recuento de objetos
count_txt_color RGB Color (0, 0, 0) Color de primer plano del texto del recuento de objetos
count_reg_color RGB Color (255, 0, 255) Color de la región de recuento
region_thickness int 5 Valor del grosor de la región de recuento
decay_factor float 0.99 Factor de decaimiento para la eliminación del área del mapa térmico tras un tiempo específico
shape str circle Forma de mapa de calor para visualización compatible con "rect" o "círculo".
line_dist_thresh int 15 Umbral de distancia euclidiana para el contador de líneas
count_bg_color RGB Color (255, 255, 255) Cuenta el color del resaltador
cls_txtdisplay_gap int 50 Mostrar el espacio entre cada recuento de clases

Argumentos model.track

Nombre Tipo Por defecto Descripción
source im0 None directorio fuente de imágenes o vídeos
persist bool False persistencia de pistas entre fotogramas
tracker str botsort.yaml Método de seguimiento 'bytetrack' o 'botsort'
conf float 0.3 Umbral de confianza
iou float 0.5 Umbral del pagaré
classes list None filtrar los resultados por clase, es decir, classes=0, o classes=[0,2,3]

Mapa térmico COLORMAPAS

Nombre del mapa de colores Descripción
cv::COLORMAP_AUTUMN Mapa de colores de otoño
cv::COLORMAP_BONE Mapa de color de los huesos
cv::COLORMAP_JET Mapa de color del chorro
cv::COLORMAP_WINTER Mapa de colores de invierno
cv::COLORMAP_RAINBOW Mapa de colores del arco iris
cv::COLORMAP_OCEAN Mapa del color del océano
cv::COLORMAP_SUMMER Mapa de colores de verano
cv::COLORMAP_SPRING Mapa de colores de primavera
cv::COLORMAP_COOL Bonito mapa de colores
cv::COLORMAP_HSV Mapa de color HSV (Tono, Saturación, Valor)
cv::COLORMAP_PINK Mapa de color rosa
cv::COLORMAP_HOT Mapa de colores calientes
cv::COLORMAP_PARULA Mapa de colores de Parula
cv::COLORMAP_MAGMA Mapa de colores del magma
cv::COLORMAP_INFERNO Mapa de colores de Inferno
cv::COLORMAP_PLASMA Mapa de colores del plasma
cv::COLORMAP_VIRIDIS Mapa de colores de Viridis
cv::COLORMAP_CIVIDIS Mapa en color de Cividis
cv::COLORMAP_TWILIGHT Mapa de colores del crepúsculo
cv::COLORMAP_TWILIGHT_SHIFTED Mapa de colores del Crepúsculo desplazado
cv::COLORMAP_TURBO Mapa de colores turbo
cv::COLORMAP_DEEPGREEN Mapa de color Verde Profundo

Estos mapas de colores se utilizan habitualmente para visualizar datos con diferentes representaciones de color.



Creado 2023-12-07, Actualizado 2024-04-05
Autores: RizwanMunawar (8), glenn-jocher (7), AyushExel (1), 1579093407@qq.com (1)

Comentarios