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 的文档。