label-studio-sdk 1.0.12__tar.gz → 1.0.14__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.
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/PKG-INFO +2 -1
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/pyproject.toml +2 -1
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/_extensions/label_studio_tools/core/utils/io.py +127 -2
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/converter/converter.py +37 -83
- label_studio_sdk-1.0.14/src/label_studio_sdk/converter/exports/yolo.py +149 -0
- label_studio_sdk-1.0.14/src/label_studio_sdk/converter/keypoints.py +146 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/core/client_wrapper.py +1 -1
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/label_interface/interface.py +15 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/label_interface/object_tags.py +6 -1
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/tokens/client_ext.py +20 -3
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/LICENSE +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/README.md +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/_extensions/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/_extensions/eval/categorical.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/_extensions/label_studio_tools/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/_extensions/label_studio_tools/core/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/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.14}/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.14}/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.14}/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.14}/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.14}/src/label_studio_sdk/_extensions/label_studio_tools/etl/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/_extensions/label_studio_tools/etl/beam.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/_extensions/label_studio_tools/etl/example.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/_extensions/label_studio_tools/etl/registry.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/_extensions/label_studio_tools/postprocessing/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/_extensions/label_studio_tools/postprocessing/video.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/_extensions/pager_ext.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/_legacy/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/_legacy/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/_legacy/exceptions.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/_legacy/project.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/_legacy/schema/label_config_schema.json +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/_legacy/users.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/_legacy/utils.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/_legacy/workspaces.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/actions/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/actions/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/actions/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/actions/types/actions_create_request_filters.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/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.14}/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.14}/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.14}/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.14}/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.14}/src/label_studio_sdk/actions/types/actions_create_request_id.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/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.14}/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.14}/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.14}/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.14}/src/label_studio_sdk/annotations/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/annotations/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/annotations/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/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.14}/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.14}/src/label_studio_sdk/base_client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/comments/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/comments/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/converter/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/converter/audio.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/converter/brush.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/converter/exports/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/converter/exports/brush_to_coco.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/converter/exports/csv.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/converter/exports/csv2.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/converter/funsd.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/converter/imports/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/converter/imports/coco.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/converter/imports/colors.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/converter/imports/label_config.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/converter/imports/pathtrack.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/converter/imports/yolo.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/converter/main.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/converter/utils.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/core/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/core/api_error.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/core/datetime_utils.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/core/file.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/core/http_client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/core/jsonable_encoder.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/core/pagination.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/core/pydantic_utilities.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/core/query_encoder.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/core/remove_none_from_dict.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/core/request_options.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/core/serialization.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/data_manager.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/environment.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/errors/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/errors/bad_request_error.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/errors/internal_server_error.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/errors/not_found_error.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/errors/unauthorized_error.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/export_storage/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/export_storage/azure/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/export_storage/azure/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/export_storage/azure/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/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.14}/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.14}/src/label_studio_sdk/export_storage/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/export_storage/gcs/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/export_storage/gcs/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/export_storage/gcs/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/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.14}/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.14}/src/label_studio_sdk/export_storage/local/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/export_storage/local/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/export_storage/local/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/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.14}/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.14}/src/label_studio_sdk/export_storage/redis/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/export_storage/redis/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/export_storage/redis/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/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.14}/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.14}/src/label_studio_sdk/export_storage/s3/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/export_storage/s3/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/export_storage/s3/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/export_storage/s3/types/s3create_response.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/export_storage/s3/types/s3update_response.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/export_storage/s3s/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/export_storage/s3s/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/export_storage/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/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.14}/src/label_studio_sdk/files/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/files/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/import_storage/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/import_storage/azure/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/import_storage/azure/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/import_storage/azure/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/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.14}/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.14}/src/label_studio_sdk/import_storage/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/import_storage/gcs/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/import_storage/gcs/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/import_storage/gcs/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/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.14}/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.14}/src/label_studio_sdk/import_storage/local/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/import_storage/local/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/import_storage/local/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/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.14}/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.14}/src/label_studio_sdk/import_storage/redis/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/import_storage/redis/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/import_storage/redis/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/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.14}/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.14}/src/label_studio_sdk/import_storage/s3/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/import_storage/s3/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/import_storage/s3/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/import_storage/s3/types/s3create_response.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/import_storage/s3/types/s3update_response.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/import_storage/s3s/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/import_storage/s3s/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/import_storage/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/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.14}/src/label_studio_sdk/jwt_settings/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/jwt_settings/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/label_interface/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/label_interface/base.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/label_interface/control_tags.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/label_interface/create.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/label_interface/data_examples.json +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/label_interface/label_tags.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/label_interface/objects.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/label_interface/region.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/ml/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/ml/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/ml/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/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.14}/src/label_studio_sdk/ml/types/ml_create_response.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/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.14}/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.14}/src/label_studio_sdk/ml/types/ml_update_response.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/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.14}/src/label_studio_sdk/model_providers/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/model_providers/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/predictions/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/predictions/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/projects/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/projects/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/projects/client_ext.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/projects/exports/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/projects/exports/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/projects/exports/client_ext.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/projects/exports/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/projects/exports/types/exports_convert_response.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/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.14}/src/label_studio_sdk/projects/pauses/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/projects/pauses/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/projects/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/projects/types/projects_create_response.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/projects/types/projects_import_tasks_response.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/projects/types/projects_list_response.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/projects/types/projects_update_response.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/prompts/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/prompts/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/prompts/indicators/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/prompts/indicators/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/prompts/runs/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/prompts/runs/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/prompts/runs/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/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.14}/src/label_studio_sdk/prompts/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/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.14}/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.14}/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.14}/src/label_studio_sdk/prompts/types/prompts_batch_predictions_response.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/prompts/versions/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/prompts/versions/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/py.typed +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/tasks/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/tasks/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/tasks/client_ext.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/tasks/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/tasks/types/tasks_list_request_fields.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/tasks/types/tasks_list_response.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/tokens/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/tokens/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/access_token_response.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/annotation.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/annotation_completed_by.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/annotation_filter_options.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/annotation_last_action.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/annotations_dm_field.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/annotations_dm_field_last_action.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/api_token_response.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/azure_blob_export_storage.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/azure_blob_export_storage_status.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/azure_blob_import_storage.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/azure_blob_import_storage_status.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/base_task.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/base_task_file_upload.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/base_task_updated_by.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/base_user.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/comment.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/comment_created_by.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/converted_format.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/converted_format_status.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/data_manager_task_serializer.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/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.14}/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.14}/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.14}/src/label_studio_sdk/types/export.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/export_format.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/export_snapshot.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/export_snapshot_status.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/export_status.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/file_upload.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/filter.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/filter_group.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/gcs_export_storage.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/gcs_export_storage_status.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/gcs_import_storage.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/gcs_import_storage_status.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/inference_run.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/inference_run_cost_estimate.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/inference_run_created_by.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/inference_run_organization.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/inference_run_project_subset.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/inference_run_status.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/jwt_settings_response.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/key_indicator_value.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/key_indicators.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/key_indicators_item.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/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.14}/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.14}/src/label_studio_sdk/types/local_files_export_storage.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/local_files_export_storage_status.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/local_files_import_storage.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/local_files_import_storage_status.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/ml_backend.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/ml_backend_auth_method.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/ml_backend_state.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/model_provider_connection.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/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.14}/src/label_studio_sdk/types/model_provider_connection_created_by.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/model_provider_connection_organization.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/model_provider_connection_provider.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/model_provider_connection_scope.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/pause.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/pause_paused_by.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/prediction.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/project.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/project_import.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/project_import_status.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/project_label_config.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/project_sampling.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/project_skip_queue.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/prompt.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/prompt_associated_projects_item.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/prompt_associated_projects_item_id.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/prompt_created_by.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/prompt_organization.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/prompt_version.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/prompt_version_created_by.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/prompt_version_organization.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/prompt_version_provider.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/redis_export_storage.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/redis_export_storage_status.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/redis_import_storage.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/redis_import_storage_status.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/refined_prompt_response.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/refined_prompt_response_refinement_status.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/rotate_token_response.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/s3export_storage.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/s3export_storage_status.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/s3import_storage.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/s3import_storage_status.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/s3s_export_storage.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/s3s_import_storage.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/s3s_import_storage_status.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/serialization_option.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/serialization_options.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/task.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/task_annotators_item.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/task_comment_authors_item.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/task_filter_options.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/user_simple.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/view.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/webhook.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/webhook_actions_item.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/webhook_serializer_for_update.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/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.14}/src/label_studio_sdk/types/workspace.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/users/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/users/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/users/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/users/types/users_get_token_response.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/users/types/users_reset_token_response.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/version.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/versions/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/versions/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/versions/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/versions/types/versions_get_response.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/versions/types/versions_get_response_edition.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/views/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/views/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/views/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/views/types/views_create_request_data.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/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.14}/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.14}/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.14}/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.14}/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.14}/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.14}/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.14}/src/label_studio_sdk/views/types/views_update_request_data.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/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.14}/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.14}/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.14}/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.14}/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.14}/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.14}/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.14}/src/label_studio_sdk/webhooks/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/webhooks/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/webhooks/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/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.14}/src/label_studio_sdk/workspaces/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/workspaces/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/workspaces/members/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/workspaces/members/client.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/workspaces/members/types/__init__.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/workspaces/members/types/members_create_response.py +0 -0
- {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/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.14
|
|
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.14"
|
|
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"
|
|
@@ -3,6 +3,7 @@ import io
|
|
|
3
3
|
import logging
|
|
4
4
|
import os
|
|
5
5
|
import shutil
|
|
6
|
+
import base64
|
|
6
7
|
from contextlib import contextmanager
|
|
7
8
|
from tempfile import mkdtemp
|
|
8
9
|
from urllib.parse import urlparse
|
|
@@ -201,7 +202,7 @@ def download_and_cache(
|
|
|
201
202
|
|
|
202
203
|
# local storage: /data/local-files?d=dir/1.jpg => 1.jpg
|
|
203
204
|
if is_local_storage_file:
|
|
204
|
-
url_filename = os.path.basename(url.split(
|
|
205
|
+
url_filename = os.path.basename(url.split("?d=")[1])
|
|
205
206
|
# cloud storage: s3://bucket/1.jpg => 1.jpg
|
|
206
207
|
elif is_cloud_storage_file:
|
|
207
208
|
url_filename = os.path.basename(url)
|
|
@@ -213,7 +214,11 @@ def download_and_cache(
|
|
|
213
214
|
filepath = os.path.join(cache_dir, url_hash + "__" + url_filename)
|
|
214
215
|
|
|
215
216
|
if not os.path.exists(filepath):
|
|
216
|
-
logger.info(
|
|
217
|
+
logger.info(
|
|
218
|
+
"Download {url} to {filepath}. download_resources: {download_resources}".format(
|
|
219
|
+
url=url, filepath=filepath, download_resources=download_resources
|
|
220
|
+
)
|
|
221
|
+
)
|
|
217
222
|
if download_resources:
|
|
218
223
|
headers = {
|
|
219
224
|
# avoid requests.exceptions.HTTPError: 403 Client Error: Forbidden. Please comply with the User-Agent policy:
|
|
@@ -256,3 +261,123 @@ def get_all_files_from_dir(d):
|
|
|
256
261
|
if os.path.isfile(filepath):
|
|
257
262
|
out.append(filepath)
|
|
258
263
|
return out
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
def get_base64_content(
|
|
267
|
+
url,
|
|
268
|
+
hostname=None,
|
|
269
|
+
access_token=None,
|
|
270
|
+
task_id=None,
|
|
271
|
+
):
|
|
272
|
+
"""This helper function is used to download a file and return its base64 representation without saving to filesystem.
|
|
273
|
+
|
|
274
|
+
:param url: File URL to download, it can be a uploaded file, local storage, cloud storage file or just http(s) url
|
|
275
|
+
:param hostname: Label Studio Hostname, it will be used for uploaded files, local storage files and cloud storage files
|
|
276
|
+
if not provided, it will be taken from LABEL_STUDIO_URL env variable
|
|
277
|
+
:param access_token: Label Studio access token, it will be used for uploaded files, local storage files and cloud storage files
|
|
278
|
+
if not provided, it will be taken from LABEL_STUDIO_API_KEY env variable
|
|
279
|
+
:param task_id: Label Studio Task ID, required for cloud storage files
|
|
280
|
+
because the URL will be rebuilt to `{hostname}/tasks/{task_id}/presign/?fileuri={url}`
|
|
281
|
+
|
|
282
|
+
:return: base64 encoded file content
|
|
283
|
+
"""
|
|
284
|
+
# get environment variables
|
|
285
|
+
hostname = (
|
|
286
|
+
hostname
|
|
287
|
+
or os.getenv("LABEL_STUDIO_URL", "")
|
|
288
|
+
or os.getenv("LABEL_STUDIO_HOST", "")
|
|
289
|
+
)
|
|
290
|
+
access_token = (
|
|
291
|
+
access_token
|
|
292
|
+
or os.getenv("LABEL_STUDIO_API_KEY", "")
|
|
293
|
+
or os.getenv("LABEL_STUDIO_ACCESS_TOKEN", "")
|
|
294
|
+
)
|
|
295
|
+
if "localhost" in hostname:
|
|
296
|
+
logger.warning(
|
|
297
|
+
f"Using `localhost` ({hostname}) in LABEL_STUDIO_URL, "
|
|
298
|
+
f"`localhost` is not accessible inside of docker containers. "
|
|
299
|
+
f"You can check your IP with utilities like `ifconfig` and set it as LABEL_STUDIO_URL."
|
|
300
|
+
)
|
|
301
|
+
if hostname and not (
|
|
302
|
+
hostname.startswith("http://") or hostname.startswith("https://")
|
|
303
|
+
):
|
|
304
|
+
raise ValueError(
|
|
305
|
+
f"Invalid hostname in LABEL_STUDIO_URL: {hostname}. "
|
|
306
|
+
"Please provide full URL starting with protocol (http:// or https://)."
|
|
307
|
+
)
|
|
308
|
+
|
|
309
|
+
# fix file upload url
|
|
310
|
+
if url.startswith("upload") or url.startswith("/upload"):
|
|
311
|
+
url = "/data" + ("" if url.startswith("/") else "/") + url
|
|
312
|
+
|
|
313
|
+
is_uploaded_file = url.startswith("/data/upload")
|
|
314
|
+
is_local_storage_file = url.startswith("/data/") and "?d=" in url
|
|
315
|
+
is_cloud_storage_file = (
|
|
316
|
+
url.startswith("s3:") or url.startswith("gs:") or url.startswith("azure-blob:")
|
|
317
|
+
)
|
|
318
|
+
|
|
319
|
+
# Local storage file: try to load locally
|
|
320
|
+
if is_local_storage_file:
|
|
321
|
+
filepath = url.split("?d=")[1]
|
|
322
|
+
filepath = safe_build_path(LOCAL_FILES_DOCUMENT_ROOT, filepath)
|
|
323
|
+
if os.path.exists(filepath):
|
|
324
|
+
logger.debug(
|
|
325
|
+
f"Local Storage file path exists locally, read content directly: {filepath}"
|
|
326
|
+
)
|
|
327
|
+
with open(filepath, "rb") as f:
|
|
328
|
+
return base64.b64encode(f.read()).decode("utf-8")
|
|
329
|
+
|
|
330
|
+
# Upload or Local Storage file
|
|
331
|
+
if is_uploaded_file or is_local_storage_file or is_cloud_storage_file:
|
|
332
|
+
# hostname check
|
|
333
|
+
if not hostname:
|
|
334
|
+
raise FileNotFoundError(
|
|
335
|
+
f"Can't resolve url, hostname not provided: {url}. "
|
|
336
|
+
"You can set LABEL_STUDIO_URL environment variable to use it as a hostname."
|
|
337
|
+
)
|
|
338
|
+
# uploaded and local storage file
|
|
339
|
+
elif is_uploaded_file or is_local_storage_file:
|
|
340
|
+
url = concat_urls(hostname, url)
|
|
341
|
+
logger.info("Resolving url using hostname [" + hostname + "]: " + url)
|
|
342
|
+
# s3, gs, azure-blob file
|
|
343
|
+
elif is_cloud_storage_file:
|
|
344
|
+
if task_id is None:
|
|
345
|
+
raise Exception(
|
|
346
|
+
"Label Studio Task ID is required for cloud storage files"
|
|
347
|
+
)
|
|
348
|
+
url = concat_urls(hostname, f"/tasks/{task_id}/presign/?fileuri={url}")
|
|
349
|
+
logger.info(
|
|
350
|
+
"Cloud storage file: Resolving url using hostname ["
|
|
351
|
+
+ hostname
|
|
352
|
+
+ "]: "
|
|
353
|
+
+ url
|
|
354
|
+
)
|
|
355
|
+
|
|
356
|
+
# check access token
|
|
357
|
+
if not access_token:
|
|
358
|
+
raise FileNotFoundError(
|
|
359
|
+
"To access uploaded and local storage files you have to "
|
|
360
|
+
"set LABEL_STUDIO_API_KEY environment variable."
|
|
361
|
+
)
|
|
362
|
+
|
|
363
|
+
# Download the content but don't save to filesystem
|
|
364
|
+
headers = {
|
|
365
|
+
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36"
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
# check if url matches hostname - then uses access token to this Label Studio instance
|
|
369
|
+
parsed_url = urlparse(url)
|
|
370
|
+
if access_token and hostname and parsed_url.netloc == urlparse(hostname).netloc:
|
|
371
|
+
headers["Authorization"] = "Token " + access_token
|
|
372
|
+
logger.debug("Authorization token is used for get_base64_content")
|
|
373
|
+
|
|
374
|
+
try:
|
|
375
|
+
r = requests.get(url, headers=headers, verify=VERIFY_SSL)
|
|
376
|
+
r.raise_for_status()
|
|
377
|
+
return base64.b64encode(r.content).decode("utf-8")
|
|
378
|
+
except requests.exceptions.SSLError as e:
|
|
379
|
+
logger.error(
|
|
380
|
+
f"SSL error during requests.get('{url}'): {e}\n"
|
|
381
|
+
f"Try to set VERIFY_SSL=False in environment variables to bypass SSL verification."
|
|
382
|
+
)
|
|
383
|
+
raise e
|
{label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/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
|