def get_node_index(classname,
                   bbox,
                   det_classes,
                   det_boxes,
                   node_num,
                   labeled=True):
    bbox = np.array(bbox, dtype=np.float32)

    max_iou = 0.5  # Use 0.5 as a threshold for evaluation
    max_iou_index = -1

    for i_node in range(node_num):
        if labeled:
            if classname == metadata.coco_classes[det_classes[i_node]]:
                # check bbox overlap
                # intersection_area = compute_area(get_intersection(bbox, det_boxes[i_node, :]))
                # iou = intersection_area/(compute_area(bbox)+compute_area(det_boxes[i_node, :])-intersection_area)
                iou = compute_iou(bbox, det_boxes[i_node, :])
                if iou > max_iou:
                    max_iou = iou
                    max_iou_index = i_node
        else:
            iou = compute_iou(bbox, det_boxes[i_node, :])
            if iou > max_iou:
                max_iou = iou
                max_iou_index = i_node
    return max_iou_index
def match_hoi(pred_det,gt_dets):
    is_match = False
    for gt_det in gt_dets:
        human_iou = compute_iou(pred_det['human_box'],gt_det['human_box'])
        if human_iou > 0.5:
            object_iou = compute_iou(pred_det['object_box'],gt_det['object_box'])
            if object_iou > 0.5:
                is_match = True
                break

    return is_match
Ejemplo n.º 3
0
def match_hoi(pred_det, gt_dets):
    is_match = False
    remaining_gt_dets = [gt_det for gt_det in gt_dets]
    for i, gt_det in enumerate(gt_dets):
        human_iou = compute_iou(pred_det['human_box'], gt_det['human_box'])
        if human_iou > 0.5:
            object_iou = compute_iou(pred_det['object_box'],
                                     gt_det['object_box'])
            if object_iou > 0.5:
                is_match = True
                del remaining_gt_dets[i]
                break
        #remaining_gt_dets.append(gt_det)

    return is_match, remaining_gt_dets
Ejemplo n.º 4
0
def compute_overlap_matrix(pdf_bboxes, iou_thresh):
    nb_tables = len(pdf_bboxes)
    overlap = np.zeros((nb_tables, nb_tables))
    for i, bb1 in enumerate(pdf_bboxes):
        for j, bb2 in enumerate(pdf_bboxes):
            if i != j and bb1[0] == bb2[0] and doOverlap(bb1[-4:], bb2[-4:]):
                iou = compute_iou(bb1[-4:], bb2[-4:])
                if iou > iou_thresh or isContained(
                        bb1[-4:], bb2[-4:]) or isContained(bb2[-4:], bb1[-4:]):
                    overlap[i, j] = 1.
    return overlap
Ejemplo n.º 5
0
def get_node_index(bbox, det_boxes, index_list):
    bbox = np.array(bbox, dtype=np.float32)
    max_iou = 0.3  # Use 0.5 as a threshold for evaluation
    max_iou_index = -1

    for i_node in index_list:
        # check bbox overlap
        iou = compute_iou(bbox, det_boxes[i_node, :])
        if iou > max_iou:
            max_iou = iou
            max_iou_index = i_node
    return max_iou_index
Ejemplo n.º 6
0
def match_hoi(pred_det, gt_dets, detected):
    flag2 = 1  # bck
    flag3 = 1  # human misloc
    flag4 = 1  # obj misloc
    flag5 = 0  # duplicate detection
    flag6 = 1  # mis grouping
    is_match = False
    remaining_gt_dets = [gt_det for gt_det in gt_dets]
    for i, gt_det in enumerate(gt_dets):
        human_iou = compute_iou(pred_det['human_box'], gt_det['human_box'])
        if human_iou > 0.1:
            flag2 = 0
        if human_iou > 0.5:
            flag3 = 0
            object_iou = compute_iou(pred_det['object_box'],
                                     gt_det['object_box'])
            if object_iou > 0.1:
                flag6 = 0
            if object_iou > 0.5:
                flag4 = 0
                is_match = True
                detected.append(gt_det)
                del remaining_gt_dets[i]
                break
        # remaining_gt_dets.append(gt_det)

    if not is_match:
        for i, gt_det in enumerate(detected):
            human_iou = compute_iou(pred_det['human_box'], gt_det['human_box'])
            if human_iou > 0.5:
                object_iou = compute_iou(pred_det['object_box'],
                                         gt_det['object_box'])
                if object_iou > 0.5:
                    flag2, flag3, flag4, flag6 = 0, 0, 0, 0
                    flag5 = 1
                    break

    return is_match, remaining_gt_dets, detected, (flag2, flag3, flag4, flag5,
                                                   flag6)
def assign_pose(human_box, pose_boxes, pose_keypoints, num_keypoints):
    max_idx = -1
    max_frac_inside = 0.7
    found_match = False
    for i, pose_box in enumerate(pose_boxes):
        iou, intersection, union = compute_iou(human_box, pose_box,True)
        pose_area = compute_area(pose_box)
        frac_inside = intersection / pose_area
        if frac_inside > max_frac_inside:
            max_frac_inside = frac_inside
            max_idx = i
            found_match = True

    if max_idx == -1:
        keypoints = np.zeros([num_keypoints,3])
    else:
        keypoints = pose_keypoints[max_idx]

    return keypoints, found_match
def compute_recall(pred_boxes, gt_boxes, k=1):
    recalled = [0] * k
    pred_box = [None] * k
    gt_box = [None] * k
    for i, pred_box_ in enumerate(pred_boxes):
        if i >= k:
            break

        for gt_box_ in gt_boxes:
            iou = compute_iou(pred_box_, gt_box_)
            if iou >= 0.5:
                recalled[i] = 1
                pred_box[i] = pred_box_
                gt_box[i] = gt_box_
                break

    max_recall = 0
    for i in range(k):
        max_recall = max(recalled[i], max_recall)
        recalled[i] = max_recall

    return recalled, pred_box, gt_box
Ejemplo n.º 9
0
def assign_pose(det_human_boxes, det_pose_boxes, det_pose, data_const):
    global MISS_POSE_NUM
    num_keypoints = det_pose.shape[1]
    assigned_pose = []
    for human_box in det_human_boxes:
        max_iou_index = -1
        max_iou = data_const.pose_bbox_iou_thresh     # 0.5
        keypoints = np.zeros([num_keypoints, 2])
        for idx in range(det_pose.shape[0]):
            iou = compute_iou(human_box, det_pose_boxes[idx, :])
            if iou > max_iou:
                max_iou = iou
                max_iou_index = idx
        if max_iou_index != -1:
            keypoints = det_pose[max_iou_index,:,:2]        
            det_pose_boxes =  np.delete(det_pose_boxes, max_iou_index, axis=0)
            det_pose =  np.delete(det_pose, max_iou_index, axis=0)
        else:
            MISS_POSE_NUM += 1
        # ipdb.set_trace()
        assigned_pose.append(keypoints)
    return np.array(assigned_pose)
Ejemplo n.º 10
0
 def get_labels(self, gt_tables):
     """
     :param gt_tables: dict, keys are page number and values are list of tables bbox within that page
     :return:
     """
     labels = np.zeros(len(self.candidates))
     for i, candidate in enumerate(self.candidates):
         page_num = candidate[0]
         try:
             tables = gt_tables[page_num]
             for gt_table in tables:
                 page_width, page_height, y0, x0, y1, x1 = gt_table
                 w_ratio = float(candidate[1]) / page_width
                 h_ratio = float(candidate[2]) / page_height
                 rescaled_gt_table = (y0 * h_ratio, x0 * w_ratio,
                                      y1 * h_ratio, x1 * w_ratio)
                 iou = compute_iou(candidate[-4:], rescaled_gt_table)
                 if iou > self.iou_thresh:
                     # candidate region is a table
                     labels[i] = 1
         except KeyError:
             # any of the candidates is a true table, all zero labels
             pass
     return labels
Ejemplo n.º 11
0
def box_recall(gt_hois, human_boxes, object_boxes, iou_thresh):
    num_pred_human_boxes = len(human_boxes)
    num_pred_object_boxes = len(object_boxes)
    num_pred_connections = num_pred_human_boxes * num_pred_object_boxes

    num_gt_connections_recalled = 0
    num_gt_connections = 0
    num_gt_human_boxes_recalled = 0
    num_gt_human_boxes = 0
    num_gt_object_boxes_recalled = 0
    num_gt_object_boxes = 0

    for hois_per_type in gt_hois:
        gt_connections = hois_per_type['connections']
        gt_human_boxes = hois_per_type['human_bboxes']
        gt_object_boxes = hois_per_type['object_bboxes']
        invis = hois_per_type['invis']

        gt_human_boxes_recalled = [False] * len(gt_human_boxes)
        for i, gt_box in enumerate(gt_human_boxes):
            for box in human_boxes:
                try:
                    iou = compute_iou(box, gt_box)
                except:
                    import pdb
                    pdb.set_trace()
                if iou >= iou_thresh:
                    gt_human_boxes_recalled[i] = True
                    break

        gt_object_boxes_recalled = [False] * len(gt_object_boxes)
        for i, gt_box in enumerate(gt_object_boxes):
            for box in object_boxes:
                try:
                    iou = compute_iou(box, gt_box)
                except:
                    import pdb
                    pdb.set_trace()
                if iou >= iou_thresh:
                    gt_object_boxes_recalled[i] = True
                    break

        gt_connections_recalled = [False] * len(gt_connections)
        for k, (i, j) in enumerate(gt_connections):
            if gt_human_boxes_recalled[i] and gt_object_boxes_recalled[j]:
                gt_connections_recalled[k] = True

        num_gt_connections += len(gt_connections)
        num_gt_connections_recalled += gt_connections_recalled.count(True)

        num_gt_human_boxes += len(gt_human_boxes)
        num_gt_human_boxes_recalled += gt_human_boxes_recalled.count(True)

        num_gt_object_boxes += len(gt_object_boxes)
        num_gt_object_boxes_recalled += gt_object_boxes_recalled.count(True)

    try:
        connection_recall = num_gt_connections_recalled / num_gt_connections
    except ZeroDivisionError:
        connection_recall = None

    try:
        human_recall = num_gt_human_boxes_recalled / num_gt_human_boxes
    except ZeroDivisionError:
        human_recall = None

    try:
        object_recall = num_gt_object_boxes_recalled / num_gt_object_boxes
    except ZeroDivisionError:
        object_recall = None

    stats = {
        'connection_recall': connection_recall,
        'human_recall': human_recall,
        'object_recall': object_recall,
        'num_gt_connections_recalled': num_gt_connections_recalled,
        'num_gt_connections': num_gt_connections,
        'num_gt_human_boxes_recalled': num_gt_human_boxes_recalled,
        'num_gt_human_boxes': num_gt_human_boxes,
        'num_gt_object_boxes_recalled': num_gt_object_boxes_recalled,
        'num_gt_object_boxes': num_gt_object_boxes,
        'num_connection_proposals': num_pred_connections,
        'num_human_proposals': num_pred_human_boxes,
        'num_object_proposals': num_pred_object_boxes,
    }

    return stats