|
@@ -232,6 +232,75 @@ def generate_gaussian_heatmaps(xs, ys, heatmap_size,num_points=2, sigma=2.0, dev
|
|
|
|
|
|
|
|
assert xs.shape == ys.shape, "x and y must have the same shape"
|
|
assert xs.shape == ys.shape, "x and y must have the same shape"
|
|
|
print(f'xs:{xs.shape}')
|
|
print(f'xs:{xs.shape}')
|
|
|
|
|
+ xs=xs.squeeze(1)
|
|
|
|
|
+ ys = ys.squeeze(1)
|
|
|
|
|
+ print(f'xs1:{xs.shape}')
|
|
|
|
|
+ N = xs.shape[0]
|
|
|
|
|
+ print(f'N:{N},num_points:{num_points}')
|
|
|
|
|
+
|
|
|
|
|
+ # 创建网格
|
|
|
|
|
+ grid_y, grid_x = torch.meshgrid(
|
|
|
|
|
+ torch.arange(heatmap_size, device=device),
|
|
|
|
|
+ torch.arange(heatmap_size, device=device),
|
|
|
|
|
+ indexing='ij'
|
|
|
|
|
+ )
|
|
|
|
|
+
|
|
|
|
|
+ # print(f'heatmap_size:{heatmap_size}')
|
|
|
|
|
+ # 初始化输出热图
|
|
|
|
|
+ combined_heatmap = torch.zeros((N, heatmap_size, heatmap_size), device=device)
|
|
|
|
|
+
|
|
|
|
|
+ for i in range(N):
|
|
|
|
|
+ heatmap= torch.zeros((heatmap_size, heatmap_size), device=device)
|
|
|
|
|
+ for j in range(num_points):
|
|
|
|
|
+ mu_x1 = xs[i, j].clamp(0, heatmap_size - 1).item()
|
|
|
|
|
+ mu_y1 = ys[i, j].clamp(0, heatmap_size - 1).item()
|
|
|
|
|
+ # print(f'mu_x1,mu_y1:{mu_x1},{mu_y1}')
|
|
|
|
|
+
|
|
|
|
|
+ # 计算距离平方
|
|
|
|
|
+ dist1 = (grid_x - mu_x1) ** 2 + (grid_y - mu_y1) ** 2
|
|
|
|
|
+
|
|
|
|
|
+ # 计算高斯分布
|
|
|
|
|
+ heatmap1 = torch.exp(-dist1 / (2 * sigma ** 2))
|
|
|
|
|
+
|
|
|
|
|
+ heatmap+=heatmap1
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ # mu_x2 = xs[i, 1].clamp(0, heatmap_size - 1).item()
|
|
|
|
|
+ # mu_y2 = ys[i, 1].clamp(0, heatmap_size - 1).item()
|
|
|
|
|
+ #
|
|
|
|
|
+ # # 计算距离平方
|
|
|
|
|
+ # dist2 = (grid_x - mu_x2) ** 2 + (grid_y - mu_y2) ** 2
|
|
|
|
|
+ #
|
|
|
|
|
+ # # 计算高斯分布
|
|
|
|
|
+ # heatmap2 = torch.exp(-dist2 / (2 * sigma ** 2))
|
|
|
|
|
+ #
|
|
|
|
|
+ # heatmap = heatmap1 + heatmap2
|
|
|
|
|
+
|
|
|
|
|
+ # 将当前热图累加到结果中
|
|
|
|
|
+ combined_heatmap[i] = heatmap
|
|
|
|
|
+
|
|
|
|
|
+ return combined_heatmap
|
|
|
|
|
+
|
|
|
|
|
+def generate_mask_gaussian_heatmaps(xs, ys, heatmap_size,num_points=2, sigma=2.0, device='cuda'):
|
|
|
|
|
+ """
|
|
|
|
|
+ 为一组点生成并合并高斯热图。
|
|
|
|
|
+
|
|
|
|
|
+ Args:
|
|
|
|
|
+ xs (Tensor): 形状为 (N, 2) 的所有点的 x 坐标
|
|
|
|
|
+ ys (Tensor): 形状为 (N, 2) 的所有点的 y 坐标
|
|
|
|
|
+ heatmap_size (int): 热图大小 H=W
|
|
|
|
|
+ sigma (float): 高斯核标准差
|
|
|
|
|
+ device (str): 设备类型 ('cpu' or 'cuda')
|
|
|
|
|
+
|
|
|
|
|
+ Returns:
|
|
|
|
|
+ Tensor: 形状为 (H, W) 的合并后的热图
|
|
|
|
|
+ """
|
|
|
|
|
+
|
|
|
|
|
+ assert xs.shape == ys.shape, "x and y must have the same shape"
|
|
|
|
|
+ print(f'xs:{xs.shape}')
|
|
|
|
|
+ xs=xs.squeeze(1)
|
|
|
|
|
+ ys = ys.squeeze(1)
|
|
|
|
|
+ print(f'xs1:{xs.shape}')
|
|
|
N = xs.shape[0]
|
|
N = xs.shape[0]
|
|
|
print(f'N:{N},num_points:{num_points}')
|
|
print(f'N:{N},num_points:{num_points}')
|
|
|
|
|
|
|
@@ -471,8 +540,9 @@ def arc_points_to_heatmap(keypoints, rois, heatmap_size):
|
|
|
|
|
|
|
|
x = keypoints[..., 0].unsqueeze(1)
|
|
x = keypoints[..., 0].unsqueeze(1)
|
|
|
y = keypoints[..., 1].unsqueeze(1)
|
|
y = keypoints[..., 1].unsqueeze(1)
|
|
|
-
|
|
|
|
|
- gs = generate_gaussian_heatmaps(x, y, num_points=10, heatmap_size=heatmap_size, sigma=1.0)
|
|
|
|
|
|
|
+ num_points=x.shape[2]
|
|
|
|
|
+ print(f'num_points:{num_points}')
|
|
|
|
|
+ gs = generate_mask_gaussian_heatmaps(x, y, num_points=num_points, heatmap_size=heatmap_size, sigma=1.0)
|
|
|
# show_heatmap(gs[0],'target')
|
|
# show_heatmap(gs[0],'target')
|
|
|
all_roi_heatmap = []
|
|
all_roi_heatmap = []
|
|
|
for roi, heatmap in zip(rois, gs):
|
|
for roi, heatmap in zip(rois, gs):
|