You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
39 lines
1.3 KiB
39 lines
1.3 KiB
#!/usr/bin/env python3
|
|
# Copyright 2004-present Facebook. All Rights Reserved.
|
|
|
|
import numpy as np
|
|
from scipy.spatial import cKDTree as KDTree
|
|
import trimesh
|
|
|
|
|
|
def compute_trimesh_chamfer(gt_points, gen_mesh, offset, scale, num_mesh_samples=30000):
|
|
"""
|
|
This function computes a symmetric chamfer distance, i.e. the sum of both chamfers.
|
|
|
|
gt_points: trimesh.points.PointCloud of just poins, sampled from the surface (see
|
|
compute_metrics.ply for more documentation)
|
|
|
|
gen_mesh: trimesh.base.Trimesh of output mesh from whichever autoencoding reconstruction
|
|
method (see compute_metrics.py for more)
|
|
|
|
"""
|
|
|
|
gen_points_sampled = trimesh.sample.sample_surface(gen_mesh, num_mesh_samples)[0]
|
|
|
|
gen_points_sampled = gen_points_sampled / scale - offset
|
|
|
|
# only need numpy array of points
|
|
# gt_points_np = gt_points.vertices
|
|
gt_points_np = gt_points.vertices
|
|
|
|
# one direction
|
|
gen_points_kd_tree = KDTree(gen_points_sampled)
|
|
one_distances, one_vertex_ids = gen_points_kd_tree.query(gt_points_np)
|
|
gt_to_gen_chamfer = np.mean(np.square(one_distances))
|
|
|
|
# other direction
|
|
gt_points_kd_tree = KDTree(gt_points_np)
|
|
two_distances, two_vertex_ids = gt_points_kd_tree.query(gen_points_sampled)
|
|
gen_to_gt_chamfer = np.mean(np.square(two_distances))
|
|
|
|
return gt_to_gen_chamfer + gen_to_gt_chamfer
|
|
|