Note
You are reading the documentation for MMOCR 0.x, which will soon be deprecated by the end of 2022. We recommend you upgrade to MMOCR 1.0 to enjoy fruitful new features and better performance brought by OpenMMLab 2.0. Check out the maintenance plan, changelog, code and documentation of MMOCR 1.0 for more details.
Source code for mmocr.core.evaluation.hmean_iou
# Copyright (c) OpenMMLab. All rights reserved.
import numpy as np
import mmocr.utils as utils
from . import utils as eval_utils
[docs]def eval_hmean_iou(pred_boxes,
gt_boxes,
gt_ignored_boxes,
iou_thr=0.5,
precision_thr=0.5):
"""Evaluate hmean of text detection using IOU standard.
Args:
pred_boxes (list[list[list[float]]]): Text boxes for an img list. Each
box has 2k (>=8) values.
gt_boxes (list[list[list[float]]]): Ground truth text boxes for an img
list. Each box has 2k (>=8) values.
gt_ignored_boxes (list[list[list[float]]]): Ignored ground truth text
boxes for an img list. Each box has 2k (>=8) values.
iou_thr (float): Iou threshold when one (gt_box, det_box) pair is
matched.
precision_thr (float): Precision threshold when one (gt_box, det_box)
pair is matched.
Returns:
hmean (tuple[dict]): Tuple of dicts indicates the hmean for the dataset
and all images.
"""
assert utils.is_3dlist(pred_boxes)
assert utils.is_3dlist(gt_boxes)
assert utils.is_3dlist(gt_ignored_boxes)
assert 0 <= iou_thr <= 1
assert 0 <= precision_thr <= 1
img_num = len(pred_boxes)
assert img_num == len(gt_boxes)
assert img_num == len(gt_ignored_boxes)
dataset_gt_num = 0
dataset_pred_num = 0
dataset_hit_num = 0
img_results = []
for i in range(img_num):
gt = gt_boxes[i]
gt_ignored = gt_ignored_boxes[i]
pred = pred_boxes[i]
gt_num = len(gt)
gt_ignored_num = len(gt_ignored)
pred_num = len(pred)
hit_num = 0
# get gt polygons.
gt_all = gt + gt_ignored
gt_polys = [eval_utils.points2polygon(p) for p in gt_all]
gt_ignored_index = [gt_num + i for i in range(len(gt_ignored))]
gt_num = len(gt_polys)
pred_polys, _, pred_ignored_index = eval_utils.ignore_pred(
pred, gt_ignored_index, gt_polys, precision_thr)
# match.
if gt_num > 0 and pred_num > 0:
sz = [gt_num, pred_num]
iou_mat = np.zeros(sz)
gt_hit = np.zeros(gt_num, np.int8)
pred_hit = np.zeros(pred_num, np.int8)
for gt_id in range(gt_num):
for pred_id in range(pred_num):
gt_pol = gt_polys[gt_id]
det_pol = pred_polys[pred_id]
iou_mat[gt_id,
pred_id] = eval_utils.poly_iou(det_pol, gt_pol)
for gt_id in range(gt_num):
for pred_id in range(pred_num):
if (gt_hit[gt_id] != 0 or pred_hit[pred_id] != 0
or gt_id in gt_ignored_index
or pred_id in pred_ignored_index):
continue
if iou_mat[gt_id, pred_id] > iou_thr:
gt_hit[gt_id] = 1
pred_hit[pred_id] = 1
hit_num += 1
gt_care_number = gt_num - gt_ignored_num
pred_care_number = pred_num - len(pred_ignored_index)
r, p, h = eval_utils.compute_hmean(hit_num, hit_num, gt_care_number,
pred_care_number)
img_results.append({'recall': r, 'precision': p, 'hmean': h})
dataset_hit_num += hit_num
dataset_gt_num += gt_care_number
dataset_pred_num += pred_care_number
dataset_r, dataset_p, dataset_h = eval_utils.compute_hmean(
dataset_hit_num, dataset_hit_num, dataset_gt_num, dataset_pred_num)
dataset_results = {
'num_gts': dataset_gt_num,
'num_dets': dataset_pred_num,
'num_match': dataset_hit_num,
'recall': dataset_r,
'precision': dataset_p,
'hmean': dataset_h
}
return dataset_results, img_results