in detic/evaluation/oideval.py [0:0]
def evaluate_img_google(self, img_id, cat_id, area_rng):
gt, dt = self._get_gt_dt(img_id, cat_id)
if len(gt) == 0 and len(dt) == 0:
return None
if len(dt) == 0:
return {
"image_id": img_id,
"category_id": cat_id,
"area_rng": area_rng,
"dt_ids": [],
"dt_matches": np.array([], dtype=np.int32).reshape(1, -1),
"dt_scores": [],
"dt_ignore": np.array([], dtype=np.int32).reshape(1, -1),
'num_gt': len(gt)
}
no_crowd_inds = [i for i, g in enumerate(gt) \
if ('iscrowd' not in g) or g['iscrowd'] == 0]
crowd_inds = [i for i, g in enumerate(gt) \
if 'iscrowd' in g and g['iscrowd'] == 1]
dt_idx = np.argsort([-d["score"] for d in dt], kind="mergesort")
if len(self.ious[img_id, cat_id]) > 0:
ious = self.ious[img_id, cat_id]
iou = ious[:, no_crowd_inds]
iou = iou[dt_idx]
ioa = ious[:, crowd_inds]
ioa = ioa[dt_idx]
else:
iou = np.zeros((len(dt_idx), 0))
ioa = np.zeros((len(dt_idx), 0))
scores = np.array([dt[i]['score'] for i in dt_idx])
num_detected_boxes = len(dt)
tp_fp_labels = np.zeros(num_detected_boxes, dtype=bool)
is_matched_to_group_of = np.zeros(num_detected_boxes, dtype=bool)
def compute_match_iou(iou):
max_overlap_gt_ids = np.argmax(iou, axis=1)
is_gt_detected = np.zeros(iou.shape[1], dtype=bool)
for i in range(num_detected_boxes):
gt_id = max_overlap_gt_ids[i]
is_evaluatable = (not tp_fp_labels[i] and
iou[i, gt_id] >= 0.5 and
not is_matched_to_group_of[i])
if is_evaluatable:
if not is_gt_detected[gt_id]:
tp_fp_labels[i] = True
is_gt_detected[gt_id] = True
def compute_match_ioa(ioa):
scores_group_of = np.zeros(ioa.shape[1], dtype=float)
tp_fp_labels_group_of = np.ones(
ioa.shape[1], dtype=float)
max_overlap_group_of_gt_ids = np.argmax(ioa, axis=1)
for i in range(num_detected_boxes):
gt_id = max_overlap_group_of_gt_ids[i]
is_evaluatable = (not tp_fp_labels[i] and
ioa[i, gt_id] >= 0.5 and
not is_matched_to_group_of[i])
if is_evaluatable:
is_matched_to_group_of[i] = True
scores_group_of[gt_id] = max(scores_group_of[gt_id], scores[i])
selector = np.where((scores_group_of > 0) & (tp_fp_labels_group_of > 0))
scores_group_of = scores_group_of[selector]
tp_fp_labels_group_of = tp_fp_labels_group_of[selector]
return scores_group_of, tp_fp_labels_group_of
if iou.shape[1] > 0:
compute_match_iou(iou)
scores_box_group_of = np.ndarray([0], dtype=float)
tp_fp_labels_box_group_of = np.ndarray([0], dtype=float)
if ioa.shape[1] > 0:
scores_box_group_of, tp_fp_labels_box_group_of = compute_match_ioa(ioa)
valid_entries = (~is_matched_to_group_of)
scores = np.concatenate(
(scores[valid_entries], scores_box_group_of))
tp_fps = np.concatenate(
(tp_fp_labels[valid_entries].astype(float),
tp_fp_labels_box_group_of))
return {
"image_id": img_id,
"category_id": cat_id,
"area_rng": area_rng,
"dt_matches": np.array([1 if x > 0 else 0 for x in tp_fps], dtype=np.int32).reshape(1, -1),
"dt_scores": [x for x in scores],
"dt_ignore": np.array([0 for x in scores], dtype=np.int32).reshape(1, -1),
'num_gt': len(gt)
}