我正在嘗試將 python 中的幾行代碼轉換為 C#。在 C# 版本中,我對以 heatmap_center 變量開頭的列表/數(shù)組語法感到困惑。在下面的片段中,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條經(jīng)驗 獲得超8個贊
np.pad 似乎在整個熱圖周圍添加了 2 個“像素”邊框。因此,如果熱圖為 124x124,則結果將是 128x128 熱圖。
現(xiàn)在我們來簡化一下
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#,請自行實現(xiàn)此功能,以便在 C# 中輕松使用它,然后如果速度太慢,請找到具有類似功能的庫。

不負相思意
TA貢獻1777條經(jīng)驗 獲得超10個贊
至于您的具體問題“在下面的片段中, heatmap_with_borders 變量的用途是什么?”
看起來它添加了 2 個“像素”邊框。該算法似乎根據(jù)相鄰像素制作某種熱圖。假設需要 1 像素偏移裁剪,然后查看中心裁剪和 1 像素裁剪哪個更大。因此,邊框可以“填充”熱圖,從而使所有輕微的“作物”保持相同的大小和范圍。
添加回答
舉報
0/150
提交
取消