|
import torch |
|
from skimage.metrics import structural_similarity as ssim |
|
from skimage.metrics import peak_signal_noise_ratio as psnr |
|
import glob |
|
import argparse |
|
import cv2 |
|
import numpy as np |
|
import argparse |
|
from tripy import shoelace_formula |
|
from pyntcloud import PyntCloud |
|
from pyntcloud.distance import euclidean_distances |
|
|
|
def evaluate_rendering(args): |
|
ssim_values = [] |
|
psnr_values = [] |
|
test_rendering_paths = sorted(glob.glob(f'{args.path}/*.png')) |
|
for test_rendering_path in test_rendering_paths: |
|
combined_image = cv2.imread(test_rendering_path) |
|
|
|
height, width = combined_image.shape[:2] |
|
|
|
input_image = combined_image[:height // 2, :] |
|
rendered_image = combined_image[height // 2:, :] |
|
|
|
|
|
ssim_value = ssim(input_image, rendered_image, multichannel=True) |
|
psnr_value = psnr(input_image, rendered_image) |
|
|
|
ssim_values.append(ssim_value) |
|
psnr_values.append(psnr_value) |
|
|
|
|
|
ssim_average = sum(ssim_values) / len(ssim_values) |
|
psnr_average = sum(psnr_values) / len(psnr_values) |
|
|
|
print(f'average_SSIM: {ssim_average:.4f}') |
|
print(f'average_PSNR: {psnr_average:.4f}') |
|
|
|
return |
|
|
|
def calculate_iou(mesh1, mesh2): |
|
|
|
intersection_area = shoelace_formula(mesh1.intersection(mesh2)) |
|
|
|
|
|
union_area = shoelace_formula(mesh1) + shoelace_formula(mesh2) - intersection_area |
|
|
|
|
|
iou = intersection_area / union_area |
|
return iou |
|
|
|
def calculate_chamfer_distance(mesh1, mesh2): |
|
|
|
distances1 = euclidean_distances(mesh1.vertices, mesh2.vertices).min(axis=1) |
|
distances2 = euclidean_distances(mesh2.vertices, mesh1.vertices).min(axis=1) |
|
chamfer_distance = (distances1.mean() + distances2.mean()) / 2 |
|
return chamfer_distance |
|
|
|
def calculate_normal_consistency(mesh1, mesh2): |
|
|
|
cos_similarity = np.abs(np.sum(mesh1.normals * mesh2.normals, axis=1)) |
|
normal_consistency = cos_similarity.mean() |
|
return normal_consistency |
|
|
|
def evaluate_3D(args): |
|
|
|
mesh1 = PyntCloud.from_file('path_to_mesh1.ply') |
|
mesh2 = PyntCloud.from_file('path_to_mesh2.ply') |
|
|
|
|
|
iou = calculate_iou(mesh1, mesh2) |
|
print(f'IoU: {iou:.4f}') |
|
|
|
|
|
chamfer_distance = calculate_chamfer_distance(mesh1, mesh2) |
|
print(f'Chamfer Distance: {chamfer_distance:.4f}') |
|
|
|
|
|
normal_consistency = calculate_normal_consistency(mesh1, mesh2) |
|
print(f'Normal Consistency: {normal_consistency:.4f}') |
|
|
|
return |
|
|
|
if __name__ == '__main__': |
|
parser = argparse.ArgumentParser(description='3D Visualization') |
|
|
|
parser.add_argument('--mode', type=str, help='mode: rendering or 3D') |
|
|
|
parser.add_argument('--path', type=str, help='path to the file') |
|
args = parser.parse_args() |
|
if args.mode == 'rendering': |
|
evaluate_rendering(args) |
|
elif args.mode == '3D': |
|
evaluate_3D(args) |