我正在尝试将 python 中的几行代码转换为 C#。在 C# 版本中,我对以 heatmap_center 变量开头的列表/数组语法感到困惑。在下面的片段中,heatmap_with_borders 变量的用途是什么?这是Python片段:def extract_keypoints(heatmap, all_keypoints, total_keypoint_num): heatmap[heatmap < 0.1] = 0 heatmap_with_borders = np.pad(heatmap, [(2, 2), (2, 2)], mode='constant') heatmap_center = heatmap_with_borders[1:heatmap_with_borders.shape[0]-1, 1:heatmap_with_borders.shape[1]-1] heatmap_left = heatmap_with_borders[1:heatmap_with_borders.shape[0]-1, 2:heatmap_with_borders.shape[1]] heatmap_right = heatmap_with_borders[1:heatmap_with_borders.shape[0]-1, 0:heatmap_with_borders.shape[1]-2] heatmap_up = heatmap_with_borders[2:heatmap_with_borders.shape[0], 1:heatmap_with_borders.shape[1]-1] heatmap_down = heatmap_with_borders[0:heatmap_with_borders.shape[0]-2, 1:heatmap_with_borders.shape[1]-1] heatmap_peaks = (heatmap_center > heatmap_left) &\ (heatmap_center > heatmap_right) &\ (heatmap_center > heatmap_up) &\ (heatmap_center > heatmap_down) heatmap_peaks = heatmap_peaks[1:heatmap_center.shape[0]-1, 1:heatmap_center.shape[1]-1] keypoints = list(zip(np.nonzero(heatmap_peaks)[1], np.nonzero(heatmap_peaks)[0])) # (w, h) keypoints = sorted(keypoints, key=itemgetter(0)) suppressed = np.zeros(len(keypoints), np.uint8) keypoints_with_score_and_id = [] keypoint_num = 0 for i in range(len(keypoints)): if suppressed[i]: continue for j in range(i+1, len(keypoints)): if math.sqrt((keypoints[i][0] - keypoints[j][0]) ** 2 + (keypoints[i][1] - keypoints[j][1]) ** 2) < 6: suppressed[j] = 1
2 回答
ITMISS
TA贡献1871条经验 获得超8个赞
np.pad 似乎在整个热图周围添加了 2 个“像素”边框。因此,如果热图为 124x124,则结果将是 128x128 热图。
现在我们来简化一下
heatmap_center = heatmap_with_borders[1:heatmap_with_borders.shape[0]-1, 1:heatmap_with_borders.shape[1]-1]
我们将从
heatmap_with_borders[1:heatmap_with_borders.shape[0]-1
1:heatmap_with_borders.shape[0]-1
表示将项目从1拉到维度-1的大小
在我们的 128,128 示例中,维度将为 128,所以我们说:从 1 到 127
具体如此简化
heatmap_center = heatmap_with_borders[1:127, 1:127]
因此,您只需跳过 2 像素边框的外部 1“像素”。在 C# 中,没有原生的“拉出列表的一部分”语法,因此您需要一个类似的方法
getSublist(heatmap, start1, end1, start2, end2)
所以你的电话看起来像
heatmap_center = getSublist(heatmap, 1, heatmap.Length - 1, 1, heatmap[0].Length -1)
我的建议是,如果您非常关心 C#,请自行实现此功能,以便在 C# 中轻松使用它,然后如果速度太慢,请找到具有类似功能的库。
不负相思意
TA贡献1777条经验 获得超10个赞
至于您的具体问题“在下面的片段中, heatmap_with_borders 变量的用途是什么?”
看起来它添加了 2 个“像素”边框。该算法似乎根据相邻像素制作某种热图。假设需要 1 像素偏移裁剪,然后查看中心裁剪和 1 像素裁剪哪个更大。因此,边框可以“填充”热图,从而使所有轻微的“作物”保持相同的大小和范围。
添加回答
举报
0/150
提交
取消