File size: 1,387 Bytes
e371ddd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import numpy as np
from scipy.spatial import cKDTree as KDTree
import mesh2sdf
import open3d

def chamfer(gt_points, rec_points):
    # one direction
    gen_points_kd_tree = KDTree(rec_points)
    one_distances, one_vertex_ids = gen_points_kd_tree.query(gt_points)
    gt_to_gen_chamfer = np.mean(one_distances)

    # other direction
    gt_points_kd_tree = KDTree(gt_points)
    two_distances, two_vertex_ids = gt_points_kd_tree.query(rec_points)
    gen_to_gt_chamfer = np.mean(two_distances)

    return (gt_to_gen_chamfer + gen_to_gt_chamfer) / 2.

# compute volume iou
def compute_iou(mesh_pr, mesh_gt):
    # trimesh to open3d
    mesh_gt_o3d = open3d.geometry.TriangleMesh()
    mesh_gt_o3d.vertices = open3d.utility.Vector3dVector(mesh_gt.vertices)
    mesh_gt_o3d.triangles = open3d.utility.Vector3iVector(mesh_gt.faces)
    mesh_rec_o3d = open3d.geometry.TriangleMesh()
    mesh_rec_o3d.vertices = open3d.utility.Vector3dVector(mesh_pr.vertices)
    mesh_rec_o3d.triangles = open3d.utility.Vector3iVector(mesh_pr.faces)

    size = 64
    sdf_pr = mesh2sdf.compute(mesh_rec_o3d.vertices, mesh_rec_o3d.triangles, size, fix=False, return_mesh=False)
    sdf_gt = mesh2sdf.compute(mesh_gt_o3d.vertices, mesh_gt_o3d.triangles, size, fix=False, return_mesh=False)
    vol_pr = sdf_pr<0
    vol_gt = sdf_gt<0
    iou = np.sum(vol_pr & vol_gt)/np.sum(vol_gt | vol_pr)
    return iou