def main(): meshes = [ ('hand', 5, 'meshes/hand_868.obj', [10, 30], False), ('fertility', 5, 'meshes/fertility/FE_10k.off', [10, 40], False), ('bunny', 1.25, 'meshes/bunny_fixed.obj', [10, 40], False), ] result_lines = [] for mesh_name, mu, filename, Ks, scaled in meshes: verts, tris = load_mesh(filename, check=False, normalize=True) print mesh_name, len(verts), len(tris) for K in Ks: t_cmh = time() Phi_cmh, D_cmh = cmm.compressed_manifold_modes( verts, tris, K, init='varimax', mu=mu, scaled=scaled, return_D=True) t_cmh = time() - t_cmh t_mh = time() Phi_mh, D_mh = cmm.manifold_harmonics( verts, tris, K, return_D=True, scaled=scaled) t_mh = time() - t_mh Phi_mh = Phi_mh.astype(np.float64) Phi_cmh = Phi_cmh.astype(np.float64) Phi_cmh[np.abs(Phi_cmh) < 1.e-7] = 0 Phi_cmh_sp = sparse.csr_matrix(Phi_cmh, dtype=np.float64) if scaled: verts_rec_cmh = np.dot(Phi_cmh, np.dot((D_cmh * Phi_cmh).T, verts)) verts_rec_mh = np.dot(Phi_mh, np.dot((D_mh * Phi_mh).T, verts)) else: verts_rec_cmh = np.dot(Phi_cmh, np.dot(Phi_cmh.T, verts)) verts_rec_mh = np.dot(Phi_mh, np.dot(Phi_mh.T, verts)) line_format = "{mesh_name} & {num_verts:>8d} & {basis} & {K:d} & {mu:>4} & {error:>6.2f} & {size:>8} & {time:>5.2f}s" result_lines.append(line_format.format( mesh_name=mesh_name, basis='MHB', K=K, mu='-', num_verts=len(verts), error=np.linalg.norm(verts_rec_mh - verts), size=sizeof_fmt(Phi_mh.nbytes), time=t_mh, )) result_lines.append(line_format.format( mesh_name=mesh_name, basis='CMB', K=K, mu='%.2f' % mu, num_verts=len(verts), error=np.linalg.norm(verts_rec_cmh - verts), size=sizeof_fmt(Phi_cmh_sp.data.nbytes + Phi_cmh_sp.indptr.nbytes + Phi_cmh_sp.indices.nbytes), time=t_cmh, )) print "------------" print "TABLE START:" print "------------" print "mesh & basis & $K$ & $\\mu$ & error & size & time" for line in result_lines: print line
import numpy as np from cmmlib import cmm from cmmlib.inout import load_mesh from cmmlib.vis.weights import show_many_weights K = 6 verts, tris = load_mesh('meshes/hand_4054.obj') # compute bases Phi_cmh = cmm.compressed_manifold_modes(verts, tris, K, mu=2, scaled=False) Phi_mh = cmm.manifold_harmonics(verts, tris, K, scaled=False) # reconstruct from bases verts_rec_cmh = np.dot(Phi_cmh, np.dot(Phi_cmh.T, verts)) verts_rec_mh = np.dot(Phi_mh, np.dot(Phi_mh.T, verts)) show_many_weights( ((verts, tris, None, 'Input'), (verts_rec_mh, tris, None, 'MH reconstr.'), (verts_rec_cmh, tris, None, 'CMM reconstr.')), show_labels=True, actor_options=dict(edge_visibility=True, line_width=1.0))
from cmmlib import cmm from cmmlib.inout import load_mesh from cmmlib.vis.weights import show_weights K = 8 + 6 + 12 mu = 20.0 filename = 'meshes/bumpy_cube6.obj' verts, tris = load_mesh(filename) Phi_cpr = cmm.compressed_manifold_modes(verts, tris, K, mu=mu) Phi_dense = cmm.manifold_harmonics(verts, tris, K) Phi_vari = cmm.varimax_modes(verts, tris, K) show_weights(verts, tris, (Phi_cpr, Phi_dense, Phi_vari), ('CMM', 'MH', 'Varimax'), show_labels=True)
from cmmlib import cmm from cmmlib.inout import load_mesh from cmmlib.vis.weights import show_many_weights mu = 2.0 K = 6 vms = [] for i, fn in enumerate(['hand_868', 'hand_868_holes2']): verts, tris = load_mesh('meshes/%s.obj' % fn) Phi_cpr = cmm.compressed_manifold_modes(verts, tris, K, mu=mu) Phi_dense = cmm.manifold_harmonics(verts, tris, K) vms += [(verts, tris, Phi_cpr, 'CMM #%d' % i), (verts, tris, Phi_dense, 'MH #%d' % i)] show_many_weights(vms, show_labels=True)
import numpy as np from cmmlib import cmm from cmmlib.align import optimal_permutation from cmmlib.inout import load_mesh from cmmlib.vis.weights import show_weights verts, tris = load_mesh('meshes/hand_4054.obj') K = 6 mus = [1/100., 1., 10.] all_Phi = [cmm.manifold_harmonics(verts, tris, K)] \ + [cmm.compressed_manifold_modes(verts, tris, K, mu, scaled=False) for mu in mus] # permute modes so we can visualize them side-by-side all_Phi_aligned = \ [np.dot(optimal_permutation(Phi.T, all_Phi[-1].T, allow_reflection=True), Phi.T).T for Phi in all_Phi[:-1]] + \ [all_Phi[-1]] show_weights(verts, tris, all_Phi_aligned, names=['dense'] + map(str, mus))
def main(): meshes = [ ('hand', 5, 'meshes/hand_868.obj', [10, 30], False), ('fertility', 5, 'meshes/fertility/FE_10k.off', [10, 40], False), ('bunny', 1.25, 'meshes/bunny_fixed.obj', [10, 40], False), ] result_lines = [] for mesh_name, mu, filename, Ks, scaled in meshes: verts, tris = load_mesh(filename, check=False, normalize=True) print mesh_name, len(verts), len(tris) for K in Ks: t_cmh = time() Phi_cmh, D_cmh = cmm.compressed_manifold_modes(verts, tris, K, init='varimax', mu=mu, scaled=scaled, return_D=True) t_cmh = time() - t_cmh t_mh = time() Phi_mh, D_mh = cmm.manifold_harmonics(verts, tris, K, return_D=True, scaled=scaled) t_mh = time() - t_mh Phi_mh = Phi_mh.astype(np.float64) Phi_cmh = Phi_cmh.astype(np.float64) Phi_cmh[np.abs(Phi_cmh) < 1.e-7] = 0 Phi_cmh_sp = sparse.csr_matrix(Phi_cmh, dtype=np.float64) if scaled: verts_rec_cmh = np.dot(Phi_cmh, np.dot((D_cmh * Phi_cmh).T, verts)) verts_rec_mh = np.dot(Phi_mh, np.dot((D_mh * Phi_mh).T, verts)) else: verts_rec_cmh = np.dot(Phi_cmh, np.dot(Phi_cmh.T, verts)) verts_rec_mh = np.dot(Phi_mh, np.dot(Phi_mh.T, verts)) line_format = "{mesh_name} & {num_verts:>8d} & {basis} & {K:d} & {mu:>4} & {error:>6.2f} & {size:>8} & {time:>5.2f}s" result_lines.append( line_format.format( mesh_name=mesh_name, basis='MHB', K=K, mu='-', num_verts=len(verts), error=np.linalg.norm(verts_rec_mh - verts), size=sizeof_fmt(Phi_mh.nbytes), time=t_mh, )) result_lines.append( line_format.format( mesh_name=mesh_name, basis='CMB', K=K, mu='%.2f' % mu, num_verts=len(verts), error=np.linalg.norm(verts_rec_cmh - verts), size=sizeof_fmt(Phi_cmh_sp.data.nbytes + Phi_cmh_sp.indptr.nbytes + Phi_cmh_sp.indices.nbytes), time=t_cmh, )) print "------------" print "TABLE START:" print "------------" print "mesh & basis & $K$ & $\\mu$ & error & size & time" for line in result_lines: print line