torch.nn.functional.grid_sample(F.grid_sample)函数的说明 & 3D空间中的点向图像投影的易错点

这篇具有很好参考价值的文章主要介绍了torch.nn.functional.grid_sample(F.grid_sample)函数的说明 & 3D空间中的点向图像投影的易错点。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

1.1 输入和输出:

变量名 数据类型 默认值 含义 备注
input Tensor - 原始图像/体素空间的特征 形状需为 ( 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体素空间中采样特征
grid Tensor - 采样图像/体素空间的归一化坐标 形状需为 ( 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节
mode str ‘bilinear’ 采样特征的插值方式 可为’bilinear’(双线性插值)、‘nearest’(最近邻插值)、‘bicubic’(双三次插值)
padding_mode str ‘zeros’ 图像/体素空间外侧填充方式 可为’zeros’(零填充)、‘border’(边界值填充)或’reflection’(反射填充,详见官方介绍)
align_corners bool False 是否将像素看作点而非方块 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时,函数会将像素视为方块,并以图像左上角像素的左上角为原点建立坐标系(如下左图所示);否则函数会将像素视为点,以图像左上角像素中心)为原点建立坐标系(如下右图所示)。
    torch.nn.functional.grid_sample(F.grid_sample)函数的说明 & 3D空间中的点向图像投影的易错点
  • 参数grid的元素需主要分布在 [ − 1 , 1 ] [-1,1] [1,1]内,表示归一化采样坐标。其中 − 1 -1 1表示图像范围内的最小坐标,而 1 1 1表示图像范围内的最大坐标(如上图所示)。
  • 参数grid中的最后一维的顺序为 ( x , y ) (x,y) (x,y),但输入图像大小 ( H , W ) (H,W) (H,W)对应 ( y _ s i z e , x _ s i z e ) (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 _ s i z e , y _ s i z e , x _ s i z e ) (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 × 4 3\times4 3×4)扩维为 4 × 4 4\times4 4×4后的矩阵为 I \textbf{I} I,相机坐标系中的点(3维)扩维到4维后的向量为 p = ( x , y , z , 1 ) T \textbf{p}=(x,y,z,1)^T p=(x,y,z,1)T,图像坐标系下的像素索引(可为小数)为 ( u , v ) (u,v) (u,v),深度为 d d d,则 ( u d , v d , d , 1 ) T = I ⋅ p (ud,vd,d,1)^T=\textbf{I}\cdot\textbf{p} (ud,vd,d,1)T=Ip

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

  下图所示为上述 ( u , v ) (u,v) (u,v)被定义的坐标系以及像素的整数索引。
torch.nn.functional.grid_sample(F.grid_sample)函数的说明 & 3D空间中的点向图像投影的易错点

可见,应该对小数索引进行floor()操作,以找到其对应像素的整数索引。文章来源地址https://www.toymoban.com/news/detail-423156.html

到了这里,关于torch.nn.functional.grid_sample(F.grid_sample)函数的说明 & 3D空间中的点向图像投影的易错点的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深入浅出Pytorch函数——torch.softmax/torch.nn.functional.softmax

    分类目录:《深入浅出Pytorch函数》总目录 相关文章: · 机器学习中的数学——激活函数:Softmax函数 · 深入浅出Pytorch函数——torch.softmax/torch.nn.functional.softmax · 深入浅出Pytorch函数——torch.nn.Softmax 将Softmax函数应用于沿 dim 的所有切片,并将重新缩放它们,使元素位于 [ 0 ,

    2024年02月15日
    浏览(67)
  • torch.nn.Conv3d

    比Conv2D多一个维度。 举例说明:Conv2D对720×720的3通道图像进行卷积,batch_size设为64,则输入向量的维度为 [64, 3, 720, 720], Conv3D对分辨率为720×720的视频(假设为连续5帧)进行卷积,batch_size设为64,则输入向量的维度为 [64, 3, 5, 720, 720]  参数详解 in_channels( int ) :输入张量的通道数

    2023年04月09日
    浏览(38)
  • PyTorch中的torch.nn.Linear函数解析

    torch.nn是包含了构筑神经网络结构基本元素的包,在这个包中,可以找到任意的神经网络层。这些神经网络层都是nn.Module这个大类的子类。torch.nn.Linear就是神经网络中的线性层,可以实现形如y=Xweight^T+b的加和功能。 nn.Linear():用于设置网络中的全连接层,需要注意的是全连接

    2024年02月16日
    浏览(40)
  • 深入浅出Pytorch函数——torch.nn.Module

    分类目录:《深入浅出Pytorch函数》总目录 Pytorch中所有网络的基类,我们的模型也应该继承这个类。 Modules 也可以包含其它 Modules ,允许使用树结构嵌入他们,我们还可以将子模块赋值给模型属性。 语法 方法 torch.nn.Module.apply 实例 通过上面方式赋值的 submodule 会被注册,当调

    2024年02月12日
    浏览(67)
  • 深入浅出Pytorch函数——torch.nn.Linear

    分类目录:《深入浅出Pytorch函数》总目录 对输入数据做线性变换 y = x A T + b y=xA^T+b y = x A T + b 语法 参数 in_features :[ int ] 每个输入样本的大小 out_features :[ int ] 每个输出样本的大小 bias :[ bool ] 若设置为 False ,则该层不会学习偏置项目,默认值为 True 变量形状 输入变量:

    2024年02月12日
    浏览(45)
  • 深入浅出Pytorch函数——torch.nn.Softmax

    分类目录:《深入浅出Pytorch函数》总目录 相关文章: · 机器学习中的数学——激活函数:Softmax函数 · 深入浅出Pytorch函数——torch.softmax/torch.nn.functional.softmax · 深入浅出Pytorch函数——torch.nn.Softmax 将Softmax函数应用于 n n n 维输入张量,重新缩放它们,使得 n n n 维输出张量的

    2024年02月15日
    浏览(56)
  • 深入浅出Pytorch函数——torch.nn.init.dirac_

    分类目录:《深入浅出Pytorch函数》总目录 相关文章: · 深入浅出Pytorch函数——torch.nn.init.calculate_gain · 深入浅出Pytorch函数——torch.nn.init.uniform_ · 深入浅出Pytorch函数——torch.nn.init.normal_ · 深入浅出Pytorch函数——torch.nn.init.constant_ · 深入浅出Pytorch函数——torch.nn.init.ones_ ·

    2024年02月12日
    浏览(44)
  • 深入浅出Pytorch函数——torch.nn.init.normal_

    分类目录:《深入浅出Pytorch函数》总目录 相关文章: · 深入浅出Pytorch函数——torch.nn.init.calculate_gain · 深入浅出Pytorch函数——torch.nn.init.uniform_ · 深入浅出Pytorch函数——torch.nn.init.normal_ · 深入浅出Pytorch函数——torch.nn.init.constant_ · 深入浅出Pytorch函数——torch.nn.init.ones_ ·

    2024年02月12日
    浏览(55)
  • 深入浅出Pytorch函数——torch.nn.init.eye_

    分类目录:《深入浅出Pytorch函数》总目录 相关文章: · 深入浅出Pytorch函数——torch.nn.init.calculate_gain · 深入浅出Pytorch函数——torch.nn.init.uniform_ · 深入浅出Pytorch函数——torch.nn.init.normal_ · 深入浅出Pytorch函数——torch.nn.init.constant_ · 深入浅出Pytorch函数——torch.nn.init.ones_ ·

    2024年02月11日
    浏览(53)
  • 深入浅出Pytorch函数——torch.nn.init.zeros_

    分类目录:《深入浅出Pytorch函数》总目录 相关文章: · 深入浅出Pytorch函数——torch.nn.init.calculate_gain · 深入浅出Pytorch函数——torch.nn.init.uniform_ · 深入浅出Pytorch函数——torch.nn.init.normal_ · 深入浅出Pytorch函数——torch.nn.init.constant_ · 深入浅出Pytorch函数——torch.nn.init.ones_ ·

    2024年02月12日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包