Spaces:
Runtime error
Runtime error
# Copyright (C) 2023, Computer Vision Lab, Seoul National University, https://cv.snu.ac.kr | |
# | |
# Copyright 2023 LucidDreamer Authors | |
# | |
# Computer Vision Lab, SNU, its affiliates and licensors retain all intellectual | |
# property and proprietary rights in and to this material, related | |
# documentation and any modifications thereto. Any use, reproduction, | |
# disclosure or distribution of this material and related documentation | |
# without an express license agreement from the Computer Vision Lab, SNU or | |
# its affiliates is strictly prohibited. | |
# | |
# For permission requests, please contact robot0321@snu.ac.kr, esw0116@snu.ac.kr, namhj28@gmail.com, jarin.lee@gmail.com. | |
import os | |
import numpy as np | |
import torch | |
def generate_seed(scale, viewangle): | |
# World 2 Camera | |
#### rotate x,y | |
render_poses = [np.array([[1,0,0,0],[0,1,0,0],[0,0,1,0]])] | |
ang = 5 | |
for i,j in zip([ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0,ang,2*ang,3*ang,2*ang,ang,0], [0,0,0,ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0,0,0,0]): | |
th, phi = i/180*np.pi, j/180*np.pi | |
posetemp = np.zeros((3, 4)) | |
posetemp[:3,:3] = np.matmul(np.eye(3), | |
np.matmul(np.array([[np.cos(th), 0, np.sin(th)], [0, 1, 0], [-np.sin(th), 0, np.cos(th)]]), np.array([[1, 0, 0], [0, np.cos(phi), -np.sin(phi)], [0, np.sin(phi), np.cos(phi)]]))) # Turn left | |
posetemp[:3,3:4] = np.array([0,0,0]).reshape(3,1) # * scale # Transition vector | |
render_poses.append(posetemp) | |
for i,j in zip([-ang,-2*ang,-3*ang,-2*ang,-ang,0,ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0], [0,0,0,ang,ang,ang,ang,ang,0,-ang,-ang,-ang,-ang,-ang,0,0,0,0]): | |
th, phi = i/180*np.pi, j/180*np.pi | |
posetemp = np.zeros((3, 4)) | |
posetemp[:3,:3] = np.matmul(np.array([[np.cos(-3*ang/180*np.pi), 0, np.sin(-3*ang/180*np.pi)], [0, 1, 0], [-np.sin(-3*ang/180*np.pi), 0, np.cos(-3*ang/180*np.pi)]]), | |
np.matmul(np.array([[np.cos(th), 0, np.sin(th)], [0, 1, 0], [-np.sin(th), 0, np.cos(th)]]), np.array([[1, 0, 0], [0, np.cos(phi), -np.sin(phi)], [0, np.sin(phi), np.cos(phi)]]))) | |
posetemp[:3,3:4] = np.array([1,0,0]).reshape(3,1) # * scale # Transition vector | |
render_poses.append(posetemp) | |
for i,j in zip([ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0,ang,2*ang,3*ang,2*ang,ang,0], [0,0,0,ang,ang,ang,ang,ang,0,-ang,-ang,-ang,-ang,-ang,0,0,0,0]): | |
th, phi = i/180*np.pi, j/180*np.pi | |
posetemp = np.zeros((3, 4)) | |
posetemp[:3,:3] = np.matmul(np.array([[np.cos(3*ang/180*np.pi), 0, np.sin(3*ang/180*np.pi)], [0, 1, 0], [-np.sin(3*ang/180*np.pi), 0, np.cos(3*ang/180*np.pi)]]), | |
np.matmul(np.array([[np.cos(th), 0, np.sin(th)], [0, 1, 0], [-np.sin(th), 0, np.cos(th)]]), np.array([[1, 0, 0], [0, np.cos(phi), -np.sin(phi)], [0, np.sin(phi), np.cos(phi)]]))) | |
posetemp[:3,3:4] = np.array([-1,0,0]).reshape(3,1) # * scale # Transition vector | |
render_poses.append(posetemp) | |
# for i,j in zip([ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0,ang,2*ang,3*ang,2*ang,ang,0], [0,0,0,ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0,0,0,0]): | |
# th, phi = i/180*np.pi, j/180*np.pi | |
# posetemp = np.zeros((3, 4)) | |
# posetemp[:3,:3] = np.matmul(np.eye(3), | |
# np.matmul(np.array([[np.cos(th), 0, np.sin(th)], [0, 1, 0], [-np.sin(th), 0, np.cos(th)]]), np.array([[1, 0, 0], [0, np.cos(phi), -np.sin(phi)], [0, np.sin(phi), np.cos(phi)]]))) | |
# posetemp[:3,3:4] = np.array([0,0,1]).reshape(3,1) # * scale # Transition vector | |
# render_poses.append(posetemp) | |
rot_cam=viewangle/3 | |
for i,j in zip([ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0,ang,2*ang,3*ang,2*ang,ang,0], [0,0,0,ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0,0,0,0]): | |
th, phi = i/180*np.pi, j/180*np.pi | |
posetemp = np.zeros((3, 4)) | |
posetemp[:3,:3] = np.matmul(np.array([[np.cos(rot_cam/180*np.pi), 0, np.sin(rot_cam/180*np.pi)], [0, 1, 0], [-np.sin(rot_cam/180*np.pi), 0, np.cos(rot_cam/180*np.pi)]]), | |
np.matmul(np.array([[np.cos(th), 0, np.sin(th)], [0, 1, 0], [-np.sin(th), 0, np.cos(th)]]), np.array([[1, 0, 0], [0, np.cos(phi), -np.sin(phi)], [0, np.sin(phi), np.cos(phi)]]))) # Turn left | |
posetemp[:3,3:4] = np.array([0,0,0]).reshape(3,1) # * scale # Transition vector | |
render_poses.append(posetemp) | |
for i,j in zip([-ang,-2*ang,-3*ang,-2*ang,-ang,0,ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0], [0,0,0,ang,ang,ang,ang,ang,0,-ang,-ang,-ang,-ang,-ang,0,0,0,0]): | |
th, phi = i/180*np.pi, j/180*np.pi | |
posetemp = np.zeros((3, 4)) | |
posetemp[:3,:3] = np.matmul(np.array([[np.cos(rot_cam/180*np.pi), 0, np.sin(rot_cam/180*np.pi)], [0, 1, 0], [-np.sin(rot_cam/180*np.pi), 0, np.cos(rot_cam/180*np.pi)]]), | |
np.matmul(np.array([[np.cos(-3*ang/180*np.pi), 0, np.sin(-3*ang/180*np.pi)], [0, 1, 0], [-np.sin(-3*ang/180*np.pi), 0, np.cos(-3*ang/180*np.pi)]]), | |
np.matmul(np.array([[np.cos(th), 0, np.sin(th)], [0, 1, 0], [-np.sin(th), 0, np.cos(th)]]), np.array([[1, 0, 0], [0, np.cos(phi), -np.sin(phi)], [0, np.sin(phi), np.cos(phi)]])))) | |
posetemp[:3,3:4] = np.array([0,0,1]).reshape(3,1) # * scale # Transition vector | |
render_poses.append(posetemp) | |
for i,j in zip([ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0,ang,2*ang,3*ang,2*ang,ang,0], [0,0,0,ang,ang,ang,ang,ang,0,-ang,-ang,-ang,-ang,-ang,0,0,0,0]): | |
th, phi = i/180*np.pi, j/180*np.pi | |
posetemp = np.zeros((3, 4)) | |
posetemp[:3,:3] = np.matmul(np.array([[np.cos(rot_cam/180*np.pi), 0, np.sin(rot_cam/180*np.pi)], [0, 1, 0], [-np.sin(rot_cam/180*np.pi), 0, np.cos(rot_cam/180*np.pi)]]), | |
np.matmul(np.array([[np.cos(3*ang/180*np.pi), 0, np.sin(3*ang/180*np.pi)], [0, 1, 0], [-np.sin(3*ang/180*np.pi), 0, np.cos(3*ang/180*np.pi)]]), | |
np.matmul(np.array([[np.cos(th), 0, np.sin(th)], [0, 1, 0], [-np.sin(th), 0, np.cos(th)]]), np.array([[1, 0, 0], [0, np.cos(phi), -np.sin(phi)], [0, np.sin(phi), np.cos(phi)]])))) | |
posetemp[:3,3:4] = np.array([0,0,-1]).reshape(3,1) # * scale # Transition vector | |
render_poses.append(posetemp) | |
# for i,j in zip([ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0,ang,2*ang,3*ang,2*ang,ang,0], [0,0,0,ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0,0,0,0]): | |
# th, phi = i/180*np.pi, j/180*np.pi | |
# posetemp = np.zeros((3, 4)) | |
# posetemp[:3,:3] = np.matmul(np.array([[np.cos(rot_cam/180*np.pi), 0, np.sin(rot_cam/180*np.pi)], [0, 1, 0], [-np.sin(rot_cam/180*np.pi), 0, np.cos(rot_cam/180*np.pi)]]), | |
# np.matmul(np.array([[np.cos(th), 0, np.sin(th)], [0, 1, 0], [-np.sin(th), 0, np.cos(th)]]), np.array([[1, 0, 0], [0, np.cos(phi), -np.sin(phi)], [0, np.sin(phi), np.cos(phi)]]))) | |
# posetemp[:3,3:4] = np.array([1,0,0]).reshape(3,1) # * scale # Transition vector | |
# render_poses.append(posetemp) | |
rot_cam=viewangle*2/3 | |
for i,j in zip([ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0,ang,2*ang,3*ang,2*ang,ang,0], [0,0,0,ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0,0,0,0]): | |
th, phi = i/180*np.pi, j/180*np.pi | |
posetemp = np.zeros((3, 4)) | |
posetemp[:3,:3] = np.matmul(np.array([[np.cos(rot_cam/180*np.pi), 0, np.sin(rot_cam/180*np.pi)], [0, 1, 0], [-np.sin(rot_cam/180*np.pi), 0, np.cos(rot_cam/180*np.pi)]]), | |
np.matmul(np.array([[np.cos(th), 0, np.sin(th)], [0, 1, 0], [-np.sin(th), 0, np.cos(th)]]), np.array([[1, 0, 0], [0, np.cos(phi), -np.sin(phi)], [0, np.sin(phi), np.cos(phi)]]))) # Turn left | |
posetemp[:3,3:4] = np.array([0,0,0]).reshape(3,1) # * scale # Transition vector | |
render_poses.append(posetemp) | |
for i,j in zip([-ang,-2*ang,-3*ang,-2*ang,-ang,0,ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0], [0,0,0,ang,ang,ang,ang,ang,0,-ang,-ang,-ang,-ang,-ang,0,0,0,0]): | |
th, phi = i/180*np.pi, j/180*np.pi | |
posetemp = np.zeros((3, 4)) | |
posetemp[:3,:3] = np.matmul(np.array([[np.cos(rot_cam/180*np.pi), 0, np.sin(rot_cam/180*np.pi)], [0, 1, 0], [-np.sin(rot_cam/180*np.pi), 0, np.cos(rot_cam/180*np.pi)]]), | |
np.matmul(np.array([[np.cos(-3*ang/180*np.pi), 0, np.sin(-3*ang/180*np.pi)], [0, 1, 0], [-np.sin(-3*ang/180*np.pi), 0, np.cos(-3*ang/180*np.pi)]]), | |
np.matmul(np.array([[np.cos(th), 0, np.sin(th)], [0, 1, 0], [-np.sin(th), 0, np.cos(th)]]), np.array([[1, 0, 0], [0, np.cos(phi), -np.sin(phi)], [0, np.sin(phi), np.cos(phi)]])))) | |
posetemp[:3,3:4] = np.array([-1,0,0]).reshape(3,1) # * scale # Transition vector | |
render_poses.append(posetemp) | |
for i,j in zip([ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0,ang,2*ang,3*ang,2*ang,ang,0], [0,0,0,ang,ang,ang,ang,ang,0,-ang,-ang,-ang,-ang,-ang,0,0,0,0]): | |
th, phi = i/180*np.pi, j/180*np.pi | |
posetemp = np.zeros((3, 4)) | |
posetemp[:3,:3] = np.matmul(np.array([[np.cos(rot_cam/180*np.pi), 0, np.sin(rot_cam/180*np.pi)], [0, 1, 0], [-np.sin(rot_cam/180*np.pi), 0, np.cos(rot_cam/180*np.pi)]]), | |
np.matmul(np.array([[np.cos(3*ang/180*np.pi), 0, np.sin(3*ang/180*np.pi)], [0, 1, 0], [-np.sin(3*ang/180*np.pi), 0, np.cos(3*ang/180*np.pi)]]), | |
np.matmul(np.array([[np.cos(th), 0, np.sin(th)], [0, 1, 0], [-np.sin(th), 0, np.cos(th)]]), np.array([[1, 0, 0], [0, np.cos(phi), -np.sin(phi)], [0, np.sin(phi), np.cos(phi)]])))) | |
posetemp[:3,3:4] = np.array([1,0,0]).reshape(3,1) # * scale # Transition vector | |
render_poses.append(posetemp) | |
# for i,j in zip([ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0,ang,2*ang,3*ang,2*ang,ang,0], [0,0,0,ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0,0,0,0]): | |
# th, phi = i/180*np.pi, j/180*np.pi | |
# posetemp = np.zeros((3, 4)) | |
# posetemp[:3,:3] = np.matmul(np.array([[np.cos(rot_cam/180*np.pi), 0, np.sin(rot_cam/180*np.pi)], [0, 1, 0], [-np.sin(rot_cam/180*np.pi), 0, np.cos(rot_cam/180*np.pi)]]), | |
# np.matmul(np.array([[np.cos(th), 0, np.sin(th)], [0, 1, 0], [-np.sin(th), 0, np.cos(th)]]), np.array([[1, 0, 0], [0, np.cos(phi), -np.sin(phi)], [0, np.sin(phi), np.cos(phi)]]))) | |
# posetemp[:3,3:4] = np.array([0,0,-1]).reshape(3,1) # * scale # Transition vector | |
# render_poses.append(posetemp) | |
rot_cam=viewangle | |
for i,j in zip([ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0,ang,2*ang,3*ang,2*ang,ang,0], [0,0,0,ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0,0,0,0]): | |
th, phi = i/180*np.pi, j/180*np.pi | |
posetemp = np.zeros((3, 4)) | |
posetemp[:3,:3] = np.matmul(np.array([[np.cos(rot_cam/180*np.pi), 0, np.sin(rot_cam/180*np.pi)], [0, 1, 0], [-np.sin(rot_cam/180*np.pi), 0, np.cos(rot_cam/180*np.pi)]]), | |
np.matmul(np.array([[np.cos(th), 0, np.sin(th)], [0, 1, 0], [-np.sin(th), 0, np.cos(th)]]), np.array([[1, 0, 0], [0, np.cos(phi), -np.sin(phi)], [0, np.sin(phi), np.cos(phi)]]))) # Turn left | |
posetemp[:3,3:4] = np.array([0,0,0]).reshape(3,1) # * scale # Transition vector | |
render_poses.append(posetemp) | |
for i,j in zip([-ang,-2*ang,-3*ang,-2*ang,-ang,0,ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0], [0,0,0,ang,ang,ang,ang,ang,0,-ang,-ang,-ang,-ang,-ang,0,0,0,0]): | |
th, phi = i/180*np.pi, j/180*np.pi | |
posetemp = np.zeros((3, 4)) | |
posetemp[:3,:3] = np.matmul(np.array([[np.cos(rot_cam/180*np.pi), 0, np.sin(rot_cam/180*np.pi)], [0, 1, 0], [-np.sin(rot_cam/180*np.pi), 0, np.cos(rot_cam/180*np.pi)]]), | |
np.matmul(np.array([[np.cos(-3*ang/180*np.pi), 0, np.sin(-3*ang/180*np.pi)], [0, 1, 0], [-np.sin(-3*ang/180*np.pi), 0, np.cos(-3*ang/180*np.pi)]]), | |
np.matmul(np.array([[np.cos(th), 0, np.sin(th)], [0, 1, 0], [-np.sin(th), 0, np.cos(th)]]), np.array([[1, 0, 0], [0, np.cos(phi), -np.sin(phi)], [0, np.sin(phi), np.cos(phi)]])))) | |
posetemp[:3,3:4] = np.array([0,0,-1]).reshape(3,1) # * scale # Transition vector | |
render_poses.append(posetemp) | |
for i,j in zip([ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0,ang,2*ang,3*ang,2*ang,ang,0], [0,0,0,ang,ang,ang,ang,ang,0,-ang,-ang,-ang,-ang,-ang,0,0,0,0]): | |
th, phi = i/180*np.pi, j/180*np.pi | |
posetemp = np.zeros((3, 4)) | |
posetemp[:3,:3] = np.matmul(np.array([[np.cos(rot_cam/180*np.pi), 0, np.sin(rot_cam/180*np.pi)], [0, 1, 0], [-np.sin(rot_cam/180*np.pi), 0, np.cos(rot_cam/180*np.pi)]]), | |
np.matmul(np.array([[np.cos(3*ang/180*np.pi), 0, np.sin(3*ang/180*np.pi)], [0, 1, 0], [-np.sin(3*ang/180*np.pi), 0, np.cos(3*ang/180*np.pi)]]), | |
np.matmul(np.array([[np.cos(th), 0, np.sin(th)], [0, 1, 0], [-np.sin(th), 0, np.cos(th)]]), np.array([[1, 0, 0], [0, np.cos(phi), -np.sin(phi)], [0, np.sin(phi), np.cos(phi)]])))) | |
posetemp[:3,3:4] = np.array([0,0,1]).reshape(3,1) # * scale # Transition vector | |
render_poses.append(posetemp) | |
# for i,j in zip([ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0,ang,2*ang,3*ang,2*ang,ang,0], [0,0,0,ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0,0,0,0]): | |
# th, phi = i/180*np.pi, j/180*np.pi | |
# posetemp = np.zeros((3, 4)) | |
# posetemp[:3,:3] = np.matmul(np.array([[np.cos(rot_cam/180*np.pi), 0, np.sin(rot_cam/180*np.pi)], [0, 1, 0], [-np.sin(rot_cam/180*np.pi), 0, np.cos(rot_cam/180*np.pi)]]), | |
# np.matmul(np.array([[np.cos(th), 0, np.sin(th)], [0, 1, 0], [-np.sin(th), 0, np.cos(th)]]), np.array([[1, 0, 0], [0, np.cos(phi), -np.sin(phi)], [0, np.sin(phi), np.cos(phi)]]))) | |
# posetemp[:3,3:4] = np.array([-1,0,0]).reshape(3,1) # * scale # Transition vector | |
# render_poses.append(posetemp) | |
render_poses.append(np.array([[1,0,0,0],[0,1,0,0],[0,0,1,0]])) | |
render_poses = np.stack(render_poses, axis=0) | |
return render_poses | |
def generate_seed_360(viewangle, n_views): | |
N = n_views | |
render_poses = np.zeros((N, 3, 4)) | |
for i in range(N): | |
th = (viewangle/N)*i/180*np.pi | |
render_poses[i,:3,:3] = np.array([[np.cos(th), 0, np.sin(th)], [0, 1, 0], [-np.sin(th), 0, np.cos(th)]]) | |
render_poses[i,:3,3:4] = np.random.randn(3,1)*0.0 # Transition vector | |
return render_poses | |
def generate_seed_360_half(viewangle, n_views): | |
N = n_views // 2 | |
halfangle = viewangle / 2 | |
render_poses = np.zeros((N*2, 3, 4)) | |
for i in range(N): | |
th = (halfangle/N)*i/180*np.pi | |
render_poses[i,:3,:3] = np.array([[np.cos(th), 0, np.sin(th)], [0, 1, 0], [-np.sin(th), 0, np.cos(th)]]) | |
render_poses[i,:3,3:4] = np.random.randn(3,1)*0.0 # Transition vector | |
for i in range(N): | |
th = -(halfangle/N)*i/180*np.pi | |
render_poses[i+N,:3,:3] = np.array([[np.cos(th), 0, np.sin(th)], [0, 1, 0], [-np.sin(th), 0, np.cos(th)]]) | |
render_poses[i+N,:3,3:4] = np.random.randn(3,1)*0.0 # Transition vector | |
return render_poses | |
def generate_seed_preset(): | |
degsum = 60 | |
thlist = np.concatenate((np.linspace(0, degsum, 4), np.linspace(0, -degsum, 4)[1:], np.linspace(0, degsum, 4), np.linspace(0, -degsum, 4)[1:], np.linspace(0, degsum, 4), np.linspace(0, -degsum, 4)[1:])) | |
philist = np.concatenate((np.linspace(0,0,7), np.linspace(-22.5,-22.5,7), np.linspace(22.5,22.5,7))) | |
assert len(thlist) == len(philist) | |
render_poses = np.zeros((len(thlist), 3, 4)) | |
for i in range(len(thlist)): | |
th = thlist[i] | |
phi = philist[i] | |
render_poses[i,:3,:3] = np.matmul(np.array([[np.cos(th/180*np.pi), 0, -np.sin(th/180*np.pi)], [0, 1, 0], [np.sin(th/180*np.pi), 0, np.cos(th/180*np.pi)]]), np.array([[1, 0, 0], [0, np.cos(phi/180*np.pi), -np.sin(phi/180*np.pi)], [0, np.sin(phi/180*np.pi), np.cos(phi/180*np.pi)]])) | |
render_poses[i,:3,3:4] = np.zeros((3,1)) | |
return render_poses | |
def generate_seed_newpreset(): | |
degsum = 60 | |
thlist = np.concatenate((np.linspace(0, degsum, 4), np.linspace(0, -degsum, 4)[1:], np.linspace(0, degsum, 4), np.linspace(0, -degsum, 4)[1:])) | |
philist = np.concatenate((np.linspace(0,0,7), np.linspace(22.5,22.5,7))) | |
assert len(thlist) == len(philist) | |
render_poses = np.zeros((len(thlist), 3, 4)) | |
for i in range(len(thlist)): | |
th = thlist[i] | |
phi = philist[i] | |
render_poses[i,:3,:3] = np.matmul(np.array([[np.cos(th/180*np.pi), 0, -np.sin(th/180*np.pi)], [0, 1, 0], [np.sin(th/180*np.pi), 0, np.cos(th/180*np.pi)]]), np.array([[1, 0, 0], [0, np.cos(phi/180*np.pi), -np.sin(phi/180*np.pi)], [0, np.sin(phi/180*np.pi), np.cos(phi/180*np.pi)]])) | |
render_poses[i,:3,3:4] = np.zeros((3,1)) | |
return render_poses | |
def generate_seed_horizon(): | |
movement = np.linspace(0, 5, 11) | |
render_poses = np.zeros((len(movement), 3, 4)) | |
for i in range(len(movement)): | |
render_poses[i,:3,:3] = np.eye(3) | |
render_poses[i,:3,3:4] = np.array([[-movement[i]], [0], [0]]) | |
return render_poses | |
def generate_seed_backward(): | |
movement = np.linspace(0, 5, 11) | |
render_poses = np.zeros((len(movement), 3, 4)) | |
for i in range(len(movement)): | |
render_poses[i,:3,:3] = np.eye(3) | |
render_poses[i,:3,3:4] = np.array([[0], [0], [movement[i]]]) | |
return render_poses | |
def generate_seed_arc(): | |
degree = 5 | |
# thlist = np.array([degree, 0, 0, 0, -degree]) | |
thlist = np.arange(0, degree, 5) + np.arange(0, -degree, 5)[1:] | |
phi = 0 | |
render_poses = np.zeros((len(thlist), 3, 4)) | |
for i in range(len(thlist)): | |
th = thlist[i] | |
d = 4.3 # 얘를 조절하면 초기 자세 기준으로 앞으로 d만큼 떨어진 점을 기준으로 도는 자세가 만들어짐 | |
render_poses[i,:3,:3] = np.matmul(np.array([[np.cos(th/180*np.pi), 0, -np.sin(th/180*np.pi)], [0, 1, 0], [np.sin(th/180*np.pi), 0, np.cos(th/180*np.pi)]]), np.array([[1, 0, 0], [0, np.cos(phi/180*np.pi), -np.sin(phi/180*np.pi)], [0, np.sin(phi/180*np.pi), np.cos(phi/180*np.pi)]])) | |
render_poses[0,:3,3:4] = np.array([d*np.sin(th/180*np.pi), 0, d-d*np.cos(th/180*np.pi)]).reshape(3,1) + np.array([0, d*np.sin(phi/180*np.pi), d-d*np.cos(phi/180*np.pi)]).reshape(3,1)# Transition vector | |
# render_poses[i,:3,3:4] = np.zeros((3,1)) | |
return render_poses | |
def generate_seed_hemisphere(center_depth, degree=5): | |
degree = 5 | |
thlist = np.array([degree, 0, 0, 0, -degree]) | |
philist = np.array([0, -degree, 0, degree, 0]) | |
assert len(thlist) == len(philist) | |
render_poses = np.zeros((len(thlist), 3, 4)) | |
for i in range(len(thlist)): | |
th = thlist[i] | |
phi = philist[i] | |
# curr_pose = np.zeros((1, 3, 4)) | |
d = center_depth # 얘를 조절하면 초기 자세 기준으로 앞으로 d만큼 떨어진 점을 기준으로 도는 자세가 만들어짐 | |
render_poses[i,:3,:3] = np.matmul(np.array([[np.cos(th/180*np.pi), 0, -np.sin(th/180*np.pi)], [0, 1, 0], [np.sin(th/180*np.pi), 0, np.cos(th/180*np.pi)]]), np.array([[1, 0, 0], [0, np.cos(phi/180*np.pi), -np.sin(phi/180*np.pi)], [0, np.sin(phi/180*np.pi), np.cos(phi/180*np.pi)]])) | |
render_poses[0,:3,3:4] = np.array([d*np.sin(th/180*np.pi), 0, d-d*np.cos(th/180*np.pi)]).reshape(3,1) + np.array([0, d*np.sin(phi/180*np.pi), d-d*np.cos(phi/180*np.pi)]).reshape(3,1)# Transition vector | |
# render_poses[i,:3,3:4] = np.zeros((3,1)) | |
return render_poses | |
def generate_seed_hemisphere_(degree, nviews): | |
# thlist = np.array([degree, 0, 0, 0, -degree]) | |
# philist = np.array([0, -degree, 0, degree, 0]) | |
thlist = degree * np.sin(np.linspace(0, 2*np.pi, nviews)) | |
philist = degree * np.cos(np.linspace(0, 2*np.pi, nviews)) | |
assert len(thlist) == len(philist) | |
render_poses = np.zeros((len(thlist), 3, 4)) | |
for i in range(len(thlist)): | |
th = thlist[i] | |
phi = philist[i] | |
# curr_pose = np.zeros((1, 3, 4)) | |
d = 4.3 # 얘를 조절하면 초기 자세 기준으로 앞으로 d만큼 떨어진 점을 기준으로 도는 자세가 만들어짐 | |
render_poses[i,:3,:3] = np.matmul(np.array([[np.cos(th/180*np.pi), 0, -np.sin(th/180*np.pi)], [0, 1, 0], [np.sin(th/180*np.pi), 0, np.cos(th/180*np.pi)]]), np.array([[1, 0, 0], [0, np.cos(phi/180*np.pi), -np.sin(phi/180*np.pi)], [0, np.sin(phi/180*np.pi), np.cos(phi/180*np.pi)]])) | |
render_poses[0,:3,3:4] = np.array([d*np.sin(th/180*np.pi), 0, d-d*np.cos(th/180*np.pi)]).reshape(3,1) + np.array([0, d*np.sin(phi/180*np.pi), d-d*np.cos(phi/180*np.pi)]).reshape(3,1)# Transition vector | |
return render_poses | |
def generate_seed_nothing(): | |
degree = 5 | |
thlist = np.array([0]) | |
philist = np.array([0]) | |
assert len(thlist) == len(philist) | |
render_poses = np.zeros((len(thlist), 3, 4)) | |
for i in range(len(thlist)): | |
th = thlist[i] | |
phi = philist[i] | |
# curr_pose = np.zeros((1, 3, 4)) | |
d = 4.3 # 얘를 조절하면 초기 자세 기준으로 앞으로 d만큼 떨어진 점을 기준으로 도는 자세가 만들어짐 | |
render_poses[i,:3,:3] = np.matmul(np.array([[np.cos(th/180*np.pi), 0, -np.sin(th/180*np.pi)], [0, 1, 0], [np.sin(th/180*np.pi), 0, np.cos(th/180*np.pi)]]), np.array([[1, 0, 0], [0, np.cos(phi/180*np.pi), -np.sin(phi/180*np.pi)], [0, np.sin(phi/180*np.pi), np.cos(phi/180*np.pi)]])) | |
render_poses[0,:3,3:4] = np.array([d*np.sin(th/180*np.pi), 0, d-d*np.cos(th/180*np.pi)]).reshape(3,1) + np.array([0, d*np.sin(phi/180*np.pi), d-d*np.cos(phi/180*np.pi)]).reshape(3,1)# Transition vector | |
# render_poses[i,:3,3:4] = np.zeros((3,1)) | |
return render_poses | |
def generate_seed_lookaround(): | |
degsum = 60 | |
thlist = np.concatenate((np.linspace(0, degsum, 4), np.linspace(0, -degsum, 4)[1:], np.linspace(0, degsum, 4), np.linspace(0, -degsum, 4)[1:], np.linspace(0, degsum, 4), np.linspace(0, -degsum, 4)[1:])) | |
philist = np.concatenate((np.linspace(0,0,7), np.linspace(22.5,22.5,7), np.linspace(-22.5,-22.5,7))) | |
assert len(thlist) == len(philist) | |
render_poses = [] | |
# up / left --> right | |
thlist = np.linspace(-degsum, degsum, 2*degsum+1) | |
for i in range(len(thlist)): | |
render_pose = np.zeros((3,4)) | |
th = thlist[i] | |
phi = 22.5 | |
render_pose[:3,:3] = np.matmul(np.array([[np.cos(th/180*np.pi), 0, -np.sin(th/180*np.pi)], [0, 1, 0], [np.sin(th/180*np.pi), 0, np.cos(th/180*np.pi)]]), np.array([[1, 0, 0], [0, np.cos(phi/180*np.pi), -np.sin(phi/180*np.pi)], [0, np.sin(phi/180*np.pi), np.cos(phi/180*np.pi)]])) | |
render_pose[:3,3:4] = np.zeros((3,1)) | |
render_poses.append(render_pose) | |
# right / up --> center | |
phlist = np.linspace(22.5, 0, 23) | |
# Exclude first frame (same as last frame before) | |
phlist = phlist[1:] | |
for i in range(len(phlist)): | |
render_pose = np.zeros((3,4)) | |
th = degsum | |
phi = phlist[i] | |
render_pose[:3,:3] = np.matmul(np.array([[np.cos(th/180*np.pi), 0, -np.sin(th/180*np.pi)], [0, 1, 0], [np.sin(th/180*np.pi), 0, np.cos(th/180*np.pi)]]), np.array([[1, 0, 0], [0, np.cos(phi/180*np.pi), -np.sin(phi/180*np.pi)], [0, np.sin(phi/180*np.pi), np.cos(phi/180*np.pi)]])) | |
render_pose[:3,3:4] = np.zeros((3,1)) | |
render_poses.append(render_pose) | |
# center / right --> left | |
thlist = np.linspace(degsum, -degsum, 2*degsum+1) | |
thlist = thlist[1:] | |
for i in range(len(thlist)): | |
render_pose = np.zeros((3,4)) | |
th = thlist[i] | |
phi = 0 | |
render_pose[:3,:3] = np.matmul(np.array([[np.cos(th/180*np.pi), 0, -np.sin(th/180*np.pi)], [0, 1, 0], [np.sin(th/180*np.pi), 0, np.cos(th/180*np.pi)]]), np.array([[1, 0, 0], [0, np.cos(phi/180*np.pi), -np.sin(phi/180*np.pi)], [0, np.sin(phi/180*np.pi), np.cos(phi/180*np.pi)]])) | |
render_pose[:3,3:4] = np.zeros((3,1)) | |
render_poses.append(render_pose) | |
# left / center --> down | |
phlist = np.linspace(0, -22.5, 23) | |
phlist = phlist[1:] | |
for i in range(len(phlist)): | |
render_pose = np.zeros((3,4)) | |
th = -degsum | |
phi = phlist[i] | |
render_pose[:3,:3] = np.matmul(np.array([[np.cos(th/180*np.pi), 0, -np.sin(th/180*np.pi)], [0, 1, 0], [np.sin(th/180*np.pi), 0, np.cos(th/180*np.pi)]]), np.array([[1, 0, 0], [0, np.cos(phi/180*np.pi), -np.sin(phi/180*np.pi)], [0, np.sin(phi/180*np.pi), np.cos(phi/180*np.pi)]])) | |
render_pose[:3,3:4] = np.zeros((3,1)) | |
render_poses.append(render_pose) | |
thlist = np.linspace(-degsum, degsum, 2*degsum+1) | |
for i in range(len(thlist)): | |
render_pose = np.zeros((3,4)) | |
th = thlist[i] | |
phi = -22.5 | |
render_pose[:3,:3] = np.matmul(np.array([[np.cos(th/180*np.pi), 0, -np.sin(th/180*np.pi)], [0, 1, 0], [np.sin(th/180*np.pi), 0, np.cos(th/180*np.pi)]]), np.array([[1, 0, 0], [0, np.cos(phi/180*np.pi), -np.sin(phi/180*np.pi)], [0, np.sin(phi/180*np.pi), np.cos(phi/180*np.pi)]])) | |
render_pose[:3,3:4] = np.zeros((3,1)) | |
render_poses.append(render_pose) | |
return render_poses | |
def generate_seed_lookdown(): | |
degsum = 60 | |
thlist = np.concatenate((np.linspace(0, degsum, 4), np.linspace(0, -degsum, 4)[1:], np.linspace(0, degsum, 4), np.linspace(0, -degsum, 4)[1:])) | |
philist = np.concatenate((np.linspace(0,0,7), np.linspace(-22.5,-22.5,7))) | |
assert len(thlist) == len(philist) | |
render_poses = np.zeros((len(thlist), 3, 4)) | |
for i in range(len(thlist)): | |
th = thlist[i] | |
phi = philist[i] | |
render_poses[i,:3,:3] = np.matmul(np.array([[np.cos(th/180*np.pi), 0, -np.sin(th/180*np.pi)], [0, 1, 0], [np.sin(th/180*np.pi), 0, np.cos(th/180*np.pi)]]), np.array([[1, 0, 0], [0, np.cos(phi/180*np.pi), -np.sin(phi/180*np.pi)], [0, np.sin(phi/180*np.pi), np.cos(phi/180*np.pi)]])) | |
render_poses[i,:3,3:4] = np.zeros((3,1)) | |
return render_poses | |
def generate_seed_back(): | |
movement = np.linspace(0, 5, 101) | |
render_poses = [] # np.zeros((len(movement), 3, 4)) | |
for i in range(len(movement)): | |
render_pose = np.zeros((3,4)) | |
render_pose[:3,:3] = np.eye(3) | |
render_pose[:3,3:4] = np.array([[0], [0], [movement[i]]]) | |
render_poses.append(render_pose) | |
movement = np.linspace(5, 0, 101) | |
movement = movement[1:] | |
for i in range(len(movement)): | |
render_pose = np.zeros((3,4)) | |
render_pose[:3,:3] = np.eye(3) | |
render_pose[:3,3:4] = np.array([[0], [0], [movement[i]]]) | |
render_poses.append(render_pose) | |
return render_poses | |
def generate_seed_llff(degree, nviews, round=4, d=2.3): | |
assert round%4==0 | |
# thlist = np.array([degree, 0, 0, 0, -degree]) | |
# philist = np.array([0, -degree, 0, degree, 0]) | |
# d = 2.3 | |
thlist = degree * np.sin(np.linspace(0, 2*np.pi*round, nviews)) | |
philist = degree * np.cos(np.linspace(0, 2*np.pi*round, nviews)) | |
zlist = d/15 * np.sin(np.linspace(0, 2*np.pi*round//4, nviews)) | |
assert len(thlist) == len(philist) | |
render_poses = np.zeros((len(thlist), 3, 4)) | |
for i in range(len(thlist)): | |
th = thlist[i] | |
phi = philist[i] | |
z = zlist[i] | |
# curr_pose = np.zeros((1, 3, 4)) | |
# d = 4.3 # 얘를 조절하면 초기 자세 기준으로 앞으로 d만큼 떨어진 점을 기준으로 도는 자세가 만들어짐 | |
render_poses[i,:3,:3] = np.matmul(np.array([[np.cos(th/180*np.pi), 0, -np.sin(th/180*np.pi)], [0, 1, 0], [np.sin(th/180*np.pi), 0, np.cos(th/180*np.pi)]]), np.array([[1, 0, 0], [0, np.cos(phi/180*np.pi), -np.sin(phi/180*np.pi)], [0, np.sin(phi/180*np.pi), np.cos(phi/180*np.pi)]])) | |
render_poses[i,:3,3:4] = np.array([d*np.sin(th/180*np.pi), 0, -z+d-d*np.cos(th/180*np.pi)]).reshape(3,1) + np.array([0, d*np.sin(phi/180*np.pi), -z+d-d*np.cos(phi/180*np.pi)]).reshape(3,1)# Transition vector | |
return render_poses | |
def generate_seed_headbanging(maxdeg, nviews_per_round, round=3, fullround=1): | |
radius = np.concatenate((np.linspace(0, maxdeg, nviews_per_round*round), maxdeg*np.ones(nviews_per_round*fullround), np.linspace(maxdeg, 0, nviews_per_round*round))) | |
thlist = 2.66*radius * np.sin(np.linspace(0, 2*np.pi*(round+fullround+round), nviews_per_round*(round+fullround+round))) | |
philist = radius * np.cos(np.linspace(0, 2*np.pi*(round+fullround+round), nviews_per_round*(round+fullround+round))) | |
assert len(thlist) == len(philist) | |
render_poses = np.zeros((len(thlist), 3, 4)) | |
for i in range(len(thlist)): | |
th = thlist[i] | |
phi = philist[i] | |
render_poses[i,:3,:3] = np.matmul(np.array([[np.cos(th/180*np.pi), 0, -np.sin(th/180*np.pi)], [0, 1, 0], [np.sin(th/180*np.pi), 0, np.cos(th/180*np.pi)]]), np.array([[1, 0, 0], [0, np.cos(phi/180*np.pi), -np.sin(phi/180*np.pi)], [0, np.sin(phi/180*np.pi), np.cos(phi/180*np.pi)]])) | |
render_poses[i,:3,3:4] = np.zeros((3,1)) | |
return render_poses | |
def generate_seed_headbanging_circle(maxdeg, nviews_per_round, round=3, fullround=1): | |
radius = np.concatenate((np.linspace(0, maxdeg, nviews_per_round*round), maxdeg*np.ones(nviews_per_round*fullround), np.linspace(maxdeg, 0, nviews_per_round*round))) | |
thlist = 2.66*radius * np.sin(np.linspace(0, 2*np.pi*(round+fullround+round), nviews_per_round*(round+fullround+round))) | |
philist = radius * np.cos(np.linspace(0, 2*np.pi*(round+fullround+round), nviews_per_round*(round+fullround+round))) | |
assert len(thlist) == len(philist) | |
render_poses = np.zeros((len(thlist), 3, 4)) | |
for i in range(len(thlist)): | |
th = thlist[i] | |
phi = philist[i] | |
render_poses[i,:3,:3] = np.matmul(np.array([[np.cos(th/180*np.pi), 0, -np.sin(th/180*np.pi)], [0, 1, 0], [np.sin(th/180*np.pi), 0, np.cos(th/180*np.pi)]]), np.array([[1, 0, 0], [0, np.cos(phi/180*np.pi), -np.sin(phi/180*np.pi)], [0, np.sin(phi/180*np.pi), np.cos(phi/180*np.pi)]])) | |
render_poses[i,:3,3:4] = np.zeros((3,1)) | |
return render_poses | |
def get_pcdGenPoses(pcdgenpath, argdict={}): | |
if pcdgenpath == 'rotate360': | |
render_poses = generate_seed_360(360, 10) | |
elif pcdgenpath == 'lookaround': | |
render_poses = generate_seed_preset() | |
elif pcdgenpath == 'moveright': | |
render_poses = generate_seed_horizon() | |
elif pcdgenpath == 'moveback': | |
render_poses = generate_seed_backward() | |
elif pcdgenpath == 'arc': | |
render_poses = generate_seed_arc() | |
elif pcdgenpath == 'lookdown': | |
render_poses = generate_seed_newpreset() | |
elif pcdgenpath == 'hemisphere': | |
render_poses = generate_seed_hemisphere(argdict['center_depth']) | |
else: | |
raise("Invalid pcdgenpath") | |
return render_poses | |
def get_camerapaths(): | |
preset_json = {} | |
for cam_path in ["back_and_forth", "llff", "headbanging"]: | |
if cam_path == 'back_and_forth': | |
render_poses = generate_seed_back() | |
elif cam_path == 'llff': | |
render_poses = generate_seed_llff(5, 400, round=4, d=2) | |
elif cam_path == 'headbanging': | |
render_poses = generate_seed_headbanging(maxdeg=15, nviews_per_round=180, round=2, fullround=0) | |
else: | |
raise("Unknown pass") | |
yz_reverse = np.array([[1,0,0], [0,-1,0], [0,0,-1]]) | |
blender_train_json = {"frames": []} | |
for render_pose in render_poses: | |
curr_frame = {} | |
### Transform world to pixel | |
Rw2i = render_pose[:3,:3] | |
Tw2i = render_pose[:3,3:4] | |
# Transfrom cam2 to world + change sign of yz axis | |
Ri2w = np.matmul(yz_reverse, Rw2i).T | |
Ti2w = -np.matmul(Ri2w, np.matmul(yz_reverse, Tw2i)) | |
Pc2w = np.concatenate((Ri2w, Ti2w), axis=1) | |
Pc2w = np.concatenate((Pc2w, np.array([0,0,0,1]).reshape((1,4))), axis=0) | |
curr_frame["transform_matrix"] = Pc2w.tolist() | |
blender_train_json["frames"].append(curr_frame) | |
preset_json[cam_path] = blender_train_json | |
return preset_json | |
def main(): | |
cam_path = 'headbanging_circle' | |
os.makedirs("poses_supplementary", exist_ok=True) | |
if cam_path == 'lookaround': | |
render_poses = generate_seed_lookaround() | |
elif cam_path == 'back': | |
render_poses = generate_seed_back() | |
elif cam_path == '360': | |
render_poses = generate_seed_360(360, 360) | |
elif cam_path == '1440': | |
render_poses = generate_seed_360(360, 1440) | |
elif cam_path == 'llff': | |
d = 8 | |
render_poses = generate_seed_llff(5, 400, round=4, d=d) | |
elif cam_path == 'headbanging': | |
round=3 | |
render_poses = generate_seed_headbanging_(maxdeg=15, nviews_per_round=180, round=round, fullround=0) | |
elif cam_path == 'headbanging_circle': | |
round=2 | |
render_poses = generate_seed_headbanging_circle(maxdeg=5, nviews_per_round=180, round=round, fullround=0) | |
yz_reverse = np.array([[1,0,0], [0,-1,0], [0,0,-1]]) | |
c2w_poses = [] | |
for render_pose in render_poses: | |
### Transform world to pixel | |
Rw2i = render_pose[:3,:3] | |
Tw2i = render_pose[:3,3:4] | |
# Transfrom cam2 to world + change sign of yz axis | |
Ri2w = np.matmul(yz_reverse, Rw2i).T | |
Ti2w = -np.matmul(Ri2w, np.matmul(yz_reverse, Tw2i)) | |
Pc2w = np.concatenate((Ri2w, Ti2w), axis=1) | |
# Pc2w = np.concatenate((Pc2w, np.array([[0,0,0,1]])), axis=0) | |
c2w_poses.append(Pc2w) | |
c2w_poses = np.stack(c2w_poses, axis=0) | |
# np.save(f'poses_supplementary/{cam_path}.npy', c2w_poses) | |
FX = 5.8269e+02 | |
W = 512 | |
fov_x = 2*np.arctan(W / (2*FX)) | |
if cam_path in ['360', '1440', 'llff', 'headbanging']: | |
fov_x = fov_x * 1.2 | |
blender_train_json = {} | |
blender_train_json["camera_angle_x"] = fov_x | |
blender_train_json["frames"] = [] | |
for render_pose in render_poses: | |
curr_frame = {} | |
### Transform world to pixel | |
Rw2i = render_pose[:3,:3] | |
Tw2i = render_pose[:3,3:4] | |
# Transfrom cam2 to world + change sign of yz axis | |
Ri2w = np.matmul(yz_reverse, Rw2i).T | |
Ti2w = -np.matmul(Ri2w, np.matmul(yz_reverse, Tw2i)) | |
Pc2w = np.concatenate((Ri2w, Ti2w), axis=1) | |
curr_frame["transform_matrix"] = Pc2w.tolist() | |
(blender_train_json["frames"]).append(curr_frame) | |
import json | |
if cam_path=='llff': | |
train_json_path = f"poses_supplementary/{cam_path}_d{d}.json" | |
elif cam_path=='headbanging': | |
train_json_path = f"poses_supplementary/{cam_path}_r{round}.json" | |
else: | |
train_json_path = f"poses_supplementary/{cam_path}.json" | |
with open(train_json_path, 'w') as outfile: | |
json.dump(blender_train_json, outfile, indent=4) | |
if __name__ == '__main__': | |
main() |