引言
我想训练一个神经网络,并需要一个可区分的前向映射实现,以将源图像扭曲为目标图像,请参见例如https://www.cs.princeton.edu/courses/archive/fall00/cs426/lectures/warp/warp.pdf。
我已经发现的是通过pytorch (grid_sample)的向后映射,其中目标图像中的每个像素都只与源图像中的一个特定像素(+邻居)有一个连接。
代码
import torch
import torch.nn.functional as F
import numpy as np
import matplotlib.pyplot as plt
# create artificial image
im = np.zeros((9,9))
im[4,4] = 1
# warping images
u = np.zeros((9,9))
v = np.zeros((9,9))
u[4,3] += 1
# shift to pytorch
h,w = np.shape(im)
im_t = torch.from_numpy(im).float().view((1,1,h,w)).cpu()
u_t = torch.from_numpy(u).float().view((1,h,w,1)).cpu()
v_t = torch.from_numpy(v).float().view((1,h,w,1)).cpu()
n, _, h, w = im_t.size()
batchSize, _, _, nmbSamples = im_t.size()
# warp source image
U = torch.arange(start=0, end=w).expand(h, w).float().view((n, h, w, 1)).cpu()
V = torch.arange(start=0, end=h).expand(w, h).t().float().view((n, h, w, 1)).cpu()
U_u = (U + u_t) / ((w-1) / 2) - 1
V_v = (V + v_t) / ((h-1) / 2) - 1
grid = torch.cat((U_u, V_v), dim=3).float().cpu()
warped_t = F.grid_sample(im_t, grid)
# plot routine
plt.figure()
plt.subplot(121)
plt.imshow(im_t.data.cpu().numpy()[0,0,:,:])
plt.grid()
plt.subplot(122)
plt.imshow(warped_t.data.cpu().numpy()[0,0,:,:])
plt.grid()
plt.show(block=False)
plt.draw()
问题
我需要的是从源图像中不同的、非相邻的像素渲染目标图像。
感谢你的帮助。问候
发布于 2021-01-08 02:05:41
我不认为在PyTorch中有一个现有的正向变形方法。正向翘曲不可避免地带来了多对一对应和零对应等问题。这些问题需要根据问题设置来解决。
https://stackoverflow.com/questions/57726538
复制相似问题