我想训练一个神经网络,并要求前向映射的可区分实现,以将源图像扭曲为目标图像,例如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()
我需要的是从源图像中不同的非相邻像素渲染目标图像。
帮助表示赞赏。 问候
答案 0 :(得分:0)
我认为 PyTorch 中没有现有的前向变形方法。前向翘曲不可避免地带来多对一对应、零对应等问题。这些问题需要根据问题设置来解决。