remove long edges in post

This commit is contained in:
2023-07-04 23:52:13 +02:00
parent 80f244b69b
commit 37ad3a3f43
4 changed files with 151 additions and 319 deletions
+10 -2
View File
@@ -80,6 +80,12 @@ class StaticCache():
mesh_mask = np.load(os.path.join(self.folder, 'mesh_mask', f'{id}_{garment}.npy')); mesh_mask = mesh_mask.astype(bool)
data['mesh_mask'] = mesh_mask
mesh_fix = np.load(os.path.join(self.folder, 'mesh_fixed', f'{id}_{garment}.npz'))
data['mesh_fix'] = dict()
data['mesh_fix']['mesh_mask'] = torch.from_numpy(mesh_fix['mask'])
# data['mesh_fix']['mask_convert'] = torch.from_numpy(mesh_fix['mas_convert'])
# data['mesh_fix']['faces'] = torch.from_numpy(mesh_fix['faces'])
for res in self.resolutions:
res_string = ''
if res != 512:
@@ -107,13 +113,15 @@ class StaticCache():
def __getitem__(self, frame: Frame) -> dict:
if (frame.id, frame.garment) not in self.store:
item = self.read(frame.id, frame.garment)
stored_data = { key: torch.from_numpy(value).to('cpu') for key, value in item.items()}
stored_data = { key: torch.from_numpy(value).to('cpu') for key, value in item.items() if type(value) == np.ndarray}
stored_data['mesh_fix'] = item['mesh_fix']
for key, value in stored_data.items():
if key.startswith('uv_') and value.shape[-1] == 3:
stored_data[key] = torch.permute(value, [2,0,1])
self.store[(frame.id, frame.garment)] = stored_data
data = { key: value.to(self.device) for key, value in self.store[(frame.id, frame.garment)].items()}
data = { key: value.to(self.device) for key, value in self.store[(frame.id, frame.garment)].items() if type(value) == torch.Tensor }
data['mesh_fix'] = { key: value.to(self.device) for key, value in self.store[(frame.id, frame.garment)]['mesh_fix'].items() }
return data
+82 -4
View File
@@ -33,7 +33,7 @@ sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/..')
from data.cloth3d_io import readPC2, loadInfo, writePC2, readOBJ, quads2tris, readPC2Frame
from data.utils import Frame
from smpl.smpl_torch import SMPL
from custom_utils.custom_utils import _maskFaces
from custom_utils.custom_utils import _maskFaces, remove_long_edges
def create_extras_file(folder):
@@ -631,7 +631,6 @@ def create_frames_file_partial(folder, out_folder, split=0.9, part=0.1):
f.write(f'{frame.id} {frame.frame_nr} {frame.garment}\n')
def check_irregular_poses(folder, folder_reg, out_folder):
for i in range(100, 200, 5):
frame: Frame = Frame('01512', i, 'Dress')
@@ -800,6 +799,83 @@ def get_ids():
pass
def generate_fixed_masks(folder, out_folder):
ids = sorted(os.listdir(folder))
os.makedirs(os.path.join(out_folder, 'mesh_fixed'), exist_ok=True)
F = np.load('smpl/smpl_faces.npy')
F_skirt = np.load('smpl/smpl_faces_skirt.npy')
import random
# import trimesh
import pyvista as pv
random.shuffle(ids)
for id in tqdm(ids):
garment_dir = os.path.join(folder, id)
if not os.path.isdir(garment_dir):
continue
garments = [f.replace('.obj','') for f in os.listdir(garment_dir) if f.endswith('.obj')]
for garment in garments:
if os.path.exists(os.path.join(out_folder, f'{id}_{garment}.pc16')):
continue
is_skirt = garment in ['Dress', 'Skirt']
mesh_static = np.load(os.path.join(out_folder, 'mesh_static', f'{id}_{garment}.npy'))
mask = np.load(os.path.join(out_folder, 'mesh_mask', f'{id}_{garment}.npy'))
_, faces = _maskFaces(np.zeros((14475, 3)), F_skirt if is_skirt else F, mask)
_, new_mask = remove_long_edges(mesh_static, faces.astype(np.int32), 0.2 if is_skirt else 0.1)
new_mask_full = np.zeros((14475), dtype=bool)
new_mask_full[mask] = new_mask
_, new_faces = _maskFaces(np.zeros((14475, 3)), F_skirt if is_skirt else F, new_mask_full)
mesh_new = mesh_static[new_mask]
# fig = go.Figure(data=[go.Mesh3d(x=mesh_new[:,0], y=mesh_new[:,1], z=mesh_new[:,2], i=new_faces[:,0], j=new_faces[:,1], k=new_faces[:,2])])
# fig.update_layout(scene_aspectmode='cube')
# fig.update_layout(scene=dict(xaxis=dict(range=[-1,1]), yaxis=dict(range=[-1,1]), zaxis=dict(range=[-1,1])))
# fig.show()
flattened_faces = np.asarray([np.concatenate((np.array([3]), f)) for f in new_faces.astype(np.int32)]).flatten()
m = pv.PolyData(mesh_new, flattened_faces)
m.fill_holes(0.03, inplace=True, progress_bar=False)
# m = trimesh.Trimesh(vertices=mesh_new, faces=new_faces, process=False, validate=False)
# trimesh.repair.fill_holes(m)
mesh_new = np.asarray(m.points)
new_faces = np.asarray(m.faces).reshape([-1, 4])[:, 1:]
m = tm.Trimesh(vertices=mesh_new, faces=new_faces, process=False, validate=False)
tm.repair.fix_winding(m)
mesh_new = np.asarray(m.vertices)
new_faces = np.asarray(m.faces)
# fig = go.Figure(data=[go.Mesh3d(x=mesh_new[:,0], y=mesh_new[:,1], z=mesh_new[:,2], i=new_faces[:,0], j=new_faces[:,1], k=new_faces[:,2])])
# fig.update_layout(scene_aspectmode='cube')
# fig.update_layout(scene=dict(xaxis=dict(range=[-1,1]), yaxis=dict(range=[-1,1]), zaxis=dict(range=[-1,1])))
# fig.show()
# fig = go.Figure(data=[go.Mesh3d(x=mesh_static[:,0], y=mesh_static[:,1], z=mesh_static[:,2], i=faces[:,0], j=faces[:,1], k=faces[:,2])])
# fig.update_layout(scene_aspectmode='cube')
# fig.update_layout(scene=dict(xaxis=dict(range=[-1,1]), yaxis=dict(range=[-1,1]), zaxis=dict(range=[-1,1])))
# fig.show()
# print((~new_mask).sum())
np.savez_compressed(os.path.join(out_folder, 'mesh_fixed', f'{id}_{garment}.npz'), mask=new_mask_full, mas_convert=new_mask, faces=new_faces)
pass
if __name__ == '__main__':
@@ -832,9 +908,11 @@ if __name__ == '__main__':
# calculate_average(folder, out_folder)
# create_frames_file(folder, out_folder)
get_ids()
# get_ids()
# create_frames_file_test(folder, out_folder)
# create_frames_file_partial(folder, out_folder, part=0.5)
# folder = '/data-local/127_2/cape_processed/test/female'
# create_mesh_normals_cape(folder, None)
# create_mesh_normals_cape(folder, None)
generate_fixed_masks(folder, out_folder)