save progress
This commit is contained in:
+17
-8
@@ -236,7 +236,7 @@ def read_posed_garment_frame(folder, id, garment, frame, map=None, mask=None, sh
|
|||||||
verts[mask, :] = verts[mask, :] - np.squeeze(shape_offsets)[mask, :]
|
verts[mask, :] = verts[mask, :] - np.squeeze(shape_offsets)[mask, :]
|
||||||
|
|
||||||
if deorient:
|
if deorient:
|
||||||
R = scipy.spatial.transform.Rotation.from_euler(pose[:3]).inv()
|
R = scipy.spatial.transform.Rotation.from_euler('xyz', pose[:3]).inv()
|
||||||
# R = scipy.spatial.transform.Rotation.from_euler([0,0,-zrot])
|
# R = scipy.spatial.transform.Rotation.from_euler([0,0,-zrot])
|
||||||
verts = R.apply(verts)
|
verts = R.apply(verts)
|
||||||
|
|
||||||
@@ -244,13 +244,12 @@ def read_posed_garment_frame(folder, id, garment, frame, map=None, mask=None, sh
|
|||||||
|
|
||||||
|
|
||||||
# can i cache map?
|
# can i cache map?
|
||||||
def read_posed_garment(folder, id, garment, map=None, mask=None, shape=None, shapedirs=None, poses=None, unshape=False, deorient=False):
|
# NOT WORKING WELL
|
||||||
pc16_path = os.path.join(folder, id, garment + '.pc16')
|
def read_posed_garment(folder, id, garment, mask=None, shape=None, shapedirs=None, poses=None, unshape=False, deorient=False):
|
||||||
verts = readPC2(pc16_path, True)
|
body_posed = readPC2(os.path.join(folder, id, 'Body_posed.pc16'), True)['V']
|
||||||
|
offsets = readPC2(os.path.join(folder, id, garment + '_offsets_dynamic.pc16'), True)['V']
|
||||||
|
verts = (body_posed + offsets) * mask[:, None]
|
||||||
|
|
||||||
if map is None:
|
|
||||||
map = sio.loadmat(os.path.join(folder, id, garment + '_map.mat'))['map'].reshape((-1))
|
|
||||||
verts = verts[:, map, :]
|
|
||||||
|
|
||||||
if unshape:
|
if unshape:
|
||||||
shape_offsets = np.tensordot(shape, shapedirs, axes=[[1], [2]])
|
shape_offsets = np.tensordot(shape, shapedirs, axes=[[1], [2]])
|
||||||
@@ -258,7 +257,7 @@ def read_posed_garment(folder, id, garment, map=None, mask=None, shape=None, sha
|
|||||||
|
|
||||||
if deorient:
|
if deorient:
|
||||||
for i in range(verts.shape[0]):
|
for i in range(verts.shape[0]):
|
||||||
R = scipy.spatial.transform.Rotation.from_euler(poses[:3, i]).inv()
|
R = scipy.spatial.transform.Rotation.from_euler('xyz', poses[:3, i]).inv()
|
||||||
# R = scipy.spatial.transform.Rotation.from_euler([0,0,-zrot])
|
# R = scipy.spatial.transform.Rotation.from_euler([0,0,-zrot])
|
||||||
verts[i] = R.apply(verts[i])
|
verts[i] = R.apply(verts[i])
|
||||||
|
|
||||||
@@ -304,6 +303,16 @@ def read_posed_body(folder, id, poses=None, deorient=False):
|
|||||||
|
|
||||||
return verts
|
return verts
|
||||||
|
|
||||||
|
|
||||||
|
def read_curvatures(h5file, id, frames, neighbourhood=None):
|
||||||
|
frames_filtered = [frame for frame in frames if frame.split()[0] == id]
|
||||||
|
garment = frames_filtered[0].split()[2]
|
||||||
|
curvatures_all = []
|
||||||
|
for frame_nr in range(len(frames_filtered)):
|
||||||
|
curv = h5file.get_node(f'/{id}/{frame_nr}/{garment}/curvature_raw').read()
|
||||||
|
curvatures_all.append(curv)
|
||||||
|
return np.array(curvatures_all)
|
||||||
|
|
||||||
# import os
|
# import os
|
||||||
# import sys
|
# import sys
|
||||||
# import numpy as np
|
# import numpy as np
|
||||||
|
|||||||
+59
-45
@@ -13,6 +13,7 @@ import numpy as np
|
|||||||
import scipy as sp
|
import scipy as sp
|
||||||
import trimesh as tm
|
import trimesh as tm
|
||||||
import cmapy as cm
|
import cmapy as cm
|
||||||
|
import tables as tb
|
||||||
import scipy.io as sio
|
import scipy.io as sio
|
||||||
import scipy.interpolate as spi
|
import scipy.interpolate as spi
|
||||||
import matplotlib.pyplot as plt
|
import matplotlib.pyplot as plt
|
||||||
@@ -22,7 +23,8 @@ import plotly.express as ex
|
|||||||
import plotly.graph_objects as go
|
import plotly.graph_objects as go
|
||||||
|
|
||||||
sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/..')
|
sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/..')
|
||||||
from data.cloth3d_io import read_garment_mask, read_garment_template, read_posed_garment_frame, loadInfo, read_posed_body_frame, read_posed_body, read_posed_garment
|
from data.cloth3d_io import read_garment_mask, read_garment_template, read_posed_garment_frame, loadInfo, read_posed_body_frame, read_posed_body, read_posed_garment, read_curvatures
|
||||||
|
from data.utils import save_to_h5file
|
||||||
|
|
||||||
|
|
||||||
os.environ["CUDA_VISIBLE_DEVICES"] = "6"
|
os.environ["CUDA_VISIBLE_DEVICES"] = "6"
|
||||||
@@ -119,6 +121,8 @@ def convert_to_uv_batch(res, m2uv, uv_map, verts, neighbours=15, mask=None, meth
|
|||||||
rbf_dest_current = np.nonzero(rbf_dest_current)
|
rbf_dest_current = np.nonzero(rbf_dest_current)
|
||||||
rbf_dest_current = np.array(rbf_dest_current).T
|
rbf_dest_current = np.array(rbf_dest_current).T
|
||||||
|
|
||||||
|
out = []
|
||||||
|
|
||||||
for i in range(batch):
|
for i in range(batch):
|
||||||
print('processing frame: ' + str(i))
|
print('processing frame: ' + str(i))
|
||||||
|
|
||||||
@@ -139,7 +143,9 @@ def convert_to_uv_batch(res, m2uv, uv_map, verts, neighbours=15, mask=None, meth
|
|||||||
if garment_uv_mask is not None:
|
if garment_uv_mask is not None:
|
||||||
result *= garment_uv_mask[:,:,np.newaxis]
|
result *= garment_uv_mask[:,:,np.newaxis]
|
||||||
|
|
||||||
np.savez_compressed(os.path.join(folder, 'uv_posed_no_orient', id + '_' + str(i) + '.npz'), uv_posed_no_orient=result)
|
out.append(result)
|
||||||
|
|
||||||
|
return out
|
||||||
|
|
||||||
|
|
||||||
def convert_to_uv_batch_label(res, m2uv, uv_map, values, neighbours=15, mask=None, method='rbf', garment_uv_mask=None, garment_uv_mask_border=None):
|
def convert_to_uv_batch_label(res, m2uv, uv_map, values, neighbours=15, mask=None, method='rbf', garment_uv_mask=None, garment_uv_mask_border=None):
|
||||||
@@ -323,25 +329,16 @@ def get_shapedirs():
|
|||||||
shapedirs.append(male['shapedirs'][to_keep, :])
|
shapedirs.append(male['shapedirs'][to_keep, :])
|
||||||
return shapedirs
|
return shapedirs
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
parser.add_argument("-f", "--folder", help = "end of range", default='/home/workspace/data/dataset/test_skirt_ready_2')
|
parser.add_argument("-f", "--folder", help = "end of range", default='/home/workspace/data/dataset/cloth3d/train')
|
||||||
parser.add_argument("-x", "--extras", help = "end of range", default='/home/workspace/data/dataset/test_skirt_ready_2_extras')
|
|
||||||
parser.add_argument("-s", "--start", help = "start of range", default=0)
|
parser.add_argument("-s", "--start", help = "start of range", default=0)
|
||||||
parser.add_argument("-e", "--end", help = "end of range", default=30000)
|
parser.add_argument("-e", "--end", help = "end of range", default=1000)
|
||||||
parser.add_argument("-n", "--name", help = "end of range", default='lhunor')
|
parser.add_argument("-n", "--name", help = "end of range", default='lhunor')
|
||||||
parser.add_argument("-sk", "--skirt", help = "end of range", default=1)
|
parser.add_argument("-sk", "--skirt", help = "end of range", default=0)
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
# smpl = SMPL('FeatureLines/superSMPL')
|
|
||||||
|
|
||||||
folder = args.folder
|
|
||||||
extras_folder = args.extras
|
|
||||||
|
|
||||||
os.makedirs(extras_folder, exist_ok=True)
|
|
||||||
|
|
||||||
print("skirt" if args.skirt == 1 else "not skirt")
|
|
||||||
|
|
||||||
F = np.load("custom_utils/smpl_faces" + ("_skirt" if args.skirt == 1 else "") + ".npy")
|
F = np.load("custom_utils/smpl_faces" + ("_skirt" if args.skirt == 1 else "") + ".npy")
|
||||||
uv_map = np.load('custom_utils/stretched_uv_map_' + ("skirt" if args.skirt == 1 else "3") + '.npy')
|
uv_map = np.load('custom_utils/stretched_uv_map_' + ("skirt" if args.skirt == 1 else "3") + '.npy')
|
||||||
m2uv = np.load('custom_utils/m2uv' + ("_skirt" if args.skirt == 1 else "") + '.npy', allow_pickle=True).item()
|
m2uv = np.load('custom_utils/m2uv' + ("_skirt" if args.skirt == 1 else "") + '.npy', allow_pickle=True).item()
|
||||||
@@ -369,49 +366,64 @@ if __name__ == '__main__':
|
|||||||
rbf_dest[uv_map_discreet_unique[:, 0], uv_map_discreet_unique[:, 1]] = 0
|
rbf_dest[uv_map_discreet_unique[:, 0], uv_map_discreet_unique[:, 1]] = 0
|
||||||
rbf_dest[np.invert(uv_mask[:,:,0])] = 0
|
rbf_dest[np.invert(uv_mask[:,:,0])] = 0
|
||||||
|
|
||||||
is_skirt = True if args.skirt == 1 else False
|
|
||||||
skirt_modifier = '_skirt' if is_skirt else ''
|
|
||||||
|
|
||||||
|
#########################################################################################
|
||||||
|
|
||||||
|
use_no_orient = False
|
||||||
|
no_shape = False
|
||||||
|
is_skirt = True if args.skirt == 1 else False
|
||||||
folder = args.folder
|
folder = args.folder
|
||||||
|
neighbourhood = 25
|
||||||
frames_file = 'frames_all.txt'
|
frames_file = 'frames_all.txt'
|
||||||
|
data_to_convert = ['mesh_posed', 'mesh_static', 'mesh_curvature', 'body_posed'] # 'mesh_unposed',
|
||||||
|
|
||||||
|
print("skirt" if args.skirt == 1 else "not skirt")
|
||||||
|
print(f'params: -f {args.folder} -s {args.start} -e {args.end} -n {args.name} -skirt {args.skirt}')
|
||||||
|
|
||||||
|
skirt_modifier = '_skirt' if is_skirt else ''
|
||||||
|
orient_mod = '_no_orient' if use_no_orient else ''
|
||||||
|
shape_mod = '_no_shape' if no_shape else ''
|
||||||
|
|
||||||
frames = []
|
frames = []
|
||||||
with open(os.path.join(folder, frames_file), 'r') as f:
|
with open(os.path.join(folder, frames_file), 'r') as f:
|
||||||
lines = f.readlines()
|
lines = f.readlines()
|
||||||
lines = [line.strip() for line in lines]
|
lines = [line.strip() for line in lines]
|
||||||
frames = lines#[int(args.start):int(args.end)]
|
frames = lines
|
||||||
ids = [frame.split('_')[0] for frame in frames]
|
ids = [frame.split()[0] for frame in frames]
|
||||||
|
|
||||||
print(f'params: -f {args.folder} -s {args.start} -e {args.end} -n {args.name} -skirt {args.skirt}')
|
|
||||||
|
|
||||||
# ids = os.listdir(os.path.join(local_folder, 'pose_shape'))
|
|
||||||
# ids = [id.split('_')[0] for id in ids]
|
|
||||||
ids = sorted(list(set(ids)))[int(args.start):int(args.end)]
|
ids = sorted(list(set(ids)))[int(args.start):int(args.end)]
|
||||||
|
|
||||||
shapedirs = get_shapedirs()
|
shapedirs = get_shapedirs()
|
||||||
|
|
||||||
use_no_orient = True
|
root = '/'.join(folder.split('/')[:-1])
|
||||||
no_shape = False
|
type = folder.split('/')[-1]
|
||||||
data_to_convert = ['mesh_posed', 'mesh_unposed', 'mesh_static', 'mesh_curvature', 'body_posed']
|
h5file = tb.open_file(os.path.join(root, f'{type}_extras.h5'), mode='a')
|
||||||
|
|
||||||
|
|
||||||
for id in tqdm.tqdm(ids):
|
for id in tqdm.tqdm(ids):
|
||||||
|
|
||||||
|
|
||||||
info = loadInfo(os.path.join(folder, id, 'info.mat'))
|
info = loadInfo(os.path.join(folder, id, 'info.mat'))
|
||||||
garments = info['outfit']
|
garments = list(info['outfit'].keys())
|
||||||
assert info['poses'].shape[1] <= 300
|
assert info['poses'].shape[1] <= 300
|
||||||
|
|
||||||
|
# put all this in a function and call for all garments
|
||||||
|
|
||||||
|
# also masking is not the same as just filling the empty values with neighbouring
|
||||||
|
# values, at least the plots are different
|
||||||
|
|
||||||
garment = garments[0]
|
garment = garments[0]
|
||||||
|
|
||||||
mask = read_garment_mask(folder, id, garment)
|
mask = read_garment_mask(folder, id, garment)
|
||||||
|
|
||||||
if 'mesh_posed' in data_to_convert:
|
if 'mesh_posed' in data_to_convert:
|
||||||
mesh_posed = read_posed_garment(folder, id, garment, mask=mask, shape=info['shape'], poses=info['poses'], use_no_orient=use_no_orient, no_shape=no_shape)
|
mesh_posed_frame = read_posed_garment_frame(folder, id, garment, 0, mask=mask, shape=info['shape'], pose=info['poses'][:,0], deorient=use_no_orient, unshape=no_shape)
|
||||||
|
mesh_posed = read_posed_garment(folder, id, garment, mask=mask, shape=info['shape'], poses=info['poses'], deorient=use_no_orient, unshape=no_shape)
|
||||||
if 'mesh_unposed' in data_to_convert:
|
if 'mesh_unposed' in data_to_convert:
|
||||||
mesh_unposed = read_unposed_garment(folder, id, garment, mask=mask, shape=info['shape'], no_shape=no_shape)
|
mesh_unposed = read_unposed_garment(folder, id, garment, mask=mask, shape=info['shape'], unshape=no_shape)
|
||||||
if 'mesh_static' in data_to_convert:
|
if 'mesh_static' in data_to_convert:
|
||||||
mesh_static = read_garment_template(folder, id, garment, mask)
|
mesh_static = read_garment_template(folder, id, garment, mask)
|
||||||
if 'mesh_curvature' in data_to_convert:
|
if 'mesh_curvature' in data_to_convert:
|
||||||
mesh_curvature = compute_curvature(mesh_posed, F)
|
mesh_curvature = read_curvatures(h5file, id, frames, neighbourhood=None)
|
||||||
if 'body_posed' in data_to_convert:
|
if 'body_posed' in data_to_convert:
|
||||||
body_posed = read_posed_body(folder, id, info['poses'], use_no_orient)
|
body_posed = read_posed_body(folder, id, info['poses'], use_no_orient)
|
||||||
|
|
||||||
@@ -442,33 +454,35 @@ if __name__ == '__main__':
|
|||||||
|
|
||||||
start = time.perf_counter()
|
start = time.perf_counter()
|
||||||
|
|
||||||
uv_verts_static, garment_uv_mask, garment_uv_mask_border = convert_to_uv(uv_res, m2uv, uv_map, verts_static, neighbours=3, mask=mask, method='rbf', garment_uv_mask=None)
|
uv_static, uv_mask, garment_uv_mask_border = convert_to_uv(uv_res, m2uv, uv_map, mesh_static, neighbours=3, mask=mask, method='rbf', garment_uv_mask=None)
|
||||||
uv_verts_static = uv_verts_static.astype(np.float32)
|
uv_static = uv_static.astype(np.float32)
|
||||||
|
|
||||||
if 'mesh_posed' in data_to_convert:
|
if 'mesh_posed' in data_to_convert:
|
||||||
uv_posed = convert_to_uv_batch(uv_res, m2uv, uv_map, gt[:, :, :], neighbours=3, mask=mask, method='rbf', garment_uv_mask=garment_uv_mask, garment_uv_mask_border=garment_uv_mask_border).astype(np.float32)
|
uv_posed = convert_to_uv_batch(uv_res, m2uv, uv_map, mesh_posed[:, :, :], neighbours=3, mask=mask, method='rbf', garment_uv_mask=uv_mask, garment_uv_mask_border=garment_uv_mask_border).astype(np.float32)
|
||||||
if 'mesh_unposed' in data_to_convert:
|
if 'mesh_unposed' in data_to_convert:
|
||||||
uv_unposed = convert_to_uv_batch(uv_res, m2uv, uv_map, mesh_unposed[:, :, :], neighbours=3, mask=mask, method='rbf', garment_uv_mask=garment_uv_mask, garment_uv_mask_border=garment_uv_mask_border).astype(np.float32)
|
uv_unposed = convert_to_uv_batch(uv_res, m2uv, uv_map, mesh_unposed[:, :, :], neighbours=3, mask=mask, method='rbf', garment_uv_mask=uv_mask, garment_uv_mask_border=garment_uv_mask_border).astype(np.float32)
|
||||||
if 'mesh_curvature' in data_to_convert:
|
if 'mesh_curvature' in data_to_convert:
|
||||||
uv_curvature = convert_to_uv_batch_label(uv_res, m2uv, uv_map, curvature[:, :], neighbours=3, mask=mask, method='nearest', garment_uv_mask=garment_uv_mask, garment_uv_mask_border=garment_uv_mask_border).astype(np.float32)
|
uv_curvature = convert_to_uv_batch_label(uv_res, m2uv, uv_map, mesh_curvature[:, :], neighbours=3, mask=mask, method='nearest', garment_uv_mask=uv_mask, garment_uv_mask_border=garment_uv_mask_border).astype(np.float32)
|
||||||
if 'body_posed' in data_to_convert:
|
if 'body_posed' in data_to_convert:
|
||||||
uv_body_posed = convert_to_uv_batch(uv_res, m2uv, uv_map, body_posed[:, :, :], neighbours=3, mask=None, method='rbf', garment_uv_mask=None, garment_uv_mask_border=garment_uv_mask_border).astype(np.float32)
|
uv_body_posed = convert_to_uv_batch(uv_res, m2uv, uv_map, body_posed[:, :, :], neighbours=3, mask=None, method='rbf', garment_uv_mask=None, garment_uv_mask_border=garment_uv_mask_border).astype(np.float32)
|
||||||
|
|
||||||
print(time.perf_counter() - start)
|
print(time.perf_counter() - start)
|
||||||
|
|
||||||
|
# mesh_static
|
||||||
if 'mesh_static' in data_to_convert:
|
save_to_h5file(h5file, id, 0, garment, uv_static, 'uv_static', 'float32')
|
||||||
# np.save(os.path.join(folder, id, garment + '_offsets_static_uv.npy'), uv_verts_static)
|
save_to_h5file(h5file, id, 0, garment, uv_mask, 'uv_mask', 'float32')
|
||||||
# np.save(os.path.join(folder, id, 'mask_uv.npy'), garment_uv_mask)
|
|
||||||
if 'mesh_posed' in data_to_convert:
|
if 'mesh_posed' in data_to_convert:
|
||||||
mesh_posed = read_posed_garment(folder, id, garment, mask=mask, shape=info['shape'], poses=info['poses'], use_no_orient=use_no_orient, no_shape=no_shape)
|
for i in range(uv_posed.shape[0]):
|
||||||
|
save_to_h5file(h5file, id, i, garment, uv_posed[i, :, :, :], 'uv_posed' + orient_mod + shape_mod, 'float32')
|
||||||
if 'mesh_unposed' in data_to_convert:
|
if 'mesh_unposed' in data_to_convert:
|
||||||
mesh_unposed = read_unposed_garment(folder, id, garment, mask=mask, shape=info['shape'], no_shape=no_shape)
|
for i in range(uv_unposed.shape[0]):
|
||||||
|
save_to_h5file(h5file, id, i, garment, uv_unposed[i, :, :, :], 'uv_unposed' + orient_mod + shape_mod, 'float32')
|
||||||
if 'mesh_curvature' in data_to_convert:
|
if 'mesh_curvature' in data_to_convert:
|
||||||
mesh_curvature = compute_curvature(mesh_posed, F)
|
for i in range(uv_curvature.shape[0]):
|
||||||
|
save_to_h5file(h5file, id, i, garment, uv_curvature[i, :, :, :], 'uv_curvature', 'uint8')
|
||||||
if 'body_posed' in data_to_convert:
|
if 'body_posed' in data_to_convert:
|
||||||
# for i in range(uv_body_posed.shape[0]):
|
for i in range(uv_body_posed.shape[0]):
|
||||||
# np.savez_compressed(os.path.join(folder, id, 'uv_body_posed', garment + '_' + str(i) + '.npz'), uv_body=uv_body[i, :, :, :])
|
save_to_h5file(h5file, id, i, garment, uv_body_posed[i, :, :, :], 'uv_body_posed', 'float32')
|
||||||
|
|
||||||
|
|
||||||
# start = time.perf_counter()
|
# start = time.perf_counter()
|
||||||
|
|||||||
+8
-25
@@ -114,14 +114,6 @@ class Cache:
|
|||||||
|
|
||||||
mask = read_garment_mask(self.folder, id, garment)
|
mask = read_garment_mask(self.folder, id, garment)
|
||||||
|
|
||||||
if self.include_neighbours:
|
|
||||||
k_neighbors = np.argsort(dist[mask, :][:, mask], axis=-1)[:, :self.neighbourhood]
|
|
||||||
self.cache[id].k_neighbors = k_neighbors
|
|
||||||
G = tm.graph.vertex_adjacency_graph(m)
|
|
||||||
for i in range(v.shape[0]):
|
|
||||||
for k in range(25):
|
|
||||||
assert nx.has_path(G, i, k_neighbors[i, k]), f'No path between {i} and {k_neighbors[i, k]}'
|
|
||||||
|
|
||||||
_, faces = _maskFaces(np.zeros((14475,3)), F, mask)
|
_, faces = _maskFaces(np.zeros((14475,3)), F, mask)
|
||||||
v = read_posed_garment_frame(folder, id, garment, 0)[mask,:]
|
v = read_posed_garment_frame(folder, id, garment, 0)[mask,:]
|
||||||
m = tm.Trimesh(v, faces, process=False, validate=False)
|
m = tm.Trimesh(v, faces, process=False, validate=False)
|
||||||
@@ -132,6 +124,14 @@ class Cache:
|
|||||||
faces = np.concatenate((faces, outliers_faces), axis=0)
|
faces = np.concatenate((faces, outliers_faces), axis=0)
|
||||||
m = tm.Trimesh(v, faces, process=False, validate=False)
|
m = tm.Trimesh(v, faces, process=False, validate=False)
|
||||||
|
|
||||||
|
if self.include_neighbours:
|
||||||
|
k_neighbors = np.argsort(dist[mask, :][:, mask], axis=-1)[:, :self.neighbourhood]
|
||||||
|
self.cache[id].k_neighbors = k_neighbors
|
||||||
|
G = tm.graph.vertex_adjacency_graph(m)
|
||||||
|
for i in range(v.shape[0]):
|
||||||
|
for k in range(25):
|
||||||
|
assert nx.has_path(G, i, k_neighbors[i, k]), f'No path between {i} and {k_neighbors[i, k]}'
|
||||||
|
|
||||||
self.cache[id].mask = mask
|
self.cache[id].mask = mask
|
||||||
self.cache[id].faces = faces
|
self.cache[id].faces = faces
|
||||||
|
|
||||||
@@ -162,7 +162,6 @@ def calculate_dist(folder, neighbourhood, frames):
|
|||||||
|
|
||||||
|
|
||||||
def generate_curvatures(folder, neighbourhood, frames):
|
def generate_curvatures(folder, neighbourhood, frames):
|
||||||
|
|
||||||
# ids = os.listdir(folder)[int(args.start):int(args.end)]
|
# ids = os.listdir(folder)[int(args.start):int(args.end)]
|
||||||
# frames = frames[int(args.start):int(args.end)]
|
# frames = frames[int(args.start):int(args.end)]
|
||||||
os.makedirs(os.path.join('/'.join(folder.split('/')[:-1]), 'backup', f'mesh_curvature_raw'), exist_ok=True)
|
os.makedirs(os.path.join('/'.join(folder.split('/')[:-1]), 'backup', f'mesh_curvature_raw'), exist_ok=True)
|
||||||
@@ -176,9 +175,6 @@ def generate_curvatures(folder, neighbourhood, frames):
|
|||||||
frame_nr = int(frame.split()[1])
|
frame_nr = int(frame.split()[1])
|
||||||
garment = frame.split()[2]
|
garment = frame.split()[2]
|
||||||
|
|
||||||
# bodies = readPC2(os.path.join(folder, id, 'Body_posed.pc16'), True)['V']
|
|
||||||
# offsetss = readPC2(os.path.join(folder, id, garment + '_registered.pc16'), True)['V']
|
|
||||||
# mask = np.load(os.path.join(folder, 'mesh_mask', f'{id}.npy')).astype(bool)
|
|
||||||
mask = cache[id].mask
|
mask = cache[id].mask
|
||||||
faces = cache[id].faces
|
faces = cache[id].faces
|
||||||
v = read_posed_garment_frame(folder, id, garment, frame_nr)[mask,:]
|
v = read_posed_garment_frame(folder, id, garment, frame_nr)[mask,:]
|
||||||
@@ -194,7 +190,6 @@ def generate_curvatures(folder, neighbourhood, frames):
|
|||||||
out = np.zeros((14475), dtype=np.float32)
|
out = np.zeros((14475), dtype=np.float32)
|
||||||
out[mask] = curvature
|
out[mask] = curvature
|
||||||
|
|
||||||
|
|
||||||
np.savez_compressed(os.path.join('/'.join(folder.split('/')[:-1]), 'backup', f'mesh_curvature_raw', f'{id}_{frame_nr}_{garment}.npz'), mesh_curvature_raw=out)
|
np.savez_compressed(os.path.join('/'.join(folder.split('/')[:-1]), 'backup', f'mesh_curvature_raw', f'{id}_{frame_nr}_{garment}.npz'), mesh_curvature_raw=out)
|
||||||
group = h5file.get_node(f'/{id}/{frame_nr}/{garment}')
|
group = h5file.get_node(f'/{id}/{frame_nr}/{garment}')
|
||||||
if f'curvature_raw' in group:
|
if f'curvature_raw' in group:
|
||||||
@@ -204,7 +199,6 @@ def generate_curvatures(folder, neighbourhood, frames):
|
|||||||
carray = h5file.create_carray(group, "curvature_raw", atom=tb.Float32Atom(), shape=out.shape, filters=filters)
|
carray = h5file.create_carray(group, "curvature_raw", atom=tb.Float32Atom(), shape=out.shape, filters=filters)
|
||||||
carray[:] = out
|
carray[:] = out
|
||||||
|
|
||||||
|
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
@@ -283,23 +277,12 @@ def visualize_curvature_labels(folder, frames):
|
|||||||
verts = read_posed_garment_frame(folder, id, garment, frame_nr)[mask, :]
|
verts = read_posed_garment_frame(folder, id, garment, frame_nr)[mask, :]
|
||||||
curv = h5file.get_node(f'/{id}/{frame_nr}/{garment}/curvature_mesh_global').read()[mask]
|
curv = h5file.get_node(f'/{id}/{frame_nr}/{garment}/curvature_mesh_global').read()[mask]
|
||||||
|
|
||||||
# m = tm.Trimesh(verts, faces, process=False, validate=False)
|
|
||||||
|
|
||||||
# outliers = np.array([len(v) for v in m.vertex_neighbors]) == 0
|
|
||||||
# outliers = np.nonzero(outliers)[0]
|
|
||||||
# outliers_n_neighbours = get_closest_n_points(verts, outliers, 2)
|
|
||||||
# outliers_faces = np.concatenate((outliers[:, np.newaxis], outliers_n_neighbours), axis=-1)
|
|
||||||
# faces = np.concatenate((faces, outliers_faces), axis=0)
|
|
||||||
|
|
||||||
colors = np.array([cm.color('jet', 1 - i) for i in np.linspace(0, 1, int(curv.max()))])
|
colors = np.array([cm.color('jet', 1 - i) for i in np.linspace(0, 1, int(curv.max()))])
|
||||||
colors_binned = np.zeros((curv.shape[0], 3))
|
colors_binned = np.zeros((curv.shape[0], 3))
|
||||||
for i in range(1, int(curv.max())+1):
|
for i in range(1, int(curv.max())+1):
|
||||||
# print(np.count_nonzero(curv == i))
|
# print(np.count_nonzero(curv == i))
|
||||||
colors_binned[curv == i, :] = colors[i-1]
|
colors_binned[curv == i, :] = colors[i-1]
|
||||||
# colors_binned = colors_binned[mask, :]
|
|
||||||
|
|
||||||
# m = tm.Trimesh(verts, faces, process=False, validate=False, vertex_colors=colors_binned)
|
|
||||||
# m.show()
|
|
||||||
x = verts
|
x = verts
|
||||||
meshes = [go.Mesh3d(
|
meshes = [go.Mesh3d(
|
||||||
x=x[:,0],
|
x=x[:,0],
|
||||||
|
|||||||
+21
-1
@@ -1,4 +1,4 @@
|
|||||||
|
import tables as tb
|
||||||
|
|
||||||
class Frame:
|
class Frame:
|
||||||
def __init__(self, id, frame_nr, garment):
|
def __init__(self, id, frame_nr, garment):
|
||||||
@@ -12,3 +12,23 @@ class Frame:
|
|||||||
def __eq__(self, other):
|
def __eq__(self, other):
|
||||||
return (self.id, self.frame_nr) == (other.id, other.frame_nr)
|
return (self.id, self.frame_nr) == (other.id, other.frame_nr)
|
||||||
|
|
||||||
|
|
||||||
|
def save_to_h5file(h5file, id, frame_nr, garment, data, name, type):
|
||||||
|
filters = tb.Filters(complevel=9, complib='blosc2')
|
||||||
|
group = h5file.get_node(f'/{id}/{frame_nr}/{garment}')
|
||||||
|
|
||||||
|
if type == 'float32':
|
||||||
|
atom = tb.Float32Atom()
|
||||||
|
elif type == 'uint8':
|
||||||
|
atom = tb.UInt8Atom()
|
||||||
|
elif type == 'bool':
|
||||||
|
atom = tb.BoolAtom()
|
||||||
|
else:
|
||||||
|
raise Exception('Unknown type')
|
||||||
|
|
||||||
|
if f'{name}' in group:
|
||||||
|
array = h5file.get_node(f'/{id}/{frame_nr}/{garment}/{name}')
|
||||||
|
array[:] = data
|
||||||
|
else:
|
||||||
|
carray = h5file.create_carray(group, name, atom=atom, shape=data.shape, filters=filters)
|
||||||
|
carray[:] = data
|
||||||
Reference in New Issue
Block a user