目标检测热力图可视化
时间: 2025-05-17 14:26:25 浏览: 18
### 实现目标检测中的热力图可视化
为了实现目标检测模型的热力图可视化,可以通过以下方法完成:
#### 方法概述
1. **加载预训练的目标检测模型**
需要先加载一个已训练好的目标检测模型(如YOLOv8),并对输入图像或视频帧执行推理操作。这一步会返回检测到的对象及其边界框的位置信息[^1]。
2. **提取目标框中心点**
对于每个检测到的目标框,计算其几何中心点坐标 (x, y),并将这些中心点存储在一个列表中作为后续处理的数据源。
3. **应用核密度估计(KDE)**
利用统计学中的核密度估计(Kernel Density Estimation)技术对收集到的所有目标框中心点进行平滑化处理,从而构建出表示空间分布的概率密度函数。
4. **绘制热力图**
基于前面获得的空间概率密度值,调用Matplotlib库或者Seaborn等专门用于可视化的第三方包来渲染最终效果——即所谓的“热力图”。这种图表能够清晰地反映出哪些区域存在较多活动物体以及它们密集程度的变化情况[^2][^3]。
以下是具体代码实现的一个例子:
```python
import cv2
from ultralytics import YOLO
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import kde
# 加载YOLOv8模型
model = YOLO('yolov8n.pt')
def detect_and_generate_heatmap(image_path):
# 图像读取与推理
img = cv2.imread(image_path)
results = model(img)[0]
boxes = []
# 提取目标框中心点
for box in results.boxes.xyxy.cpu().numpy():
x_min, y_min, x_max, y_max = map(int, box[:4])
center_x = int((x_min + x_max)/2)
center_y = int((y_min + y_max)/2)
boxes.append([center_x, center_y])
if not boxes:
print("No objects detected.")
return None
data = np.array(boxes)
# KDE 计算
nbins=300j
k = kde.gaussian_kde(data.T)
xi, yi = np.mgrid[min(data[:,0]):max(data[:,0]):nbins,
min(data[:,1]):max(data[:,1]):nbins]
zi = k(np.vstack([xi.flatten(), yi.flatten()]))
# 绘制热力图
fig, ax = plt.subplots(figsize=(7,7))
ax.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB), extent=[min(data[:,0]), max(data[:,0]),
min(data[:,1]), max(data[:,1])], origin="lower", alpha=.5)
cax = ax.contourf(xi, yi, zi.reshape(xi.shape), cmap='jet', levels=100, alpha=.6)
fig.colorbar(cax).set_label('Density')
plt.show()
detect_and_generate_heatmap('example.jpg') # 替换为实际图片路径
```
此脚本实现了从一张静态照片里找到所有被标记出来的对象,并基于那些位置制作相应的热度显示图形.
阅读全文
相关推荐


















