From 53044b8da5ef8de8144afdc8ee78263a238a7794 Mon Sep 17 00:00:00 2001 From: Akshit Priyesh Date: Mon, 13 Mar 2023 02:48:19 +0530 Subject: [PATCH] extended keypoints support and added missing metrics --- fiftyone/core/patches.py | 2 +- fiftyone/utils/eval/detection.py | 2 +- fiftyone/utils/iou.py | 30 ++++++++++++++++++++++++++++++ 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/fiftyone/core/patches.py b/fiftyone/core/patches.py index ccb510d7c6..aa519ef6d0 100644 --- a/fiftyone/core/patches.py +++ b/fiftyone/core/patches.py @@ -23,7 +23,7 @@ import fiftyone.core.view as fov -_PATCHES_TYPES = (fol.Detections, fol.Polylines) +_PATCHES_TYPES = (fol.Detections, fol.Polylines, fol.Keypoints) _NO_MATCH_ID = "" diff --git a/fiftyone/utils/eval/detection.py b/fiftyone/utils/eval/detection.py index 79cc7565fe..accd298e11 100644 --- a/fiftyone/utils/eval/detection.py +++ b/fiftyone/utils/eval/detection.py @@ -130,7 +130,7 @@ def evaluate_detections( fov.validate_collection_label_fields( samples, (pred_field, gt_field), - (fol.Detections, fol.Polylines, fol.TemporalDetections), + (fol.Detections, fol.Polylines, fol.TemporalDetections, fol.Keypoints), same_type=True, ) diff --git a/fiftyone/utils/iou.py b/fiftyone/utils/iou.py index d1f41fb3fa..e7b641a89f 100644 --- a/fiftyone/utils/iou.py +++ b/fiftyone/utils/iou.py @@ -17,6 +17,8 @@ import fiftyone.core.utils as fou import fiftyone.core.validation as fov +from scipy.spatial import distance + from .utils3d import compute_cuboid_iou as _compute_cuboid_iou sg = fou.lazy_import("shapely.geometry") @@ -89,6 +91,12 @@ def compute_ious( preds, gts, error_level, iscrowd=iscrowd, classwise=classwise ) + + if isinstance(preds[0], fol.Keypoints): + return _compute_keypoint_similarity( + preds, gts, iscrowd=iscrowd, classwise=classwise + ) + if use_masks: # @todo when tolerance is None, consider using dense masks rather than # polygonal approximations? @@ -556,6 +564,28 @@ def _compute_polyline_ious( return ious +def _compute_keypoint_similarity(preds, gts, error_level, iscrowd=None, classwise=False, gt_crowds=None): + #calculate euclidean distance of each keypoint + sim_score = np.zeros((len(preds), len(gts))) + + for j, gt in enumerate(gts): + for i, pt in enumerate(preds): + gt_points=[] + pt_points=[] + for x in gt['points']: + gt_points.append(x) + for y in pt['points']: + pt_points.append(y) + + gt_points=sum(gt_points, []) + + pt_points=sum(pt_points, []) + + sim_score[i, j] = 1/(1 + distance.euclidean(tuple(gt_points),tuple(pt_points))) + + return sim_score + + def _compute_mask_ious( preds, gts, tolerance, error_level, iscrowd=None, classwise=False ):