diff --git a/.gitignore b/.gitignore index 09561d3..7fc8105 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,5 @@ training_data/training_data_*/ training_data/*.vec training_data/backgrounds.txt training_data/negatives -training_data/opencv \ No newline at end of file +training_data/opencv +validation/cascade* \ No newline at end of file diff --git a/validation/compare_to_gt.py b/validation/compare_to_gt.py new file mode 100644 index 0000000..cbde07f --- /dev/null +++ b/validation/compare_to_gt.py @@ -0,0 +1,97 @@ +import argparse +import os + +def dir_path(string): + if os.path.exists(string): + return string + else: + raise NotADirectoryError(string) + +def init_argparse() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + prog="FaceDetection", + usage="%(prog)s [OPTION]", + description="Run face localization" + ) + parser.add_argument( + "ground_truth", type=dir_path, help="ground truth file" + ) + parser.add_argument( + "test_file", type=dir_path, help="file to compare to the ground truth" + ) + parser.add_argument( + "out_file", help="the file to write the output to" + ) + return parser + +multiplication_factor = 0.05 +def get_adjustment_amount(imgSize, x1, y1, x2, y2): + + # find the difference between the left gap and the right gap, divide it by two, and multiply it by the speed scale + horizontal_adjustment = multiplication_factor * (x1 - (imgSize[0] - x2)) / 2 + vertical_adjustment = multiplication_factor * (y1 - (imgSize[0] - y2)) / 2 + + return [horizontal_adjustment, vertical_adjustment] + +parser = init_argparse() +args = parser.parse_args() + +class FrameBox: + frame_number: int + top_left: tuple + bottom_right: tuple + + def __init__(self, frame_number, x1, y1, x2, y2): + self.frame_number = frame_number + self.top_left = (x1, y1) + self.bottom_right = (x2, y2) + +ground_truth = [] +with open(args.ground_truth, 'r') as gt_file: + lines = gt_file.readlines() + for line in lines: + items = line.split(",") + ground_truth.append(FrameBox(int(items[0].strip()), int(items[1].strip()), int(items[2].strip()), int(items[3].strip()), int(items[4].strip()))) + +test_results = [] +with open(args.test_file, 'r') as test_file: + lines = test_file.readlines() + for line in lines: + items = line.split(",") + test_results.append(FrameBox(int(items[0].strip()), int(items[1].strip()), int(items[2].strip()), int(items[3].strip()), int(items[4].strip()))) + +test_fb: FrameBox +gt_frame: FrameBox +last_frame_num = 0 +average_sum = 0 +average_count = 0 +print("length of test file: " + str(len(test_results))) +for test_fb in test_results: + # make + def bring_up_gt(): + if test_fb.frame_number > ground_truth[0].frame_number: + ground_truth.pop(0) + bring_up_gt() + + bring_up_gt() + + assert(ground_truth[0].frame_number == test_fb.frame_number) + gt_frame = ground_truth[0] + + gt_adjustment = get_adjustment_amount((1920, 1000), gt_frame.top_left[0], gt_frame.top_left[1], gt_frame.bottom_right[0], gt_frame.bottom_right[1]) + test_adjustment = get_adjustment_amount((1920, 1000), test_fb.top_left[0], test_fb.top_left[1], test_fb.bottom_right[0], test_fb.bottom_right[1]) + + if last_frame_num != test_fb.frame_number and average_count != 0: + with open(args.out_file, 'a') as out_file: + out_file.write(f"{average_sum},\n") + average_sum = 0 + average_count = 0 + + average_count += 1 + # get the average + average_sum += abs(( (gt_adjustment[0] - test_adjustment[0]) + (gt_adjustment[1] - test_adjustment[1]) ) / 2) + + last_frame_num = test_fb.frame_number + + + \ No newline at end of file diff --git a/validation/final.xlsx b/validation/final.xlsx new file mode 100644 index 0000000..e2e7fe8 Binary files /dev/null and b/validation/final.xlsx differ diff --git a/validation/ground_truth.txt b/validation/ground_truth.txt index 36b9c2a..adc730a 100644 --- a/validation/ground_truth.txt +++ b/validation/ground_truth.txt @@ -1,4 +1,3 @@ -frame_number, top_left_x, top_left_y, bottom_right_x, bottom_right_y 0, 856, 189, 1202, 623 1, 856, 189, 1202, 623 2, 857, 189, 1203, 623