From 27fb580971d16bf9457a2867cc93910c2ea955cd Mon Sep 17 00:00:00 2001 From: Hunor Laczko Date: Mon, 26 Jun 2023 00:18:51 +0200 Subject: [PATCH] fixed boundaries --- data/registration_weights.py | 138 ++++++++++++++++++++++++++--------- 1 file changed, 102 insertions(+), 36 deletions(-) diff --git a/data/registration_weights.py b/data/registration_weights.py index 6f3f326..00a4c18 100644 --- a/data/registration_weights.py +++ b/data/registration_weights.py @@ -30,7 +30,7 @@ from data.cloth3d_io import ( from smpl.smpl_torch import SMPL # from custom_utils.custom_utils import _maskFaces -device = 'cpu' +device = 'cuda' smpl = SMPL(device, 'smpl') @@ -555,12 +555,12 @@ def get_boundaries(folder, frame): registered_cloth = np.load('temp/matlab_match_registered.npy') registered_faces = np.load('temp/matlab_match_faces.npy') registered_weight_faces = np.load('temp/matlab_match_weights_faces.npy') - registred_weights = np.load('temp/matlab_match_weights_weights.npy') + registered_weights = np.load('temp/matlab_match_weights_weights.npy') _, faces, _, _ = readOBJ(os.path.join(folder, id, garment + '.obj')) faces = quads2tris(faces) template = np.load('temp/mapping_cloth.npy') - registered_cloth = (template[registered_weight_faces] * registred_weights[:,:,None]).sum(1) + registered_cloth = (template[registered_weight_faces] * registered_weights[:,:,None]).sum(1) registered_meshfix = MeshFix(registered_cloth, registered_faces.astype(np.int32)) registered_holes = registered_meshfix.extract_holes() @@ -586,46 +586,51 @@ def get_boundaries(folder, frame): registered_border.extend(ind.ravel()) registered_border_mask[i] = True - np.save('temp/registered_border.npy', registered_border) np.save('temp/template_border.npy', template_border) lines = generate_edges(registered_cloth, registered_holes, registered_border) lines_new = reindex_lines(lines, registered_border_mask) bounds, bounds_edges_global, bounds_edges_local, labels = get_boundary_components(registered_border, lines_new) + # for k in range(labels.max()+1): + # bounds_edges_reindexed = reindex_edges(bounds_edges_local[k].copy(), labels == k) + # verts_order, edges_order = order(bounds[k], bounds_edges_reindexed) + # traces = [] + # for i in range(bounds_edges_global[k].shape[0]): + # traces.append(go.Scatter3d( + # x=registered_cloth[bounds_edges_global[k][i],0], y=registered_cloth[bounds_edges_global[k][i],1], z=registered_cloth[bounds_edges_global[k][i],2], + # mode='lines', line=dict(color='red', width=1))) + # for i in range(15): + # traces.append(go.Scatter3d( + # x=registered_cloth[bounds_edges_global[k][edges_order][i],0], y=registered_cloth[bounds_edges_global[k][edges_order][i],1], z=registered_cloth[bounds_edges_global[k][edges_order][i],2], + # mode='lines', line=dict(color='blue', width=1))) + # fig = go.Figure(data=traces) + # fig.update_layout(scene = dict( + # xaxis = dict(range=[-1,1],), + # yaxis = dict(range=[-1,1],), + # zaxis = dict(range=[-1,1],),),) + # fig.update_layout(scene_aspectmode='cube') + # fig.show() + for k in range(labels.max()+1): bounds_edges_reindexed = reindex_edges(bounds_edges_local[k].copy(), labels == k) verts_order, edges_order = order(bounds[k], bounds_edges_reindexed) - traces = [] - for i in range(bounds_edges_global[k].shape[0]): - traces.append(go.Scatter3d( - x=registered_cloth[bounds_edges_global[k][i],0], y=registered_cloth[bounds_edges_global[k][i],1], z=registered_cloth[bounds_edges_global[k][i],2], - mode='lines', line=dict(color='red', width=1))) - for i in range(15): - traces.append(go.Scatter3d( - x=registered_cloth[bounds_edges_global[k][edges_order][i],0], y=registered_cloth[bounds_edges_global[k][edges_order][i],1], z=registered_cloth[bounds_edges_global[k][edges_order][i],2], - mode='lines', line=dict(color='blue', width=1))) - fig = go.Figure(data=traces) - fig.update_layout(scene = dict( - xaxis = dict(range=[-1,1],), - yaxis = dict(range=[-1,1],), - zaxis = dict(range=[-1,1],),),) - fig.update_layout(scene_aspectmode='cube') - fig.show() + bounds_edges_global[k] = bounds_edges_global[k][edges_order] + bounds[k] = bounds[k][verts_order] + + np.savez('temp/registered_border.npz', {f'bound_{i}': bounds[i] for i in range(len(bounds))}) + np.savez('temp/registered_border_edges.npz', {f'bound_edges_{i}': bounds_edges_global[i] for i in range(len(bounds_edges_global))}) + + + # for k in range(labels.max()+1): + # for j in range(bounds[k].shape[0]): + # w_1 = registered_weights[bounds[k][j]] + # w_2 = registered_weights[bounds[k][(j+1)%bounds[k].shape[0]]] + + # pass - k = 0 - traces = [go.Scatter3d( - x=registered_cloth[bounds[k],0], y=registered_cloth[bounds[k],1], z=registered_cloth[bounds[k],2], - mode='markers', line=dict(color='red', width=1))] - fig = go.Figure(data=traces) - fig.update_layout(scene = dict( - xaxis = dict(range=[-1,1],), - yaxis = dict(range=[-1,1],), - zaxis = dict(range=[-1,1],),),) - fig.update_layout(scene_aspectmode='cube') - fig.show() # plot registered cloth and tempalte as scatterplots and add another two scatter plots for the two boundary sets fig = go.Figure(data=[ @@ -962,7 +967,11 @@ def flatten_boundary(folder, frame): template_border = np.load('temp/template_border.npy') - registered_border = np.load('temp/registered_border.npy') + registered_border = np.load('temp/registered_border.npz', allow_pickle=True)['arr_0'].item() + registered_borders = [registered_border[k] for k in registered_border.keys()] + registered_border_edges = np.load('temp/registered_border_edges.npz', allow_pickle=True)['arr_0'].item() + registered_border_edges = [registered_border_edges[k] for k in registered_border_edges.keys()] + registered_border = np.concatenate(registered_borders) template_border_tree = KDTree(template[template_border,:]) @@ -996,6 +1005,63 @@ def flatten_boundary(folder, frame): yaxis = dict(range=[-1,1],), zaxis = dict(range=[-1,1],),),) fig.update_layout(scene_aspectmode='cube') + # fig.show() + + fig = go.Figure(data=[ + go.Mesh3d( + x=registered_cloth[:,0], y=registered_cloth[:,1], z=registered_cloth[:,2], + i=registered_faces[:,0], j=registered_faces[:,1], k=registered_faces[:,2], + color='lightpink', opacity=1), + ]) + fig.update_layout(scene = dict( + xaxis = dict(range=[-1,1],), + yaxis = dict(range=[-1,1],), + zaxis = dict(range=[-1,1],),),) + fig.update_layout(scene_aspectmode='cube') + # fig.show() + + # save registered_cloth as obj + # writeOBJ('temp/test_registered.obj', registered_cloth, registered_faces.astype(np.int32)) + + + for k in range(len(registered_borders)): + border = registered_borders[k] + edges = registered_border_edges[k] + for i in range(border.shape[0]): + w_1 = weights_weights[border[i],:] + w_2 = weights_weights[border[(i+1)%border.shape[0]],:] + f_1 = weights_faces[border[i],:] + f_2 = weights_faces[border[(i+1)%border.shape[0]],:] + + if np.all(f_1 == f_2): + reference = registered_cloth[f_1[0],:] + dist_1 = np.linalg.norm(registered_cloth[border[i],:] - reference, axis=0) + dist_2 = np.linalg.norm(registered_cloth[border[(i+1)%border.shape[0]],:] - reference, axis=0) + if (dist_1 < dist_2 and w_1[0] < w_2[0]) or (dist_1 > dist_2 and w_1[0] > w_2[0]): + weights_weights[border[(i+1)%border.shape[0]],:] = weights_weights[border[i],:] + + reference = registered_cloth[f_1[1],:] + dist_1 = np.linalg.norm(registered_cloth[border[i],:] - reference, axis=0) + dist_2 = np.linalg.norm(registered_cloth[border[(i+1)%border.shape[0]],:] - reference, axis=0) + if (dist_1 < dist_2 and w_1[1] < w_2[1]) or (dist_1 > dist_2 and w_1[1] > w_2[1]): + weights_weights[border[(i+1)%border.shape[0]],:] = weights_weights[border[i],:] + # pass + # registered_cloth + + # pass + + registered_cloth = (template[weights_faces] * weights_weights[:,:,None]).sum(1) + fig = go.Figure(data=[ + go.Mesh3d( + x=registered_cloth[:,0], y=registered_cloth[:,1], z=registered_cloth[:,2], + i=registered_faces[:,0], j=registered_faces[:,1], k=registered_faces[:,2], + color='lightpink', opacity=1), + ]) + fig.update_layout(scene = dict( + xaxis = dict(range=[-1,1],), + yaxis = dict(range=[-1,1],), + zaxis = dict(range=[-1,1],),),) + fig.update_layout(scene_aspectmode='cube') fig.show() pass @@ -1036,8 +1102,8 @@ def fill_holes(folder, frame): if __name__ == "__main__": - # folder = '/data-net/code/cloth3d/train' - folder = r'D:\Work\code\cloth3d\train' + folder = '/data-net/code/cloth3d/train' + # folder = r'D:\Work\code\cloth3d\train' # frames = [f'00761_{i}' for i in range(300)] # folder = r'Z:\Work\Huni\Barcelona\Dataset\cloth3d\train' frames = get_frames(folder, 'frames_all.txt') @@ -1063,9 +1129,9 @@ if __name__ == "__main__": # register(folder, frame) - get_boundaries(folder, frame) + # get_boundaries(folder, frame) # optimize_boundaries_2(folder, frame) - # flatten_boundary(folder, frame) + flatten_boundary(folder, frame) # fill_holes(folder, frame) break pass