【发布时间】:2020-01-03 16:42:32
【问题描述】:
简介
我想训练一个神经网络,并需要一个可微分的前向映射实现,以将源图像变形为目标图像,参见例如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()
问题
我需要的是从源图像中不同的非相邻像素渲染目标图像。
帮助表示赞赏。 问候
【问题讨论】:
标签: tensorflow neural-network pytorch