我正在尝试使用 pytorch 在 3D 体积上执行刚性+缩放变换,但我似乎无法理解 torch.nn.function.affine_grid 所需的 theta 是如何工作的。
我有一个大小为 (1,4,4) 的变换矩阵,是通过矩阵平移 * 缩放 * 旋转相乘生成的。例如,如果我在 scipy.ndimage.affine_transform 中使用此矩阵,它可以正常工作。然而,相同的矩阵(裁剪为大小(1,3,4))在torch.nn.function.affine_grid 中完全失败。
我已经设法理解翻译是如何工作的(范围 -1 到 1),并且我已经通过简单地将值标准化到该范围来确认翻译矩阵的工作原理。至于另外两个,我迷路了。
我尝试单独使用基本的缩放矩阵(如下)作为最基本的比较,但 pytorch 中的结果与 scipy 中的结果不同
Scaling =
[[0.75, 0, 0, 0],
[[0, 0.75, 0, 0],
[[0, 0, 0.75, 0],
[[0, 0, 0, 1]]
Run Code Online (Sandbox Code Playgroud)
如何将 (1,4,4) 仿射矩阵转换为与 torch.nn.function.affine_grid 相同的工作方式?或者,有没有办法根据变换参数(移位、欧拉角、缩放)生成正确的矩阵?
我有一个非常简单的基于 tensorflow 的函数,它采用形状为 (1, 6, 64, 64, 64, 1) 的张量并返回形状为 (1, 6, 3) 的张量,其中包含每个 (64 , 64, 64) 原始张量中的体积。我的工作没有任何问题,但每次我的循环(见下文)进入下一次迭代时,我电脑中使用的 RAM 都会增加。在我完全用完之前,这将我限制在大约 500 个样本。我想我在某个地方遗漏了一些东西,但我没有足够的经验知道在哪里。
代码:
import tensorflow as tf
import pickle
import scipy.io
import scipy.ndimage
import sys
from os import listdir
from os.path import isfile, join
import numpy as np
def get_raw_centroids(lm_vol):
# Find centres of mass for each landmark
lm_vol *= tf.cast(tf.greater(lm_vol, 0.75), tf.float64)
batch_size, lm_size, vol_size = lm_vol.shape[:3]
xx, yy, zz = tf.meshgrid(tf.range(vol_size), tf.range(
vol_size), tf.range(vol_size), indexing='ij')
coords = …Run Code Online (Sandbox Code Playgroud)