fixed boundaries
This commit is contained in:
+102
-36
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user