| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- import numpy as np
- from mmeval import COCODetection
- import distance
- def reformat_gt_and_pred(labels, det_res, label_classes):
- preds = []
- gts = []
-
- for idx, (ann, pred) in enumerate(zip(labels, det_res)):
- # with open(label_path, "r") as f:
- # ann = json.load(f)
- gt_bboxes = []
- gt_labels = []
- for item in ann['step_1']['result']:
- if item['attribute'] in label_classes:
- gt_bboxes.append([item['x'], item['y'], item['x']+item['width'], item['y']+item['height']])
- gt_labels.append(label_classes.index(item['attribute']))
-
- gts.append({
- 'img_id': idx,
- 'width': ann['width'],
- 'height': ann['height'],
- 'bboxes': np.array(gt_bboxes),
- 'labels': np.array(gt_labels),
- 'ignore_flags': [False]*len(gt_labels),
- })
-
- bboxes = []
- labels = []
- scores = []
- for item in pred:
- bboxes.append(item['box'])
- labels.append(label_classes.index(item['type']))
- scores.append(item['score'])
- preds.append({
- 'img_id': idx,
- 'bboxes': np.array(bboxes),
- 'scores': np.array(scores),
- 'labels': np.array(labels),
- })
-
- return gts, preds
- def detect_val(labels, det_res, label_classes):
- # label_classes = ['inline_formula', "formula"]
- meta={'CLASSES':tuple(label_classes)}
- coco_det_metric = COCODetection(dataset_meta=meta, metric=['bbox'])
- gts, preds = reformat_gt_and_pred(labels, det_res, label_classes)
-
- res = coco_det_metric(predictions=preds, groundtruths=gts)
- return res
- def label_match(annotations, match_change_dict):
- for item in annotations['step_1']['result']:
- if item['attribute'] in match_change_dict.keys():
- item['attribute'] = match_change_dict[item['attribute']]
- return annotations
- def format_gt_bbox(annotations, ignore_category):
- gt_bboxes = []
- for item in annotations['step_1']['result']:
- if item['textAttribute'] and item['attribute'] not in ignore_category:
- x0 = item['x']
- y0 = item['y']
- x1 = item['x'] + item['width']
- y1 = item['y'] + item['height']
- order = item['textAttribute']
- category = item['attribute']
- gt_bboxes.append([x0, y0, x1, y1, order, None, None, category])
- return gt_bboxes
- def cal_edit_distance(sorted_bboxes):
- # order_list = [int(bbox[4]) for bbox in sorted_bboxes]
- # print(sorted_bboxes[0][0][12])
- order_list = [int(bbox[12]) for bbox in sorted_bboxes]
- sorted_order = sorted(order_list, key=int)
- distance_cal = distance.levenshtein(order_list, sorted_order)
- if len(order_list) > 0:
- return distance_cal / len(order_list)
- else:
- return 0
-
|