label-studio-sdk 1.0.11__tar.gz → 1.0.13__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of label-studio-sdk might be problematic. Click here for more details.

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