Esempio n. 1
0
def assign_instances_for_scan(pred_file, gt_file, pred_path):
    try:
        pred_info = util_3d.read_instance_prediction_file(pred_file, pred_path)
    except Exception, e:
        util.print_error('unable to load ' + pred_file + ': ' + str(e))
Esempio n. 2
0
def assign_instances_for_scan(pred_file, gt_file, pred_path):
    pred_info = util_3d.read_instance_prediction_file(pred_file, pred_path)
    try:
        pred_info = util_3d.read_instance_prediction_file(pred_file, pred_path)
    except:
        util.print_error('unable to load ' + pred_file)
    try:
        gt_ids = util_3d.load_ids(gt_file)
    except:
        util.print_error('unable to load ' + gt_file)
    # get gt instances
    gt_instances = util_3d.get_instances(gt_ids, VALID_CLASS_IDS, CLASS_LABELS,
                                         ID_TO_LABEL)
    # associate
    gt2pred = deepcopy(gt_instances)
    for label in gt2pred:
        for gt in gt2pred[label]:
            gt['matched_pred'] = []
    pred2gt = {}
    for label in CLASS_LABELS:
        pred2gt[label] = []
    num_pred_instances = 0
    # mask of void labels in the groundtruth
    bool_void = np.logical_not(np.in1d(gt_ids // 1000, VALID_CLASS_IDS))
    # go thru all prediction masks
    for pred_index, pred_mask_file in enumerate(pred_info):
        label_id = int(pred_info[pred_mask_file]['label_id'])
        conf = pred_info[pred_mask_file]['conf']
        if not label_id in ID_TO_LABEL:
            continue
        label_name = ID_TO_LABEL[label_id]
        # read the mask
        pred_mask = util_3d.load_ids(pred_mask_file)
        if len(pred_mask) != len(gt_ids):
            util.print_error(
                'wrong number of lines in ' + pred_mask_file +
                '(%d) vs #mesh vertices (%d), please double check and/or re-download the mesh'
                % (len(pred_mask), len(gt_ids)))
        # convert to binary
        pred_mask = np.not_equal(pred_mask, 0)
        num = np.count_nonzero(pred_mask)
        if num < opt.min_region_sizes[0]:
            continue  # skip if empty

        pred_instance = {}
        pred_instance['filename'] = pred_mask_file
        pred_instance['pred_id'] = num_pred_instances
        pred_instance['label_id'] = label_id
        pred_instance['vert_count'] = num
        pred_instance['confidence'] = conf
        pred_instance['void_intersection'] = np.count_nonzero(
            np.logical_and(bool_void, pred_mask))

        # matched gt instances
        matched_gt = []
        # go thru all gt instances with matching label
        #print(gt2pred[label_name])
        for (gt_num, gt_inst) in enumerate(gt2pred[label_name]):
            intersection = np.count_nonzero(
                np.logical_and(gt_ids == gt_inst['instance_id'], pred_mask))
            #print((gt_ids == gt_inst['instance_id']).sum(), pred_mask.sum(), intersection)
            if intersection > 0:
                gt_copy = gt_inst.copy()
                pred_copy = pred_instance.copy()
                gt_copy['intersection'] = intersection
                pred_copy['intersection'] = intersection
                matched_gt.append(gt_copy)
                gt2pred[label_name][gt_num]['matched_pred'].append(pred_copy)
        #print(label_name, pred_index, num_pred_instances, num, conf, pred_instance['void_intersection'], len(matched_gt))
        pred_instance['matched_gt'] = matched_gt
        num_pred_instances += 1
        pred2gt[label_name].append(pred_instance)
    return gt2pred, pred2gt