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

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

Potentially problematic release.


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

Files changed (370) hide show
  1. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/PKG-INFO +2 -1
  2. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/pyproject.toml +2 -1
  3. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/converter.py +37 -83
  4. label_studio_sdk-1.0.13/src/label_studio_sdk/converter/exports/yolo.py +149 -0
  5. label_studio_sdk-1.0.13/src/label_studio_sdk/converter/keypoints.py +146 -0
  6. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/LICENSE +0 -0
  7. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/README.md +0 -0
  8. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/__init__.py +0 -0
  9. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/__init__.py +0 -0
  10. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/eval/categorical.py +0 -0
  11. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/label_studio_tools/__init__.py +0 -0
  12. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/label_studio_tools/core/__init__.py +0 -0
  13. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/label_studio_tools/core/label_config.py +0 -0
  14. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/label_studio_tools/core/utils/__init__.py +0 -0
  15. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/label_studio_tools/core/utils/exceptions.py +0 -0
  16. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/label_studio_tools/core/utils/io.py +0 -0
  17. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/label_studio_tools/core/utils/json_schema.py +0 -0
  18. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/label_studio_tools/core/utils/params.py +0 -0
  19. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/label_studio_tools/etl/__init__.py +0 -0
  20. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/label_studio_tools/etl/beam.py +0 -0
  21. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/label_studio_tools/etl/example.py +0 -0
  22. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/label_studio_tools/etl/registry.py +0 -0
  23. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/label_studio_tools/postprocessing/__init__.py +0 -0
  24. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/label_studio_tools/postprocessing/video.py +0 -0
  25. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_extensions/pager_ext.py +0 -0
  26. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_legacy/__init__.py +0 -0
  27. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_legacy/client.py +0 -0
  28. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_legacy/exceptions.py +0 -0
  29. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_legacy/project.py +0 -0
  30. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_legacy/schema/label_config_schema.json +0 -0
  31. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_legacy/users.py +0 -0
  32. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_legacy/utils.py +0 -0
  33. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/_legacy/workspaces.py +0 -0
  34. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/actions/__init__.py +0 -0
  35. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/actions/client.py +0 -0
  36. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/actions/types/__init__.py +0 -0
  37. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/actions/types/actions_create_request_filters.py +0 -0
  38. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/actions/types/actions_create_request_filters_conjunction.py +0 -0
  39. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/actions/types/actions_create_request_filters_items_item.py +0 -0
  40. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/actions/types/actions_create_request_filters_items_item_filter.py +0 -0
  41. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/actions/types/actions_create_request_filters_items_item_operator.py +0 -0
  42. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/actions/types/actions_create_request_filters_items_item_value.py +0 -0
  43. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/actions/types/actions_create_request_id.py +0 -0
  44. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/actions/types/actions_create_request_ordering_item.py +0 -0
  45. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/actions/types/actions_create_request_selected_items.py +0 -0
  46. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/actions/types/actions_create_request_selected_items_excluded.py +0 -0
  47. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/actions/types/actions_create_request_selected_items_included.py +0 -0
  48. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/annotations/__init__.py +0 -0
  49. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/annotations/client.py +0 -0
  50. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/annotations/types/__init__.py +0 -0
  51. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/annotations/types/annotations_create_bulk_request_selected_items.py +0 -0
  52. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/annotations/types/annotations_create_bulk_response_item.py +0 -0
  53. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/base_client.py +0 -0
  54. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/client.py +0 -0
  55. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/comments/__init__.py +0 -0
  56. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/comments/client.py +0 -0
  57. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/__init__.py +0 -0
  58. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/audio.py +0 -0
  59. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/brush.py +0 -0
  60. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/exports/__init__.py +0 -0
  61. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/exports/brush_to_coco.py +0 -0
  62. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/exports/csv.py +0 -0
  63. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/exports/csv2.py +0 -0
  64. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/funsd.py +0 -0
  65. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/imports/__init__.py +0 -0
  66. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/imports/coco.py +0 -0
  67. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/imports/colors.py +0 -0
  68. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/imports/label_config.py +0 -0
  69. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/imports/pathtrack.py +0 -0
  70. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/imports/yolo.py +0 -0
  71. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/main.py +0 -0
  72. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/converter/utils.py +0 -0
  73. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/core/__init__.py +0 -0
  74. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/core/api_error.py +0 -0
  75. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/core/client_wrapper.py +0 -0
  76. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/core/datetime_utils.py +0 -0
  77. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/core/file.py +0 -0
  78. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/core/http_client.py +0 -0
  79. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/core/jsonable_encoder.py +0 -0
  80. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/core/pagination.py +0 -0
  81. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/core/pydantic_utilities.py +0 -0
  82. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/core/query_encoder.py +0 -0
  83. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/core/remove_none_from_dict.py +0 -0
  84. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/core/request_options.py +0 -0
  85. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/core/serialization.py +0 -0
  86. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/data_manager.py +0 -0
  87. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/environment.py +0 -0
  88. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/errors/__init__.py +0 -0
  89. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/errors/bad_request_error.py +0 -0
  90. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/errors/internal_server_error.py +0 -0
  91. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/errors/not_found_error.py +0 -0
  92. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/errors/unauthorized_error.py +0 -0
  93. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/__init__.py +0 -0
  94. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/azure/__init__.py +0 -0
  95. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/azure/client.py +0 -0
  96. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/azure/types/__init__.py +0 -0
  97. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/azure/types/azure_create_response.py +0 -0
  98. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/azure/types/azure_update_response.py +0 -0
  99. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/client.py +0 -0
  100. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/gcs/__init__.py +0 -0
  101. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/gcs/client.py +0 -0
  102. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/gcs/types/__init__.py +0 -0
  103. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/gcs/types/gcs_create_response.py +0 -0
  104. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/gcs/types/gcs_update_response.py +0 -0
  105. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/local/__init__.py +0 -0
  106. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/local/client.py +0 -0
  107. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/local/types/__init__.py +0 -0
  108. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/local/types/local_create_response.py +0 -0
  109. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/local/types/local_update_response.py +0 -0
  110. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/redis/__init__.py +0 -0
  111. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/redis/client.py +0 -0
  112. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/redis/types/__init__.py +0 -0
  113. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/redis/types/redis_create_response.py +0 -0
  114. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/redis/types/redis_update_response.py +0 -0
  115. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/s3/__init__.py +0 -0
  116. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/s3/client.py +0 -0
  117. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/s3/types/__init__.py +0 -0
  118. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/s3/types/s3create_response.py +0 -0
  119. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/s3/types/s3update_response.py +0 -0
  120. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/s3s/__init__.py +0 -0
  121. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/s3s/client.py +0 -0
  122. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/types/__init__.py +0 -0
  123. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/export_storage/types/export_storage_list_types_response_item.py +0 -0
  124. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/files/__init__.py +0 -0
  125. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/files/client.py +0 -0
  126. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/__init__.py +0 -0
  127. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/azure/__init__.py +0 -0
  128. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/azure/client.py +0 -0
  129. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/azure/types/__init__.py +0 -0
  130. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/azure/types/azure_create_response.py +0 -0
  131. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/azure/types/azure_update_response.py +0 -0
  132. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/client.py +0 -0
  133. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/gcs/__init__.py +0 -0
  134. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/gcs/client.py +0 -0
  135. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/gcs/types/__init__.py +0 -0
  136. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/gcs/types/gcs_create_response.py +0 -0
  137. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/gcs/types/gcs_update_response.py +0 -0
  138. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/local/__init__.py +0 -0
  139. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/local/client.py +0 -0
  140. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/local/types/__init__.py +0 -0
  141. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/local/types/local_create_response.py +0 -0
  142. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/local/types/local_update_response.py +0 -0
  143. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/redis/__init__.py +0 -0
  144. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/redis/client.py +0 -0
  145. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/redis/types/__init__.py +0 -0
  146. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/redis/types/redis_create_response.py +0 -0
  147. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/redis/types/redis_update_response.py +0 -0
  148. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/s3/__init__.py +0 -0
  149. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/s3/client.py +0 -0
  150. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/s3/types/__init__.py +0 -0
  151. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/s3/types/s3create_response.py +0 -0
  152. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/s3/types/s3update_response.py +0 -0
  153. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/s3s/__init__.py +0 -0
  154. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/s3s/client.py +0 -0
  155. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/types/__init__.py +0 -0
  156. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/import_storage/types/import_storage_list_types_response_item.py +0 -0
  157. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/jwt_settings/__init__.py +0 -0
  158. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/jwt_settings/client.py +0 -0
  159. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/label_interface/__init__.py +0 -0
  160. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/label_interface/base.py +0 -0
  161. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/label_interface/control_tags.py +0 -0
  162. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/label_interface/create.py +0 -0
  163. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/label_interface/data_examples.json +0 -0
  164. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/label_interface/interface.py +0 -0
  165. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/label_interface/label_tags.py +0 -0
  166. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/label_interface/object_tags.py +0 -0
  167. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/label_interface/objects.py +0 -0
  168. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/label_interface/region.py +0 -0
  169. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/ml/__init__.py +0 -0
  170. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/ml/client.py +0 -0
  171. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/ml/types/__init__.py +0 -0
  172. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/ml/types/ml_create_request_auth_method.py +0 -0
  173. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/ml/types/ml_create_response.py +0 -0
  174. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/ml/types/ml_create_response_auth_method.py +0 -0
  175. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/ml/types/ml_update_request_auth_method.py +0 -0
  176. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/ml/types/ml_update_response.py +0 -0
  177. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/ml/types/ml_update_response_auth_method.py +0 -0
  178. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/model_providers/__init__.py +0 -0
  179. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/model_providers/client.py +0 -0
  180. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/predictions/__init__.py +0 -0
  181. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/predictions/client.py +0 -0
  182. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/__init__.py +0 -0
  183. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/client.py +0 -0
  184. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/client_ext.py +0 -0
  185. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/exports/__init__.py +0 -0
  186. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/exports/client.py +0 -0
  187. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/exports/client_ext.py +0 -0
  188. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/exports/types/__init__.py +0 -0
  189. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/exports/types/exports_convert_response.py +0 -0
  190. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/exports/types/exports_list_formats_response_item.py +0 -0
  191. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/pauses/__init__.py +0 -0
  192. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/pauses/client.py +0 -0
  193. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/types/__init__.py +0 -0
  194. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/types/projects_create_response.py +0 -0
  195. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/types/projects_import_tasks_response.py +0 -0
  196. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/types/projects_list_response.py +0 -0
  197. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/projects/types/projects_update_response.py +0 -0
  198. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/prompts/__init__.py +0 -0
  199. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/prompts/client.py +0 -0
  200. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/prompts/indicators/__init__.py +0 -0
  201. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/prompts/indicators/client.py +0 -0
  202. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/prompts/runs/__init__.py +0 -0
  203. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/prompts/runs/client.py +0 -0
  204. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/prompts/runs/types/__init__.py +0 -0
  205. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/prompts/runs/types/runs_list_request_project_subset.py +0 -0
  206. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/prompts/types/__init__.py +0 -0
  207. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/prompts/types/prompts_batch_failed_predictions_request_failed_predictions_item.py +0 -0
  208. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/prompts/types/prompts_batch_failed_predictions_response.py +0 -0
  209. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/prompts/types/prompts_batch_predictions_request_results_item.py +0 -0
  210. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/prompts/types/prompts_batch_predictions_response.py +0 -0
  211. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/prompts/versions/__init__.py +0 -0
  212. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/prompts/versions/client.py +0 -0
  213. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/py.typed +0 -0
  214. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/tasks/__init__.py +0 -0
  215. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/tasks/client.py +0 -0
  216. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/tasks/client_ext.py +0 -0
  217. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/tasks/types/__init__.py +0 -0
  218. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/tasks/types/tasks_list_request_fields.py +0 -0
  219. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/tasks/types/tasks_list_response.py +0 -0
  220. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/tokens/__init__.py +0 -0
  221. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/tokens/client.py +0 -0
  222. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/tokens/client_ext.py +0 -0
  223. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/__init__.py +0 -0
  224. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/access_token_response.py +0 -0
  225. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/annotation.py +0 -0
  226. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/annotation_completed_by.py +0 -0
  227. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/annotation_filter_options.py +0 -0
  228. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/annotation_last_action.py +0 -0
  229. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/annotations_dm_field.py +0 -0
  230. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/annotations_dm_field_last_action.py +0 -0
  231. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/api_token_response.py +0 -0
  232. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/azure_blob_export_storage.py +0 -0
  233. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/azure_blob_export_storage_status.py +0 -0
  234. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/azure_blob_import_storage.py +0 -0
  235. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/azure_blob_import_storage_status.py +0 -0
  236. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/base_task.py +0 -0
  237. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/base_task_file_upload.py +0 -0
  238. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/base_task_updated_by.py +0 -0
  239. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/base_user.py +0 -0
  240. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/comment.py +0 -0
  241. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/comment_created_by.py +0 -0
  242. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/converted_format.py +0 -0
  243. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/converted_format_status.py +0 -0
  244. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/data_manager_task_serializer.py +0 -0
  245. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/data_manager_task_serializer_annotators_item.py +0 -0
  246. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/data_manager_task_serializer_drafts_item.py +0 -0
  247. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/data_manager_task_serializer_predictions_item.py +0 -0
  248. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/export.py +0 -0
  249. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/export_format.py +0 -0
  250. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/export_snapshot.py +0 -0
  251. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/export_snapshot_status.py +0 -0
  252. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/export_status.py +0 -0
  253. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/file_upload.py +0 -0
  254. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/filter.py +0 -0
  255. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/filter_group.py +0 -0
  256. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/gcs_export_storage.py +0 -0
  257. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/gcs_export_storage_status.py +0 -0
  258. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/gcs_import_storage.py +0 -0
  259. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/gcs_import_storage_status.py +0 -0
  260. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/inference_run.py +0 -0
  261. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/inference_run_cost_estimate.py +0 -0
  262. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/inference_run_created_by.py +0 -0
  263. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/inference_run_organization.py +0 -0
  264. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/inference_run_project_subset.py +0 -0
  265. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/inference_run_status.py +0 -0
  266. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/jwt_settings_response.py +0 -0
  267. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/key_indicator_value.py +0 -0
  268. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/key_indicators.py +0 -0
  269. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/key_indicators_item.py +0 -0
  270. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/key_indicators_item_additional_kpis_item.py +0 -0
  271. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/key_indicators_item_extra_kpis_item.py +0 -0
  272. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/local_files_export_storage.py +0 -0
  273. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/local_files_export_storage_status.py +0 -0
  274. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/local_files_import_storage.py +0 -0
  275. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/local_files_import_storage_status.py +0 -0
  276. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/ml_backend.py +0 -0
  277. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/ml_backend_auth_method.py +0 -0
  278. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/ml_backend_state.py +0 -0
  279. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/model_provider_connection.py +0 -0
  280. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/model_provider_connection_budget_reset_period.py +0 -0
  281. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/model_provider_connection_created_by.py +0 -0
  282. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/model_provider_connection_organization.py +0 -0
  283. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/model_provider_connection_provider.py +0 -0
  284. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/model_provider_connection_scope.py +0 -0
  285. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/pause.py +0 -0
  286. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/pause_paused_by.py +0 -0
  287. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/prediction.py +0 -0
  288. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/project.py +0 -0
  289. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/project_import.py +0 -0
  290. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/project_import_status.py +0 -0
  291. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/project_label_config.py +0 -0
  292. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/project_sampling.py +0 -0
  293. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/project_skip_queue.py +0 -0
  294. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/prompt.py +0 -0
  295. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/prompt_associated_projects_item.py +0 -0
  296. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/prompt_associated_projects_item_id.py +0 -0
  297. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/prompt_created_by.py +0 -0
  298. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/prompt_organization.py +0 -0
  299. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/prompt_version.py +0 -0
  300. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/prompt_version_created_by.py +0 -0
  301. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/prompt_version_organization.py +0 -0
  302. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/prompt_version_provider.py +0 -0
  303. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/redis_export_storage.py +0 -0
  304. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/redis_export_storage_status.py +0 -0
  305. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/redis_import_storage.py +0 -0
  306. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/redis_import_storage_status.py +0 -0
  307. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/refined_prompt_response.py +0 -0
  308. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/refined_prompt_response_refinement_status.py +0 -0
  309. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/rotate_token_response.py +0 -0
  310. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/s3export_storage.py +0 -0
  311. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/s3export_storage_status.py +0 -0
  312. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/s3import_storage.py +0 -0
  313. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/s3import_storage_status.py +0 -0
  314. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/s3s_export_storage.py +0 -0
  315. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/s3s_import_storage.py +0 -0
  316. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/s3s_import_storage_status.py +0 -0
  317. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/serialization_option.py +0 -0
  318. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/serialization_options.py +0 -0
  319. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/task.py +0 -0
  320. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/task_annotators_item.py +0 -0
  321. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/task_comment_authors_item.py +0 -0
  322. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/task_filter_options.py +0 -0
  323. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/user_simple.py +0 -0
  324. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/view.py +0 -0
  325. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/webhook.py +0 -0
  326. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/webhook_actions_item.py +0 -0
  327. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/webhook_serializer_for_update.py +0 -0
  328. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/webhook_serializer_for_update_actions_item.py +0 -0
  329. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/types/workspace.py +0 -0
  330. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/users/__init__.py +0 -0
  331. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/users/client.py +0 -0
  332. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/users/types/__init__.py +0 -0
  333. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/users/types/users_get_token_response.py +0 -0
  334. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/users/types/users_reset_token_response.py +0 -0
  335. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/version.py +0 -0
  336. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/versions/__init__.py +0 -0
  337. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/versions/client.py +0 -0
  338. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/versions/types/__init__.py +0 -0
  339. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/versions/types/versions_get_response.py +0 -0
  340. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/versions/types/versions_get_response_edition.py +0 -0
  341. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/views/__init__.py +0 -0
  342. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/views/client.py +0 -0
  343. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/views/types/__init__.py +0 -0
  344. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/views/types/views_create_request_data.py +0 -0
  345. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/views/types/views_create_request_data_filters.py +0 -0
  346. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/views/types/views_create_request_data_filters_conjunction.py +0 -0
  347. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/views/types/views_create_request_data_filters_items_item.py +0 -0
  348. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/views/types/views_create_request_data_filters_items_item_filter.py +0 -0
  349. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/views/types/views_create_request_data_filters_items_item_operator.py +0 -0
  350. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/views/types/views_create_request_data_filters_items_item_value.py +0 -0
  351. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/views/types/views_create_request_data_ordering_item.py +0 -0
  352. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/views/types/views_update_request_data.py +0 -0
  353. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/views/types/views_update_request_data_filters.py +0 -0
  354. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/views/types/views_update_request_data_filters_conjunction.py +0 -0
  355. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/views/types/views_update_request_data_filters_items_item.py +0 -0
  356. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/views/types/views_update_request_data_filters_items_item_filter.py +0 -0
  357. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/views/types/views_update_request_data_filters_items_item_operator.py +0 -0
  358. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/views/types/views_update_request_data_filters_items_item_value.py +0 -0
  359. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/views/types/views_update_request_data_ordering_item.py +0 -0
  360. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/webhooks/__init__.py +0 -0
  361. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/webhooks/client.py +0 -0
  362. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/webhooks/types/__init__.py +0 -0
  363. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/webhooks/types/webhooks_update_request_actions_item.py +0 -0
  364. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/workspaces/__init__.py +0 -0
  365. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/workspaces/client.py +0 -0
  366. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/workspaces/members/__init__.py +0 -0
  367. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/workspaces/members/client.py +0 -0
  368. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/workspaces/members/types/__init__.py +0 -0
  369. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/workspaces/members/types/members_create_response.py +0 -0
  370. {label_studio_sdk-1.0.12 → label_studio_sdk-1.0.13}/src/label_studio_sdk/workspaces/members/types/members_list_response_item.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: label-studio-sdk
3
- Version: 1.0.12
3
+ Version: 1.0.13
4
4
  Summary:
5
5
  Requires-Python: >=3.9,<4
6
6
  Classifier: Intended Audience :: Developers
@@ -29,6 +29,7 @@ Requires-Dist: jsonschema (>=4.23.0)
29
29
  Requires-Dist: lxml (>=4.2.5)
30
30
  Requires-Dist: nltk (>=3.9.1,<4.0.0)
31
31
  Requires-Dist: numpy (>=1.26.4,<3.0.0)
32
+ Requires-Dist: opencv-python (>=4.9.0,<5.0.0)
32
33
  Requires-Dist: pandas (>=0.24.0)
33
34
  Requires-Dist: pydantic (>=1.9.2)
34
35
  Requires-Dist: pydantic-core (>=2.18.2,<3.0.0)
@@ -3,7 +3,7 @@ name = "label-studio-sdk"
3
3
 
4
4
  [tool.poetry]
5
5
  name = "label-studio-sdk"
6
- version = "1.0.12"
6
+ version = "1.0.13"
7
7
  description = ""
8
8
  readme = "README.md"
9
9
  authors = []
@@ -45,6 +45,7 @@ jsonschema = ">=4.23.0"
45
45
  lxml = ">=4.2.5"
46
46
  nltk = "^3.9.1"
47
47
  numpy = ">=1.26.4,<3.0.0"
48
+ opencv-python = "^4.9.0"
48
49
  pandas = ">=0.24.0"
49
50
  pydantic = ">= 1.9.2"
50
51
  pydantic-core = "^2.18.2"
@@ -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
@@ -0,0 +1,146 @@
1
+ import os
2
+ import json
3
+
4
+
5
+ def keypoints_in_label_config(label_config):
6
+ """
7
+ Check if the label config contains keypoints.
8
+ :param label_config: Label config in JSON format.
9
+ :return: True if keypoints are present, False otherwise.
10
+ """
11
+ for cfg in label_config.values():
12
+ if cfg.get("type") == "KeyPointLabels":
13
+ return True
14
+ return False
15
+
16
+
17
+ def update_categories_for_keypoints(categories, category_name_to_id, label_config):
18
+ keypoint_labels = []
19
+ for cfg in label_config.values():
20
+ if cfg.get("type") == "KeyPointLabels":
21
+ keypoint_labels.extend(cfg.get("labels", []))
22
+ keypoint_labels = list(dict.fromkeys(keypoint_labels))
23
+
24
+ non_kp = [cat.copy() for cat in categories if cat["name"] not in keypoint_labels]
25
+
26
+ new_categories = []
27
+ new_mapping = {}
28
+ next_id = 0
29
+ for cat in non_kp:
30
+ cat["id"] = next_id
31
+ new_categories.append(cat)
32
+ new_mapping[cat["name"]] = next_id
33
+ next_id += 1
34
+
35
+ if keypoint_labels:
36
+ merged_id = next_id
37
+ merged_category = {
38
+ "id": merged_id,
39
+ "name": "default",
40
+ "supercategory": "default",
41
+ "keypoints": keypoint_labels,
42
+ "skeleton": []
43
+ }
44
+ new_categories.append(merged_category)
45
+ for kp_name in keypoint_labels:
46
+ new_mapping[kp_name] = merged_id
47
+
48
+ return new_categories, new_mapping
49
+
50
+
51
+ def build_kp_order(label_config):
52
+ kp_block = {}
53
+
54
+ for tag in label_config.values():
55
+ if tag.get("type") == "KeyPointLabels":
56
+ kp_block.update(tag.get("labels_attrs", {}))
57
+
58
+ pairs, used = [], set()
59
+
60
+ for name, attrs in kp_block.items():
61
+ try:
62
+ idx = int(attrs.get("model_index"))
63
+ except (TypeError, ValueError):
64
+ continue
65
+ if idx in used:
66
+ continue
67
+ pairs.append((idx, name))
68
+ used.add(idx)
69
+
70
+ pairs.sort(key=lambda p: p[0])
71
+ result = [name for _, name in pairs]
72
+ return result
73
+
74
+
75
+ def get_bbox_coco(keypoints, kp_order):
76
+ xs = [keypoints[3*i] for i in range(len(kp_order)) if keypoints[3*i + 2] > 0]
77
+ ys = [keypoints[3*i + 1] for i in range(len(kp_order)) if keypoints[3*i + 2] > 0]
78
+ if xs and ys:
79
+ x_min = min(xs)
80
+ y_min = min(ys)
81
+ x_max = max(xs)
82
+ y_max = max(ys)
83
+ width = x_max - x_min
84
+ height = y_max - y_min
85
+ bbox = [x_min, y_min, width, height]
86
+ else:
87
+ bbox = [0, 0, 0, 0]
88
+ return bbox
89
+
90
+
91
+ def process_keypoints_for_coco(keypoint_labels, kp_order, annotation_id, image_id, category_name_to_id):
92
+ keypoints = [0] * (len(kp_order) * 3)
93
+
94
+ for kp in keypoint_labels:
95
+ width, height = kp["original_width"], kp["original_height"]
96
+ x, y = kp['x'] / 100 * width, kp['y'] / 100 * height
97
+ labels = kp.get('keypointlabels', [])
98
+ v = 2 if labels else 0
99
+ for label in labels:
100
+ if label in kp_order:
101
+ idx = kp_order.index(label)
102
+ keypoints[3 * idx] = int(round(x))
103
+ keypoints[3 * idx + 1] = int(round(y))
104
+ keypoints[3 * idx + 2] = v
105
+
106
+ num_keypoints = sum(1 for i in range(len(kp_order)) if keypoints[3*i + 2] > 0)
107
+
108
+ bbox = get_bbox_coco(keypoints, kp_order)
109
+
110
+ category_id = category_name_to_id.get(kp_order[0], 0)
111
+ annotation = {
112
+ 'id': annotation_id,
113
+ 'image_id': image_id,
114
+ 'category_id': category_id,
115
+ 'keypoints': keypoints,
116
+ 'num_keypoints': num_keypoints,
117
+ 'bbox': bbox,
118
+ 'iscrowd': 0
119
+ }
120
+ return annotation
121
+
122
+
123
+ def get_yolo_categories_for_keypoints(label_config):
124
+ # Get all keypoint labels from the label config
125
+ keypoint_labels = []
126
+ for cfg in label_config.values():
127
+ if cfg.get("type") == "KeyPointLabels":
128
+ keypoint_labels.extend(cfg.get("labels", []))
129
+ keypoint_labels = list(dict.fromkeys(keypoint_labels)) # Remove duplicates
130
+
131
+ # Get all rectangle labels from the label config
132
+ rectangle_labels = []
133
+ for cfg in label_config.values():
134
+ if cfg.get("type") == "RectangleLabels":
135
+ rectangle_labels.extend(cfg.get("labels", []))
136
+ rectangle_labels = list(dict.fromkeys(rectangle_labels)) # Remove duplicates
137
+
138
+ # Create categories for each rectangle label
139
+ categories = []
140
+ category_name_to_id = {}
141
+
142
+ for i, label in enumerate(rectangle_labels):
143
+ categories.append({"id": i, "name": label, "keypoints": keypoint_labels})
144
+ category_name_to_id[label] = i
145
+
146
+ return categories, category_name_to_id