Salta para o conteúdo

Visualização avançada de dados: Heatmaps usando Ultralytics YOLOv8 🚀

Introdução aos mapas de calor

Um mapa de calor gerado com Ultralytics YOLOv8 transforma dados complexos numa matriz vibrante e codificada por cores. Esta ferramenta visual utiliza um espetro de cores para representar valores de dados variáveis, em que os tons mais quentes indicam intensidades mais elevadas e os tons mais frios significam valores mais baixos. Os mapas de calor são excelentes na visualização de padrões de dados intrincados, correlações e anomalias, oferecendo uma abordagem acessível e envolvente à interpretação de dados em diversos domínios.



Observa: Mapas de calor utilizando Ultralytics YOLOv8

Porquê escolher mapas de calor para análise de dados?

  • Visualização intuitiva da distribuição de dados: Os mapas de calor simplificam a compreensão da concentração e distribuição de dados, convertendo conjuntos de dados complexos em formatos visuais fáceis de compreender.
  • Deteção eficiente de padrões: Ao visualizar os dados em formato de mapa de calor, torna-se mais fácil detetar tendências, clusters e outliers, facilitando uma análise mais rápida e insights.
  • Melhoria da análise espacial e da tomada de decisões: Os mapas de calor são fundamentais para ilustrar as relações espaciais, ajudando nos processos de tomada de decisões em sectores como a inteligência empresarial, os estudos ambientais e o planeamento urbano.

Aplicações no mundo real

Transporte Retalho
Ultralytics YOLOv8 Mapa de calor dos transportes Ultralytics YOLOv8 Mapa de calor do retalho
Ultralytics YOLOv8 Mapa de calor dos transportes Ultralytics YOLOv8 Mapa de calor do retalho

Configuração do mapa de calor

  • heatmap_alpha: Certifica-te de que este valor se encontra no intervalo (0,0 - 1,0).
  • decay_factor: Usado para remover o mapa de calor depois de um objeto já não estar no quadro, o seu valor também deve estar no intervalo (0,0 - 1,0).

Mapas de calor utilizando Ultralytics YOLOv8 Exemplo

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

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)

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)

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

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

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

Nome Tipo Predefinição Descrição
view_img bool False Apresenta o quadro com o mapa de calor
colormap cv2.COLORMAP None cv2.COLORMAP para o mapa térmico
imw int None Largura do mapa de calor
imh int None Altura do mapa de calor
heatmap_alpha float 0.5 Valor alfa do mapa de calor
count_reg_pts list None Pontos da região de contagem de objectos
count_txt_thickness int 2 Conta os valores do tamanho do texto
count_txt_color RGB Color (0, 0, 0) Cor de primeiro plano para o texto de contagem de objectos
count_color RGB Color (255, 255, 255) Cor de fundo para o texto de contagem de objectos
count_reg_color RGB Color (255, 0, 255) Cor da região de contagem
region_thickness int 5 Valor da espessura da região de contagem
decay_factor float 0.99 Fator de decaimento para a remoção da área do mapa de calor após um tempo específico
shape str circle Forma do mapa de calor para visualização "rect" ou "círculo" suportada
line_dist_thresh int 15 Limiar da distância euclidiana para o contador de linhas

Argumentos model.track

Nome Tipo Predefinição Descrição
source im0 None diretório de origem para imagens ou vídeos
persist bool False persistência de faixas entre fotogramas
tracker str botsort.yaml Método de rastreio "bytetrack" ou "botsort
conf float 0.3 Limiar de confiança
iou float 0.5 Limiar IOU
classes list None filtra os resultados por classe, ou seja, classes=0, ou classes=[0,2,3]

Mapa térmico COLORMAPs

Nome do mapa de cores Descrição
cv::COLORMAP_AUTUMN Mapa de cores do outono
cv::COLORMAP_BONE Mapa de cores dos ossos
cv::COLORMAP_JET Mapa de cores do jato
cv::COLORMAP_WINTER Mapa de cores de inverno
cv::COLORMAP_RAINBOW Mapa de cores do arco-íris
cv::COLORMAP_OCEAN Mapa de cores dos oceanos
cv::COLORMAP_SUMMER Mapa de cores do verão
cv::COLORMAP_SPRING Mapa de cores da primavera
cv::COLORMAP_COOL Mapa de cores fixe
cv::COLORMAP_HSV Mapa de cores HSV (Matiz, Saturação, Valor)
cv::COLORMAP_PINK Mapa cor-de-rosa
cv::COLORMAP_HOT Mapa de cores quentes
cv::COLORMAP_PARULA Mapa de cores de Parula
cv::COLORMAP_MAGMA Mapa de cores do magma
cv::COLORMAP_INFERNO Mapa de cores do Inferno
cv::COLORMAP_PLASMA Mapa de cores do plasma
cv::COLORMAP_VIRIDIS Mapa de cores de Viridis
cv::COLORMAP_CIVIDIS Mapa de cores de Cividis
cv::COLORMAP_TWILIGHT Mapa de cores do crepúsculo
cv::COLORMAP_TWILIGHT_SHIFTED Mapa de cores do crepúsculo deslocado
cv::COLORMAP_TURBO Mapa de cores do turbo
cv::COLORMAP_DEEPGREEN Mapa de cores verde profundo

Estes mapas de cores são normalmente utilizados para visualizar dados com diferentes representações de cores.



Criado em 2023-12-07, Atualizado em 2024-02-03
Autores: glenn-jocher (7), AyushExel (1), chr043416@gmail.com (6), 1579093407@qq.com (1)

Comentários