|
from einops import rearrange |
|
|
|
from .projection import sample_image_grid, get_local_rays |
|
from ..misc.sht import rsh_cart_2, rsh_cart_4, rsh_cart_6, rsh_cart_8 |
|
|
|
|
|
def get_intrinsic_embedding(context, degree=0, downsample=1, merge_hw=False): |
|
assert degree in [0, 2, 4, 8] |
|
|
|
b, v, _, h, w = context["image"].shape |
|
device = context["image"].device |
|
tgt_h, tgt_w = h // downsample, w // downsample |
|
xy_ray, _ = sample_image_grid((tgt_h, tgt_w), device) |
|
xy_ray = xy_ray[None, None, ...].expand(b, v, -1, -1, -1) |
|
directions = get_local_rays(xy_ray, rearrange(context["intrinsics"], "b v i j -> b v () () i j"),) |
|
|
|
if degree == 2: |
|
directions = rsh_cart_2(directions) |
|
elif degree == 4: |
|
directions = rsh_cart_4(directions) |
|
elif degree == 8: |
|
directions = rsh_cart_8(directions) |
|
|
|
if merge_hw: |
|
directions = rearrange(directions, "b v h w d -> b v (h w) d") |
|
else: |
|
directions = rearrange(directions, "b v h w d -> b v d h w") |
|
|
|
return directions |
|
|