Pytorch 中的图像翻译,使用 affine_grid 和 grid_sample 函数
image translation in Pytorch, using affine_grid & grid_sample functions
我打算将图像移动 1 或 2 个像素,因为我在仿射矩阵中指定了一个小数字 (1.25 , 1.9)。
但是,图像被移得很远,像几百个像素:
(我的输入图像全是黄色菠萝)
下面是一个工作示例。
import torch
import numpy as np
import matplotlib.pyplot as plt
from torchvision import datasets, transforms
import torch.nn.functional as F
rotation_simple = np.array([[1,0, 1.25],
[ 0,1, 1.9]])
#load image
transform = transforms.Compose([transforms.Resize(255),
transforms.CenterCrop(224),
transforms.ToTensor()])
dataloader = torch.utils.data.DataLoader(datasets.ImageFolder('/home/Pictures',transform=transform,), shuffle=True)
dtype = torch.FloatTensor
i = 0
while i<3:
img, labels = next(iter(dataloader))
img = img#.double() # 有时候要转为double有时候不用转
rotation_simple = torch.as_tensor(rotation_simple)[None]
grid = F.affine_grid(rotation_simple, img.size()).type(dtype)
x = F.grid_sample(img, grid)
plt.imshow(x[0].permute(1, 2, 0))
plt.show()
i+=1
我想知道为什么该函数将图像移动这么远而不是在 x 和 y 方向上仅移动 1 个像素。
Ps。设置“align_corners=True”对这种情况没有帮助。
Pps。我的pytorch版本是1.4.0+cu100
网格和仿射变换的“度量单位”是不是像素,而是归一化坐标:
grid
specifies the sampling pixel locations normalized by the input spatial dimensions. Therefore, it should have most values in the range of [-1, 1]
. For example, values x = -1, y = -1
is the left-top pixel of input, and values x = 1, y = 1
is the right-bottom pixel of input.
因此,[1.25, 1.9]
翻译实际上是翻译几乎整个图像大小。您需要将翻译值除以 2*img.shape
以获得像素级翻译。
有关详细信息,请参阅 grid_sample
的文档。
我打算将图像移动 1 或 2 个像素,因为我在仿射矩阵中指定了一个小数字 (1.25 , 1.9)。
但是,图像被移得很远,像几百个像素:
(我的输入图像全是黄色菠萝)
下面是一个工作示例。
import torch
import numpy as np
import matplotlib.pyplot as plt
from torchvision import datasets, transforms
import torch.nn.functional as F
rotation_simple = np.array([[1,0, 1.25],
[ 0,1, 1.9]])
#load image
transform = transforms.Compose([transforms.Resize(255),
transforms.CenterCrop(224),
transforms.ToTensor()])
dataloader = torch.utils.data.DataLoader(datasets.ImageFolder('/home/Pictures',transform=transform,), shuffle=True)
dtype = torch.FloatTensor
i = 0
while i<3:
img, labels = next(iter(dataloader))
img = img#.double() # 有时候要转为double有时候不用转
rotation_simple = torch.as_tensor(rotation_simple)[None]
grid = F.affine_grid(rotation_simple, img.size()).type(dtype)
x = F.grid_sample(img, grid)
plt.imshow(x[0].permute(1, 2, 0))
plt.show()
i+=1
我想知道为什么该函数将图像移动这么远而不是在 x 和 y 方向上仅移动 1 个像素。
Ps。设置“align_corners=True”对这种情况没有帮助。
Pps。我的pytorch版本是1.4.0+cu100
网格和仿射变换的“度量单位”是不是像素,而是归一化坐标:
grid
specifies the sampling pixel locations normalized by the input spatial dimensions. Therefore, it should have most values in the range of[-1, 1]
. For example, valuesx = -1, y = -1
is the left-top pixel of input, and valuesx = 1, y = 1
is the right-bottom pixel of input.
因此,[1.25, 1.9]
翻译实际上是翻译几乎整个图像大小。您需要将翻译值除以 2*img.shape
以获得像素级翻译。
有关详细信息,请参阅 grid_sample
的文档。