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.
Files changed (370) hide show
  1. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/PKG-INFO +2 -1
  2. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/pyproject.toml +2 -1
  3. {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
  4. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/converter/converter.py +37 -83
  5. label_studio_sdk-1.0.14/src/label_studio_sdk/converter/exports/yolo.py +149 -0
  6. label_studio_sdk-1.0.14/src/label_studio_sdk/converter/keypoints.py +146 -0
  7. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/core/client_wrapper.py +1 -1
  8. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/label_interface/interface.py +15 -0
  9. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/label_interface/object_tags.py +6 -1
  10. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/tokens/client_ext.py +20 -3
  11. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/LICENSE +0 -0
  12. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/README.md +0 -0
  13. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/__init__.py +0 -0
  14. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/_extensions/__init__.py +0 -0
  15. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/_extensions/eval/categorical.py +0 -0
  16. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/_extensions/label_studio_tools/__init__.py +0 -0
  17. {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
  18. {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
  19. {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
  20. {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
  21. {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
  22. {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
  23. {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
  24. {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
  25. {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
  26. {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
  27. {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
  28. {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
  29. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/_extensions/pager_ext.py +0 -0
  30. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/_legacy/__init__.py +0 -0
  31. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/_legacy/client.py +0 -0
  32. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/_legacy/exceptions.py +0 -0
  33. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/_legacy/project.py +0 -0
  34. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/_legacy/schema/label_config_schema.json +0 -0
  35. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/_legacy/users.py +0 -0
  36. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/_legacy/utils.py +0 -0
  37. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/_legacy/workspaces.py +0 -0
  38. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/actions/__init__.py +0 -0
  39. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/actions/client.py +0 -0
  40. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/actions/types/__init__.py +0 -0
  41. {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
  42. {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
  43. {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
  44. {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
  45. {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
  46. {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
  47. {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
  48. {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
  49. {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
  50. {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
  51. {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
  52. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/annotations/__init__.py +0 -0
  53. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/annotations/client.py +0 -0
  54. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/annotations/types/__init__.py +0 -0
  55. {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
  56. {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
  57. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/base_client.py +0 -0
  58. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/client.py +0 -0
  59. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/comments/__init__.py +0 -0
  60. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/comments/client.py +0 -0
  61. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/converter/__init__.py +0 -0
  62. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/converter/audio.py +0 -0
  63. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/converter/brush.py +0 -0
  64. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/converter/exports/__init__.py +0 -0
  65. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/converter/exports/brush_to_coco.py +0 -0
  66. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/converter/exports/csv.py +0 -0
  67. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/converter/exports/csv2.py +0 -0
  68. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/converter/funsd.py +0 -0
  69. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/converter/imports/__init__.py +0 -0
  70. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/converter/imports/coco.py +0 -0
  71. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/converter/imports/colors.py +0 -0
  72. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/converter/imports/label_config.py +0 -0
  73. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/converter/imports/pathtrack.py +0 -0
  74. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/converter/imports/yolo.py +0 -0
  75. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/converter/main.py +0 -0
  76. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/converter/utils.py +0 -0
  77. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/core/__init__.py +0 -0
  78. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/core/api_error.py +0 -0
  79. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/core/datetime_utils.py +0 -0
  80. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/core/file.py +0 -0
  81. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/core/http_client.py +0 -0
  82. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/core/jsonable_encoder.py +0 -0
  83. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/core/pagination.py +0 -0
  84. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/core/pydantic_utilities.py +0 -0
  85. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/core/query_encoder.py +0 -0
  86. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/core/remove_none_from_dict.py +0 -0
  87. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/core/request_options.py +0 -0
  88. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/core/serialization.py +0 -0
  89. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/data_manager.py +0 -0
  90. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/environment.py +0 -0
  91. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/errors/__init__.py +0 -0
  92. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/errors/bad_request_error.py +0 -0
  93. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/errors/internal_server_error.py +0 -0
  94. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/errors/not_found_error.py +0 -0
  95. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/errors/unauthorized_error.py +0 -0
  96. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/export_storage/__init__.py +0 -0
  97. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/export_storage/azure/__init__.py +0 -0
  98. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/export_storage/azure/client.py +0 -0
  99. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/export_storage/azure/types/__init__.py +0 -0
  100. {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
  101. {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
  102. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/export_storage/client.py +0 -0
  103. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/export_storage/gcs/__init__.py +0 -0
  104. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/export_storage/gcs/client.py +0 -0
  105. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/export_storage/gcs/types/__init__.py +0 -0
  106. {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
  107. {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
  108. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/export_storage/local/__init__.py +0 -0
  109. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/export_storage/local/client.py +0 -0
  110. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/export_storage/local/types/__init__.py +0 -0
  111. {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
  112. {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
  113. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/export_storage/redis/__init__.py +0 -0
  114. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/export_storage/redis/client.py +0 -0
  115. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/export_storage/redis/types/__init__.py +0 -0
  116. {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
  117. {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
  118. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/export_storage/s3/__init__.py +0 -0
  119. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/export_storage/s3/client.py +0 -0
  120. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/export_storage/s3/types/__init__.py +0 -0
  121. {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
  122. {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
  123. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/export_storage/s3s/__init__.py +0 -0
  124. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/export_storage/s3s/client.py +0 -0
  125. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/export_storage/types/__init__.py +0 -0
  126. {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
  127. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/files/__init__.py +0 -0
  128. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/files/client.py +0 -0
  129. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/import_storage/__init__.py +0 -0
  130. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/import_storage/azure/__init__.py +0 -0
  131. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/import_storage/azure/client.py +0 -0
  132. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/import_storage/azure/types/__init__.py +0 -0
  133. {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
  134. {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
  135. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/import_storage/client.py +0 -0
  136. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/import_storage/gcs/__init__.py +0 -0
  137. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/import_storage/gcs/client.py +0 -0
  138. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/import_storage/gcs/types/__init__.py +0 -0
  139. {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
  140. {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
  141. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/import_storage/local/__init__.py +0 -0
  142. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/import_storage/local/client.py +0 -0
  143. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/import_storage/local/types/__init__.py +0 -0
  144. {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
  145. {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
  146. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/import_storage/redis/__init__.py +0 -0
  147. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/import_storage/redis/client.py +0 -0
  148. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/import_storage/redis/types/__init__.py +0 -0
  149. {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
  150. {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
  151. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/import_storage/s3/__init__.py +0 -0
  152. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/import_storage/s3/client.py +0 -0
  153. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/import_storage/s3/types/__init__.py +0 -0
  154. {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
  155. {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
  156. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/import_storage/s3s/__init__.py +0 -0
  157. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/import_storage/s3s/client.py +0 -0
  158. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/import_storage/types/__init__.py +0 -0
  159. {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
  160. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/jwt_settings/__init__.py +0 -0
  161. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/jwt_settings/client.py +0 -0
  162. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/label_interface/__init__.py +0 -0
  163. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/label_interface/base.py +0 -0
  164. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/label_interface/control_tags.py +0 -0
  165. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/label_interface/create.py +0 -0
  166. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/label_interface/data_examples.json +0 -0
  167. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/label_interface/label_tags.py +0 -0
  168. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/label_interface/objects.py +0 -0
  169. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/label_interface/region.py +0 -0
  170. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/ml/__init__.py +0 -0
  171. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/ml/client.py +0 -0
  172. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/ml/types/__init__.py +0 -0
  173. {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
  174. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/ml/types/ml_create_response.py +0 -0
  175. {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
  176. {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
  177. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/ml/types/ml_update_response.py +0 -0
  178. {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
  179. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/model_providers/__init__.py +0 -0
  180. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/model_providers/client.py +0 -0
  181. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/predictions/__init__.py +0 -0
  182. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/predictions/client.py +0 -0
  183. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/projects/__init__.py +0 -0
  184. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/projects/client.py +0 -0
  185. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/projects/client_ext.py +0 -0
  186. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/projects/exports/__init__.py +0 -0
  187. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/projects/exports/client.py +0 -0
  188. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/projects/exports/client_ext.py +0 -0
  189. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/projects/exports/types/__init__.py +0 -0
  190. {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
  191. {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
  192. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/projects/pauses/__init__.py +0 -0
  193. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/projects/pauses/client.py +0 -0
  194. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/projects/types/__init__.py +0 -0
  195. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/projects/types/projects_create_response.py +0 -0
  196. {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
  197. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/projects/types/projects_list_response.py +0 -0
  198. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/projects/types/projects_update_response.py +0 -0
  199. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/prompts/__init__.py +0 -0
  200. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/prompts/client.py +0 -0
  201. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/prompts/indicators/__init__.py +0 -0
  202. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/prompts/indicators/client.py +0 -0
  203. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/prompts/runs/__init__.py +0 -0
  204. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/prompts/runs/client.py +0 -0
  205. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/prompts/runs/types/__init__.py +0 -0
  206. {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
  207. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/prompts/types/__init__.py +0 -0
  208. {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
  209. {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
  210. {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
  211. {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
  212. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/prompts/versions/__init__.py +0 -0
  213. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/prompts/versions/client.py +0 -0
  214. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/py.typed +0 -0
  215. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/tasks/__init__.py +0 -0
  216. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/tasks/client.py +0 -0
  217. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/tasks/client_ext.py +0 -0
  218. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/tasks/types/__init__.py +0 -0
  219. {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
  220. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/tasks/types/tasks_list_response.py +0 -0
  221. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/tokens/__init__.py +0 -0
  222. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/tokens/client.py +0 -0
  223. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/__init__.py +0 -0
  224. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/access_token_response.py +0 -0
  225. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/annotation.py +0 -0
  226. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/annotation_completed_by.py +0 -0
  227. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/annotation_filter_options.py +0 -0
  228. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/annotation_last_action.py +0 -0
  229. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/annotations_dm_field.py +0 -0
  230. {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
  231. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/api_token_response.py +0 -0
  232. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/azure_blob_export_storage.py +0 -0
  233. {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
  234. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/azure_blob_import_storage.py +0 -0
  235. {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
  236. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/base_task.py +0 -0
  237. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/base_task_file_upload.py +0 -0
  238. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/base_task_updated_by.py +0 -0
  239. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/base_user.py +0 -0
  240. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/comment.py +0 -0
  241. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/comment_created_by.py +0 -0
  242. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/converted_format.py +0 -0
  243. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/converted_format_status.py +0 -0
  244. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/data_manager_task_serializer.py +0 -0
  245. {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
  246. {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
  247. {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
  248. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/export.py +0 -0
  249. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/export_format.py +0 -0
  250. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/export_snapshot.py +0 -0
  251. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/export_snapshot_status.py +0 -0
  252. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/export_status.py +0 -0
  253. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/file_upload.py +0 -0
  254. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/filter.py +0 -0
  255. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/filter_group.py +0 -0
  256. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/gcs_export_storage.py +0 -0
  257. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/gcs_export_storage_status.py +0 -0
  258. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/gcs_import_storage.py +0 -0
  259. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/gcs_import_storage_status.py +0 -0
  260. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/inference_run.py +0 -0
  261. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/inference_run_cost_estimate.py +0 -0
  262. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/inference_run_created_by.py +0 -0
  263. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/inference_run_organization.py +0 -0
  264. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/inference_run_project_subset.py +0 -0
  265. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/inference_run_status.py +0 -0
  266. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/jwt_settings_response.py +0 -0
  267. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/key_indicator_value.py +0 -0
  268. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/key_indicators.py +0 -0
  269. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/key_indicators_item.py +0 -0
  270. {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
  271. {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
  272. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/local_files_export_storage.py +0 -0
  273. {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
  274. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/local_files_import_storage.py +0 -0
  275. {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
  276. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/ml_backend.py +0 -0
  277. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/ml_backend_auth_method.py +0 -0
  278. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/ml_backend_state.py +0 -0
  279. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/model_provider_connection.py +0 -0
  280. {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
  281. {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
  282. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/model_provider_connection_organization.py +0 -0
  283. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/model_provider_connection_provider.py +0 -0
  284. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/model_provider_connection_scope.py +0 -0
  285. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/pause.py +0 -0
  286. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/pause_paused_by.py +0 -0
  287. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/prediction.py +0 -0
  288. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/project.py +0 -0
  289. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/project_import.py +0 -0
  290. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/project_import_status.py +0 -0
  291. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/project_label_config.py +0 -0
  292. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/project_sampling.py +0 -0
  293. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/project_skip_queue.py +0 -0
  294. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/prompt.py +0 -0
  295. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/prompt_associated_projects_item.py +0 -0
  296. {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
  297. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/prompt_created_by.py +0 -0
  298. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/prompt_organization.py +0 -0
  299. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/prompt_version.py +0 -0
  300. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/prompt_version_created_by.py +0 -0
  301. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/prompt_version_organization.py +0 -0
  302. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/prompt_version_provider.py +0 -0
  303. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/redis_export_storage.py +0 -0
  304. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/redis_export_storage_status.py +0 -0
  305. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/redis_import_storage.py +0 -0
  306. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/redis_import_storage_status.py +0 -0
  307. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/refined_prompt_response.py +0 -0
  308. {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
  309. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/rotate_token_response.py +0 -0
  310. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/s3export_storage.py +0 -0
  311. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/s3export_storage_status.py +0 -0
  312. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/s3import_storage.py +0 -0
  313. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/s3import_storage_status.py +0 -0
  314. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/s3s_export_storage.py +0 -0
  315. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/s3s_import_storage.py +0 -0
  316. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/s3s_import_storage_status.py +0 -0
  317. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/serialization_option.py +0 -0
  318. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/serialization_options.py +0 -0
  319. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/task.py +0 -0
  320. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/task_annotators_item.py +0 -0
  321. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/task_comment_authors_item.py +0 -0
  322. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/task_filter_options.py +0 -0
  323. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/user_simple.py +0 -0
  324. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/view.py +0 -0
  325. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/webhook.py +0 -0
  326. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/webhook_actions_item.py +0 -0
  327. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/webhook_serializer_for_update.py +0 -0
  328. {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
  329. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/types/workspace.py +0 -0
  330. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/users/__init__.py +0 -0
  331. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/users/client.py +0 -0
  332. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/users/types/__init__.py +0 -0
  333. {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
  334. {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
  335. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/version.py +0 -0
  336. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/versions/__init__.py +0 -0
  337. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/versions/client.py +0 -0
  338. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/versions/types/__init__.py +0 -0
  339. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/versions/types/versions_get_response.py +0 -0
  340. {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
  341. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/views/__init__.py +0 -0
  342. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/views/client.py +0 -0
  343. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/views/types/__init__.py +0 -0
  344. {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
  345. {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
  346. {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
  347. {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
  348. {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
  349. {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
  350. {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
  351. {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
  352. {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
  353. {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
  354. {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
  355. {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
  356. {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
  357. {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
  358. {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
  359. {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
  360. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/webhooks/__init__.py +0 -0
  361. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/webhooks/client.py +0 -0
  362. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/webhooks/types/__init__.py +0 -0
  363. {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
  364. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/workspaces/__init__.py +0 -0
  365. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/workspaces/client.py +0 -0
  366. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/workspaces/members/__init__.py +0 -0
  367. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/workspaces/members/client.py +0 -0
  368. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.14}/src/label_studio_sdk/workspaces/members/types/__init__.py +0 -0
  369. {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
  370. {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.12
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.12"
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('?d=')[1])
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("Download {url} to {filepath}. download_resources: {download_resources}".format(url=url, filepath=filepath, download_resources=download_resources))
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
@@ -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
- 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()
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
- annotations = []
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