fixed boundaries

This commit is contained in:
2023-06-26 00:18:51 +02:00
parent 9a7aaefb8f
commit 27fb580971
+102 -36
View File
@@ -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