save
This commit is contained in:
+54
-9
@@ -3,9 +3,10 @@ import sys
|
|||||||
import random
|
import random
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import plotly.graph_objects as go
|
import plotly.graph_objects as go
|
||||||
from pymeshfix import MeshFix
|
import torch
|
||||||
import trimesh
|
from torch.nn.functional import mse_loss
|
||||||
import open3d as o3d
|
from pytorch3d.structures import Meshes
|
||||||
|
from pytorch3d.loss import mesh_laplacian_smoothing, mesh_edge_loss, mesh_normal_consistency, chamfer_distance
|
||||||
|
|
||||||
sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/..')
|
sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/..')
|
||||||
from data.cloth3d_io import (
|
from data.cloth3d_io import (
|
||||||
@@ -22,8 +23,12 @@ from data.cloth3d_io import (
|
|||||||
readOBJ,
|
readOBJ,
|
||||||
quads2tris
|
quads2tris
|
||||||
)
|
)
|
||||||
|
from smpl.smpl_torch import SMPL
|
||||||
# from custom_utils.custom_utils import _maskFaces
|
# from custom_utils.custom_utils import _maskFaces
|
||||||
|
|
||||||
|
smpl = SMPL('cuda', 'smpl')
|
||||||
|
|
||||||
|
|
||||||
def _maskFaces(V, F, mask, return_unfixed=False):
|
def _maskFaces(V, F, mask, return_unfixed=False):
|
||||||
V_mask = mask
|
V_mask = mask
|
||||||
F_mask = np.take(V_mask, F.reshape(-1), axis=0)
|
F_mask = np.take(V_mask, F.reshape(-1), axis=0)
|
||||||
@@ -117,25 +122,65 @@ def register(folder, frame):
|
|||||||
mask = raw_mask > 0
|
mask = raw_mask > 0
|
||||||
mesh_posed, map = local_read_posed_garment_frame(folder, id, garment, frame_nr, pose=info['poses'][:,frame_nr], deorient=True)
|
mesh_posed, map = local_read_posed_garment_frame(folder, id, garment, frame_nr, pose=info['poses'][:,frame_nr], deorient=True)
|
||||||
body_posed = local_read_posed_body_frame(folder, id, frame_nr, pose=info['poses'][:,frame_nr], deorient=True)
|
body_posed = local_read_posed_body_frame(folder, id, frame_nr, pose=info['poses'][:,frame_nr], deorient=True)
|
||||||
v, faces, _, _ = readOBJ(os.path.join(folder, id, garment + '.obj'))
|
template, faces, _, _ = readOBJ(os.path.join(folder, id, garment + '.obj'))
|
||||||
faces = quads2tris(faces)
|
faces = quads2tris(faces)
|
||||||
|
pose = torch.zeros(72)
|
||||||
|
shape = torch.zeros(11)
|
||||||
|
shape[-1] = 1
|
||||||
|
# for star pose
|
||||||
|
pose[:,5] = 3.1415/4
|
||||||
|
pose[:,8] = -3.1415/4
|
||||||
|
star_body = smpl(pose.unsqueeze(0), shape.unsqueeze(0))[0][0].cpu().numpy()
|
||||||
|
|
||||||
is_skirt = (garment == 'Dress' or garment == 'Skirt')
|
is_skirt = (garment == 'Dress' or garment == 'Skirt')
|
||||||
skirt_mod = '_skirt' if is_skirt else ''
|
skirt_mod = '_skirt' if is_skirt else ''
|
||||||
F = np.load(f'smpl/smpl_faces{skirt_mod}.npy').astype(np.int32)
|
F = np.load(f'smpl/smpl_faces{skirt_mod}.npy').astype(np.int32)
|
||||||
|
|
||||||
plot(v, faces)
|
plot(template, faces)
|
||||||
plot(mesh_posed, faces)
|
|
||||||
plot(mesh_posed, F)
|
|
||||||
# v = mesh_posed[mask,:]
|
# v = mesh_posed[mask,:]
|
||||||
|
|
||||||
|
# Define the meshes to optimize
|
||||||
|
mesh1 = Meshes(verts=template[None,:,:], faces=faces[None,:,:])
|
||||||
|
mesh2 = Meshes(verts=star_body, faces=F[None,:,:])
|
||||||
|
|
||||||
|
# Define the optimizer and learning rate
|
||||||
|
optimizer = torch.optim.Adam([mesh1.verts_packed()], lr=0.01)
|
||||||
|
|
||||||
|
# Define the loss functions
|
||||||
|
def laplacian_smoothing_loss(mesh):
|
||||||
|
return mesh_laplacian_smoothing(mesh, method="uniform")
|
||||||
|
|
||||||
|
def edge_loss(mesh1, mesh2):
|
||||||
|
return mesh_edge_loss(mesh1, mesh2)
|
||||||
|
|
||||||
|
def normal_consistency_loss(mesh1, mesh2):
|
||||||
|
return mesh_normal_consistency(mesh1, mesh2)
|
||||||
|
|
||||||
|
# Optimization loop
|
||||||
|
for i in range(100):
|
||||||
|
optimizer.zero_grad()
|
||||||
|
|
||||||
|
# Forward pass
|
||||||
|
mesh1_out = Meshes(verts=[mesh1.verts_packed()], faces=[mesh1.faces_packed()])
|
||||||
|
loss = chamfer_distance(mesh1_out, mesh2)
|
||||||
|
loss += laplacian_smoothing_loss(mesh1_out)
|
||||||
|
loss += edge_loss(mesh1_out)
|
||||||
|
loss += normal_consistency_loss(mesh1_out)
|
||||||
|
|
||||||
|
# Backward pass
|
||||||
|
loss.backward()
|
||||||
|
optimizer.step()
|
||||||
|
|
||||||
|
# Print the loss
|
||||||
|
print(f"Loss: {loss.item()}")
|
||||||
|
|
||||||
pass
|
pass
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
# folder = '/data-local/127/train'
|
folder = '/data-net/dataset/cloth3d/train'
|
||||||
# folder = r'D:\Work\Dataset\cloth3d\train'
|
# folder = r'D:\Work\Dataset\cloth3d\train'
|
||||||
# frames = [f'00761_{i}' for i in range(300)]
|
# frames = [f'00761_{i}' for i in range(300)]
|
||||||
folder = r'Z:\Work\Huni\Barcelona\Dataset\cloth3d\train'
|
# folder = r'Z:\Work\Huni\Barcelona\Dataset\cloth3d\train'
|
||||||
frames = get_frames(folder, 'frames_all.txt')
|
frames = get_frames(folder, 'frames_all.txt')
|
||||||
root = '/'.join(folder.split('/')[:-1])
|
root = '/'.join(folder.split('/')[:-1])
|
||||||
type = folder.split('/')[-1]
|
type = folder.split('/')[-1]
|
||||||
|
|||||||
Reference in New Issue
Block a user