File size: 2,305 Bytes
5e0b9df
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# Copyright (c) KakaoBrain, Inc. and its affiliates. All Rights Reserved
"""
V-COCO evaluator that works in distributed mode.
"""
import os
import numpy as np
import torch

from hotr.util.misc import all_gather
from hotr.metrics.vcoco.ap_role import APRole
from functools import partial

def init_vcoco_evaluators(human_act_name, object_act_name):
    role_eval1 = APRole(act_name=object_act_name, scenario_flag=True, iou_threshold=0.5)
    role_eval2 = APRole(act_name=object_act_name, scenario_flag=False, iou_threshold=0.5)

    return role_eval1, role_eval2

class VCocoEvaluator(object):
    def __init__(self, args):
        self.img_ids = []
        self.eval_imgs = []
        self.role_eval1, self.role_eval2 = init_vcoco_evaluators(args.human_actions, args.object_actions)
        self.num_human_act = args.num_human_act
        self.action_idx = args.valid_ids

    def update(self, outputs):
        img_ids = list(np.unique(list(outputs.keys())))
        for img_num, img_id in enumerate(img_ids):
            print(f"Evaluating Score Matrix... : [{(img_num+1):>4}/{len(img_ids):<4}]" ,flush=True, end="\r")
            prediction = outputs[img_id]['prediction']
            target = outputs[img_id]['target']

            # score with prediction
            hbox, hcat, obox, ocat = list(map(lambda x: prediction[x], \
                ['h_box', 'h_cat', 'o_box', 'o_cat']))

            assert 'pair_score' in prediction
            score = prediction['pair_score']

            hbox, hcat, obox, ocat, score =\
                    list(map(lambda x: x.cpu().numpy(), [hbox, hcat, obox, ocat, score]))

            # ground-truth
            gt_h_inds = (target['labels'] == 1)
            gt_h_box = target['boxes'][gt_h_inds, :4].cpu().numpy()
            gt_h_act = target['inst_actions'][gt_h_inds, :self.num_human_act].cpu().numpy()

            gt_p_box = target['pair_boxes'].cpu().numpy()
            gt_p_act = target['pair_actions'].cpu().numpy()

            score = score[self.action_idx, :, :]
            gt_p_act = gt_p_act[:, self.action_idx]

            self.role_eval1.add_data(hbox, obox, score, gt_h_box, gt_h_act, gt_p_box, gt_p_act)
            self.role_eval2.add_data(hbox, obox, score, gt_h_box, gt_h_act, gt_p_box, gt_p_act)
            self.img_ids.append(img_id)