File size: 1,716 Bytes
c28dddb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import os, sys
sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..'))
import numpy as np
from copy import deepcopy
from metrics.iou import sampling_iou
from objects.motions import transform_all_parts

from objects.dict_utils import get_bbox_vertices

'''
This file computes the Average Overlap Ratio (AOR) metric\n
'''

def AOR(tgt, num_states=10, transform_use_plucker=False):
    tree = tgt["diffuse_tree"]
    states = np.linspace(0, 1, num_states)
    original_bbox_vertices = np.array([get_bbox_vertices(tgt, i) for i in range(len(tgt["diffuse_tree"]))], dtype=np.float32) 
    
    ious = []
    for state_idx, state in enumerate(states):
        ious_per_state = []
        bbox_vertices = deepcopy(original_bbox_vertices)
        part_trans = transform_all_parts(bbox_vertices, tgt, state, transform_use_plucker)
        for node in tree:
            children = node['children']
            num_children = len(children)
            if num_children < 2:
                continue
            for i in range(num_children-1):
                for j in range(i+1, num_children):
                    child_id = children[i]
                    sibling_id = children[j]
                    bbox_v_0 = deepcopy(bbox_vertices[child_id])
                    bbox_v_1 = deepcopy(bbox_vertices[sibling_id])
                    iou = sampling_iou(bbox_v_0, bbox_v_1, part_trans[child_id], part_trans[sibling_id], num_samples=10000)
                    if np.isnan(iou):
                        continue
                    ious_per_state.append(iou)
        if len(ious_per_state) > 0:
            ious.append(np.mean(ious_per_state))
    if len(ious) == 0:
        return -1
    return float(np.mean(ious))