作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 pytorch 在 3D 体积上执行刚性 + 比例变换,但我似乎无法理解 torch.nn.functional.affine_grid 所需的 theta 是如何工作的。
我有一个大小为 (1,4,4) 的变换矩阵,它是通过将矩阵 Translation * Scale * Rotation 相乘而生成的。例如,如果我在 scipy.ndimage.affine_transform 中使用这个矩阵,它就没有问题。但是,相同的矩阵(裁剪为 (1,3,4) 的大小)在使用 torch.nn.functional.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]]
最佳答案
对于将来遇到类似问题的任何人,scipy 与 pytorch 仿射变换的问题在于 scipy 在 (0, 0, 0) 附近应用变换,而 pytorch 在图像/体积的中间应用它。
例如,让我们取参数:
euler_angles = [ea0, ea1, ea2]
translation = [tr0, tr1, tr2]
scale = [sc0, sc1, sc2]
# Rotation matrix
R_x(ea0, ea1, ea2) = np.array([[1, 0, 0, 0],
[0, math.cos(ea0), -math.sin(ea0), 0],
[0, math.sin(ea0), math.cos(ea0), 0],
[0, 0, 0, 1]])
R_y(ea0, ea1, ea2) = np.array([[math.cos(ea1), 0, math.sin(ea1), 0],
[0, 1, 0, 0],
[-math.sin(ea1), 0, math.cos(ea1)], 0],
[0, 0, 0, 1]])
R_z(ea0, ea1, ea2) = np.array([[math.cos(ea2), -math.sin(ea2), 0, 0],
[math.sin(ea2), math.cos(ea2), 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1]])
R = R_x.dot(R_y).dot(R_z)
# Translation matrix
T(tr0, tr1, tr2) = np.array([[1, 0, 0, -tr0],
[0, 1, 0, -tr1],
[0, 0, 1, -tr2],
[0, 0, 0, 1]])
# Scaling matrix
S(sc0, sc1, sc2) = np.array([[1/sc0, 0, 0, 0],
[0, 1/sc1, 0, 0],
[0, 0, 1/sc2, 0],
[0, 0, 0, 1]])
T_zero = np.array([[1, 0, 0, 50],
[0, 1, 0, 50],
[0, 0, 1, 50],
[0, 0, 0, 1]])
T_centre = np.array([[1, 0, 0, -50],
[0, 1, 0, -50],
[0, 0, 1, -50],
[0, 0, 0, 1]])
transform_scipy_centre = T_zero.dot(T).dot(S).dot(R).T_centre
# Note the order difference
translation_pytorch = =[tr0_p, tr1_p, tr2_p] = [tr0/50, tr2/50, tr1/50]
T_p = T(tr0_p, tr1_p, tr2_p)
# Note the order difference
euler_angles_pytorch = [ea0_p, ea1_p, ea2_p] = [-ea0, -ea2, -ea1]
R_x_p = R_x(ea0_p, ea1_p, ea2_p)
R_y_p = R_y(ea0_p, ea1_p, ea2_p)
R_z_p = R_z(ea0_p, ea1_p, ea2_p)
transform_scipy_centre = T_zero.dot(T).dot(S).dot(R).T_centre
transform_pytorch = T_p.dot(S_p).dot(R_p)
关于python - 从仿射变换矩阵生成 pytorch 的 theta,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61964914/
我是一名优秀的程序员,十分优秀!