Skip to content

Task creation

You can add tasks to your batches. It works for any kind of project. For Data processing projects, your can attach a dataset to your batch, add files on it and refer to those files when you create your tasks.

Code Reference

See the code reference for further details.

Usage for annotation tool projects

Add simple task for image

from isahitlab.client import IsahitLab

lab = IsahitLab()

tasks_input = [
    {
      "name": "folder/01.png",
      "resources": [
        "/path/to/folder/01.png"
      ]
    }
]

lab.create_tasks(
    project_id='<project_id>',
    batch_id='<batch_id>',
    tasks=tasks_input
)

Resources

Resources can be a path to a local file or a public url. The local files will be uploaded and stored by Isahit Lab.

The resources field is a list of image to support "sequence" annotation. If your project is not configured for image sequence annotation, it will only use the first resource.

Add task with annotations

Geometry formats

See Geometry formats to know more about the different formats for rectangles, polygons etc...

from isahitlab.client import IsahitLab

lab = IsahitLab()

tasks_input = [
    {
      "name": "my_task_01.png",
      "resources": [
        "/path/to/folder/01.png"
      ],
      "data": {
        "annotations": [
          {
            "polygons": [
              {
                "geometry": {
                  "vertices": [
                    0.05958132045088567,
                    0.2894211576846307,
                    0.41867954911433175,
                    0.7305389221556886
                  ],
                  "type": "rectangle"
                }
              }
            ]
          }
        ]
      }
    }
]

lab.create_tasks(
    project_id='<project_id>',
    batch_id='<batch_id>',
    tasks=tasks_input
)

Add task with annotations and labels

from isahitlab.client import IsahitLab

lab = IsahitLab()

tasks_input = [
    {
      "name": "my_task_01.png",
      "resources": [
        "/path/to/folder/01.png"
      ],
      "data": {
        "annotations": [
          {
            "polygons": [
              {
                "geometry": {
                  "vertices": [
                    0.05958132045088567,
                    0.2894211576846307,
                    0.41867954911433175,
                    0.7305389221556886
                  ],
                  "type": "rectangle"
                }
              }
            ],
            "labels": {
              "my_list_id": {
                "labels": [
                  {
                    "id": "Test",
                    "name": "Test"
                  }
                ]
              }
            }
          }
        ]
      }
    }
]

lab.create_tasks(
    project_id='<project_id>',
    batch_id='<batch_id>',
    tasks=tasks_input
)

Labels

To work properly, my_list_id must match a list id configured on your project

Usage for data processing (form) projects

Data format for Data processing (form) project is totally function of the form configuration of the project.

Resources

Tasks of Data processing (form) project are not resource based so you cannot simply provide the resources field. It will be ignored.

Let's say you have 3 inputs on your form :

Input ID Type Comment
text-1 Display text Image name
image-1 Resource image Image to be processed
listbox-1 Listbox For ex. "Is blurry ?"
from isahitlab.client import IsahitLab

lab = IsahitLab()

tasks_input = [
    {
      "name": "my_task_01.png",
      "data": {
        "text-1": "Image my_task_01.png",
        "image-1": "https://my-domain.com/public/image.jpg"
      }
    }
]

lab.create_tasks(
    project_id='<project_id>',
    batch_id='<batch_id>',
    tasks=tasks_input
)

With resource in dataset

In the example above, we set a public url for image-1. In Isahit Lab, you can create a dataset and attach it to your batch. Then you can add resources and refer to it in your tasks with resource://folder/image.jpg

Code Reference

See the code reference for further details.

from isahitlab.client import IsahitLab

lab = IsahitLab()

files = [
    "image1.jpg",
    {"file" : "/path/to/folder/01.png", "path": "folder"}
]

tasks_input = [
    {
      "name": "image1.jpg",
      "data": {
        "text-1": "Image image1.jpg",
        "image-1": "resource://image1.jpg"
      }
    }
    {
      "name": "01.png",
      "data": {
        "text-1": "Image folder/01.png",
        "image-1": "resource://folder/01.png"
      }
    }
]

lab.append_to_dataset(
        project_id='<project_id>',
        batch_id='<batch_id>',
        files=files)

lab.create_tasks(
    project_id='<project_id>',
    batch_id='<batch_id>',
    tasks=tasks_input
)

Annotation tool in data processing (form) projects

Your form can contain annotation tools (In this example: iat-1).

from isahitlab.client import IsahitLab

lab = IsahitLab()

files = [
    "image1.jpg",
    {"file" : "/path/to/folder/01.png", "path": "folder"}
]

tasks_input = [
    {
      "name": "image1.jpg",
      "data": {
        "text-1": "Image image1.jpg",
        "image-1": "resource://image1.jpg",
        "iat-1": {
            "resources" : ["resource://image1.jpg"]
        }
      }
    }
    {
      "name": "01.png",
      "data": {
        "text-1": "Image folder/01.png",
        "image-1": "resource://folder/01.png",
        "iat-1": {
            "resources" : ["resource://folder/01.png"],
            "annotations" : [
                ... # see "Add task with annotations" above
            ]
        }
      }
    }
]

lab.append_to_dataset(
        project_id='<project_id>',
        batch_id='<batch_id>',
        files=files)

lab.create_tasks(
    project_id='<project_id>',
    batch_id='<batch_id>',
    tasks=tasks_input
)

Validation

Unicity

The SDK will automatically raise an error if a task with the same name exists in the batch. The whole import is canceled.

To ignore duplicates and insert others tasks, set raise_if_existing to False

To skip this check and insert duplicates anyway, set disable_unicity_check to True

Data validation

The SDK helps you to import valid data to make sure your tasks will work properly.

If you are encountering problems with validation, you can disable the validation by setting disable_data_check to True

Geometry formats

Rectangle annotation

{
    "polygons": [
        {
        "geometry": {
            "vertices": [
            0.05958132045088567, # Top Left X relative coordinate
            0.2894211576846307,  # Top Left Y relative coordinate
            0.41867954911433175, # Bottom Right X relative coordinate
            0.7305389221556886   # Bottom Right Y relative coordinate
            ],
            "type": "rectangle"
        }
        }
    ],
    "labels": {
        "my_list_id": {
            "labels": [
                {
                "id": "Test",
                "name": "Test"
                }
            ]
        }
    }
}

Polygon, graph and polyline annotation

{
    "polygons": [
        {
        "geometry": {
            "vertices": [
            0.05958132045088567,  # Point X1 relative coordinate
            0.2894211576846307,   # Point Y1 relative coordinate
            0.41867954911433175,  # Point X2 relative coordinate
            0.7305389221556886,   # Point Y2 relative coordinate
            ...
            0.31867954911433175,  # Point Xn relative coordinate
            0.9305389221556886    # Point Yn relative coordinate
            ],
            "type": "polygon"
        }
        }
    ],
    "labels": {
        "my_list_id": {
            "labels": [
                {
                "id": "Test",
                "name": "Test"
                }
            ]
        }
    }
}

Segmentation

Using helper

For a easier way to import segmentation data, see "Using helper" section below.

In Isahit Lab, the segmentation is "Pixel level" so the native input / output is a png mask.

To work properly, you must provide a base64 encoded mask and annotations list where polygons is a list of three number matching the RGB used in the mask.

Mask

Each labeled pixel in your mask must follow this RGB convention:

R G B
instance_id % 256 floor(instance_id / 256) Label bChannel (in your project configuration)

newId % 256, Math.floor(newId / 256)

Example

RGB triplet : (1, 0, 7)

Annotations

You must aslo provide an annotation for each RGB triplet in your mask and with the label matching the B channel

{
    "polygons": [1, 0, 7],
    "labels": {
        "my_list_id": {
            "labels": [
                {
                    "id": "Test",
                    "name": "Test"
                }
            ]
        }
    }
}

Example

from isahitlab.client import IsahitLab

lab = IsahitLab()

tasks_input = [
    {
      "name": "my_task_01.png",
      "resources": [
        "/path/to/folder/01.png"
      ],
      "data": {
        "annotations": [
          {
            "polygons": [1, 0, 7]
            "labels": {
              "my_list_id": {
                "labels": [
                  {
                    "id": "Test",
                    "name": "Test"
                  }
                ]
              }
            }
          }
        ],
        "mask" : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA (truncated)"
      }
    }
]

lab.create_tasks(
    project_id='<project_id>',
    batch_id='<batch_id>',
    tasks=tasks_input
)

Using helper

You can use a helper to import segmentation task with Rectangle or Polygon data.

Dependencies

This feature requires additional dependencies. You can install then with pip install isahitlab[image]

from isahitlab.client import IsahitLab
from isahitlab.helpers.labels import extract_labels_map_by_id
from isahitlab.helpers.segmentation import polygon_data_to_segmentation_data

lab = IsahitLab()

tasks_input = [
    {
      "name": "my_task_01.png",
      "resources": [
        "/path/to/folder/01.png"
      ],
      "data": {
        "annotations": [
          {
            "polygons": [
              {
                "geometry": {
                  "vertices": [
                    0.05958132045088567,
                    0.2894211576846307,
                    0.41867954911433175,
                    0.7305389221556886
                  ],
                  "type": "rectangle"
                }
              }
            ]
          }
        ]
      }
    }
]

# Get project configuration and extract label mapping
project_configuration = lab.project_configuration(project_id=project_id)
labels_mapping_by_id = extract_labels_map_by_id(
    project_configuration=project_configuration)

  # For each task, replace "polygon" or "rectangle" data by "segmentation" data
  tasks_input = [{
      **t,
      "data": polygon_data_to_segmentation_data(
                  t['data'], 
                  labels_mapping_by_id=labels_mapping_by_id, 
                  image_size={ 
                          "width": 800,
                          "height": 600 
                  }
      )
  } for t in tasks_input]

lab.create_tasks(
    project_id='<project_id>',
    batch_id='<batch_id>',
    tasks=tasks_input
)

Image size

image_size parameter is required to build the segmentation mask.

Kili compatibility

The SDK provide a partial compatiblity with Kili format for task creation. Set compatibility_mode to kili.

from isahitlab.client import IsahitLab

lab = IsahitLab()

tasks_input = [
    {
        "name": "test4.png",
        "resources": [
            "/home/benjamin/Documents/ISAHIT SAAS/image-demo/image_2/01.png"
        ],
        "data": {
            "OBJECT_DETECTION_JOB": {
                "annotations": [
                    {
                        "boundingPoly": [
                            {
                                "normalizedVertices": [
                                    {
                                        "x": 0.09589041095890412,
                                        "y": 0.2607829000381695
                                    },
                                    {
                                        "x": 0.09589041095890412,
                                        "y": 0.16281436871792687
                                    },
                                    {
                                        "x": 0.24738114423851731,
                                        "y": 0.16281436871792687
                                    },
                                    {
                                        "x": 0.24738114423851731,
                                        "y": 0.2607829000381695
                                    }
                                ],
                                "vertices": [
                                    {
                                        "x": 94.93150684931507,
                                        "y": 163.51087832393227
                                    },
                                    {
                                        "x": 94.93150684931507,
                                        "y": 102.08460918614014
                                    },
                                    {
                                        "x": 244.90733279613215,
                                        "y": 102.08460918614014
                                    },
                                    {
                                        "x": 244.90733279613215,
                                        "y": 163.51087832393227
                                    }
                                ]
                            }
                        ],
                        "categories": [
                            {
                                "name": "Test1"
                            }
                        ],
                        "children": {
                            "CLASSIFICATION_JOB": {
                                "categories": [
                                    {
                                        "confidence": 100,
                                        "name": "ENFANT_1"
                                    }
                                ]
                            },
                            "CLASSIFICATION_JOB_0": {
                                "categories": [
                                    {
                                        "children": {
                                            "TRANSCRIPTION_JOB_0": {
                                                "text": "test 2"
                                            }
                                        },
                                        "confidence": 100,
                                        "name": "ENFANT_2"
                                    },
                                    {
                                        "children": {
                                            "TRANSCRIPTION_JOB": {
                                                "text": "test"
                                            }
                                        },
                                        "confidence": 100,
                                        "name": "ENFANT_1"
                                    }
                                ]
                            }
                        },
                        "labelVersion": "default",
                        "mid": "20241128170655261-1",
                        "type": "rectangle"
                    }
                ]
            }
        }
    }
]

lab.create_tasks(
    project_id='<project_id>',
    batch_id='<batch_id>',
    compatibility_mode="kili",
    tasks=tasks_input
)