MuRF代码阅读

对图像Size的处理, 以适应Transformer

  • MVSPlat 当中使用 Center_Crop 裁剪图像,适用于 Transformer 的32 倍数, 其中 焦距 f 不变化,只改变 cx,cy.
  • MuRF 直接对图像进行 插值,合成理想的 size. 根据 ori_sizeinference_size 计算出来 scale, 然后分别乘上 对应的 内参。 这个时候 内参数的 所有参数fcx,cy都会改变。
 ori_size = var.images.shape[3:]
scale_factor_y = inference_size[0] / ori_size[0]
scale_factor_x = inference_size[1] / ori_size[1]

 tmp_imgs = var.images.view(-1, 3, *ori_size)
tmp_imgs = F.interpolate(tmp_imgs, size=inference_size, mode='bilinear', align_corners=True)


# update intrinsics
intrinsic = var.intrinsics.clone()  # [B, V, 3, 3]
intrinsic[:, :, :1] = intrinsic[:, :, :1] * scale_factor_x
intrinsic[:, :, 1:2] = intrinsic[:,:, 1:2] * scale_factor_y

使用 Transformer 对于图像进行处理,得到不同分辨率的 Feature Map

# extract multi-view image features,用列表存储
# list of [B, V, C, H, W], multi-scale, resolution from low to high
ref_feats_list = self.get_img_feat(ref_images)

Render

生成的 Ray 是从 downsample 之后的图像生成的, 假设原图像的分辨率是(352,1408), 论文中的参数 radiance_subsample_factor = 4, 那么会从 降采样4倍之后的图像 size = (88,352)生成光线。 每条光线如果采样 64 个点,那么组成的 Tensor pts_3D 对应的 shape 是 # [B,HW,D,3], 将这些采样点投影到 feature_map 上面然后计算 Reference Image 之间的 feature 相似度,去得到 Geometry 的 Cues.
在这里插入图片描述

Patch-based for High-Resolution rendering

MuRF 可以对于 高分辨率的图像在 Test 的阶段做 Rendering

sample window on the image

  • 先生成一个小范围的 window. uv像素坐标系;
* window_grid = generate_window_grid(-local_radius, local_radius,
                                     -local_radius, local_radius,
                                     local_h, local_w, device=grid.device)  
  • 上一部生成的 grid 坐标 [-1,1] 之间转换到 uv像素坐标系;
 b, n, d = grid.shape[:3]
 # grid is in [-1, 1]
 color_sample_grid = grid.view(b, n * d, 1, 2)  # [B, H*W*D, 1, 2]
 color_sample_grid = (color_sample_grid + 1) / 2  # [0, 1]
 color_sample_grid = torch.cat((color_sample_grid[:, :, :, :1] * (
img_w - 1), color_sample_grid[:, :, :, 1:] * (img_h - 1)), dim=-1)  # image scale
  • window 的 size 和实际采样点坐标相加, 生成 最后的采样范围,变换到[-1,1]之间,使用 grid_sample 函数来实现最后的 query;
 color_sample_grid = color_sample_grid + \
window_grid  # [B, H*W*D, (2R+1)^2, 2]

# normalize to [-1, 1]
c = torch.Tensor([(img_w - 1) / 2., (img_h - 1) / 2.]).float().to(color_sample_grid.device)
color_sample_grid = (color_sample_grid - c) / c  # [-1, 1]

sampled_color = torch_F.grid_sample(
ref_images[:, view_idx], color_sample_grid, align_corners=True, mode='bilinear', padding_mode='border')
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值