torch.nn.functional.grid_sample(F.grid_sample)函数的说明 3D空间中的点向图像投影的易错点
创始人
2024-02-24 15:16:47
0

由于二者有一定共通之处,因此放在一篇文章内介绍。

1. 关于torch.nn.functional.grid_sample函数的说明(F.grid_sample)

  该函数的作用是在图像/体素空间中采样特征。

1.1 输入和输出:

变量名数据类型默认值含义备注
inputTensor-原始图像/体素空间的特征形状需为(B,C,H,W)(B,C,H,W)(B,C,H,W)或(B,C,D,H,W)(B,C,D,H,W)(B,C,D,H,W),分别表示在图像中采样特征和在3D体素空间中采样特征
gridTensor-采样图像/体素空间的归一化坐标形状需为(B,h,w,2)(B,h,w,2)(B,h,w,2)(对应4维input的情况)或(B,d,h,w,3)(B,d,h,w,3)(B,d,h,w,3)(对应5维input的情况),具体见1.2节
modestr‘bilinear’采样特征的插值方式可为’bilinear’(双线性插值)、‘nearest’(最近邻插值)、‘bicubic’(双三次插值)
padding_modestr‘zeros’图像/体素空间外侧填充方式可为’zeros’(零填充)、‘border’(边界值填充)或’reflection’(反射填充,详见官方介绍)
align_cornersboolFalse是否将像素看作点而非方块False表示将像素看作方块,而True表示将像素看作点(具体见1.2节)
返回值Tensor返回值采样得到的特征图形状为(B,C,h,w)(B,C,h,w)(B,C,h,w)(对应4维input的情况)或(B,C,d,h,w)(B,C,d,h,w)(B,C,d,h,w)(对应5维input的情况)

1.2 需要注意的地方

以4维输入(即从图像采样特征)为例,设图像的大小为(H,W)(H,W)(H,W)。

  • 当align_corner=False时,函数会将像素视为方块,并以图像左上角像素的左上角为原点建立坐标系(如下左图所示);否则函数会将像素视为点,以图像左上角像素中心)为原点建立坐标系(如下右图所示)。
    在这里插入图片描述
  • 参数grid的元素需主要分布在[−1,1][-1,1][−1,1]内,表示归一化采样坐标。其中−1-1−1表示图像范围内的最小坐标,而111表示图像范围内的最大坐标(如上图所示)。
  • 参数grid中的最后一维的顺序为(x,y)(x,y)(x,y),但输入图像大小(H,W)(H,W)(H,W)对应(y_size,x_size)(y\_size,x\_size)(y_size,x_size)。例子如下:
a = torch.arange(12, dtype=torch.float).reshape(3,4).unsqueeze(0).unsqueeze(0)  # (1,1,3,4)
grid = torch.tensor([[[-0.25,-1.0], [1.0,-1.0]],[[-1.0, 1.0], [1.0, 1.0]]]).unsqueeze(0)					# (1,2,2,2)
out = F.grid_sample(a, grid=grid, padding_mode='border')						# (1,1,2,2)
# 输出a:
# tensor([[[[ 0.,  1.,  2.,  3.],
#           [ 4.,  5.,  6.,  7.],
#           [ 8.,  9., 10., 11.]]]])
# 输出out:
# tensor([[[[ 1.,  3.],
#           [ 8., 11.]]]])
# 我们只关注采样的左上角元素,坐标为(-0.25,-1.0),对应上左图中的第一行第二个格子的顶部中心,
# 在双线性插值、边界值填充的情况下采样特征就是该像素的特征1。
  • 对于5维输入(即从体素空间采样特征)的情况,参数grid中的最后一维顺序为(x,y,z)(x,y,z)(x,y,z),但输入体素空间大小(D,H,W)(D,H,W)(D,H,W)对应(z_size,y_size,x_size)(z\_size,y\_size,x\_size)(z_size,y_size,x_size)。例子如下:
a = torch.arange(12, dtype=torch.float).reshape(3,4).unsqueeze(0).unsqueeze(0)  # (1,1,3,4)
grid = torch.tensor([[[[-0.25, -1.0, -1.0], [1.0, -1.0, -1.0]],[[ -1.0,  1.0,  1.0], [1.0,  1.0,  1.0]]]]).unsqueeze(0)	# (1,1,2,2,3)
out = F.grid_sample(a, grid=grid, padding_mode='border')						# (1,1,1,2,2)
# 输出a:
# tensor([[[[[ 0.,  1.,  2.,  3.],
#            [ 4.,  5.,  6.,  7.],
#            [ 8.,  9., 10., 11.]],		# 第一层
# 
#           [[12., 13., 14., 15.],
#            [16., 17., 18., 19.],
#            [20., 21., 22., 23.]]]]])	# 第二层
# 输出out:
# tensor([[[[[ 1.,  3.],
#            [20., 23.]]]]])
# 我们只关注采样的左上角元素,前两个维度的坐标为(-0.25,-1.0),对应上左图中的第一行第二个格子的顶部中心;
# 而第三个维度的坐标为-1.0,对应最上层的最上部(自行想象3D体素空间)。在双线性插值、边界值填充的情况下,
# 采样特征就是该体素(最上层、第一行第二个体素)的特征1。

2. 3D空间中的点向图像投影时的易错点

2.1 点向图像的投影

  设图像的内参矩阵(3×43\times43×4)扩维为4×44\times44×4后的矩阵为I\textbf{I}I,相机坐标系中的点(3维)扩维到4维后的向量为p=(x,y,z,1)T\textbf{p}=(x,y,z,1)^Tp=(x,y,z,1)T,图像坐标系下的像素索引(可为小数)为(u,v)(u,v)(u,v),深度为ddd,则(ud,vd,d,1)T=I⋅p(ud,vd,d,1)^T=\textbf{I}\cdot\textbf{p}(ud,vd,d,1)T=I⋅p

2.2 易错点:小数索引转换为整数索引(寻找对应的像素)

  下图所示为上述(u,v)(u,v)(u,v)被定义的坐标系以及像素的整数索引。
在这里插入图片描述

可见,应该对小数索引进行floor()操作,以找到其对应像素的整数索引。

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...