NeRFs-Eye-View / nerf-project

0 stars 1 forks source link

[DOC] NeRF paper review-2 #7

Closed jungcow closed 7 months ago

jungcow commented 9 months ago

Description

TODO

jungcow commented 8 months ago

교수님의 피드백:

    N_iters = 200000 + 1 # 20만번의 epoch
    print('Begin')
    print('TRAIN views are', i_train)
    print('TEST views are', i_test)
    print('VAL views are', i_val)

    # Summary writers
    # writer = SummaryWriter(os.path.join(basedir, 'summaries', expname))

    start = start + 1
    for i in trange(start, N_iters):
        time0 = time.time()

        # Sample random ray batch
        if use_batching:
            # Random over all images
            batch = rays_rgb[i_batch:i_batch+N_rand] # [B, 2+1, 3*?]
            batch = torch.transpose(batch, 0, 1)
            batch_rays, target_s = batch[:2], batch[2]

            i_batch += N_rand
            if i_batch >= rays_rgb.shape[0]:
                print("Shuffle data after an epoch!")
                rand_idx = torch.randperm(rays_rgb.shape[0])
                rays_rgb = rays_rgb[rand_idx]
                i_batch = 0

        else:
            # Random from one image
            img_i = np.random.choice(i_train) # 한번의 epoch당 하나의 이미지를 sample
            target = images[img_i]
            target = torch.Tensor(target).to(device)
            pose = poses[img_i, :3,:4]

            if N_rand is not None:
                rays_o, rays_d = get_rays(H, W, K, torch.Tensor(pose))  # (H, W, 3), (H, W, 3)

colmap의 출력이 포인트 클라우드는 피쳐에 대한 point들인가? -> 맞다. ray sampling에서 t가 시간이다? —> 그냥 직선상의 점으로 생각 샘플링 바운드가 잘 모르는 부분이었음. -> 이미 feature 대한 포인트 클라우드가 있으니까 그 공간 정보를 이용해서 바운드를 설정하는게 아닌가? 여기서 알 수 있는 것은 상대적인 거리정보 뿐이다. 어떻게 ray에서 sampling된 것만으로 MLP에 넣어서 밀도랑 색깔을 뽑아낼 수 있을까? -> NeRF의 두개의 neural network와 volume rendering을 통한 최종 컬러값 계산으로 에러값을 계산. 이 loss function을 통해 공간상의 밀도 분포가 추정될 것이고, 이를 통해 보다 정확한 컬러값을 추정할 수 있을 것. ray상의 색에 대한 확률 분포를 만들어서 중첩시키면 진해지는 부분에서 색이 결정 될거다... 샘플링된 포인트들에 대한 색깔이 어떻게 될지를 예측한다는 말이다. 그 포인트로 된 것를 학습하려면 다른 뷰에대한 사진들로 학습해야되는거 아닌가 —> 사진 100장에 대해 픽셀을 배치 사이즈만큼 뽑는다. 이 픽셀에 대해서 각각 ray를 만들어 공간상의 ray 위의 점들을 또 뽑는다. 이 점들을 학습에 사용. 즉 100장의 사진들이 사용됨. 공간상에서 장면에 대한 대략적인 초기 색깔 분포를 알고 있어야 하는 것 아닌가? —> 처음에는 엉망으로 나올 것. 하지만 loss function을 통해 loss가 줄어드는 방향으로 점차 파라미터들이 갱신될 것. 한 view를 인풋으로 주고 다 비교하는 것인가, 한장의 이미지로 GT로 비교할때 결국 어차피 GT로 수렴하는 아닌가... 첫번째 장과 두번째 장을 순서대로 넣으면 두번째장 학습시킬때는 첫번째 학습킨 장면에 대해서는 멀어지는게 아닌가? -> 따라서 100장을 여러번에 걸쳐서 학습에 사용 결국 NeRF는 어느 뷰에 대해서 그 뷰에 대한 2d 이미지를 생성해내면 되는거 아닌가?

jungcow commented 8 months ago

내가 생각하는, 피드백에서 얻은 NeRF의 본질은 공간상의 object에 대한 어떠한 공간적 정보(object의 위치, 부피, 밀도 등)를 갖지 않은 상태에서, 이 object가 공간상에 어떠한 밀도 분포로 존재하는지를 추정하는 일인 것 같다. 공간상의 object에 대해 어떤 view로의 렌더링을 수행할 때, 만약 투명하지 않은 물체라면 어느 object의 특정 지점의 색깔만이 반영되어야 하고, 이것의 의미는 해당 지점의 밀도 분포가 delta function과 같이 특정 지점에만 무한대의 확률을 갖는 분포를 가져야 함을 뜻한다. 투명하다면, 그곳의 불투명도 또는 도달 가능성(transmittance)를 이용해서 밀도 분포를 구하여 이들의 적분을 통해 하나의 픽셀 값을 구해야 함을 뜻한다. 즉 이렇게 공간 상의 어느 위치에 물체가 있고, 또 이 물체의 어느부분의 밀도가 어느 정도로 꽉 차있어서 뒤에 색이 반영이 어느 정도로 될지에 대한 것들을 나타내는 공간상의 3차원 확률 분포를 추정하는 것이 NeRF의 두개의 Neural network에서의 본질적인 목적인 것 같다.