kili-technology / kili-python-sdk

Simplest and fastest image and text annotation tool.
https://kili-technology.com
Apache License 2.0
231 stars 30 forks source link

coco_segm_annotation_to_normalized_vertices does not handle nested segmentation field #1751

Open robmarkcole opened 3 months ago

robmarkcole commented 3 months ago

In the importing_coco.ipynb example, the function coco_segm_annotation_to_normalized_vertices doesn't handle nested segmentation. This is demonstrated below:


def test_coco_segm_annotation_to_normalized_vertices():
    # Sample COCO annotation data
    coco_ann = {
        "segmentation": [
                [
                    [
                        1842.8,
                        1322.2,
                        1848.1,
                        1320.2,
                        1845,
                        1311.8,
                        1839.7,
                        1313.8
                    ]
                ]
            ],
        "iscrowd": 0
    }
    img_width = 8000  # Example image width
    img_height = 6000  # Example image height

    normalized_vertices = coco_segm_annotation_to_normalized_vertices(
        coco_ann=coco_ann,
        img_width=img_width,
        img_height=img_height
    )

    print("Normalized Vertices:")
    for vertices in normalized_vertices:
        for vertex in vertices:
            print(vertex)

test_coco_segm_annotation_to_normalized_vertices()

Ideally I would be able to upload cocojson to the platform, but in the meantime I suggest improving this example

robmarkcole commented 3 months ago

Updated to handle nested segmentation:

def coco_segm_annotation_to_normalized_vertices(coco_ann, *, img_width, img_height):
    """
    Convert a COCO segmentation annotation to normalized vertices.
    Handles segmentation data that is a list of list of list (nested list for each polygon).
    """
    coco_segmentations = coco_ann["segmentation"]
    ret = []
    for coco_segm_group in coco_segmentations:  # Additional loop to handle extra nesting
        for coco_segm in coco_segm_group:
            if coco_ann["iscrowd"] == 0:
                # a single object (iscrowd=0) where polygons are used
                vertices = [
                    point_to_normalized_point(
                        point={"x": x, "y": y},
                        img_width=img_width,
                        img_height=img_height,
                        origin_location="top_left",
                    )
                    for x, y in zip(coco_segm[::2], coco_segm[1::2])
                ]
                ret.append(vertices)
    return ret