diff --git a/helpers/remove_points_of_class_from_pc.py b/helpers/remove_points_of_class_from_pc.py new file mode 100644 index 0000000000000000000000000000000000000000..6008c955196ebffefc86d6cdc578933fb12f3232 --- /dev/null +++ b/helpers/remove_points_of_class_from_pc.py @@ -0,0 +1,84 @@ +import argparse +import glob +import os +import laspy +import numpy as np + +class RemovePointsOfClassFromPC: + def __init__(self, folder_name, class_name, class_value, verbose=False): + self.folder_name = folder_name + self.class_name = class_name + self.class_value = class_value + self.verbose = verbose + + def get_paths_of_files(self, folder_name): + # use glob to get all the paths of the files in the folder + paths = glob.glob(os.path.join(folder_name, "*.las"), recursive=False) + + # check if the folder is empty + if len(paths) == 0: + raise Exception("The folder is empty") + + if self.verbose: + print("The number of files in the folder {} is {}".format(folder_name, len(paths))) + + return paths + + def read_one_las_file_and_remove_points(self, file_path, class_name, class_value): + # read the las file + las_file = laspy.read(file_path) + + # check if at least one point has the class value in the las file + if np.sum(las_file[class_name] == class_value) == 0: + if self.verbose: + print("No points with the class value {} in the file {}".format(class_value, file_path)) + print("No points removed from the file {}".format(file_path)) + + + # create a new las file with the same header as the original las file + new_file = laspy.create(point_format=las_file.header.point_format, file_version=las_file.header.version) + + # write the points to the las file except the points of the class + new_file.points = las_file.points[las_file[class_name] != class_value] + + # write the las file + new_file.write(file_path) + + def remove_points_of_class_from_pc(self, folder_name, class_name, class_value): + # get the paths of all the files in the folder + paths = self.get_paths_of_files(folder_name) + + # read all the files and remove the points of the class + for path in paths: + if self.verbose: + print("Removing points from the file {}".format(path)) + self.read_one_las_file_and_remove_points(path, class_name, class_value) + + if self.verbose: + print("Done") + + def __call__(self): + self.remove_points_of_class_from_pc(self.folder_name, self.class_name, self.class_value) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Remove points of a class from a point cloud") + parser.add_argument("-f", "--folder_name", type=str, help="The folder name where the point clouds are stored") + parser.add_argument("-n", "--class_name", type=str, help="The class name of the points to be removed") + parser.add_argument("-c", "--class_value", type=int, help="The class value of the points to be removed") + parser.add_argument("-v", "--verbose", action="store_true", help="Print the progress") + + args = parser.parse_args() + + # get the arguments + folder_name = args.folder_name + class_name = args.class_name + class_value = args.class_value + verbose = args.verbose + + # remove the points of the class from the point cloud + remove_points_of_class_from_pc = RemovePointsOfClassFromPC(folder_name, class_name,class_value, verbose) + remove_points_of_class_from_pc() + + + \ No newline at end of file diff --git a/metrics/instance_segmentation_metrics_in_folder.py b/metrics/instance_segmentation_metrics_in_folder.py index e9b4eca42a34a3289e5396597dbe3b634cb4b1a5..9e3e42360fe1dbed6ee95fc84817c41ff2908bcb 100644 --- a/metrics/instance_segmentation_metrics_in_folder.py +++ b/metrics/instance_segmentation_metrics_in_folder.py @@ -111,7 +111,15 @@ class InstanceSegmentationMetricsInFolder(): # f1_scores_weighted_list.append(f1_score_weighted) # calculate the mean f1 score of weighted f1 scores - mean_f1_score = sum(f1_scores_weighted_list) / len(f1_scores_weighted_list) + # mean_f1_score = sum(f1_scores_weighted_list) / len(f1_scores_weighted_list) + + # use a dirty hack to compute the mean of the metrics (accounts for broken point clouds caused by phils code) + + mean_f1_score = sum(f1_scores_weighted_list) / len(gt_las_file_paths) + + print('numer of files: ' + str(len(gt_las_file_paths))) + + # calculate the mean metrics for all the elements in the metric_dict_list # create a mean_metrics dictionary and initialize it with zeros mean_metrics = {}