label-studio-sdk 1.0.12__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.12 → label_studio_sdk-1.0.13}/PKG-INFO +2 -1
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/pyproject.toml +2 -1
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/converter.py +37 -83
- 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.12 → label_studio_sdk-1.0.13}/LICENSE +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/README.md +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/eval/categorical.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/label_studio_tools/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/label_studio_tools/core/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → 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.12 → 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.12 → 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.12 → 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.12 → 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.12 → 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.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/label_studio_tools/etl/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/label_studio_tools/etl/beam.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/label_studio_tools/etl/example.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/label_studio_tools/etl/registry.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/label_studio_tools/postprocessing/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/label_studio_tools/postprocessing/video.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/pager_ext.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_legacy/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_legacy/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_legacy/exceptions.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_legacy/project.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_legacy/schema/label_config_schema.json +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_legacy/users.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_legacy/utils.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_legacy/workspaces.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/actions/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/actions/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/actions/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/actions/types/actions_create_request_filters.py +0 -0
- {label_studio_sdk-1.0.12 → 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.12 → 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.12 → 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.12 → 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.12 → 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.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/actions/types/actions_create_request_id.py +0 -0
- {label_studio_sdk-1.0.12 → 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.12 → 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.12 → 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.12 → 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.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/annotations/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/annotations/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/annotations/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → 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.12 → 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.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/base_client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/comments/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/comments/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/audio.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/brush.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/exports/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/exports/brush_to_coco.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/exports/csv.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/exports/csv2.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/funsd.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/imports/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/imports/coco.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/imports/colors.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/imports/label_config.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/imports/pathtrack.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/imports/yolo.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/main.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/utils.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/core/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/core/api_error.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/core/client_wrapper.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/core/datetime_utils.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/core/file.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/core/http_client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/core/jsonable_encoder.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/core/pagination.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/core/pydantic_utilities.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/core/query_encoder.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/core/remove_none_from_dict.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/core/request_options.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/core/serialization.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/data_manager.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/environment.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/errors/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/errors/bad_request_error.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/errors/internal_server_error.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/errors/not_found_error.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/errors/unauthorized_error.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/azure/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/azure/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/azure/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → 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.12 → 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.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/gcs/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/gcs/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/gcs/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → 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.12 → 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.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/local/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/local/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/local/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → 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.12 → 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.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/redis/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/redis/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/redis/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → 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.12 → 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.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/s3/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/s3/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/s3/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/s3/types/s3create_response.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/s3/types/s3update_response.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/s3s/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/s3s/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → 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.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/files/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/files/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/azure/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/azure/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/azure/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → 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.12 → 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.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/gcs/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/gcs/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/gcs/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → 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.12 → 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.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/local/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/local/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/local/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → 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.12 → 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.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/redis/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/redis/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/redis/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → 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.12 → 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.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/s3/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/s3/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/s3/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/s3/types/s3create_response.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/s3/types/s3update_response.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/s3s/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/s3s/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → 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.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/jwt_settings/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/jwt_settings/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/label_interface/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/label_interface/base.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/label_interface/control_tags.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/label_interface/create.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/label_interface/data_examples.json +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/label_interface/interface.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/label_interface/label_tags.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/label_interface/object_tags.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/label_interface/objects.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/label_interface/region.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/ml/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/ml/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/ml/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → 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.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/ml/types/ml_create_response.py +0 -0
- {label_studio_sdk-1.0.12 → 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.12 → 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.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/ml/types/ml_update_response.py +0 -0
- {label_studio_sdk-1.0.12 → 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.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/model_providers/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/model_providers/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/predictions/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/predictions/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/client_ext.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/exports/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/exports/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/exports/client_ext.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/exports/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/exports/types/exports_convert_response.py +0 -0
- {label_studio_sdk-1.0.12 → 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.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/pauses/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/pauses/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/types/projects_create_response.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/types/projects_import_tasks_response.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/types/projects_list_response.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/types/projects_update_response.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/prompts/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/prompts/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/prompts/indicators/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/prompts/indicators/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/prompts/runs/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/prompts/runs/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/prompts/runs/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → 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.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/prompts/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → 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.12 → 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.12 → 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.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/prompts/types/prompts_batch_predictions_response.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/prompts/versions/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/prompts/versions/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/py.typed +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/tasks/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/tasks/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/tasks/client_ext.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/tasks/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/tasks/types/tasks_list_request_fields.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/tasks/types/tasks_list_response.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/tokens/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/tokens/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/tokens/client_ext.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/access_token_response.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/annotation.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/annotation_completed_by.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/annotation_filter_options.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/annotation_last_action.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/annotations_dm_field.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/annotations_dm_field_last_action.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/api_token_response.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/azure_blob_export_storage.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/azure_blob_export_storage_status.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/azure_blob_import_storage.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/azure_blob_import_storage_status.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/base_task.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/base_task_file_upload.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/base_task_updated_by.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/base_user.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/comment.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/comment_created_by.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/converted_format.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/converted_format_status.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/data_manager_task_serializer.py +0 -0
- {label_studio_sdk-1.0.12 → 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.12 → 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.12 → 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.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/export.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/export_format.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/export_snapshot.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/export_snapshot_status.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/export_status.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/file_upload.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/filter.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/filter_group.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/gcs_export_storage.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/gcs_export_storage_status.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/gcs_import_storage.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/gcs_import_storage_status.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/inference_run.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/inference_run_cost_estimate.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/inference_run_created_by.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/inference_run_organization.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/inference_run_project_subset.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/inference_run_status.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/jwt_settings_response.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/key_indicator_value.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/key_indicators.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/key_indicators_item.py +0 -0
- {label_studio_sdk-1.0.12 → 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.12 → 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.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/local_files_export_storage.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/local_files_export_storage_status.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/local_files_import_storage.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/local_files_import_storage_status.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/ml_backend.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/ml_backend_auth_method.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/ml_backend_state.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/model_provider_connection.py +0 -0
- {label_studio_sdk-1.0.12 → 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.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/model_provider_connection_created_by.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/model_provider_connection_organization.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/model_provider_connection_provider.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/model_provider_connection_scope.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/pause.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/pause_paused_by.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/prediction.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/project.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/project_import.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/project_import_status.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/project_label_config.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/project_sampling.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/project_skip_queue.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/prompt.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/prompt_associated_projects_item.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/prompt_associated_projects_item_id.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/prompt_created_by.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/prompt_organization.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/prompt_version.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/prompt_version_created_by.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/prompt_version_organization.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/prompt_version_provider.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/redis_export_storage.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/redis_export_storage_status.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/redis_import_storage.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/redis_import_storage_status.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/refined_prompt_response.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/refined_prompt_response_refinement_status.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/rotate_token_response.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/s3export_storage.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/s3export_storage_status.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/s3import_storage.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/s3import_storage_status.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/s3s_export_storage.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/s3s_import_storage.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/s3s_import_storage_status.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/serialization_option.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/serialization_options.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/task.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/task_annotators_item.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/task_comment_authors_item.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/task_filter_options.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/user_simple.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/view.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/webhook.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/webhook_actions_item.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/webhook_serializer_for_update.py +0 -0
- {label_studio_sdk-1.0.12 → 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.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/workspace.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/users/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/users/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/users/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/users/types/users_get_token_response.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/users/types/users_reset_token_response.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/version.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/versions/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/versions/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/versions/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/versions/types/versions_get_response.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/versions/types/versions_get_response_edition.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/views/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/views/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/views/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/views/types/views_create_request_data.py +0 -0
- {label_studio_sdk-1.0.12 → 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.12 → 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.12 → 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.12 → 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.12 → 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.12 → 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.12 → 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.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/views/types/views_update_request_data.py +0 -0
- {label_studio_sdk-1.0.12 → 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.12 → 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.12 → 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.12 → 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.12 → 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.12 → 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.12 → 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.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/webhooks/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/webhooks/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/webhooks/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → 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.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/workspaces/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/workspaces/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/workspaces/members/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/workspaces/members/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/workspaces/members/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/workspaces/members/types/members_create_response.py +0 -0
- {label_studio_sdk-1.0.12 → 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
|
|
@@ -29,6 +29,7 @@ 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
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 = []
|
|
@@ -45,6 +45,7 @@ jsonschema = ">=4.23.0"
|
|
|
45
45
|
lxml = ">=4.2.5"
|
|
46
46
|
nltk = "^3.9.1"
|
|
47
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"
|
{label_studio_sdk-1.0.12 → 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
|
|
|
@@ -109,13 +111,13 @@ class Converter(object):
|
|
|
109
111
|
"description": "Popular machine learning format used by the COCO dataset for object detection and image "
|
|
110
112
|
"segmentation tasks with polygons and rectangles.",
|
|
111
113
|
"link": "https://labelstud.io/guide/export.html#COCO",
|
|
112
|
-
"tags": ["image segmentation", "object detection"],
|
|
114
|
+
"tags": ["image segmentation", "object detection", "keypoints"],
|
|
113
115
|
},
|
|
114
116
|
Format.COCO_WITH_IMAGES: {
|
|
115
117
|
"title": "COCO with Images",
|
|
116
118
|
"description": "COCO format with images downloaded.",
|
|
117
119
|
"link": "https://labelstud.io/guide/export.html#COCO",
|
|
118
|
-
"tags": ["image segmentation", "object detection"],
|
|
120
|
+
"tags": ["image segmentation", "object detection", "keypoints"],
|
|
119
121
|
},
|
|
120
122
|
Format.VOC: {
|
|
121
123
|
"title": "Pascal VOC XML",
|
|
@@ -128,13 +130,13 @@ class Converter(object):
|
|
|
128
130
|
"description": "Popular TXT format is created for each image file. Each txt file contains annotations for "
|
|
129
131
|
"the corresponding image file, that is object class, object coordinates, height & width.",
|
|
130
132
|
"link": "https://labelstud.io/guide/export.html#YOLO",
|
|
131
|
-
"tags": ["image segmentation", "object detection"],
|
|
133
|
+
"tags": ["image segmentation", "object detection", "keypoints"],
|
|
132
134
|
},
|
|
133
135
|
Format.YOLO_WITH_IMAGES: {
|
|
134
136
|
"title": "YOLO with Images",
|
|
135
137
|
"description": "YOLO format with images downloaded.",
|
|
136
138
|
"link": "https://labelstud.io/guide/export.html#YOLO",
|
|
137
|
-
"tags": ["image segmentation", "object detection"],
|
|
139
|
+
"tags": ["image segmentation", "object detection", "keypoints"],
|
|
138
140
|
},
|
|
139
141
|
Format.YOLO_OBB: {
|
|
140
142
|
"title": "YOLOv8 OBB",
|
|
@@ -205,6 +207,7 @@ class Converter(object):
|
|
|
205
207
|
self._schema = None
|
|
206
208
|
self.access_token = access_token
|
|
207
209
|
self.hostname = hostname
|
|
210
|
+
self.is_keypoints = None
|
|
208
211
|
|
|
209
212
|
if isinstance(config, dict):
|
|
210
213
|
self._schema = config
|
|
@@ -376,11 +379,14 @@ class Converter(object):
|
|
|
376
379
|
and (
|
|
377
380
|
"RectangleLabels" in output_tag_types
|
|
378
381
|
or "PolygonLabels" in output_tag_types
|
|
382
|
+
or "KeyPointLabels" in output_tag_types
|
|
379
383
|
)
|
|
380
384
|
or "Rectangle" in output_tag_types
|
|
381
385
|
and "Labels" in output_tag_types
|
|
382
386
|
or "PolygonLabels" in output_tag_types
|
|
383
387
|
and "Labels" in output_tag_types
|
|
388
|
+
or "KeyPointLabels" in output_tag_types
|
|
389
|
+
and "Labels" in output_tag_types
|
|
384
390
|
):
|
|
385
391
|
all_formats.remove(Format.COCO.name)
|
|
386
392
|
all_formats.remove(Format.COCO_WITH_IMAGES.name)
|
|
@@ -522,6 +528,9 @@ class Converter(object):
|
|
|
522
528
|
if "original_height" in r:
|
|
523
529
|
v["original_height"] = r["original_height"]
|
|
524
530
|
outputs[r["from_name"]].append(v)
|
|
531
|
+
if self.is_keypoints:
|
|
532
|
+
v['id'] = r.get('id')
|
|
533
|
+
v['parentID'] = r.get('parentID')
|
|
525
534
|
|
|
526
535
|
data = Converter.get_data(task, outputs, annotation)
|
|
527
536
|
if "agreement" in task:
|
|
@@ -638,6 +647,7 @@ class Converter(object):
|
|
|
638
647
|
os.makedirs(output_image_dir, exist_ok=True)
|
|
639
648
|
images, categories, annotations = [], [], []
|
|
640
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)
|
|
641
651
|
data_key = self._data_keys[0]
|
|
642
652
|
item_iterator = (
|
|
643
653
|
self.iter_from_dir(input_data)
|
|
@@ -703,9 +713,10 @@ class Converter(object):
|
|
|
703
713
|
logger.debug(f'Empty bboxes for {item["output"]}')
|
|
704
714
|
continue
|
|
705
715
|
|
|
716
|
+
keypoint_labels = []
|
|
706
717
|
for label in labels:
|
|
707
718
|
category_name = None
|
|
708
|
-
for key in ["rectanglelabels", "polygonlabels", "labels"]:
|
|
719
|
+
for key in ["rectanglelabels", "polygonlabels", "keypointlabels", "labels"]:
|
|
709
720
|
if key in label and len(label[key]) > 0:
|
|
710
721
|
category_name = label[key][0]
|
|
711
722
|
break
|
|
@@ -775,11 +786,22 @@ class Converter(object):
|
|
|
775
786
|
"area": get_polygon_area(x, y),
|
|
776
787
|
}
|
|
777
788
|
)
|
|
789
|
+
elif "keypointlabels" in label:
|
|
790
|
+
keypoint_labels.append(label)
|
|
778
791
|
else:
|
|
779
792
|
raise ValueError("Unknown label type")
|
|
780
793
|
|
|
781
794
|
if os.getenv("LABEL_STUDIO_FORCE_ANNOTATOR_EXPORT"):
|
|
782
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
|
+
))
|
|
783
805
|
|
|
784
806
|
with io.open(output_file, mode="w", encoding="utf8") as fout:
|
|
785
807
|
json.dump(
|
|
@@ -846,7 +868,14 @@ class Converter(object):
|
|
|
846
868
|
else:
|
|
847
869
|
output_label_dir = os.path.join(output_dir, "labels")
|
|
848
870
|
os.makedirs(output_label_dir, exist_ok=True)
|
|
849
|
-
|
|
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()
|
|
850
879
|
data_key = self._data_keys[0]
|
|
851
880
|
item_iterator = (
|
|
852
881
|
self.iter_from_dir(input_data)
|
|
@@ -923,82 +952,7 @@ class Converter(object):
|
|
|
923
952
|
pass
|
|
924
953
|
continue
|
|
925
954
|
|
|
926
|
-
|
|
927
|
-
for label in labels:
|
|
928
|
-
category_name = None
|
|
929
|
-
category_names = [] # considering multi-label
|
|
930
|
-
for key in ["rectanglelabels", "polygonlabels", "labels"]:
|
|
931
|
-
if key in label and len(label[key]) > 0:
|
|
932
|
-
# change to save multi-label
|
|
933
|
-
for category_name in label[key]:
|
|
934
|
-
category_names.append(category_name)
|
|
935
|
-
|
|
936
|
-
if len(category_names) == 0:
|
|
937
|
-
logger.debug(
|
|
938
|
-
"Unknown label type or labels are empty: " + str(label)
|
|
939
|
-
)
|
|
940
|
-
continue
|
|
941
|
-
|
|
942
|
-
for category_name in category_names:
|
|
943
|
-
if category_name not in category_name_to_id:
|
|
944
|
-
category_id = len(categories)
|
|
945
|
-
category_name_to_id[category_name] = category_id
|
|
946
|
-
categories.append({"id": category_id, "name": category_name})
|
|
947
|
-
category_id = category_name_to_id[category_name]
|
|
948
|
-
|
|
949
|
-
if (
|
|
950
|
-
"rectanglelabels" in label
|
|
951
|
-
or "rectangle" in label
|
|
952
|
-
or "labels" in label
|
|
953
|
-
):
|
|
954
|
-
# yolo obb
|
|
955
|
-
if is_obb:
|
|
956
|
-
obb_annotation = convert_annotation_to_yolo_obb(label)
|
|
957
|
-
if obb_annotation is None:
|
|
958
|
-
continue
|
|
959
|
-
|
|
960
|
-
top_left, top_right, bottom_right, bottom_left = (
|
|
961
|
-
obb_annotation
|
|
962
|
-
)
|
|
963
|
-
x1, y1 = top_left
|
|
964
|
-
x2, y2 = top_right
|
|
965
|
-
x3, y3 = bottom_right
|
|
966
|
-
x4, y4 = bottom_left
|
|
967
|
-
annotations.append(
|
|
968
|
-
[category_id, x1, y1, x2, y2, x3, y3, x4, y4]
|
|
969
|
-
)
|
|
970
|
-
|
|
971
|
-
# simple yolo
|
|
972
|
-
else:
|
|
973
|
-
annotation = convert_annotation_to_yolo(label)
|
|
974
|
-
if annotation is None:
|
|
975
|
-
continue
|
|
976
|
-
|
|
977
|
-
(
|
|
978
|
-
x,
|
|
979
|
-
y,
|
|
980
|
-
w,
|
|
981
|
-
h,
|
|
982
|
-
) = annotation
|
|
983
|
-
annotations.append([category_id, x, y, w, h])
|
|
984
|
-
|
|
985
|
-
elif "polygonlabels" in label or "polygon" in label:
|
|
986
|
-
if not ('points' in label):
|
|
987
|
-
continue
|
|
988
|
-
points_abs = [(x / 100, y / 100) for x, y in label["points"]]
|
|
989
|
-
annotations.append(
|
|
990
|
-
[category_id]
|
|
991
|
-
+ [coord for point in points_abs for coord in point]
|
|
992
|
-
)
|
|
993
|
-
else:
|
|
994
|
-
raise ValueError(f"Unknown label type {label}")
|
|
995
|
-
with open(label_path, "w") as f:
|
|
996
|
-
for annotation in annotations:
|
|
997
|
-
for idx, l in enumerate(annotation):
|
|
998
|
-
if idx == len(annotation) - 1:
|
|
999
|
-
f.write(f"{l}\n")
|
|
1000
|
-
else:
|
|
1001
|
-
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)
|
|
1002
956
|
with open(class_file, "w", encoding="utf8") as f:
|
|
1003
957
|
for c in categories:
|
|
1004
958
|
f.write(c["name"] + "\n")
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from label_studio_sdk.converter.utils import convert_annotation_to_yolo, convert_annotation_to_yolo_obb
|
|
3
|
+
from label_studio_sdk.converter.keypoints import build_kp_order
|
|
4
|
+
|
|
5
|
+
logger = logging.getLogger(__name__)
|
|
6
|
+
|
|
7
|
+
def process_keypoints_for_yolo(labels, label_path,
|
|
8
|
+
category_name_to_id, categories,
|
|
9
|
+
is_obb, kp_order):
|
|
10
|
+
class_map = {c['name']: c['id'] for c in categories}
|
|
11
|
+
|
|
12
|
+
rectangles = {}
|
|
13
|
+
for item in labels:
|
|
14
|
+
if item['type'].lower() == 'rectanglelabels':
|
|
15
|
+
bbox_id = item['id']
|
|
16
|
+
cls_name = item['rectanglelabels'][0]
|
|
17
|
+
cls_idx = class_map.get(cls_name)
|
|
18
|
+
if cls_idx is None:
|
|
19
|
+
continue
|
|
20
|
+
|
|
21
|
+
x = item['x'] / 100.0
|
|
22
|
+
y = item['y'] / 100.0
|
|
23
|
+
width = item['width'] / 100.0
|
|
24
|
+
height = item['height'] / 100.0
|
|
25
|
+
x_c = x + width / 2.0
|
|
26
|
+
y_c = y + height / 2.0
|
|
27
|
+
|
|
28
|
+
rectangles[bbox_id] = {
|
|
29
|
+
'class_idx': cls_idx,
|
|
30
|
+
'x_center': x_c,
|
|
31
|
+
'y_center': y_c,
|
|
32
|
+
'width': width,
|
|
33
|
+
'height': height,
|
|
34
|
+
'kp_dict': {}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
for item in labels:
|
|
38
|
+
if item['type'].lower() == 'keypointlabels':
|
|
39
|
+
parent_id = item.get('parentID')
|
|
40
|
+
if parent_id not in rectangles:
|
|
41
|
+
continue
|
|
42
|
+
label_name = item['keypointlabels'][0]
|
|
43
|
+
kp_x = item['x'] / 100.0
|
|
44
|
+
kp_y = item['y'] / 100.0
|
|
45
|
+
rectangles[parent_id]['kp_dict'][label_name] = (kp_x, kp_y, 2) # 2 = visible
|
|
46
|
+
|
|
47
|
+
lines = []
|
|
48
|
+
for rect in rectangles.values():
|
|
49
|
+
base = [
|
|
50
|
+
rect['class_idx'],
|
|
51
|
+
rect['x_center'],
|
|
52
|
+
rect['y_center'],
|
|
53
|
+
rect['width'],
|
|
54
|
+
rect['height']
|
|
55
|
+
]
|
|
56
|
+
keypoints = []
|
|
57
|
+
for k in kp_order:
|
|
58
|
+
keypoints.extend(rect['kp_dict'].get(k, (0.0, 0.0, 0)))
|
|
59
|
+
line = ' '.join(map(str, base + keypoints))
|
|
60
|
+
lines.append(line)
|
|
61
|
+
|
|
62
|
+
with open(label_path, 'w', encoding='utf-8') as f:
|
|
63
|
+
f.write('\n'.join(lines))
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def process_and_save_yolo_annotations(labels, label_path, category_name_to_id, categories, is_obb, is_keypoints, label_config):
|
|
67
|
+
if is_keypoints:
|
|
68
|
+
kp_order = build_kp_order(label_config)
|
|
69
|
+
process_keypoints_for_yolo(labels, label_path, category_name_to_id, categories, is_obb, kp_order)
|
|
70
|
+
return categories, category_name_to_id
|
|
71
|
+
|
|
72
|
+
annotations = []
|
|
73
|
+
for label in labels:
|
|
74
|
+
category_name = None
|
|
75
|
+
category_names = [] # considering multi-label
|
|
76
|
+
for key in ["rectanglelabels", "polygonlabels", "labels"]:
|
|
77
|
+
if key in label and len(label[key]) > 0:
|
|
78
|
+
# change to save multi-label
|
|
79
|
+
for category_name in label[key]:
|
|
80
|
+
category_names.append(category_name)
|
|
81
|
+
|
|
82
|
+
if len(category_names) == 0:
|
|
83
|
+
logger.debug(
|
|
84
|
+
"Unknown label type or labels are empty: " + str(label)
|
|
85
|
+
)
|
|
86
|
+
continue
|
|
87
|
+
|
|
88
|
+
for category_name in category_names:
|
|
89
|
+
if category_name not in category_name_to_id:
|
|
90
|
+
category_id = len(categories)
|
|
91
|
+
category_name_to_id[category_name] = category_id
|
|
92
|
+
categories.append({"id": category_id, "name": category_name})
|
|
93
|
+
category_id = category_name_to_id[category_name]
|
|
94
|
+
|
|
95
|
+
if (
|
|
96
|
+
"rectanglelabels" in label
|
|
97
|
+
or "rectangle" in label
|
|
98
|
+
or "labels" in label
|
|
99
|
+
):
|
|
100
|
+
# yolo obb
|
|
101
|
+
if is_obb:
|
|
102
|
+
obb_annotation = convert_annotation_to_yolo_obb(label)
|
|
103
|
+
if obb_annotation is None:
|
|
104
|
+
continue
|
|
105
|
+
|
|
106
|
+
top_left, top_right, bottom_right, bottom_left = (
|
|
107
|
+
obb_annotation
|
|
108
|
+
)
|
|
109
|
+
x1, y1 = top_left
|
|
110
|
+
x2, y2 = top_right
|
|
111
|
+
x3, y3 = bottom_right
|
|
112
|
+
x4, y4 = bottom_left
|
|
113
|
+
annotations.append(
|
|
114
|
+
[category_id, x1, y1, x2, y2, x3, y3, x4, y4]
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
# simple yolo
|
|
118
|
+
else:
|
|
119
|
+
annotation = convert_annotation_to_yolo(label)
|
|
120
|
+
if annotation is None:
|
|
121
|
+
continue
|
|
122
|
+
|
|
123
|
+
(
|
|
124
|
+
x,
|
|
125
|
+
y,
|
|
126
|
+
w,
|
|
127
|
+
h,
|
|
128
|
+
) = annotation
|
|
129
|
+
annotations.append([category_id, x, y, w, h])
|
|
130
|
+
|
|
131
|
+
elif "polygonlabels" in label or "polygon" in label:
|
|
132
|
+
if not ('points' in label):
|
|
133
|
+
continue
|
|
134
|
+
points_abs = [(x / 100, y / 100) for x, y in label["points"]]
|
|
135
|
+
annotations.append(
|
|
136
|
+
[category_id]
|
|
137
|
+
+ [coord for point in points_abs for coord in point]
|
|
138
|
+
)
|
|
139
|
+
else:
|
|
140
|
+
raise ValueError(f"Unknown label type {label}")
|
|
141
|
+
with open(label_path, "w") as f:
|
|
142
|
+
for annotation in annotations:
|
|
143
|
+
for idx, l in enumerate(annotation):
|
|
144
|
+
if idx == len(annotation) - 1:
|
|
145
|
+
f.write(f"{l}\n")
|
|
146
|
+
else:
|
|
147
|
+
f.write(f"{l} ")
|
|
148
|
+
|
|
149
|
+
return categories, category_name_to_id
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import json
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def keypoints_in_label_config(label_config):
|
|
6
|
+
"""
|
|
7
|
+
Check if the label config contains keypoints.
|
|
8
|
+
:param label_config: Label config in JSON format.
|
|
9
|
+
:return: True if keypoints are present, False otherwise.
|
|
10
|
+
"""
|
|
11
|
+
for cfg in label_config.values():
|
|
12
|
+
if cfg.get("type") == "KeyPointLabels":
|
|
13
|
+
return True
|
|
14
|
+
return False
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def update_categories_for_keypoints(categories, category_name_to_id, label_config):
|
|
18
|
+
keypoint_labels = []
|
|
19
|
+
for cfg in label_config.values():
|
|
20
|
+
if cfg.get("type") == "KeyPointLabels":
|
|
21
|
+
keypoint_labels.extend(cfg.get("labels", []))
|
|
22
|
+
keypoint_labels = list(dict.fromkeys(keypoint_labels))
|
|
23
|
+
|
|
24
|
+
non_kp = [cat.copy() for cat in categories if cat["name"] not in keypoint_labels]
|
|
25
|
+
|
|
26
|
+
new_categories = []
|
|
27
|
+
new_mapping = {}
|
|
28
|
+
next_id = 0
|
|
29
|
+
for cat in non_kp:
|
|
30
|
+
cat["id"] = next_id
|
|
31
|
+
new_categories.append(cat)
|
|
32
|
+
new_mapping[cat["name"]] = next_id
|
|
33
|
+
next_id += 1
|
|
34
|
+
|
|
35
|
+
if keypoint_labels:
|
|
36
|
+
merged_id = next_id
|
|
37
|
+
merged_category = {
|
|
38
|
+
"id": merged_id,
|
|
39
|
+
"name": "default",
|
|
40
|
+
"supercategory": "default",
|
|
41
|
+
"keypoints": keypoint_labels,
|
|
42
|
+
"skeleton": []
|
|
43
|
+
}
|
|
44
|
+
new_categories.append(merged_category)
|
|
45
|
+
for kp_name in keypoint_labels:
|
|
46
|
+
new_mapping[kp_name] = merged_id
|
|
47
|
+
|
|
48
|
+
return new_categories, new_mapping
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def build_kp_order(label_config):
|
|
52
|
+
kp_block = {}
|
|
53
|
+
|
|
54
|
+
for tag in label_config.values():
|
|
55
|
+
if tag.get("type") == "KeyPointLabels":
|
|
56
|
+
kp_block.update(tag.get("labels_attrs", {}))
|
|
57
|
+
|
|
58
|
+
pairs, used = [], set()
|
|
59
|
+
|
|
60
|
+
for name, attrs in kp_block.items():
|
|
61
|
+
try:
|
|
62
|
+
idx = int(attrs.get("model_index"))
|
|
63
|
+
except (TypeError, ValueError):
|
|
64
|
+
continue
|
|
65
|
+
if idx in used:
|
|
66
|
+
continue
|
|
67
|
+
pairs.append((idx, name))
|
|
68
|
+
used.add(idx)
|
|
69
|
+
|
|
70
|
+
pairs.sort(key=lambda p: p[0])
|
|
71
|
+
result = [name for _, name in pairs]
|
|
72
|
+
return result
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def get_bbox_coco(keypoints, kp_order):
|
|
76
|
+
xs = [keypoints[3*i] for i in range(len(kp_order)) if keypoints[3*i + 2] > 0]
|
|
77
|
+
ys = [keypoints[3*i + 1] for i in range(len(kp_order)) if keypoints[3*i + 2] > 0]
|
|
78
|
+
if xs and ys:
|
|
79
|
+
x_min = min(xs)
|
|
80
|
+
y_min = min(ys)
|
|
81
|
+
x_max = max(xs)
|
|
82
|
+
y_max = max(ys)
|
|
83
|
+
width = x_max - x_min
|
|
84
|
+
height = y_max - y_min
|
|
85
|
+
bbox = [x_min, y_min, width, height]
|
|
86
|
+
else:
|
|
87
|
+
bbox = [0, 0, 0, 0]
|
|
88
|
+
return bbox
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def process_keypoints_for_coco(keypoint_labels, kp_order, annotation_id, image_id, category_name_to_id):
|
|
92
|
+
keypoints = [0] * (len(kp_order) * 3)
|
|
93
|
+
|
|
94
|
+
for kp in keypoint_labels:
|
|
95
|
+
width, height = kp["original_width"], kp["original_height"]
|
|
96
|
+
x, y = kp['x'] / 100 * width, kp['y'] / 100 * height
|
|
97
|
+
labels = kp.get('keypointlabels', [])
|
|
98
|
+
v = 2 if labels else 0
|
|
99
|
+
for label in labels:
|
|
100
|
+
if label in kp_order:
|
|
101
|
+
idx = kp_order.index(label)
|
|
102
|
+
keypoints[3 * idx] = int(round(x))
|
|
103
|
+
keypoints[3 * idx + 1] = int(round(y))
|
|
104
|
+
keypoints[3 * idx + 2] = v
|
|
105
|
+
|
|
106
|
+
num_keypoints = sum(1 for i in range(len(kp_order)) if keypoints[3*i + 2] > 0)
|
|
107
|
+
|
|
108
|
+
bbox = get_bbox_coco(keypoints, kp_order)
|
|
109
|
+
|
|
110
|
+
category_id = category_name_to_id.get(kp_order[0], 0)
|
|
111
|
+
annotation = {
|
|
112
|
+
'id': annotation_id,
|
|
113
|
+
'image_id': image_id,
|
|
114
|
+
'category_id': category_id,
|
|
115
|
+
'keypoints': keypoints,
|
|
116
|
+
'num_keypoints': num_keypoints,
|
|
117
|
+
'bbox': bbox,
|
|
118
|
+
'iscrowd': 0
|
|
119
|
+
}
|
|
120
|
+
return annotation
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def get_yolo_categories_for_keypoints(label_config):
|
|
124
|
+
# Get all keypoint labels from the label config
|
|
125
|
+
keypoint_labels = []
|
|
126
|
+
for cfg in label_config.values():
|
|
127
|
+
if cfg.get("type") == "KeyPointLabels":
|
|
128
|
+
keypoint_labels.extend(cfg.get("labels", []))
|
|
129
|
+
keypoint_labels = list(dict.fromkeys(keypoint_labels)) # Remove duplicates
|
|
130
|
+
|
|
131
|
+
# Get all rectangle labels from the label config
|
|
132
|
+
rectangle_labels = []
|
|
133
|
+
for cfg in label_config.values():
|
|
134
|
+
if cfg.get("type") == "RectangleLabels":
|
|
135
|
+
rectangle_labels.extend(cfg.get("labels", []))
|
|
136
|
+
rectangle_labels = list(dict.fromkeys(rectangle_labels)) # Remove duplicates
|
|
137
|
+
|
|
138
|
+
# Create categories for each rectangle label
|
|
139
|
+
categories = []
|
|
140
|
+
category_name_to_id = {}
|
|
141
|
+
|
|
142
|
+
for i, label in enumerate(rectangle_labels):
|
|
143
|
+
categories.append({"id": i, "name": label, "keypoints": keypoint_labels})
|
|
144
|
+
category_name_to_id[label] = i
|
|
145
|
+
|
|
146
|
+
return categories, category_name_to_id
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/pager_ext.py
RENAMED
|
File without changes
|
{label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_legacy/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_legacy/exceptions.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_legacy/workspaces.py
RENAMED
|
File without changes
|
{label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/actions/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/actions/types/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|