dbolya / tide

A General Toolbox for Identifying Object Detection Errors

Home Page:https://dbolya.github.io/tide

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Dataset which is not COCO in COCO format

toddChavezz opened this issue · comments

Is it possible to apply TIDE as it is to a custom dataset which is not COCO but is in the exact format of COCO? My model also outputs the same results file. But at the moment I get:

Traceback (most recent call last):
File "..../mAP_evaluation.py", line 91, in evaluate_coco
tide.summarize()
File "..../lib/python3.7/site-packages/tidecv/quantify.py", line 494, in summarize
main_errors = self.get_main_errors()
File "..../lib/python3.7/site-packages/tidecv/quantify.py", line 603, in get_main_errors
for error, value in run.fix_main_errors().items()
File "..../lib/python3.7/site-packages/tidecv/quantify.py", line 349, in fix_main_errors
new_ap = _ap_data.get_mAP()
File "...../lib/python3.7/site-packages/tidecv/ap.py", line 150, in get_mAP
return sum(aps) / len(aps)
ZeroDivisionError: division by zero

Thanks a lot in advance!

@toddChavezz were you able to do this successfully?

I borrowed the solution from my dear colleague @leonvarga . Call below functions like this:

            tide = TIDE()
            tide.evaluate(coco_gt_to_tide_data(coco_true), coco_dt_to_tide_data(coco_pred), mode=TIDE.BOX)
            tide.summarize()

The functions:

from tidecv import Data, f
from pycocotools.coco import COCO


def coco_gt_to_tide_data(coco_gt: COCO, name="default"):
    data = Data(name)

    for idx, image in enumerate(coco_gt.imgs.values()):
        if 'file_name' in image.keys():
            data.add_image(image['id'], image['file_name'])

    if coco_gt.cats is not None:
        for cat in coco_gt.cats.values():
            if 'name' in cat.keys():
                data.add_class(cat['id'], cat['name'])

    for ann in coco_gt.anns.values():
        image = ann['image_id']
        _cls = ann['category_id']
        box = ann['bbox']

        if ann['iscrowd']:
            data.add_ignore_region(image, _cls, box)
        else:
            data.add_ground_truth(image, _cls, box)

    return data


def coco_dt_to_tide_data(coco_dt: COCO, name="default"):
    data = Data(name)

    for det in coco_dt.anns.values():
        image = det['image_id']
        _cls = det['category_id']
        score = det['score']
        box = det['bbox'] if 'bbox' in det else None
        mask = det['segmentation'] if 'segmentation' in det else None

        data.add_detection(image, _cls, score, box, mask)

    return data