Example #1
0
def analyze_results(result_file, result_types, coco,
                    max_dets=(100, 300, 1000)):
    for res_type in result_types:
        assert res_type in [
            'proposal', 'proposal_fast', 'bbox', 'segm', 'keypoints'
        ]

    if mmcv.is_str(coco):
        coco = COCO(coco)
    assert isinstance(coco, COCO)

    # if result_types == ['proposal_fast']:
    #     ar = fast_eval_recall(result_file, coco, np.array(max_dets))
    #     for i, num in enumerate(max_dets):
    #         print('AR@{}\t= {:.4f}'.format(num, ar[i]))
    #     return

    assert result_file.endswith('.json')
    coco_dets = coco.loadRes(result_file)

    img_ids = coco.getImgIds()
    for res_type in result_types:
        iou_type = 'bbox' if res_type == 'proposal' else res_type
        cocoEval = COCOeval(coco, coco_dets, iou_type)
        cocoEval.params.imgIds = img_ids
        if res_type == 'proposal':
            cocoEval.params.useCats = 0
            cocoEval.params.maxDets = list(max_dets)

        # cocoEval.evaluate()
        dt_with_iou = cocoEval.analyze_results()
        result_file = 'results_with_iou.json'
        mmcv.dump(dt_with_iou, result_file)

        ious = []
        scores = []
        print('the number of detections is ', len(dt_with_iou))
        num = np.zeros([20], dtype=np.int)
        sum = np.zeros([20], dtype=np.float)
        for ind, dt in enumerate(dt_with_iou):
            # if dt['iou'] < 0.5:
            #     continue

            if dt['iou'] >= 0 and dt['iou'] < 0.05:
                num[0] = num[0] + 1
                sum[0] = sum[0] + dt['score']
            elif dt['iou'] >= 0.05 and dt['iou'] < 0.1:
                num[1] = num[1] + 1
                sum[1] = sum[1] + dt['score']
            elif dt['iou'] >= 0.1 and dt['iou'] < 0.15:
                num[2] = num[2] + 1
                sum[2] = sum[2] + dt['score']
            elif dt['iou'] >= 0.15 and dt['iou'] < 0.2:
                num[3] = num[3] + 1
                sum[3] = sum[3] + dt['score']
            elif dt['iou'] >= 0.2 and dt['iou'] < 0.25:
                num[4] = num[4] + 1
                sum[4] = sum[4] + dt['score']
            elif dt['iou'] >= 0.25 and dt['iou'] < 0.3:
                num[5] = num[5] + 1
                sum[5] = sum[5] + dt['score']
            elif dt['iou'] >= 0.3 and dt['iou'] < 0.35:
                num[6] = num[6] + 1
                sum[6] = sum[6] + dt['score']
            elif dt['iou'] >= 0.35 and dt['iou'] < 0.4:
                num[7] = num[7] + 1
                sum[7] = sum[7] + dt['score']
            elif dt['iou'] >= 0.4 and dt['iou'] < 0.45:
                num[8] = num[8] + 1
                sum[8] = sum[8] + dt['score']
            elif dt['iou'] >= 0.45 and dt['iou'] <= 0.5:
                num[9] = num[9] + 1
                sum[9] = sum[9] + dt['score']
            elif dt['iou'] >= 0.5 and dt['iou'] < 0.55:
                num[10] = num[10] + 1
                sum[10] = sum[10] + dt['score']
            elif dt['iou'] >= 0.55 and dt['iou'] < 0.6:
                num[11] = num[11] + 1
                sum[11] = sum[11] + dt['score']
            elif dt['iou'] >= 0.6 and dt['iou'] < 0.65:
                num[12] = num[12] + 1
                sum[12] = sum[12] + dt['score']
            elif dt['iou'] >= 0.65 and dt['iou'] < 0.7:
                num[13] = num[13] + 1
                sum[13] = sum[13] + dt['score']
            elif dt['iou'] >= 0.7 and dt['iou'] < 0.75:
                num[14] = num[14] + 1
                sum[14] = sum[14] + dt['score']
            elif dt['iou'] >= 0.75 and dt['iou'] < 0.8:
                num[15] = num[15] + 1
                sum[15] = sum[15] + dt['score']
            elif dt['iou'] >= 0.8 and dt['iou'] < 0.85:
                num[16] = num[16] + 1
                sum[16] = sum[16] + dt['score']
            elif dt['iou'] >= 0.85 and dt['iou'] < 0.9:
                num[17] = num[17] + 1
                sum[17] = sum[17] + dt['score']
            elif dt['iou'] >= 0.9 and dt['iou'] < 0.95:
                num[18] = num[18] + 1
                sum[18] = sum[18] + dt['score']
            elif dt['iou'] >= 0.95 and dt['iou'] <= 1.0:
                num[19] = num[19] + 1
                sum[19] = sum[19] + dt['score']

            ious.append(dt['iou'])
            scores.append(dt['score'])
            # if ind >200000:
            #     break
        average = sum / num
        plt.scatter(ious, scores, 0.1)
        ious_scores = np.stack((ious, scores), axis=-1)
        np.savetxt('ious_scores.csv',
                   ious_scores,
                   delimiter=',',
                   fmt='%.3e',
                   header='iou, score')
        np.savetxt('average_scores.csv',
                   average,
                   fmt='%f',
                   header='average_score')
        np.savetxt('num_samples.csv', num, fmt='%d', header='num_samples')

        plt.ylabel('classification score')
        plt.xlabel('IoU with ground truth')
        plt.savefig('score_vs_iou')
        plt.show()