label-studio-sdk 1.0.11__tar.gz → 1.0.13__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of label-studio-sdk might be problematic. Click here for more details.
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/PKG-INFO +3 -2
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/pyproject.toml +3 -2
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/__init__.py +4 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/converter.py +59 -83
- label_studio_sdk-1.0.13/src/label_studio_sdk/converter/exports/brush_to_coco.py +332 -0
- label_studio_sdk-1.0.13/src/label_studio_sdk/converter/exports/yolo.py +149 -0
- label_studio_sdk-1.0.13/src/label_studio_sdk/converter/keypoints.py +146 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/main.py +14 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/jwt_settings/client.py +2 -2
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/tokens/client.py +140 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/__init__.py +4 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/annotation.py +2 -1
- label_studio_sdk-1.0.13/src/label_studio_sdk/types/annotation_completed_by.py +6 -0
- label_studio_sdk-1.0.13/src/label_studio_sdk/types/rotate_token_response.py +22 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/LICENSE +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/README.md +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/eval/categorical.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/label_studio_tools/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/label_studio_tools/core/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/label_studio_tools/core/label_config.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/label_studio_tools/core/utils/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/label_studio_tools/core/utils/exceptions.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/label_studio_tools/core/utils/io.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/label_studio_tools/core/utils/json_schema.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/label_studio_tools/core/utils/params.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/label_studio_tools/etl/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/label_studio_tools/etl/beam.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/label_studio_tools/etl/example.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/label_studio_tools/etl/registry.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/label_studio_tools/postprocessing/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/label_studio_tools/postprocessing/video.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/pager_ext.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_legacy/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_legacy/client.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_legacy/exceptions.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_legacy/project.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_legacy/schema/label_config_schema.json +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_legacy/users.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_legacy/utils.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_legacy/workspaces.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/actions/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/actions/client.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/actions/types/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/actions/types/actions_create_request_filters.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/actions/types/actions_create_request_filters_conjunction.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/actions/types/actions_create_request_filters_items_item.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/actions/types/actions_create_request_filters_items_item_filter.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/actions/types/actions_create_request_filters_items_item_operator.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/actions/types/actions_create_request_filters_items_item_value.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/actions/types/actions_create_request_id.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/actions/types/actions_create_request_ordering_item.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/actions/types/actions_create_request_selected_items.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/actions/types/actions_create_request_selected_items_excluded.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/actions/types/actions_create_request_selected_items_included.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/annotations/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/annotations/client.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/annotations/types/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/annotations/types/annotations_create_bulk_request_selected_items.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/annotations/types/annotations_create_bulk_response_item.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/base_client.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/client.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/comments/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/comments/client.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/audio.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/brush.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/exports/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/exports/csv.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/exports/csv2.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/funsd.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/imports/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/imports/coco.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/imports/colors.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/imports/label_config.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/imports/pathtrack.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/imports/yolo.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/utils.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/core/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/core/api_error.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/core/client_wrapper.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/core/datetime_utils.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/core/file.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/core/http_client.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/core/jsonable_encoder.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/core/pagination.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/core/pydantic_utilities.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/core/query_encoder.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/core/remove_none_from_dict.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/core/request_options.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/core/serialization.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/data_manager.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/environment.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/errors/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/errors/bad_request_error.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/errors/internal_server_error.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/errors/not_found_error.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/errors/unauthorized_error.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/azure/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/azure/client.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/azure/types/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/azure/types/azure_create_response.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/azure/types/azure_update_response.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/client.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/gcs/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/gcs/client.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/gcs/types/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/gcs/types/gcs_create_response.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/gcs/types/gcs_update_response.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/local/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/local/client.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/local/types/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/local/types/local_create_response.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/local/types/local_update_response.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/redis/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/redis/client.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/redis/types/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/redis/types/redis_create_response.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/redis/types/redis_update_response.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/s3/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/s3/client.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/s3/types/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/s3/types/s3create_response.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/s3/types/s3update_response.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/s3s/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/s3s/client.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/types/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/types/export_storage_list_types_response_item.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/files/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/files/client.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/azure/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/azure/client.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/azure/types/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/azure/types/azure_create_response.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/azure/types/azure_update_response.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/client.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/gcs/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/gcs/client.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/gcs/types/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/gcs/types/gcs_create_response.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/gcs/types/gcs_update_response.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/local/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/local/client.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/local/types/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/local/types/local_create_response.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/local/types/local_update_response.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/redis/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/redis/client.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/redis/types/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/redis/types/redis_create_response.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/redis/types/redis_update_response.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/s3/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/s3/client.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/s3/types/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/s3/types/s3create_response.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/s3/types/s3update_response.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/s3s/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/s3s/client.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/types/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/types/import_storage_list_types_response_item.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/jwt_settings/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/label_interface/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/label_interface/base.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/label_interface/control_tags.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/label_interface/create.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/label_interface/data_examples.json +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/label_interface/interface.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/label_interface/label_tags.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/label_interface/object_tags.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/label_interface/objects.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/label_interface/region.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/ml/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/ml/client.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/ml/types/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/ml/types/ml_create_request_auth_method.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/ml/types/ml_create_response.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/ml/types/ml_create_response_auth_method.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/ml/types/ml_update_request_auth_method.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/ml/types/ml_update_response.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/ml/types/ml_update_response_auth_method.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/model_providers/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/model_providers/client.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/predictions/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/predictions/client.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/client.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/client_ext.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/exports/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/exports/client.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/exports/client_ext.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/exports/types/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/exports/types/exports_convert_response.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/exports/types/exports_list_formats_response_item.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/pauses/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/pauses/client.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/types/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/types/projects_create_response.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/types/projects_import_tasks_response.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/types/projects_list_response.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/types/projects_update_response.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/prompts/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/prompts/client.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/prompts/indicators/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/prompts/indicators/client.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/prompts/runs/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/prompts/runs/client.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/prompts/runs/types/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/prompts/runs/types/runs_list_request_project_subset.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/prompts/types/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/prompts/types/prompts_batch_failed_predictions_request_failed_predictions_item.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/prompts/types/prompts_batch_failed_predictions_response.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/prompts/types/prompts_batch_predictions_request_results_item.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/prompts/types/prompts_batch_predictions_response.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/prompts/versions/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/prompts/versions/client.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/py.typed +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/tasks/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/tasks/client.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/tasks/client_ext.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/tasks/types/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/tasks/types/tasks_list_request_fields.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/tasks/types/tasks_list_response.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/tokens/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/tokens/client_ext.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/access_token_response.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/annotation_filter_options.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/annotation_last_action.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/annotations_dm_field.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/annotations_dm_field_last_action.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/api_token_response.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/azure_blob_export_storage.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/azure_blob_export_storage_status.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/azure_blob_import_storage.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/azure_blob_import_storage_status.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/base_task.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/base_task_file_upload.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/base_task_updated_by.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/base_user.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/comment.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/comment_created_by.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/converted_format.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/converted_format_status.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/data_manager_task_serializer.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/data_manager_task_serializer_annotators_item.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/data_manager_task_serializer_drafts_item.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/data_manager_task_serializer_predictions_item.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/export.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/export_format.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/export_snapshot.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/export_snapshot_status.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/export_status.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/file_upload.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/filter.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/filter_group.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/gcs_export_storage.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/gcs_export_storage_status.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/gcs_import_storage.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/gcs_import_storage_status.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/inference_run.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/inference_run_cost_estimate.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/inference_run_created_by.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/inference_run_organization.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/inference_run_project_subset.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/inference_run_status.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/jwt_settings_response.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/key_indicator_value.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/key_indicators.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/key_indicators_item.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/key_indicators_item_additional_kpis_item.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/key_indicators_item_extra_kpis_item.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/local_files_export_storage.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/local_files_export_storage_status.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/local_files_import_storage.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/local_files_import_storage_status.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/ml_backend.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/ml_backend_auth_method.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/ml_backend_state.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/model_provider_connection.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/model_provider_connection_budget_reset_period.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/model_provider_connection_created_by.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/model_provider_connection_organization.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/model_provider_connection_provider.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/model_provider_connection_scope.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/pause.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/pause_paused_by.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/prediction.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/project.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/project_import.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/project_import_status.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/project_label_config.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/project_sampling.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/project_skip_queue.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/prompt.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/prompt_associated_projects_item.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/prompt_associated_projects_item_id.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/prompt_created_by.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/prompt_organization.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/prompt_version.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/prompt_version_created_by.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/prompt_version_organization.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/prompt_version_provider.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/redis_export_storage.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/redis_export_storage_status.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/redis_import_storage.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/redis_import_storage_status.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/refined_prompt_response.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/refined_prompt_response_refinement_status.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/s3export_storage.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/s3export_storage_status.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/s3import_storage.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/s3import_storage_status.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/s3s_export_storage.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/s3s_import_storage.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/s3s_import_storage_status.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/serialization_option.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/serialization_options.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/task.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/task_annotators_item.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/task_comment_authors_item.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/task_filter_options.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/user_simple.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/view.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/webhook.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/webhook_actions_item.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/webhook_serializer_for_update.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/webhook_serializer_for_update_actions_item.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/workspace.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/users/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/users/client.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/users/types/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/users/types/users_get_token_response.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/users/types/users_reset_token_response.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/version.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/versions/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/versions/client.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/versions/types/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/versions/types/versions_get_response.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/versions/types/versions_get_response_edition.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/views/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/views/client.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/views/types/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/views/types/views_create_request_data.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/views/types/views_create_request_data_filters.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/views/types/views_create_request_data_filters_conjunction.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/views/types/views_create_request_data_filters_items_item.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/views/types/views_create_request_data_filters_items_item_filter.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/views/types/views_create_request_data_filters_items_item_operator.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/views/types/views_create_request_data_filters_items_item_value.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/views/types/views_create_request_data_ordering_item.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/views/types/views_update_request_data.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/views/types/views_update_request_data_filters.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/views/types/views_update_request_data_filters_conjunction.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/views/types/views_update_request_data_filters_items_item.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/views/types/views_update_request_data_filters_items_item_filter.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/views/types/views_update_request_data_filters_items_item_operator.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/views/types/views_update_request_data_filters_items_item_value.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/views/types/views_update_request_data_ordering_item.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/webhooks/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/webhooks/client.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/webhooks/types/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/webhooks/types/webhooks_update_request_actions_item.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/workspaces/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/workspaces/client.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/workspaces/members/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/workspaces/members/client.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/workspaces/members/types/__init__.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/workspaces/members/types/members_create_response.py +0 -0
- {label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/workspaces/members/types/members_list_response_item.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: label-studio-sdk
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.13
|
|
4
4
|
Summary:
|
|
5
5
|
Requires-Python: >=3.9,<4
|
|
6
6
|
Classifier: Intended Audience :: Developers
|
|
@@ -28,7 +28,8 @@ Requires-Dist: jsf (>=0.11.2,<0.12.0)
|
|
|
28
28
|
Requires-Dist: jsonschema (>=4.23.0)
|
|
29
29
|
Requires-Dist: lxml (>=4.2.5)
|
|
30
30
|
Requires-Dist: nltk (>=3.9.1,<4.0.0)
|
|
31
|
-
Requires-Dist: numpy (>=1.26.4,<
|
|
31
|
+
Requires-Dist: numpy (>=1.26.4,<3.0.0)
|
|
32
|
+
Requires-Dist: opencv-python (>=4.9.0,<5.0.0)
|
|
32
33
|
Requires-Dist: pandas (>=0.24.0)
|
|
33
34
|
Requires-Dist: pydantic (>=1.9.2)
|
|
34
35
|
Requires-Dist: pydantic-core (>=2.18.2,<3.0.0)
|
|
@@ -3,7 +3,7 @@ name = "label-studio-sdk"
|
|
|
3
3
|
|
|
4
4
|
[tool.poetry]
|
|
5
5
|
name = "label-studio-sdk"
|
|
6
|
-
version = "1.0.
|
|
6
|
+
version = "1.0.13"
|
|
7
7
|
description = ""
|
|
8
8
|
readme = "README.md"
|
|
9
9
|
authors = []
|
|
@@ -44,7 +44,8 @@ jsf = "^0.11.2"
|
|
|
44
44
|
jsonschema = ">=4.23.0"
|
|
45
45
|
lxml = ">=4.2.5"
|
|
46
46
|
nltk = "^3.9.1"
|
|
47
|
-
numpy = ">=1.26.4,<
|
|
47
|
+
numpy = ">=1.26.4,<3.0.0"
|
|
48
|
+
opencv-python = "^4.9.0"
|
|
48
49
|
pandas = ">=0.24.0"
|
|
49
50
|
pydantic = ">= 1.9.2"
|
|
50
51
|
pydantic-core = "^2.18.2"
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
from .types import (
|
|
4
4
|
AccessTokenResponse,
|
|
5
5
|
Annotation,
|
|
6
|
+
AnnotationCompletedBy,
|
|
6
7
|
AnnotationFilterOptions,
|
|
7
8
|
AnnotationLastAction,
|
|
8
9
|
AnnotationsDmField,
|
|
@@ -85,6 +86,7 @@ from .types import (
|
|
|
85
86
|
RedisImportStorageStatus,
|
|
86
87
|
RefinedPromptResponse,
|
|
87
88
|
RefinedPromptResponseRefinementStatus,
|
|
89
|
+
RotateTokenResponse,
|
|
88
90
|
S3ExportStorage,
|
|
89
91
|
S3ExportStorageStatus,
|
|
90
92
|
S3ImportStorage,
|
|
@@ -200,6 +202,7 @@ __all__ = [
|
|
|
200
202
|
"ActionsCreateRequestSelectedItemsExcluded",
|
|
201
203
|
"ActionsCreateRequestSelectedItemsIncluded",
|
|
202
204
|
"Annotation",
|
|
205
|
+
"AnnotationCompletedBy",
|
|
203
206
|
"AnnotationFilterOptions",
|
|
204
207
|
"AnnotationLastAction",
|
|
205
208
|
"AnnotationsCreateBulkRequestSelectedItems",
|
|
@@ -307,6 +310,7 @@ __all__ = [
|
|
|
307
310
|
"RedisImportStorageStatus",
|
|
308
311
|
"RefinedPromptResponse",
|
|
309
312
|
"RefinedPromptResponseRefinementStatus",
|
|
313
|
+
"RotateTokenResponse",
|
|
310
314
|
"S3ExportStorage",
|
|
311
315
|
"S3ExportStorageStatus",
|
|
312
316
|
"S3ImportStorage",
|
{label_studio_sdk-1.0.11 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/converter.py
RENAMED
|
@@ -11,13 +11,14 @@ from datetime import datetime
|
|
|
11
11
|
from enum import Enum
|
|
12
12
|
from glob import glob
|
|
13
13
|
from shutil import copy2
|
|
14
|
-
from typing import Optional
|
|
14
|
+
from typing import Optional, List, Tuple
|
|
15
15
|
|
|
16
16
|
import ijson
|
|
17
17
|
import ujson as json
|
|
18
18
|
from PIL import Image
|
|
19
19
|
from label_studio_sdk.converter import brush
|
|
20
20
|
from label_studio_sdk.converter.audio import convert_to_asr_json_manifest
|
|
21
|
+
from label_studio_sdk.converter.keypoints import process_keypoints_for_coco, build_kp_order, update_categories_for_keypoints, keypoints_in_label_config, get_yolo_categories_for_keypoints
|
|
21
22
|
from label_studio_sdk.converter.exports import csv2
|
|
22
23
|
from label_studio_sdk.converter.utils import (
|
|
23
24
|
parse_config,
|
|
@@ -34,6 +35,7 @@ from label_studio_sdk.converter.utils import (
|
|
|
34
35
|
convert_annotation_to_yolo_obb,
|
|
35
36
|
)
|
|
36
37
|
from label_studio_sdk._extensions.label_studio_tools.core.utils.io import get_local_path
|
|
38
|
+
from label_studio_sdk.converter.exports.yolo import process_and_save_yolo_annotations
|
|
37
39
|
|
|
38
40
|
logger = logging.getLogger(__name__)
|
|
39
41
|
|
|
@@ -59,6 +61,7 @@ class Format(Enum):
|
|
|
59
61
|
YOLO_WITH_IMAGES = 14
|
|
60
62
|
COCO_WITH_IMAGES = 15
|
|
61
63
|
YOLO_OBB_WITH_IMAGES = 16
|
|
64
|
+
BRUSH_TO_COCO = 17
|
|
62
65
|
|
|
63
66
|
def __str__(self):
|
|
64
67
|
return self.name
|
|
@@ -108,13 +111,13 @@ class Converter(object):
|
|
|
108
111
|
"description": "Popular machine learning format used by the COCO dataset for object detection and image "
|
|
109
112
|
"segmentation tasks with polygons and rectangles.",
|
|
110
113
|
"link": "https://labelstud.io/guide/export.html#COCO",
|
|
111
|
-
"tags": ["image segmentation", "object detection"],
|
|
114
|
+
"tags": ["image segmentation", "object detection", "keypoints"],
|
|
112
115
|
},
|
|
113
116
|
Format.COCO_WITH_IMAGES: {
|
|
114
117
|
"title": "COCO with Images",
|
|
115
118
|
"description": "COCO format with images downloaded.",
|
|
116
119
|
"link": "https://labelstud.io/guide/export.html#COCO",
|
|
117
|
-
"tags": ["image segmentation", "object detection"],
|
|
120
|
+
"tags": ["image segmentation", "object detection", "keypoints"],
|
|
118
121
|
},
|
|
119
122
|
Format.VOC: {
|
|
120
123
|
"title": "Pascal VOC XML",
|
|
@@ -127,13 +130,13 @@ class Converter(object):
|
|
|
127
130
|
"description": "Popular TXT format is created for each image file. Each txt file contains annotations for "
|
|
128
131
|
"the corresponding image file, that is object class, object coordinates, height & width.",
|
|
129
132
|
"link": "https://labelstud.io/guide/export.html#YOLO",
|
|
130
|
-
"tags": ["image segmentation", "object detection"],
|
|
133
|
+
"tags": ["image segmentation", "object detection", "keypoints"],
|
|
131
134
|
},
|
|
132
135
|
Format.YOLO_WITH_IMAGES: {
|
|
133
136
|
"title": "YOLO with Images",
|
|
134
137
|
"description": "YOLO format with images downloaded.",
|
|
135
138
|
"link": "https://labelstud.io/guide/export.html#YOLO",
|
|
136
|
-
"tags": ["image segmentation", "object detection"],
|
|
139
|
+
"tags": ["image segmentation", "object detection", "keypoints"],
|
|
137
140
|
},
|
|
138
141
|
Format.YOLO_OBB: {
|
|
139
142
|
"title": "YOLOv8 OBB",
|
|
@@ -167,6 +170,13 @@ class Converter(object):
|
|
|
167
170
|
"format expected by NVIDIA NeMo models.",
|
|
168
171
|
"link": "https://labelstud.io/guide/export.html#ASR-MANIFEST",
|
|
169
172
|
"tags": ["speech recognition"],
|
|
173
|
+
},
|
|
174
|
+
Format.BRUSH_TO_COCO: {
|
|
175
|
+
|
|
176
|
+
"title": "Brush labels to COCO",
|
|
177
|
+
"description": "Export your brush labels as COCO format for segmentation tasks. Converts RLE encoded masks to COCO polygons.",
|
|
178
|
+
"link": "https://labelstud.io/guide/export.html#COCO",
|
|
179
|
+
"tags": ["image segmentation", "brush annotations"],
|
|
170
180
|
},
|
|
171
181
|
}
|
|
172
182
|
|
|
@@ -197,6 +207,7 @@ class Converter(object):
|
|
|
197
207
|
self._schema = None
|
|
198
208
|
self.access_token = access_token
|
|
199
209
|
self.hostname = hostname
|
|
210
|
+
self.is_keypoints = None
|
|
200
211
|
|
|
201
212
|
if isinstance(config, dict):
|
|
202
213
|
self._schema = config
|
|
@@ -293,6 +304,19 @@ class Converter(object):
|
|
|
293
304
|
upload_dir=self.upload_dir,
|
|
294
305
|
download_resources=self.download_resources,
|
|
295
306
|
)
|
|
307
|
+
elif format == Format.BRUSH_TO_COCO:
|
|
308
|
+
items = (
|
|
309
|
+
self.iter_from_dir(input_data)
|
|
310
|
+
if is_dir
|
|
311
|
+
else self.iter_from_json_file(input_data)
|
|
312
|
+
)
|
|
313
|
+
from label_studio_sdk.converter.exports.brush_to_coco import convert_to_coco
|
|
314
|
+
image_dir = kwargs.get("image_dir")
|
|
315
|
+
convert_to_coco(
|
|
316
|
+
items,
|
|
317
|
+
output_data,
|
|
318
|
+
output_image_dir=image_dir
|
|
319
|
+
)
|
|
296
320
|
|
|
297
321
|
def _get_data_keys_and_output_tags(self, output_tags=None):
|
|
298
322
|
data_keys = set()
|
|
@@ -355,11 +379,14 @@ class Converter(object):
|
|
|
355
379
|
and (
|
|
356
380
|
"RectangleLabels" in output_tag_types
|
|
357
381
|
or "PolygonLabels" in output_tag_types
|
|
382
|
+
or "KeyPointLabels" in output_tag_types
|
|
358
383
|
)
|
|
359
384
|
or "Rectangle" in output_tag_types
|
|
360
385
|
and "Labels" in output_tag_types
|
|
361
386
|
or "PolygonLabels" in output_tag_types
|
|
362
387
|
and "Labels" in output_tag_types
|
|
388
|
+
or "KeyPointLabels" in output_tag_types
|
|
389
|
+
and "Labels" in output_tag_types
|
|
363
390
|
):
|
|
364
391
|
all_formats.remove(Format.COCO.name)
|
|
365
392
|
all_formats.remove(Format.COCO_WITH_IMAGES.name)
|
|
@@ -376,6 +403,7 @@ class Converter(object):
|
|
|
376
403
|
):
|
|
377
404
|
all_formats.remove(Format.BRUSH_TO_NUMPY.name)
|
|
378
405
|
all_formats.remove(Format.BRUSH_TO_PNG.name)
|
|
406
|
+
all_formats.remove(Format.BRUSH_TO_COCO.name)
|
|
379
407
|
if not (
|
|
380
408
|
("Audio" in input_tag_types or "AudioPlus" in input_tag_types)
|
|
381
409
|
and "TextArea" in output_tag_types
|
|
@@ -500,6 +528,9 @@ class Converter(object):
|
|
|
500
528
|
if "original_height" in r:
|
|
501
529
|
v["original_height"] = r["original_height"]
|
|
502
530
|
outputs[r["from_name"]].append(v)
|
|
531
|
+
if self.is_keypoints:
|
|
532
|
+
v['id'] = r.get('id')
|
|
533
|
+
v['parentID'] = r.get('parentID')
|
|
503
534
|
|
|
504
535
|
data = Converter.get_data(task, outputs, annotation)
|
|
505
536
|
if "agreement" in task:
|
|
@@ -616,6 +647,7 @@ class Converter(object):
|
|
|
616
647
|
os.makedirs(output_image_dir, exist_ok=True)
|
|
617
648
|
images, categories, annotations = [], [], []
|
|
618
649
|
categories, category_name_to_id = self._get_labels()
|
|
650
|
+
categories, category_name_to_id = update_categories_for_keypoints(categories, category_name_to_id, self._schema)
|
|
619
651
|
data_key = self._data_keys[0]
|
|
620
652
|
item_iterator = (
|
|
621
653
|
self.iter_from_dir(input_data)
|
|
@@ -681,9 +713,10 @@ class Converter(object):
|
|
|
681
713
|
logger.debug(f'Empty bboxes for {item["output"]}')
|
|
682
714
|
continue
|
|
683
715
|
|
|
716
|
+
keypoint_labels = []
|
|
684
717
|
for label in labels:
|
|
685
718
|
category_name = None
|
|
686
|
-
for key in ["rectanglelabels", "polygonlabels", "labels"]:
|
|
719
|
+
for key in ["rectanglelabels", "polygonlabels", "keypointlabels", "labels"]:
|
|
687
720
|
if key in label and len(label[key]) > 0:
|
|
688
721
|
category_name = label[key][0]
|
|
689
722
|
break
|
|
@@ -753,11 +786,22 @@ class Converter(object):
|
|
|
753
786
|
"area": get_polygon_area(x, y),
|
|
754
787
|
}
|
|
755
788
|
)
|
|
789
|
+
elif "keypointlabels" in label:
|
|
790
|
+
keypoint_labels.append(label)
|
|
756
791
|
else:
|
|
757
792
|
raise ValueError("Unknown label type")
|
|
758
793
|
|
|
759
794
|
if os.getenv("LABEL_STUDIO_FORCE_ANNOTATOR_EXPORT"):
|
|
760
795
|
annotations[-1].update({"annotator": get_annotator(item)})
|
|
796
|
+
if keypoint_labels:
|
|
797
|
+
kp_order = build_kp_order(self._schema)
|
|
798
|
+
annotations.append(process_keypoints_for_coco(
|
|
799
|
+
keypoint_labels,
|
|
800
|
+
kp_order,
|
|
801
|
+
annotation_id=len(annotations),
|
|
802
|
+
image_id=image_id,
|
|
803
|
+
category_name_to_id=category_name_to_id,
|
|
804
|
+
))
|
|
761
805
|
|
|
762
806
|
with io.open(output_file, mode="w", encoding="utf8") as fout:
|
|
763
807
|
json.dump(
|
|
@@ -824,7 +868,14 @@ class Converter(object):
|
|
|
824
868
|
else:
|
|
825
869
|
output_label_dir = os.path.join(output_dir, "labels")
|
|
826
870
|
os.makedirs(output_label_dir, exist_ok=True)
|
|
827
|
-
|
|
871
|
+
is_keypoints = keypoints_in_label_config(self._schema)
|
|
872
|
+
|
|
873
|
+
if is_keypoints:
|
|
874
|
+
# we use this attribute to add id and parentID to annotation data
|
|
875
|
+
self.is_keypoints = True
|
|
876
|
+
categories, category_name_to_id = get_yolo_categories_for_keypoints(self._schema)
|
|
877
|
+
else:
|
|
878
|
+
categories, category_name_to_id = self._get_labels()
|
|
828
879
|
data_key = self._data_keys[0]
|
|
829
880
|
item_iterator = (
|
|
830
881
|
self.iter_from_dir(input_data)
|
|
@@ -901,82 +952,7 @@ class Converter(object):
|
|
|
901
952
|
pass
|
|
902
953
|
continue
|
|
903
954
|
|
|
904
|
-
|
|
905
|
-
for label in labels:
|
|
906
|
-
category_name = None
|
|
907
|
-
category_names = [] # considering multi-label
|
|
908
|
-
for key in ["rectanglelabels", "polygonlabels", "labels"]:
|
|
909
|
-
if key in label and len(label[key]) > 0:
|
|
910
|
-
# change to save multi-label
|
|
911
|
-
for category_name in label[key]:
|
|
912
|
-
category_names.append(category_name)
|
|
913
|
-
|
|
914
|
-
if len(category_names) == 0:
|
|
915
|
-
logger.debug(
|
|
916
|
-
"Unknown label type or labels are empty: " + str(label)
|
|
917
|
-
)
|
|
918
|
-
continue
|
|
919
|
-
|
|
920
|
-
for category_name in category_names:
|
|
921
|
-
if category_name not in category_name_to_id:
|
|
922
|
-
category_id = len(categories)
|
|
923
|
-
category_name_to_id[category_name] = category_id
|
|
924
|
-
categories.append({"id": category_id, "name": category_name})
|
|
925
|
-
category_id = category_name_to_id[category_name]
|
|
926
|
-
|
|
927
|
-
if (
|
|
928
|
-
"rectanglelabels" in label
|
|
929
|
-
or "rectangle" in label
|
|
930
|
-
or "labels" in label
|
|
931
|
-
):
|
|
932
|
-
# yolo obb
|
|
933
|
-
if is_obb:
|
|
934
|
-
obb_annotation = convert_annotation_to_yolo_obb(label)
|
|
935
|
-
if obb_annotation is None:
|
|
936
|
-
continue
|
|
937
|
-
|
|
938
|
-
top_left, top_right, bottom_right, bottom_left = (
|
|
939
|
-
obb_annotation
|
|
940
|
-
)
|
|
941
|
-
x1, y1 = top_left
|
|
942
|
-
x2, y2 = top_right
|
|
943
|
-
x3, y3 = bottom_right
|
|
944
|
-
x4, y4 = bottom_left
|
|
945
|
-
annotations.append(
|
|
946
|
-
[category_id, x1, y1, x2, y2, x3, y3, x4, y4]
|
|
947
|
-
)
|
|
948
|
-
|
|
949
|
-
# simple yolo
|
|
950
|
-
else:
|
|
951
|
-
annotation = convert_annotation_to_yolo(label)
|
|
952
|
-
if annotation is None:
|
|
953
|
-
continue
|
|
954
|
-
|
|
955
|
-
(
|
|
956
|
-
x,
|
|
957
|
-
y,
|
|
958
|
-
w,
|
|
959
|
-
h,
|
|
960
|
-
) = annotation
|
|
961
|
-
annotations.append([category_id, x, y, w, h])
|
|
962
|
-
|
|
963
|
-
elif "polygonlabels" in label or "polygon" in label:
|
|
964
|
-
if not ('points' in label):
|
|
965
|
-
continue
|
|
966
|
-
points_abs = [(x / 100, y / 100) for x, y in label["points"]]
|
|
967
|
-
annotations.append(
|
|
968
|
-
[category_id]
|
|
969
|
-
+ [coord for point in points_abs for coord in point]
|
|
970
|
-
)
|
|
971
|
-
else:
|
|
972
|
-
raise ValueError(f"Unknown label type {label}")
|
|
973
|
-
with open(label_path, "w") as f:
|
|
974
|
-
for annotation in annotations:
|
|
975
|
-
for idx, l in enumerate(annotation):
|
|
976
|
-
if idx == len(annotation) - 1:
|
|
977
|
-
f.write(f"{l}\n")
|
|
978
|
-
else:
|
|
979
|
-
f.write(f"{l} ")
|
|
955
|
+
categories, category_name_to_id = process_and_save_yolo_annotations(labels, label_path, category_name_to_id, categories, is_obb, is_keypoints, self._schema)
|
|
980
956
|
with open(class_file, "w", encoding="utf8") as f:
|
|
981
957
|
for c in categories:
|
|
982
958
|
f.write(c["name"] + "\n")
|
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Convert brush annotations and polygon annotations to COCO format.
|
|
3
|
+
This module handles RLE encoded brush masks and converts them to COCO segmentation format.
|
|
4
|
+
"""
|
|
5
|
+
import logging
|
|
6
|
+
import random
|
|
7
|
+
import io
|
|
8
|
+
import os
|
|
9
|
+
import json
|
|
10
|
+
import numpy as np
|
|
11
|
+
import cv2
|
|
12
|
+
from copy import deepcopy
|
|
13
|
+
from datetime import datetime
|
|
14
|
+
|
|
15
|
+
from label_studio_sdk.converter.utils import ensure_dir, get_annotator
|
|
16
|
+
import label_studio_sdk.converter.brush as brush_module
|
|
17
|
+
|
|
18
|
+
logger = logging.getLogger(__name__)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def generate_random_color():
|
|
22
|
+
"""Generates a random hex color for category visualization"""
|
|
23
|
+
return '#{:02x}{:02x}{:02x}'.format(random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def flatten(item):
|
|
27
|
+
"""Flatten nested lists for segmentation format"""
|
|
28
|
+
if isinstance(item, list):
|
|
29
|
+
for subitem in item:
|
|
30
|
+
yield from flatten(subitem)
|
|
31
|
+
else:
|
|
32
|
+
yield item
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def generate_contour_from_rle(rle, original_width, original_height):
|
|
36
|
+
"""Convert RLE encoded masks to COCO segmentation format
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
rle: RLE encoded mask data
|
|
40
|
+
original_width: Width of the original image
|
|
41
|
+
original_height: Height of the original image
|
|
42
|
+
|
|
43
|
+
Returns:
|
|
44
|
+
tuple: (segmentation, bbox_list, area_list) in COCO format
|
|
45
|
+
"""
|
|
46
|
+
# Ensure rle is bytes, not string
|
|
47
|
+
if isinstance(rle, str):
|
|
48
|
+
rle = rle.encode('utf-8')
|
|
49
|
+
|
|
50
|
+
# Decode RLE
|
|
51
|
+
try:
|
|
52
|
+
rle_binary = brush_module.decode_rle(rle)
|
|
53
|
+
except Exception as e:
|
|
54
|
+
logger.warning(f"Failed to decode RLE: {e}")
|
|
55
|
+
return [], [], []
|
|
56
|
+
|
|
57
|
+
# Reshape to image dimensions with 4 channels (RGBA)
|
|
58
|
+
try:
|
|
59
|
+
reshaped_image = np.reshape(rle_binary, [original_height, original_width, 4])
|
|
60
|
+
except Exception as e:
|
|
61
|
+
logger.warning(f"Failed to reshape RLE data: {e}")
|
|
62
|
+
return [], [], []
|
|
63
|
+
|
|
64
|
+
# Use only the alpha channel for contour detection
|
|
65
|
+
alpha_channel = np.array(reshaped_image[:, :, 3]).astype('uint8')
|
|
66
|
+
|
|
67
|
+
# Find contours
|
|
68
|
+
contours, _ = cv2.findContours(
|
|
69
|
+
alpha_channel, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
segmentation = []
|
|
73
|
+
bbox_list = []
|
|
74
|
+
area_list = []
|
|
75
|
+
for contour in contours:
|
|
76
|
+
# OpenCV contours are in format [[[x1,y1]], [[x2,y2]], ...],
|
|
77
|
+
# we need to convert to a flat list [x1,y1,x2,y2,...]
|
|
78
|
+
contour_points = [point[0] for point in contour]
|
|
79
|
+
|
|
80
|
+
# Flatten to a single list
|
|
81
|
+
contour_flat = []
|
|
82
|
+
for point in contour_points:
|
|
83
|
+
contour_flat.extend(point.tolist())
|
|
84
|
+
|
|
85
|
+
# Check if we have at least 3 points (6 coordinates) for a valid polygon
|
|
86
|
+
if len(contour_points) >= 3:
|
|
87
|
+
segmentation.append(contour_flat)
|
|
88
|
+
|
|
89
|
+
x, y, w, h = cv2.boundingRect(contour)
|
|
90
|
+
bbox_list.append([x, y, w, h]) # Format: [top-left x, top-left y, width, height]
|
|
91
|
+
|
|
92
|
+
# Compute the area of the contour
|
|
93
|
+
area = cv2.contourArea(contour)
|
|
94
|
+
area_list.append(int(area))
|
|
95
|
+
|
|
96
|
+
return segmentation, bbox_list, area_list
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def generate_contour_from_polygon(points, original_width, original_height):
|
|
100
|
+
"""Convert polygon annotations to COCO segmentation format
|
|
101
|
+
|
|
102
|
+
Args:
|
|
103
|
+
points: List of [x, y] points in percentage format
|
|
104
|
+
original_width: Width of the original image
|
|
105
|
+
original_height: Height of the original image
|
|
106
|
+
|
|
107
|
+
Returns:
|
|
108
|
+
tuple: (segmentation, bbox, area) in COCO format
|
|
109
|
+
"""
|
|
110
|
+
# Convert from percentage to absolute coordinates
|
|
111
|
+
modified_points = [
|
|
112
|
+
[round(x * original_width / 100), round(y * original_height / 100)]
|
|
113
|
+
for x, y in points
|
|
114
|
+
]
|
|
115
|
+
|
|
116
|
+
# Initialize lists
|
|
117
|
+
segmentation = [list(flatten(modified_points))]
|
|
118
|
+
|
|
119
|
+
# Convert points to a NumPy array and reshape for OpenCV
|
|
120
|
+
contour = np.array(modified_points, dtype=np.float32).reshape((-1, 1, 2))
|
|
121
|
+
|
|
122
|
+
# Calculate bounding box
|
|
123
|
+
bbox = cv2.boundingRect(contour)
|
|
124
|
+
bbox = [int(coordinate) for coordinate in bbox]
|
|
125
|
+
|
|
126
|
+
# Compute the area of the contour
|
|
127
|
+
area = cv2.contourArea(contour)
|
|
128
|
+
|
|
129
|
+
return segmentation, bbox, int(area)
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def convert_to_coco(items, output_dir, output_image_dir=None):
|
|
133
|
+
"""Convert Label Studio annotations to COCO format
|
|
134
|
+
|
|
135
|
+
Args:
|
|
136
|
+
items: Iterable of annotation items
|
|
137
|
+
output_dir: Directory where to save the resulting COCO JSON
|
|
138
|
+
output_image_dir: Optional directory for images
|
|
139
|
+
|
|
140
|
+
Returns:
|
|
141
|
+
Path to the generated COCO JSON file
|
|
142
|
+
"""
|
|
143
|
+
ensure_dir(output_dir)
|
|
144
|
+
output_file = os.path.join(output_dir, "result_coco.json")
|
|
145
|
+
|
|
146
|
+
if output_image_dir is not None:
|
|
147
|
+
ensure_dir(output_image_dir)
|
|
148
|
+
else:
|
|
149
|
+
output_image_dir = os.path.join(output_dir, "images")
|
|
150
|
+
os.makedirs(output_image_dir, exist_ok=True)
|
|
151
|
+
|
|
152
|
+
# Initialize COCO JSON structure
|
|
153
|
+
coco_data = {
|
|
154
|
+
'images': [],
|
|
155
|
+
'annotations': [],
|
|
156
|
+
'categories': [],
|
|
157
|
+
'info': {
|
|
158
|
+
'year': datetime.now().year,
|
|
159
|
+
'version': '1.0',
|
|
160
|
+
'description': 'Converted from Label Studio',
|
|
161
|
+
'contributor': 'Label Studio Converter',
|
|
162
|
+
'date_created': str(datetime.now()),
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
category_map = {} # To track unique categories
|
|
167
|
+
annotation_id = 0
|
|
168
|
+
|
|
169
|
+
# Process each item
|
|
170
|
+
for image_id, item in enumerate(items):
|
|
171
|
+
# Extract image information
|
|
172
|
+
image_path = None
|
|
173
|
+
for key, value in item['input'].items():
|
|
174
|
+
if isinstance(value, str) and any(value.lower().endswith(ext) for ext in ['.jpg', '.jpeg', '.png', '.gif', '.bmp']):
|
|
175
|
+
image_path = value
|
|
176
|
+
break
|
|
177
|
+
|
|
178
|
+
if not image_path:
|
|
179
|
+
logger.warning(f"No image path found for item {item.get('id')}. Skipping.")
|
|
180
|
+
continue
|
|
181
|
+
|
|
182
|
+
image_info = {
|
|
183
|
+
'id': image_id,
|
|
184
|
+
'file_name': os.path.basename(image_path),
|
|
185
|
+
'path': image_path,
|
|
186
|
+
'width': None, # Will be filled from annotations
|
|
187
|
+
'height': None # Will be filled from annotations
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
# Skip tasks without annotations
|
|
191
|
+
if not item['output']:
|
|
192
|
+
logger.warning(f"No annotations found for item {item.get('id')}")
|
|
193
|
+
continue
|
|
194
|
+
|
|
195
|
+
valid_annotations = False
|
|
196
|
+
|
|
197
|
+
# Process all annotations
|
|
198
|
+
for output_key, annotations in item['output'].items():
|
|
199
|
+
for annotation in annotations:
|
|
200
|
+
# Get image dimensions from the first annotation
|
|
201
|
+
if image_info['width'] is None and 'original_width' in annotation:
|
|
202
|
+
image_info['width'] = annotation['original_width']
|
|
203
|
+
image_info['height'] = annotation['original_height']
|
|
204
|
+
|
|
205
|
+
# Identify annotation type and extract labels
|
|
206
|
+
annotation_type = annotation.get('type', '').lower()
|
|
207
|
+
labels = []
|
|
208
|
+
|
|
209
|
+
if 'brushlabels' in annotation:
|
|
210
|
+
labels = annotation['brushlabels']
|
|
211
|
+
type_key = 'brushlabels'
|
|
212
|
+
elif 'polygonlabels' in annotation:
|
|
213
|
+
labels = annotation['polygonlabels']
|
|
214
|
+
type_key = 'polygonlabels'
|
|
215
|
+
elif 'rectanglelabels' in annotation:
|
|
216
|
+
labels = annotation['rectanglelabels']
|
|
217
|
+
type_key = 'rectanglelabels'
|
|
218
|
+
elif 'labels' in annotation:
|
|
219
|
+
labels = annotation['labels']
|
|
220
|
+
type_key = 'labels'
|
|
221
|
+
else:
|
|
222
|
+
logger.debug(f"Unsupported annotation type: {annotation_type}")
|
|
223
|
+
continue
|
|
224
|
+
|
|
225
|
+
# Process each label
|
|
226
|
+
for label in labels:
|
|
227
|
+
# Add new categories to the map
|
|
228
|
+
if label not in category_map:
|
|
229
|
+
category_id = len(category_map) + 1
|
|
230
|
+
category_map[label] = category_id
|
|
231
|
+
coco_data['categories'].append({
|
|
232
|
+
'id': category_id,
|
|
233
|
+
'name': label,
|
|
234
|
+
'supercategory': '',
|
|
235
|
+
'color': generate_random_color(),
|
|
236
|
+
'metadata': {}
|
|
237
|
+
})
|
|
238
|
+
|
|
239
|
+
category_id = category_map[label]
|
|
240
|
+
|
|
241
|
+
# Convert annotation based on type
|
|
242
|
+
if 'rle' in annotation and type_key == 'brushlabels':
|
|
243
|
+
|
|
244
|
+
# check required keys exist
|
|
245
|
+
if not all(k in annotation for k in ['rle', 'original_width', 'original_height']):
|
|
246
|
+
logger.warning(f"Missing required keys for RLE annotation. Skipping.")
|
|
247
|
+
continue
|
|
248
|
+
|
|
249
|
+
# Process brush annotation (RLE encoded mask)
|
|
250
|
+
segmentations, bboxes, areas = generate_contour_from_rle(
|
|
251
|
+
annotation['rle'],
|
|
252
|
+
annotation['original_width'],
|
|
253
|
+
annotation['original_height']
|
|
254
|
+
)
|
|
255
|
+
|
|
256
|
+
# Create separate annotation for each contour
|
|
257
|
+
for i, (segmentation, bbox, area) in enumerate(zip(segmentations, bboxes, areas)):
|
|
258
|
+
coco_annotation = {
|
|
259
|
+
'id': annotation_id,
|
|
260
|
+
'image_id': image_id,
|
|
261
|
+
'category_id': category_id,
|
|
262
|
+
'segmentation': [segmentation], # COCO format requires double nesting
|
|
263
|
+
'area': area,
|
|
264
|
+
'bbox': bbox,
|
|
265
|
+
'iscrowd': 0,
|
|
266
|
+
'annotator': get_annotator(item, "unknown")
|
|
267
|
+
}
|
|
268
|
+
coco_data['annotations'].append(coco_annotation)
|
|
269
|
+
annotation_id += 1
|
|
270
|
+
valid_annotations = True
|
|
271
|
+
|
|
272
|
+
elif 'points' in annotation and type_key == 'polygonlabels':
|
|
273
|
+
# check required keys exist
|
|
274
|
+
if not all(k in annotation for k in ['points', 'original_width', 'original_height']):
|
|
275
|
+
logger.warning(f"Missing required keys for polygon annotation. Skipping.")
|
|
276
|
+
continue
|
|
277
|
+
# Process polygon annotation
|
|
278
|
+
segmentation, bbox, area = generate_contour_from_polygon(
|
|
279
|
+
annotation['points'],
|
|
280
|
+
annotation['original_width'],
|
|
281
|
+
annotation['original_height']
|
|
282
|
+
)
|
|
283
|
+
|
|
284
|
+
coco_annotation = {
|
|
285
|
+
'id': annotation_id,
|
|
286
|
+
'image_id': image_id,
|
|
287
|
+
'category_id': category_id,
|
|
288
|
+
'segmentation': segmentation,
|
|
289
|
+
'area': area,
|
|
290
|
+
'bbox': bbox,
|
|
291
|
+
'iscrowd': 0,
|
|
292
|
+
'annotator': get_annotator(item, "unknown")
|
|
293
|
+
}
|
|
294
|
+
coco_data['annotations'].append(coco_annotation)
|
|
295
|
+
annotation_id += 1
|
|
296
|
+
valid_annotations = True
|
|
297
|
+
|
|
298
|
+
elif annotation_type == 'rectanglelabels' or type_key == 'labels':
|
|
299
|
+
# check required keys exist
|
|
300
|
+
if not all(k in annotation for k in ['x', 'y', 'width', 'height', 'original_width', 'original_height']):
|
|
301
|
+
logger.warning(f"Missing required keys for rectangle annotation. Skipping.")
|
|
302
|
+
continue
|
|
303
|
+
|
|
304
|
+
# Convert from percentage to absolute coordinates
|
|
305
|
+
x = annotation['x'] * annotation['original_width'] / 100
|
|
306
|
+
y = annotation['y'] * annotation['original_height'] / 100
|
|
307
|
+
w = annotation['width'] * annotation['original_width'] / 100
|
|
308
|
+
h = annotation['height'] * annotation['original_height'] / 100
|
|
309
|
+
|
|
310
|
+
coco_annotation = {
|
|
311
|
+
'id': annotation_id,
|
|
312
|
+
'image_id': image_id,
|
|
313
|
+
'category_id': category_id,
|
|
314
|
+
'segmentation': [], # Empty for bounding boxes
|
|
315
|
+
'area': w * h,
|
|
316
|
+
'bbox': [x, y, w, h],
|
|
317
|
+
'iscrowd': 0,
|
|
318
|
+
'annotator': get_annotator(item, "unknown")
|
|
319
|
+
}
|
|
320
|
+
coco_data['annotations'].append(coco_annotation)
|
|
321
|
+
annotation_id += 1
|
|
322
|
+
valid_annotations = True
|
|
323
|
+
|
|
324
|
+
# Add image to the dataset if it has valid dimensions
|
|
325
|
+
if image_info['width'] is not None and image_info['height'] is not None and valid_annotations:
|
|
326
|
+
coco_data['images'].append(image_info)
|
|
327
|
+
|
|
328
|
+
# Write COCO JSON to file
|
|
329
|
+
with io.open(output_file, 'w', encoding='utf8') as f:
|
|
330
|
+
json.dump(coco_data, f, indent=2, ensure_ascii=False)
|
|
331
|
+
|
|
332
|
+
return output_file
|