最复杂的相对坐标矩阵
该矩阵由相对x最小坐标、相对x最大坐标、相对y最小坐标、相对y最大坐标,相对x中心坐标、相对y中心坐标,以及高度和宽度的映射(用于表示高度和宽度的比列)。
其中相对坐标设置这么多不同类型的原因在于,相对最小值: 表示每个像素块的左上角位置。相对最大值: 表示每个像素块的右下角位置,而相对中心值则表示每个像素块的中心位置,相对最小值和相对最大值不仅提供了每个像素的具体位置,还允许网络更丰富地编码空间信息,包括大小和位置信息。这种丰富的编码能够帮助网络在处理与位置相关的任务时更具表现力。
对应代码
def _make_coord(batch, height, width):
# 生成网格坐标 (meshgrid),这里 xv 和 yv 是两个二维张量,表示图像中每个像素的 x 和 y 坐标。
#xv 的每一行都相同,包含从 0 到 height-1 的值,而 yv 的每一列都相同,包含从 0 到 width-1 的值。
xv, yv = torch.meshgrid([torch.arange(0, height), torch.arange(0, width)])
#计算相对位置编码,xv_min 和 yv_min 是 x 和 y 的相对最小值,范围从 [-1 , 1)
xv_min = (xv.float() * 2 - width) / width
yv_min = (yv.float() * 2 - height) / height
#xv_max 和 yv_max 是 x 和 y 的相对最大值,范围从 (-1. 1]
xv_max = ((xv + 1).float() * 2 - width) / width
yv_max = ((yv + 1).float() * 2 - height) / height
# xv_ctr 和 yv_ctr 是 x 和 y 的中心值,范围从 (-1,1)
xv_ctr = (xv_min + xv_max) / 2
yv_ctr = (yv_min + yv_max) / 2
## hmap 和 wmap 是两个二维张量,每个元素分别是 1.0 / height 和 1.0 / width,用于表示高度和宽度的相对比例
hmap = torch.ones(height, width) * (1.0 / height)
wmap = torch.ones(height, width) * (1.0 / width)
# 将以上所有内容拼接
coord = torch.autograd.Variable(
torch.cat(
[
xv_min.unsqueeze(0),
yv_min.unsqueeze(0),
xv_max.unsqueeze(0),
yv_max.unsqueeze(0),
xv_ctr.unsqueeze(0),
yv_ctr.unsqueeze(0),
hmap.unsqueeze(0),
wmap.unsqueeze(0),
],
dim=0,
)
)
#在batch内重复
coord = coord.unsqueeze(0).repeat(batch, 1, 1, 1)
return coord