Lingteng Qiu (邱陵腾)
rm assets & wheels
434b0b0
import pdb
import torch
import tqlt.mesh as tmesh
import trimesh
from core.opt import MeshOptimizer
from core.remesh import calc_vertex_normals
from einops import repeat
from tqdm import tqdm
from util.func import (
load_obj,
make_sphere,
make_star_cameras,
normalize_vertices,
save_images,
save_obj,
)
from util.render import NormalsRenderer
from util.snapshot import snapshot
try:
from util.view import show
except:
show = None
fname = "data/lucy.obj"
steps = 100
snapshot_step = 1
mv, proj = make_star_cameras(4, 4)
renderer = NormalsRenderer(mv, proj, [512, 512])
target_vertices, target_faces = load_obj(fname)
target_vertices = normalize_vertices(target_vertices)
target_normals = calc_vertex_normals(target_vertices, target_faces)
target_images = renderer.render(target_vertices, target_normals, target_faces)
alpha = repeat(target_images[..., 3:], "b h w 1 -> b h w 3")
save_images(target_images[..., :3], "./out/target_images/")
save_images(alpha, "./out/target_alpha/")
mesh = tmesh.Mesh.load("./smpl.obj")
mesh.v[..., 1] = -mesh.v[..., 1]
vertices = mesh.v
faces = mesh.f.long()
# vertices, faces = make_sphere(level=2, radius=0.5)
opt = MeshOptimizer(vertices, faces)
vertices = opt.vertices
for i in tqdm(range(steps)):
normals = calc_vertex_normals(vertices, faces)
images = renderer.render(vertices, normals, faces)
loss = (images - target_images).abs().mean()
loss.backward()
opt.step()
if show and i % snapshot_step == 0:
snapshots.append(snapshot(opt))
vertices, faces = opt.remesh()
print(vertices.shape)
save_obj(vertices, faces, "./out/result.obj")
save_images(images[..., :3], "./out/images/")
save_images(images[..., 3:], "./out/alpha/")
if show:
show(target_vertices, target_faces, snapshots)