NeRF Code Review - def get_rays(H,W,K,c2w)

HeyHo·2022년 11월 2일
1

NeRF code Review

목록 보기
1/7
# Ray helpers
def get_rays(H, W, K, c2w):
    i, j = torch.meshgrid(torch.linspace(0, W-1, W), torch.linspace(0, H-1, H))  # pytorch's meshgrid has indexing='ij'
    i = i.t()
    j = j.t()
    dirs = torch.stack([(i-K[0][2])/K[0][0], -(j-K[1][2])/K[1][1], -torch.ones_like(i)], -1)
    # Rotate ray directions from camera frame to the world frame
    rays_d = torch.sum(dirs[..., np.newaxis, :] * c2w[:3,:3], -1)  # dot product, equals to: [c2w.dot(dir) for dir in dirs]
    # Translate camera frame's origin to the world frame. It is the origin of all rays.
    rays_o = c2w[:3,-1].expand(rays_d.shape)
    return rays_o, rays_d

리뷰할 코드는 run_nerf_helper.py 부분의 get_rays 함수이다.
i,j를 meshgrid로 정의해주었는데, i,j는 이미지에서의 pixel index라고 생각하면 된다.
lego.blender의 경우, 이미지를 400x400 이미지를 input으로 받기 때문에, 각각의 pixel index가 0부터 399까지 meshgrid로 출력된 것을 확인할 수 있다.
dirs를 정의해주기 전에, i.t(), j.t()를 이용하여 matrix를 transpose해준 것을 확인할 수 있다.(왜? - 추후에 알아보기)
dirs는 Intrinsic parameter를 사용하여 Image coordiante에서 normalized coordinate로 변환해주는 matrix이다.
출처: https://www.slideshare.net/HyeongminLee3/pr302-nerf-representing-scenes-as-neural-radiance-fields-for-view-synthesis

dirs = torch.stack([(i-K[0][2])/K[0][0], -(j-K[1][2])/K[1][1], -torch.ones_like(i)], -1)

여기서 dirs의 수식은 다음과 같다.

dir:=[uv1]=K1[xy1]dir:=\begin{bmatrix}u\\v\\1\\ \end{bmatrix} = K^{-1} \begin{bmatrix}x\\y\\1\\ \end{bmatrix}
K1=[1/fx0cx/fx01/fycy/fy001]K^{-1}= \begin{bmatrix}1/f_x&0&-c_x/f_x\\0&1/f_y&-c_y/f_y\\0&0&1\\ \end{bmatrix}

rays_d는 다음과 같다.

rays_d = torch.sum(dirs[..., np.newaxis, :] * c2w[:3,:3], -1)  # dot product, equals to: [c2w.dot(dir) for dir in dirs]

rays_o는 다음과 같다.

rays_o = c2w[:3,-1].expand(rays_d.shape)

여기까지만 해도, rays_d와 rays_o의 shape은 [H,W,3]이다.

(lego.blend의경우[400,400,3])(lego.blend 의 경우 [400,400,3])

마지막으로 get_rays 함수는 rays_d와 rays_o를 return한다.

profile
Coputer vision, AI

0개의 댓글