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 smpl.smpl_torch import SMPL
|
||||||
# from custom_utils.custom_utils import _maskFaces
|
# from custom_utils.custom_utils import _maskFaces
|
||||||
|
|
||||||
device = 'cpu'
|
device = 'cuda'
|
||||||
smpl = SMPL(device, 'smpl')
|
smpl = SMPL(device, 'smpl')
|
||||||
|
|
||||||
|
|
||||||
@@ -555,12 +555,12 @@ def get_boundaries(folder, frame):
|
|||||||
registered_cloth = np.load('temp/matlab_match_registered.npy')
|
registered_cloth = np.load('temp/matlab_match_registered.npy')
|
||||||
registered_faces = np.load('temp/matlab_match_faces.npy')
|
registered_faces = np.load('temp/matlab_match_faces.npy')
|
||||||
registered_weight_faces = np.load('temp/matlab_match_weights_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, _, _ = readOBJ(os.path.join(folder, id, garment + '.obj'))
|
||||||
faces = quads2tris(faces)
|
faces = quads2tris(faces)
|
||||||
template = np.load('temp/mapping_cloth.npy')
|
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_meshfix = MeshFix(registered_cloth, registered_faces.astype(np.int32))
|
||||||
registered_holes = registered_meshfix.extract_holes()
|
registered_holes = registered_meshfix.extract_holes()
|
||||||
@@ -586,46 +586,51 @@ def get_boundaries(folder, frame):
|
|||||||
registered_border.extend(ind.ravel())
|
registered_border.extend(ind.ravel())
|
||||||
registered_border_mask[i] = True
|
registered_border_mask[i] = True
|
||||||
|
|
||||||
np.save('temp/registered_border.npy', registered_border)
|
|
||||||
np.save('temp/template_border.npy', template_border)
|
np.save('temp/template_border.npy', template_border)
|
||||||
|
|
||||||
lines = generate_edges(registered_cloth, registered_holes, registered_border)
|
lines = generate_edges(registered_cloth, registered_holes, registered_border)
|
||||||
lines_new = reindex_lines(lines, registered_border_mask)
|
lines_new = reindex_lines(lines, registered_border_mask)
|
||||||
bounds, bounds_edges_global, bounds_edges_local, labels = get_boundary_components(registered_border, lines_new)
|
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):
|
for k in range(labels.max()+1):
|
||||||
bounds_edges_reindexed = reindex_edges(bounds_edges_local[k].copy(), labels == k)
|
bounds_edges_reindexed = reindex_edges(bounds_edges_local[k].copy(), labels == k)
|
||||||
verts_order, edges_order = order(bounds[k], bounds_edges_reindexed)
|
verts_order, edges_order = order(bounds[k], bounds_edges_reindexed)
|
||||||
traces = []
|
bounds_edges_global[k] = bounds_edges_global[k][edges_order]
|
||||||
for i in range(bounds_edges_global[k].shape[0]):
|
bounds[k] = bounds[k][verts_order]
|
||||||
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],
|
np.savez('temp/registered_border.npz', {f'bound_{i}': bounds[i] for i in range(len(bounds))})
|
||||||
mode='lines', line=dict(color='red', width=1)))
|
np.savez('temp/registered_border_edges.npz', {f'bound_edges_{i}': bounds_edges_global[i] for i in range(len(bounds_edges_global))})
|
||||||
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],
|
# for k in range(labels.max()+1):
|
||||||
mode='lines', line=dict(color='blue', width=1)))
|
# for j in range(bounds[k].shape[0]):
|
||||||
fig = go.Figure(data=traces)
|
# w_1 = registered_weights[bounds[k][j]]
|
||||||
fig.update_layout(scene = dict(
|
# w_2 = registered_weights[bounds[k][(j+1)%bounds[k].shape[0]]]
|
||||||
xaxis = dict(range=[-1,1],),
|
|
||||||
yaxis = dict(range=[-1,1],),
|
# pass
|
||||||
zaxis = dict(range=[-1,1],),),)
|
|
||||||
fig.update_layout(scene_aspectmode='cube')
|
|
||||||
fig.show()
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
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
|
# plot registered cloth and tempalte as scatterplots and add another two scatter plots for the two boundary sets
|
||||||
fig = go.Figure(data=[
|
fig = go.Figure(data=[
|
||||||
@@ -962,7 +967,11 @@ def flatten_boundary(folder, frame):
|
|||||||
|
|
||||||
|
|
||||||
template_border = np.load('temp/template_border.npy')
|
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,:])
|
template_border_tree = KDTree(template[template_border,:])
|
||||||
|
|
||||||
@@ -996,6 +1005,63 @@ def flatten_boundary(folder, frame):
|
|||||||
yaxis = dict(range=[-1,1],),
|
yaxis = dict(range=[-1,1],),
|
||||||
zaxis = dict(range=[-1,1],),),)
|
zaxis = dict(range=[-1,1],),),)
|
||||||
fig.update_layout(scene_aspectmode='cube')
|
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()
|
fig.show()
|
||||||
|
|
||||||
pass
|
pass
|
||||||
@@ -1036,8 +1102,8 @@ def fill_holes(folder, frame):
|
|||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
# folder = '/data-net/code/cloth3d/train'
|
folder = '/data-net/code/cloth3d/train'
|
||||||
folder = r'D:\Work\code\cloth3d\train'
|
# folder = r'D:\Work\code\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')
|
||||||
@@ -1063,9 +1129,9 @@ if __name__ == "__main__":
|
|||||||
|
|
||||||
|
|
||||||
# register(folder, frame)
|
# register(folder, frame)
|
||||||
get_boundaries(folder, frame)
|
# get_boundaries(folder, frame)
|
||||||
# optimize_boundaries_2(folder, frame)
|
# optimize_boundaries_2(folder, frame)
|
||||||
# flatten_boundary(folder, frame)
|
flatten_boundary(folder, frame)
|
||||||
# fill_holes(folder, frame)
|
# fill_holes(folder, frame)
|
||||||
break
|
break
|
||||||
pass
|
pass
|
||||||
|
|||||||
Reference in New Issue
Block a user