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)
Exemple #4
0
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.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))
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