torch.functional.affine_grid的坑

问题描述:在用torch进行图像仿射变换的时候,平移始终有问题

比如现在想要让一张图对应的tensor平移0.5个图像长度

那么需要先构造一个transform_matrix,这里网上说的是偏移量不是像素值,而是归一化的比例

shift_x = 0.5
shift_y = 0.5
transform_matrix = torch.tensor([
            [1, 0, shift_x],
            [0, 1 ,shift_y]]).unsqueeze(0) # 设B(batch size为1)

然后进行放射变换

origin_tensor = torch.randn(1,3,100,200) # B, C, H, W
grid = F.affine_grid(transform_matrix, # 旋转变换矩阵
                     origin_tensor.shape)	# 变换后的tensor的shape(与输入tensor相同)

output = F.grid_sample(origin_tensor, # 输入tensor,shape为[B,C,W,H]
					   grid, # 上一步输出的gird,shape为[B,C,W,H]
					   mode='nearest') # 一些图像填充方法,这里我用的是最近邻

但是得到的结果是图像只平移了不到一半

torch.functional.affine_grid的坑_第1张图片torch.functional.affine_grid的坑_第2张图片 

最后得出结论:归一化是把平移具体的的像素值offset归一化为[-1, 1]。向右向下是[-1,0](注意这里跟像素坐标系方向定义相反)。这里是图像中心来平移,因此在计算归一化值shift_x, shift_y的时候,除的是图像尺寸的一半。

简单来说,向某个方向平移的话,需要把平移的尺寸相对于全图尺寸的比例参数×2.

也就是说shift_x和shift_y这俩平移参数设置成1,才能平移半张图(相当于图像中心平移到图像边缘,[0,1]取上限了)。

shift_x = 1.0
shift_y = 1.0
transform_matrix = torch.tensor([
            [1, 0, shift_x],
            [0, 1 ,shift_y]]).unsqueeze(0) # 设B(batch size为1)

这下正常了

torch.functional.affine_grid的坑_第3张图片torch.functional.affine_grid的坑_第4张图片

你可能感兴趣的:(深度学习,人工智能,计算机视觉)