synapse-sdk 1.0.0a35__py3-none-any.whl → 2025.11.7__py3-none-any.whl
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 synapse-sdk might be problematic. Click here for more details.
- synapse_sdk/__init__.py +24 -0
- synapse_sdk/cli/__init__.py +308 -5
- synapse_sdk/cli/alias/utils.py +1 -1
- synapse_sdk/cli/code_server.py +687 -0
- synapse_sdk/cli/config.py +440 -0
- synapse_sdk/cli/devtools.py +90 -0
- synapse_sdk/cli/plugin/publish.py +23 -15
- synapse_sdk/clients/agent/__init__.py +9 -3
- synapse_sdk/clients/agent/container.py +133 -0
- synapse_sdk/clients/agent/core.py +19 -0
- synapse_sdk/clients/agent/ray.py +298 -9
- synapse_sdk/clients/backend/__init__.py +28 -12
- synapse_sdk/clients/backend/annotation.py +9 -1
- synapse_sdk/clients/backend/core.py +31 -4
- synapse_sdk/clients/backend/data_collection.py +186 -0
- synapse_sdk/clients/backend/hitl.py +1 -1
- synapse_sdk/clients/backend/integration.py +4 -3
- synapse_sdk/clients/backend/ml.py +1 -1
- synapse_sdk/clients/backend/models.py +35 -1
- synapse_sdk/clients/base.py +309 -36
- synapse_sdk/clients/ray/serve.py +2 -0
- synapse_sdk/devtools/__init__.py +0 -0
- synapse_sdk/devtools/config.py +94 -0
- synapse_sdk/devtools/docs/.gitignore +20 -0
- synapse_sdk/devtools/docs/README.md +41 -0
- synapse_sdk/devtools/docs/blog/2019-05-28-first-blog-post.md +12 -0
- synapse_sdk/devtools/docs/blog/2019-05-29-long-blog-post.md +44 -0
- synapse_sdk/devtools/docs/blog/2021-08-01-mdx-blog-post.mdx +24 -0
- synapse_sdk/devtools/docs/blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg +0 -0
- synapse_sdk/devtools/docs/blog/2021-08-26-welcome/index.md +29 -0
- synapse_sdk/devtools/docs/blog/authors.yml +25 -0
- synapse_sdk/devtools/docs/blog/tags.yml +19 -0
- synapse_sdk/devtools/docs/docs/api/clients/agent.md +43 -0
- synapse_sdk/devtools/docs/docs/api/clients/annotation-mixin.md +378 -0
- synapse_sdk/devtools/docs/docs/api/clients/backend.md +420 -0
- synapse_sdk/devtools/docs/docs/api/clients/base.md +257 -0
- synapse_sdk/devtools/docs/docs/api/clients/core-mixin.md +477 -0
- synapse_sdk/devtools/docs/docs/api/clients/data-collection-mixin.md +422 -0
- synapse_sdk/devtools/docs/docs/api/clients/hitl-mixin.md +554 -0
- synapse_sdk/devtools/docs/docs/api/clients/index.md +391 -0
- synapse_sdk/devtools/docs/docs/api/clients/integration-mixin.md +571 -0
- synapse_sdk/devtools/docs/docs/api/clients/ml-mixin.md +578 -0
- synapse_sdk/devtools/docs/docs/api/clients/ray.md +342 -0
- synapse_sdk/devtools/docs/docs/api/index.md +52 -0
- synapse_sdk/devtools/docs/docs/api/plugins/categories.md +43 -0
- synapse_sdk/devtools/docs/docs/api/plugins/models.md +114 -0
- synapse_sdk/devtools/docs/docs/api/plugins/utils.md +328 -0
- synapse_sdk/devtools/docs/docs/categories.md +0 -0
- synapse_sdk/devtools/docs/docs/cli-usage.md +280 -0
- synapse_sdk/devtools/docs/docs/concepts/index.md +38 -0
- synapse_sdk/devtools/docs/docs/configuration.md +83 -0
- synapse_sdk/devtools/docs/docs/contributing.md +306 -0
- synapse_sdk/devtools/docs/docs/examples/index.md +29 -0
- synapse_sdk/devtools/docs/docs/faq.md +179 -0
- synapse_sdk/devtools/docs/docs/features/converters/index.md +455 -0
- synapse_sdk/devtools/docs/docs/features/index.md +24 -0
- synapse_sdk/devtools/docs/docs/features/utils/file.md +415 -0
- synapse_sdk/devtools/docs/docs/features/utils/network.md +378 -0
- synapse_sdk/devtools/docs/docs/features/utils/storage.md +57 -0
- synapse_sdk/devtools/docs/docs/features/utils/types.md +51 -0
- synapse_sdk/devtools/docs/docs/installation.md +94 -0
- synapse_sdk/devtools/docs/docs/introduction.md +47 -0
- synapse_sdk/devtools/docs/docs/plugins/categories/neural-net-plugins/train-action-overview.md +814 -0
- synapse_sdk/devtools/docs/docs/plugins/categories/pre-annotation-plugins/pre-annotation-plugin-overview.md +198 -0
- synapse_sdk/devtools/docs/docs/plugins/categories/pre-annotation-plugins/to-task-action-development.md +1645 -0
- synapse_sdk/devtools/docs/docs/plugins/categories/pre-annotation-plugins/to-task-overview.md +717 -0
- synapse_sdk/devtools/docs/docs/plugins/categories/pre-annotation-plugins/to-task-template-development.md +1380 -0
- synapse_sdk/devtools/docs/docs/plugins/categories/upload-plugins/upload-plugin-action.md +948 -0
- synapse_sdk/devtools/docs/docs/plugins/categories/upload-plugins/upload-plugin-overview.md +544 -0
- synapse_sdk/devtools/docs/docs/plugins/categories/upload-plugins/upload-plugin-template.md +766 -0
- synapse_sdk/devtools/docs/docs/plugins/export-plugins.md +1092 -0
- synapse_sdk/devtools/docs/docs/plugins/plugins.md +852 -0
- synapse_sdk/devtools/docs/docs/quickstart.md +78 -0
- synapse_sdk/devtools/docs/docs/troubleshooting.md +519 -0
- synapse_sdk/devtools/docs/docs/tutorial-basics/_category_.json +8 -0
- synapse_sdk/devtools/docs/docs/tutorial-basics/congratulations.md +23 -0
- synapse_sdk/devtools/docs/docs/tutorial-basics/create-a-blog-post.md +34 -0
- synapse_sdk/devtools/docs/docs/tutorial-basics/create-a-document.md +57 -0
- synapse_sdk/devtools/docs/docs/tutorial-basics/create-a-page.md +43 -0
- synapse_sdk/devtools/docs/docs/tutorial-basics/deploy-your-site.md +31 -0
- synapse_sdk/devtools/docs/docs/tutorial-basics/markdown-features.mdx +152 -0
- synapse_sdk/devtools/docs/docs/tutorial-extras/_category_.json +7 -0
- synapse_sdk/devtools/docs/docs/tutorial-extras/img/docsVersionDropdown.png +0 -0
- synapse_sdk/devtools/docs/docs/tutorial-extras/img/localeDropdown.png +0 -0
- synapse_sdk/devtools/docs/docs/tutorial-extras/manage-docs-versions.md +55 -0
- synapse_sdk/devtools/docs/docs/tutorial-extras/translate-your-site.md +88 -0
- synapse_sdk/devtools/docs/docusaurus.config.ts +148 -0
- synapse_sdk/devtools/docs/i18n/ko/code.json +325 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/agent.md +43 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/annotation-mixin.md +289 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/backend.md +420 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/base.md +257 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/core-mixin.md +417 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/data-collection-mixin.md +356 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/hitl-mixin.md +192 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/index.md +391 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/integration-mixin.md +479 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/ml-mixin.md +284 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/ray.md +342 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/index.md +52 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/plugins/models.md +114 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/categories.md +0 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/cli-usage.md +280 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/concepts/index.md +38 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/configuration.md +83 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/contributing.md +306 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/examples/index.md +29 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/faq.md +179 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/converters/index.md +30 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/index.md +24 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/utils/file.md +415 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/utils/network.md +378 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/utils/storage.md +60 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/utils/types.md +51 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/installation.md +94 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/introduction.md +47 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/neural-net-plugins/train-action-overview.md +815 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/pre-annotation-plugins/pre-annotation-plugin-overview.md +198 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/pre-annotation-plugins/to-task-action-development.md +1645 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/pre-annotation-plugins/to-task-overview.md +717 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/pre-annotation-plugins/to-task-template-development.md +1380 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/upload-plugins/upload-plugin-action.md +948 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/upload-plugins/upload-plugin-overview.md +544 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/upload-plugins/upload-plugin-template.md +766 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/export-plugins.md +1092 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/plugins.md +117 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/quickstart.md +78 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/troubleshooting.md +519 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current.json +34 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-theme-classic/footer.json +42 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-theme-classic/navbar.json +18 -0
- synapse_sdk/devtools/docs/package-lock.json +18784 -0
- synapse_sdk/devtools/docs/package.json +48 -0
- synapse_sdk/devtools/docs/sidebars.ts +122 -0
- synapse_sdk/devtools/docs/src/components/HomepageFeatures/index.tsx +71 -0
- synapse_sdk/devtools/docs/src/components/HomepageFeatures/styles.module.css +11 -0
- synapse_sdk/devtools/docs/src/css/custom.css +30 -0
- synapse_sdk/devtools/docs/src/pages/index.module.css +23 -0
- synapse_sdk/devtools/docs/src/pages/index.tsx +21 -0
- synapse_sdk/devtools/docs/src/pages/markdown-page.md +7 -0
- synapse_sdk/devtools/docs/static/.nojekyll +0 -0
- synapse_sdk/devtools/docs/static/img/docusaurus-social-card.jpg +0 -0
- synapse_sdk/devtools/docs/static/img/docusaurus.png +0 -0
- synapse_sdk/devtools/docs/static/img/favicon.ico +0 -0
- synapse_sdk/devtools/docs/static/img/logo.png +0 -0
- synapse_sdk/devtools/docs/static/img/undraw_docusaurus_mountain.svg +171 -0
- synapse_sdk/devtools/docs/static/img/undraw_docusaurus_react.svg +170 -0
- synapse_sdk/devtools/docs/static/img/undraw_docusaurus_tree.svg +40 -0
- synapse_sdk/devtools/docs/tsconfig.json +8 -0
- synapse_sdk/devtools/server.py +41 -0
- synapse_sdk/devtools/streamlit_app/__init__.py +5 -0
- synapse_sdk/devtools/streamlit_app/app.py +128 -0
- synapse_sdk/devtools/streamlit_app/services/__init__.py +11 -0
- synapse_sdk/devtools/streamlit_app/services/job_service.py +233 -0
- synapse_sdk/devtools/streamlit_app/services/plugin_service.py +236 -0
- synapse_sdk/devtools/streamlit_app/services/serve_service.py +95 -0
- synapse_sdk/devtools/streamlit_app/ui/__init__.py +15 -0
- synapse_sdk/devtools/streamlit_app/ui/config_tab.py +76 -0
- synapse_sdk/devtools/streamlit_app/ui/deployment_tab.py +66 -0
- synapse_sdk/devtools/streamlit_app/ui/http_tab.py +125 -0
- synapse_sdk/devtools/streamlit_app/ui/jobs_tab.py +573 -0
- synapse_sdk/devtools/streamlit_app/ui/serve_tab.py +346 -0
- synapse_sdk/devtools/streamlit_app/ui/status_bar.py +118 -0
- synapse_sdk/devtools/streamlit_app/utils/__init__.py +40 -0
- synapse_sdk/devtools/streamlit_app/utils/json_viewer.py +197 -0
- synapse_sdk/devtools/streamlit_app/utils/log_formatter.py +38 -0
- synapse_sdk/devtools/streamlit_app/utils/styles.py +241 -0
- synapse_sdk/devtools/streamlit_app/utils/ui_components.py +289 -0
- synapse_sdk/devtools/streamlit_app.py +10 -0
- synapse_sdk/loggers.py +65 -7
- synapse_sdk/plugins/README.md +1340 -0
- synapse_sdk/plugins/categories/base.py +73 -11
- synapse_sdk/plugins/categories/data_validation/actions/validation.py +72 -0
- synapse_sdk/plugins/categories/data_validation/templates/plugin/validation.py +33 -5
- synapse_sdk/plugins/categories/export/actions/__init__.py +3 -0
- synapse_sdk/plugins/categories/export/actions/export/__init__.py +28 -0
- synapse_sdk/plugins/categories/export/actions/export/action.py +165 -0
- synapse_sdk/plugins/categories/export/actions/export/enums.py +113 -0
- synapse_sdk/plugins/categories/export/actions/export/exceptions.py +53 -0
- synapse_sdk/plugins/categories/export/actions/export/models.py +74 -0
- synapse_sdk/plugins/categories/export/actions/export/run.py +195 -0
- synapse_sdk/plugins/categories/export/actions/{export.py → export/utils.py} +47 -82
- synapse_sdk/plugins/categories/export/templates/config.yaml +19 -1
- synapse_sdk/plugins/categories/export/templates/plugin/__init__.py +390 -0
- synapse_sdk/plugins/categories/export/templates/plugin/export.py +153 -129
- synapse_sdk/plugins/categories/neural_net/actions/deployment.py +9 -62
- synapse_sdk/plugins/categories/neural_net/actions/train.py +1062 -32
- synapse_sdk/plugins/categories/neural_net/actions/tune.py +534 -0
- synapse_sdk/plugins/categories/neural_net/templates/config.yaml +27 -5
- synapse_sdk/plugins/categories/neural_net/templates/plugin/inference.py +26 -10
- synapse_sdk/plugins/categories/pre_annotation/actions/__init__.py +4 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/pre_annotation/__init__.py +3 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/pre_annotation/action.py +10 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/__init__.py +28 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/action.py +145 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/enums.py +269 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/exceptions.py +14 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/factory.py +76 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/models.py +97 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/orchestrator.py +250 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/run.py +64 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/__init__.py +17 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/annotation.py +287 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/base.py +170 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/extraction.py +83 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/metrics.py +87 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/preprocessor.py +127 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/validation.py +143 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task.py +966 -0
- synapse_sdk/plugins/categories/pre_annotation/templates/config.yaml +19 -0
- synapse_sdk/plugins/categories/pre_annotation/templates/plugin/to_task.py +40 -0
- synapse_sdk/plugins/categories/upload/actions/upload/__init__.py +19 -0
- synapse_sdk/plugins/categories/upload/actions/upload/action.py +232 -0
- synapse_sdk/plugins/categories/upload/actions/upload/context.py +185 -0
- synapse_sdk/plugins/categories/upload/actions/upload/enums.py +471 -0
- synapse_sdk/plugins/categories/upload/actions/upload/exceptions.py +36 -0
- synapse_sdk/plugins/categories/upload/actions/upload/factory.py +138 -0
- synapse_sdk/plugins/categories/upload/actions/upload/models.py +203 -0
- synapse_sdk/plugins/categories/upload/actions/upload/orchestrator.py +183 -0
- synapse_sdk/plugins/categories/upload/actions/upload/registry.py +113 -0
- synapse_sdk/plugins/categories/upload/actions/upload/run.py +179 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/base.py +107 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/cleanup.py +62 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/collection.py +63 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/generate.py +84 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/initialize.py +82 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/metadata.py +235 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/organize.py +203 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/upload.py +97 -0
- synapse_sdk/plugins/categories/upload/actions/upload/steps/validate.py +71 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/base.py +82 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/data_unit/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/data_unit/batch.py +39 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/data_unit/single.py +29 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/file_discovery/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/file_discovery/flat.py +258 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/file_discovery/recursive.py +281 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/metadata/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/metadata/excel.py +174 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/metadata/none.py +16 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/upload/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/upload/sync.py +84 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/validation/__init__.py +1 -0
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/validation/default.py +60 -0
- synapse_sdk/plugins/categories/upload/actions/upload/utils.py +250 -0
- synapse_sdk/plugins/categories/upload/templates/README.md +470 -0
- synapse_sdk/plugins/categories/upload/templates/config.yaml +29 -2
- synapse_sdk/plugins/categories/upload/templates/plugin/__init__.py +294 -0
- synapse_sdk/plugins/categories/upload/templates/plugin/upload.py +88 -30
- synapse_sdk/plugins/models.py +122 -16
- synapse_sdk/plugins/templates/plugin-config-schema.json +406 -0
- synapse_sdk/plugins/templates/schema.json +491 -0
- synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/requirements.txt +1 -1
- synapse_sdk/plugins/utils/__init__.py +46 -0
- synapse_sdk/plugins/utils/actions.py +119 -0
- synapse_sdk/plugins/utils/config.py +203 -0
- synapse_sdk/plugins/{utils.py → utils/legacy.py} +26 -46
- synapse_sdk/plugins/utils/ray_gcs.py +66 -0
- synapse_sdk/plugins/utils/registry.py +58 -0
- synapse_sdk/shared/__init__.py +25 -0
- synapse_sdk/shared/enums.py +93 -0
- synapse_sdk/utils/converters/__init__.py +240 -0
- synapse_sdk/utils/converters/coco/__init__.py +0 -0
- synapse_sdk/utils/converters/coco/from_dm.py +322 -0
- synapse_sdk/utils/converters/coco/to_dm.py +215 -0
- synapse_sdk/utils/converters/dm/__init__.py +56 -0
- synapse_sdk/utils/converters/dm/from_v1.py +627 -0
- synapse_sdk/utils/converters/dm/to_v1.py +367 -0
- synapse_sdk/utils/converters/pascal/__init__.py +0 -0
- synapse_sdk/utils/converters/pascal/from_dm.py +244 -0
- synapse_sdk/utils/converters/pascal/to_dm.py +214 -0
- synapse_sdk/utils/converters/yolo/__init__.py +0 -0
- synapse_sdk/utils/converters/yolo/from_dm.py +384 -0
- synapse_sdk/utils/converters/yolo/to_dm.py +267 -0
- synapse_sdk/utils/dataset.py +46 -0
- synapse_sdk/utils/encryption.py +158 -0
- synapse_sdk/utils/file/__init__.py +39 -0
- synapse_sdk/utils/file/archive.py +32 -0
- synapse_sdk/utils/file/checksum.py +56 -0
- synapse_sdk/utils/file/chunking.py +31 -0
- synapse_sdk/utils/file/download.py +385 -0
- synapse_sdk/utils/file/encoding.py +40 -0
- synapse_sdk/utils/file/io.py +22 -0
- synapse_sdk/utils/file/video/__init__.py +29 -0
- synapse_sdk/utils/file/video/transcode.py +307 -0
- synapse_sdk/utils/{file.py → file.py.backup} +84 -2
- synapse_sdk/utils/http.py +138 -0
- synapse_sdk/utils/network.py +293 -0
- synapse_sdk/utils/storage/__init__.py +36 -2
- synapse_sdk/utils/storage/providers/__init__.py +141 -0
- synapse_sdk/utils/storage/providers/file_system.py +134 -0
- synapse_sdk/utils/storage/providers/http.py +190 -0
- synapse_sdk/utils/storage/providers/s3.py +54 -6
- synapse_sdk/utils/storage/providers/sftp.py +31 -0
- synapse_sdk/utils/storage/registry.py +6 -0
- synapse_sdk-2025.11.7.dist-info/METADATA +122 -0
- synapse_sdk-2025.11.7.dist-info/RECORD +386 -0
- {synapse_sdk-1.0.0a35.dist-info → synapse_sdk-2025.11.7.dist-info}/WHEEL +1 -1
- synapse_sdk/clients/backend/dataset.py +0 -102
- synapse_sdk/plugins/categories/upload/actions/upload.py +0 -293
- synapse_sdk-1.0.0a35.dist-info/METADATA +0 -47
- synapse_sdk-1.0.0a35.dist-info/RECORD +0 -137
- {synapse_sdk-1.0.0a35.dist-info → synapse_sdk-2025.11.7.dist-info}/entry_points.txt +0 -0
- {synapse_sdk-1.0.0a35.dist-info → synapse_sdk-2025.11.7.dist-info}/licenses/LICENSE +0 -0
- {synapse_sdk-1.0.0a35.dist-info → synapse_sdk-2025.11.7.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,627 @@
|
|
|
1
|
+
from . import BaseDMConverter
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class DMV1ToV2Converter(BaseDMConverter):
|
|
5
|
+
"""DM v1 to v2 format converter class."""
|
|
6
|
+
|
|
7
|
+
def __init__(self, old_dm_data={}, file_type=None):
|
|
8
|
+
"""Initialize the converter.
|
|
9
|
+
|
|
10
|
+
Args:
|
|
11
|
+
old_dm_data (dict): DM v1 format data to be converted
|
|
12
|
+
file_type (str, optional): Type of file being converted
|
|
13
|
+
"""
|
|
14
|
+
super().__init__(file_type)
|
|
15
|
+
self.old_dm_data = old_dm_data
|
|
16
|
+
self.classification_info = {}
|
|
17
|
+
self.media_data = {}
|
|
18
|
+
|
|
19
|
+
def convert(self):
|
|
20
|
+
"""Convert DM v1 data to v2 format.
|
|
21
|
+
|
|
22
|
+
Returns:
|
|
23
|
+
dict: Converted data in DM v2 format
|
|
24
|
+
"""
|
|
25
|
+
# Reset state
|
|
26
|
+
old_dm_data = self.old_dm_data
|
|
27
|
+
self.classification_info = {}
|
|
28
|
+
self.media_data = {}
|
|
29
|
+
|
|
30
|
+
# Extract media IDs from annotations key
|
|
31
|
+
media_ids = list(old_dm_data.get('annotations', {}).keys())
|
|
32
|
+
|
|
33
|
+
# If file_type is not specified, try to detect from media_ids
|
|
34
|
+
if not self.file_type and media_ids:
|
|
35
|
+
detected_file_type = self._detect_file_type(media_ids[0])
|
|
36
|
+
if detected_file_type:
|
|
37
|
+
self.file_type = detected_file_type
|
|
38
|
+
# Re-setup tool processors with detected file_type
|
|
39
|
+
self.tool_processors = self._setup_tool_processors()
|
|
40
|
+
|
|
41
|
+
for media_id in media_ids:
|
|
42
|
+
self._convert_media_item(old_dm_data, media_id)
|
|
43
|
+
|
|
44
|
+
# Build final result (put classification at the front)
|
|
45
|
+
result = {'classification': self.classification_info}
|
|
46
|
+
result.update(self.media_data)
|
|
47
|
+
|
|
48
|
+
return result
|
|
49
|
+
|
|
50
|
+
def _detect_file_type(self, media_id):
|
|
51
|
+
"""Detect file type from media ID."""
|
|
52
|
+
if '_' in media_id:
|
|
53
|
+
return media_id.split('_')[0]
|
|
54
|
+
return media_id
|
|
55
|
+
|
|
56
|
+
def _convert_media_item(self, old_dm_data, media_id):
|
|
57
|
+
"""Process a single media item.
|
|
58
|
+
|
|
59
|
+
Args:
|
|
60
|
+
old_dm_data (dict): Original DM v1 data
|
|
61
|
+
media_id (str): ID of the media item to process
|
|
62
|
+
"""
|
|
63
|
+
# Extract media type (e.g., "video_1" -> "videos", "image_2" -> "images")
|
|
64
|
+
media_type, media_type_plural = self._extract_media_type_info(media_id)
|
|
65
|
+
|
|
66
|
+
# Create list for this media type if it doesn't exist
|
|
67
|
+
if media_type_plural not in self.media_data:
|
|
68
|
+
self.media_data[media_type_plural] = []
|
|
69
|
+
|
|
70
|
+
# Create id -> class and tool mappings
|
|
71
|
+
annotations = old_dm_data.get('annotations', {}).get(media_id, [])
|
|
72
|
+
|
|
73
|
+
id_to_class = {}
|
|
74
|
+
id_to_tool = {}
|
|
75
|
+
for annotation in annotations:
|
|
76
|
+
id_to_class[annotation['id']] = annotation['classification']['class']
|
|
77
|
+
id_to_tool[annotation['id']] = annotation['tool']
|
|
78
|
+
|
|
79
|
+
# Create id -> full classification mapping (including additional attributes)
|
|
80
|
+
id_to_full_classification = {annotation['id']: annotation['classification'] for annotation in annotations}
|
|
81
|
+
|
|
82
|
+
# Collect all classifications from annotations (regardless of whether they have data)
|
|
83
|
+
for annotation in annotations:
|
|
84
|
+
tool_type = annotation['tool']
|
|
85
|
+
classification = annotation['classification']['class']
|
|
86
|
+
|
|
87
|
+
if tool_type not in self.classification_info:
|
|
88
|
+
self.classification_info[tool_type] = []
|
|
89
|
+
|
|
90
|
+
# Add only non-duplicate classifications
|
|
91
|
+
if classification and classification not in self.classification_info[tool_type]:
|
|
92
|
+
self.classification_info[tool_type].append(classification)
|
|
93
|
+
|
|
94
|
+
# Initialize current media item
|
|
95
|
+
media_item = {}
|
|
96
|
+
|
|
97
|
+
# Process data from annotationsData for this media
|
|
98
|
+
annotations_data = old_dm_data.get('annotationsData', {}).get(media_id, [])
|
|
99
|
+
|
|
100
|
+
# Group by annotation tool type
|
|
101
|
+
tools_data = {}
|
|
102
|
+
|
|
103
|
+
for item in annotations_data:
|
|
104
|
+
item_id = item.get('id', '')
|
|
105
|
+
# Get tool and classification info from annotations
|
|
106
|
+
tool_type = id_to_tool.get(item_id, '')
|
|
107
|
+
classification = id_to_class.get(item_id, '')
|
|
108
|
+
|
|
109
|
+
# Process by each tool type
|
|
110
|
+
self._convert_annotation_item(
|
|
111
|
+
item, item_id, tool_type, classification, id_to_full_classification, tools_data, media_type
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
# Add processed tool data to media item
|
|
115
|
+
for tool_type, tool_data in tools_data.items():
|
|
116
|
+
if tool_data: # Only add if data exists
|
|
117
|
+
media_item[tool_type] = tool_data
|
|
118
|
+
|
|
119
|
+
# Add media item to result (only if data exists)
|
|
120
|
+
if media_item:
|
|
121
|
+
self.media_data[media_type_plural].append(media_item)
|
|
122
|
+
|
|
123
|
+
def _convert_annotation_item(
|
|
124
|
+
self, item, item_id, tool_type, classification, id_to_full_classification, tools_data, media_type
|
|
125
|
+
):
|
|
126
|
+
"""Process a single annotation item based on its tool type and media type.
|
|
127
|
+
|
|
128
|
+
Args:
|
|
129
|
+
item (dict): Annotation item data
|
|
130
|
+
item_id (str): ID of the annotation item
|
|
131
|
+
tool_type (str): Type of annotation tool
|
|
132
|
+
classification (str): Classification label
|
|
133
|
+
id_to_full_classification (dict): Mapping of ID to full classification data
|
|
134
|
+
tools_data (dict): Dictionary to store processed tool data
|
|
135
|
+
media_type (str): Type of media (image, video, pcd, text)
|
|
136
|
+
"""
|
|
137
|
+
# Check if tool_processors is available and contains the tool_type
|
|
138
|
+
if hasattr(self, 'tool_processors') and self.tool_processors:
|
|
139
|
+
processor = self.tool_processors.get(tool_type)
|
|
140
|
+
if processor:
|
|
141
|
+
processor(item, item_id, classification, tools_data, id_to_full_classification)
|
|
142
|
+
else:
|
|
143
|
+
self._handle_unknown_tool(tool_type, item_id)
|
|
144
|
+
else:
|
|
145
|
+
# Use file_type + tool_type pattern for method names
|
|
146
|
+
method_name = f'_convert_{media_type}_{tool_type}'
|
|
147
|
+
if hasattr(self, method_name):
|
|
148
|
+
method = getattr(self, method_name)
|
|
149
|
+
method(item, item_id, classification, tools_data, id_to_full_classification)
|
|
150
|
+
else:
|
|
151
|
+
self._handle_unknown_tool(tool_type, item_id, media_type)
|
|
152
|
+
|
|
153
|
+
def _handle_unknown_tool(self, tool_type, item_id=None, media_type=None):
|
|
154
|
+
"""Handle unknown tool types with consistent warning message."""
|
|
155
|
+
warning_msg = f"Warning: Unknown tool type '{tool_type}'"
|
|
156
|
+
if media_type:
|
|
157
|
+
warning_msg += f' for media type {media_type}'
|
|
158
|
+
if item_id:
|
|
159
|
+
warning_msg += f' for item {item_id}'
|
|
160
|
+
print(warning_msg)
|
|
161
|
+
|
|
162
|
+
def _extract_media_type_info(self, media_id):
|
|
163
|
+
"""Extract media type information from media ID."""
|
|
164
|
+
media_type = media_id.split('_')[0] if '_' in media_id else media_id
|
|
165
|
+
media_type_plural = media_type + 's' if not media_type.endswith('s') else media_type
|
|
166
|
+
return media_type, media_type_plural
|
|
167
|
+
|
|
168
|
+
def _singularize_media_type(self, media_type_plural):
|
|
169
|
+
"""Convert plural media type to singular."""
|
|
170
|
+
return media_type_plural.rstrip('s')
|
|
171
|
+
|
|
172
|
+
def _process_bounding_box_common(self, item, item_id, classification, tools_data, id_to_full_classification=None):
|
|
173
|
+
"""Process bounding box annotation - common logic.
|
|
174
|
+
|
|
175
|
+
Args:
|
|
176
|
+
item (dict): Annotation item data
|
|
177
|
+
item_id (str): ID of the annotation item
|
|
178
|
+
classification (str): Classification label
|
|
179
|
+
tools_data (dict): Dictionary to store processed tool data
|
|
180
|
+
id_to_full_classification (dict, optional): Full classification mapping
|
|
181
|
+
"""
|
|
182
|
+
if 'bounding_box' not in tools_data:
|
|
183
|
+
tools_data['bounding_box'] = []
|
|
184
|
+
|
|
185
|
+
# Process coordinate or coordinates
|
|
186
|
+
coord_data = None
|
|
187
|
+
if 'coordinate' in item and isinstance(item['coordinate'], dict):
|
|
188
|
+
# Single coordinate structure (dictionary)
|
|
189
|
+
coord_data = item['coordinate']
|
|
190
|
+
elif 'coordinates' in item:
|
|
191
|
+
# Multiple coordinates structure (video etc.)
|
|
192
|
+
coords_data = item['coordinates']
|
|
193
|
+
if coords_data:
|
|
194
|
+
# Use coordinate data from first key
|
|
195
|
+
first_key = list(coords_data.keys())[0]
|
|
196
|
+
coord_data = coords_data[first_key]
|
|
197
|
+
|
|
198
|
+
if coord_data and 'width' in coord_data and 'height' in coord_data:
|
|
199
|
+
data = [
|
|
200
|
+
coord_data['x'],
|
|
201
|
+
coord_data['y'],
|
|
202
|
+
coord_data['width'],
|
|
203
|
+
coord_data['height'],
|
|
204
|
+
]
|
|
205
|
+
|
|
206
|
+
tools_data['bounding_box'].append({
|
|
207
|
+
'id': item_id,
|
|
208
|
+
'classification': classification,
|
|
209
|
+
'attrs': [],
|
|
210
|
+
'data': data,
|
|
211
|
+
})
|
|
212
|
+
|
|
213
|
+
def _convert_bounding_box(self, item, item_id, classification, tools_data, id_to_full_classification=None):
|
|
214
|
+
"""Process bounding box annotation."""
|
|
215
|
+
return self._process_bounding_box_common(item, item_id, classification, tools_data, id_to_full_classification)
|
|
216
|
+
|
|
217
|
+
def _convert_named_entity(self, item, item_id, classification, tools_data, id_to_full_classification=None):
|
|
218
|
+
"""Process named entity annotation.
|
|
219
|
+
|
|
220
|
+
Args:
|
|
221
|
+
item (dict): Annotation item data
|
|
222
|
+
item_id (str): ID of the annotation item
|
|
223
|
+
classification (str): Classification label
|
|
224
|
+
tools_data (dict): Dictionary to store processed tool data
|
|
225
|
+
id_to_full_classification (dict, optional): Full classification mapping
|
|
226
|
+
"""
|
|
227
|
+
if 'named_entity' not in tools_data:
|
|
228
|
+
tools_data['named_entity'] = []
|
|
229
|
+
|
|
230
|
+
# Process named_entity ranges and content
|
|
231
|
+
entity_data = {}
|
|
232
|
+
if 'ranges' in item and isinstance(item['ranges'], list):
|
|
233
|
+
# Store ranges information
|
|
234
|
+
entity_data['ranges'] = item['ranges']
|
|
235
|
+
|
|
236
|
+
if 'content' in item:
|
|
237
|
+
# Store selected text content
|
|
238
|
+
entity_data['content'] = item['content']
|
|
239
|
+
|
|
240
|
+
tools_data['named_entity'].append({
|
|
241
|
+
'id': item_id,
|
|
242
|
+
'classification': classification,
|
|
243
|
+
'attrs': [],
|
|
244
|
+
'data': entity_data, # Format: {ranges: [...], content: "..."}
|
|
245
|
+
})
|
|
246
|
+
|
|
247
|
+
def _process_polyline_common(self, item, item_id, classification, tools_data, id_to_full_classification=None):
|
|
248
|
+
"""Process polyline annotation.
|
|
249
|
+
|
|
250
|
+
Args:
|
|
251
|
+
item (dict): Annotation item data
|
|
252
|
+
item_id (str): ID of the annotation item
|
|
253
|
+
classification (str): Classification label
|
|
254
|
+
tools_data (dict): Dictionary to store processed tool data
|
|
255
|
+
id_to_full_classification (dict, optional): Full classification mapping
|
|
256
|
+
"""
|
|
257
|
+
if 'polyline' not in tools_data:
|
|
258
|
+
tools_data['polyline'] = []
|
|
259
|
+
|
|
260
|
+
# Process polyline coordinates
|
|
261
|
+
polyline_data = []
|
|
262
|
+
if 'coordinate' in item and isinstance(item['coordinate'], list):
|
|
263
|
+
# Convert each coordinate point to [x, y] format
|
|
264
|
+
for point in item['coordinate']:
|
|
265
|
+
if 'x' in point and 'y' in point:
|
|
266
|
+
polyline_data.append([point['x'], point['y']])
|
|
267
|
+
|
|
268
|
+
tools_data['polyline'].append({
|
|
269
|
+
'id': item_id,
|
|
270
|
+
'classification': classification,
|
|
271
|
+
'attrs': [],
|
|
272
|
+
'data': polyline_data, # Format: [[x1, y1], [x2, y2], [x3, y3], ...]
|
|
273
|
+
})
|
|
274
|
+
|
|
275
|
+
def _process_keypoint_common(self, item, item_id, classification, tools_data, id_to_full_classification=None):
|
|
276
|
+
"""Process keypoint annotation.
|
|
277
|
+
|
|
278
|
+
Args:
|
|
279
|
+
item (dict): Annotation item data
|
|
280
|
+
item_id (str): ID of the annotation item
|
|
281
|
+
classification (str): Classification label
|
|
282
|
+
tools_data (dict): Dictionary to store processed tool data
|
|
283
|
+
id_to_full_classification (dict, optional): Full classification mapping
|
|
284
|
+
"""
|
|
285
|
+
if 'keypoint' not in tools_data:
|
|
286
|
+
tools_data['keypoint'] = []
|
|
287
|
+
|
|
288
|
+
# Process keypoint coordinate (single point)
|
|
289
|
+
keypoint_data = []
|
|
290
|
+
if 'coordinate' in item and isinstance(item['coordinate'], dict):
|
|
291
|
+
coord = item['coordinate']
|
|
292
|
+
if 'x' in coord and 'y' in coord:
|
|
293
|
+
keypoint_data = [coord['x'], coord['y']]
|
|
294
|
+
|
|
295
|
+
tools_data['keypoint'].append({
|
|
296
|
+
'id': item_id,
|
|
297
|
+
'classification': classification,
|
|
298
|
+
'attrs': [],
|
|
299
|
+
'data': keypoint_data, # Format: [x, y]
|
|
300
|
+
})
|
|
301
|
+
|
|
302
|
+
def _convert_3d_bounding_box(self, item, item_id, classification, tools_data, id_to_full_classification=None):
|
|
303
|
+
"""Process 3D bounding box annotation.
|
|
304
|
+
|
|
305
|
+
Args:
|
|
306
|
+
item (dict): Annotation item data
|
|
307
|
+
item_id (str): ID of the annotation item
|
|
308
|
+
classification (str): Classification label
|
|
309
|
+
tools_data (dict): Dictionary to store processed tool data
|
|
310
|
+
id_to_full_classification (dict, optional): Full classification mapping
|
|
311
|
+
"""
|
|
312
|
+
if '3d_bounding_box' not in tools_data:
|
|
313
|
+
tools_data['3d_bounding_box'] = []
|
|
314
|
+
|
|
315
|
+
# Process 3d_bounding_box psr (position, scale, rotation)
|
|
316
|
+
psr_data = {}
|
|
317
|
+
if 'psr' in item and isinstance(item['psr'], dict):
|
|
318
|
+
psr = item['psr']
|
|
319
|
+
|
|
320
|
+
# Extract only x, y, z values from position, scale, rotation
|
|
321
|
+
for component in ['position', 'scale', 'rotation']:
|
|
322
|
+
if component in psr and isinstance(psr[component], dict):
|
|
323
|
+
psr_data[component] = {
|
|
324
|
+
'x': psr[component].get('x'),
|
|
325
|
+
'y': psr[component].get('y'),
|
|
326
|
+
'z': psr[component].get('z'),
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
tools_data['3d_bounding_box'].append({
|
|
330
|
+
'id': item_id,
|
|
331
|
+
'classification': classification,
|
|
332
|
+
'attrs': [],
|
|
333
|
+
'data': psr_data, # Format: {position: {x,y,z}, scale: {x,y,z}, rotation: {x,y,z}}
|
|
334
|
+
})
|
|
335
|
+
|
|
336
|
+
def _convert_video_segmentation_data(
|
|
337
|
+
self, item, item_id, classification, tools_data, id_to_full_classification=None
|
|
338
|
+
):
|
|
339
|
+
"""Process video segmentation annotation data.
|
|
340
|
+
|
|
341
|
+
Args:
|
|
342
|
+
item (dict): Annotation item data
|
|
343
|
+
item_id (str): ID of the annotation item
|
|
344
|
+
classification (str): Classification label
|
|
345
|
+
tools_data (dict): Dictionary to store processed tool data
|
|
346
|
+
id_to_full_classification (dict, optional): Full classification mapping
|
|
347
|
+
"""
|
|
348
|
+
if 'segmentation' not in tools_data:
|
|
349
|
+
tools_data['segmentation'] = []
|
|
350
|
+
|
|
351
|
+
# Process frame section-based segmentation (videos)
|
|
352
|
+
segmentation_data = {}
|
|
353
|
+
if 'section' in item and isinstance(item['section'], dict):
|
|
354
|
+
segmentation_data = item['section']
|
|
355
|
+
|
|
356
|
+
tools_data['segmentation'].append({
|
|
357
|
+
'id': item_id,
|
|
358
|
+
'classification': classification,
|
|
359
|
+
'attrs': [],
|
|
360
|
+
'data': segmentation_data, # Format: {startFrame: x, endFrame: y}
|
|
361
|
+
})
|
|
362
|
+
|
|
363
|
+
def _convert_image_segmentation_data(
|
|
364
|
+
self, item, item_id, classification, tools_data, id_to_full_classification=None
|
|
365
|
+
):
|
|
366
|
+
"""Process image segmentation annotation data.
|
|
367
|
+
|
|
368
|
+
Args:
|
|
369
|
+
item (dict): Annotation item data
|
|
370
|
+
item_id (str): ID of the annotation item
|
|
371
|
+
classification (str): Classification label
|
|
372
|
+
tools_data (dict): Dictionary to store processed tool data
|
|
373
|
+
id_to_full_classification (dict, optional): Full classification mapping
|
|
374
|
+
"""
|
|
375
|
+
if 'segmentation' not in tools_data:
|
|
376
|
+
tools_data['segmentation'] = []
|
|
377
|
+
|
|
378
|
+
# Process pixel-based segmentation (images)
|
|
379
|
+
segmentation_data = {}
|
|
380
|
+
if 'pixel_indices' in item and isinstance(item['pixel_indices'], list):
|
|
381
|
+
segmentation_data = item['pixel_indices']
|
|
382
|
+
|
|
383
|
+
tools_data['segmentation'].append({
|
|
384
|
+
'id': item_id,
|
|
385
|
+
'classification': classification,
|
|
386
|
+
'attrs': [],
|
|
387
|
+
'data': segmentation_data, # Format: [pixel_indices...]
|
|
388
|
+
})
|
|
389
|
+
|
|
390
|
+
def _process_polygon_common(self, item, item_id, classification, tools_data, id_to_full_classification=None):
|
|
391
|
+
"""Process polygon annotation.
|
|
392
|
+
|
|
393
|
+
Args:
|
|
394
|
+
item (dict): Annotation item data
|
|
395
|
+
item_id (str): ID of the annotation item
|
|
396
|
+
classification (str): Classification label
|
|
397
|
+
tools_data (dict): Dictionary to store processed tool data
|
|
398
|
+
id_to_full_classification (dict, optional): Full classification mapping
|
|
399
|
+
"""
|
|
400
|
+
if 'polygon' not in tools_data:
|
|
401
|
+
tools_data['polygon'] = []
|
|
402
|
+
|
|
403
|
+
# Process polygon coordinates
|
|
404
|
+
polygon_data = []
|
|
405
|
+
if 'coordinate' in item and isinstance(item['coordinate'], list):
|
|
406
|
+
# Convert each coordinate point to [x, y] format
|
|
407
|
+
for point in item['coordinate']:
|
|
408
|
+
if 'x' in point and 'y' in point:
|
|
409
|
+
polygon_data.append([point['x'], point['y']])
|
|
410
|
+
|
|
411
|
+
tools_data['polygon'].append({
|
|
412
|
+
'id': item_id,
|
|
413
|
+
'classification': classification,
|
|
414
|
+
'attrs': [],
|
|
415
|
+
'data': polygon_data, # Format: [[x1, y1], [x2, y2], [x3, y3], ...]
|
|
416
|
+
})
|
|
417
|
+
|
|
418
|
+
def _process_relation_common(self, item, item_id, classification, tools_data, id_to_full_classification=None):
|
|
419
|
+
"""Process relation annotation.
|
|
420
|
+
|
|
421
|
+
Args:
|
|
422
|
+
item (dict): Annotation item data
|
|
423
|
+
item_id (str): ID of the annotation item
|
|
424
|
+
classification (str): Classification label
|
|
425
|
+
tools_data (dict): Dictionary to store processed tool data
|
|
426
|
+
id_to_full_classification (dict, optional): Full classification mapping
|
|
427
|
+
"""
|
|
428
|
+
if 'relation' not in tools_data:
|
|
429
|
+
tools_data['relation'] = []
|
|
430
|
+
|
|
431
|
+
# Process relation data (needs adjustment based on actual relation data structure)
|
|
432
|
+
relation_data = []
|
|
433
|
+
if 'data' in item:
|
|
434
|
+
relation_data = item['data']
|
|
435
|
+
|
|
436
|
+
tools_data['relation'].append({
|
|
437
|
+
'id': item_id,
|
|
438
|
+
'classification': classification,
|
|
439
|
+
'attrs': [],
|
|
440
|
+
'data': relation_data, # Format: ['from_id', 'to_id']
|
|
441
|
+
})
|
|
442
|
+
|
|
443
|
+
def _convert_group(self, item, item_id, classification, tools_data, id_to_full_classification=None):
|
|
444
|
+
"""Process group annotation.
|
|
445
|
+
|
|
446
|
+
Args:
|
|
447
|
+
item (dict): Annotation item data
|
|
448
|
+
item_id (str): ID of the annotation item
|
|
449
|
+
classification (str): Classification label
|
|
450
|
+
tools_data (dict): Dictionary to store processed tool data
|
|
451
|
+
id_to_full_classification (dict, optional): Full classification mapping
|
|
452
|
+
"""
|
|
453
|
+
if 'group' not in tools_data:
|
|
454
|
+
tools_data['group'] = []
|
|
455
|
+
|
|
456
|
+
# Process group data (needs adjustment based on actual group data structure)
|
|
457
|
+
group_data = []
|
|
458
|
+
if 'data' in item:
|
|
459
|
+
group_data = item['data']
|
|
460
|
+
|
|
461
|
+
tools_data['group'].append({
|
|
462
|
+
'id': item_id,
|
|
463
|
+
'classification': classification,
|
|
464
|
+
'attrs': [],
|
|
465
|
+
'data': group_data, # Format: ['id1', 'id2', 'id3', ...]
|
|
466
|
+
})
|
|
467
|
+
|
|
468
|
+
# Include all the _convert_* methods from previous code...
|
|
469
|
+
def _convert_classification(self, item, item_id, classification, tools_data, id_to_full_classification):
|
|
470
|
+
"""Process classification annotation."""
|
|
471
|
+
if 'classification' not in tools_data:
|
|
472
|
+
tools_data['classification'] = []
|
|
473
|
+
|
|
474
|
+
# Get full classification info (including additional attributes)
|
|
475
|
+
full_classification = id_to_full_classification.get(item_id, {})
|
|
476
|
+
|
|
477
|
+
# Store additional attributes in attrs array
|
|
478
|
+
attrs = []
|
|
479
|
+
classification_data = {}
|
|
480
|
+
|
|
481
|
+
for key, value in full_classification.items():
|
|
482
|
+
if key != 'class': # class is already stored in classification field
|
|
483
|
+
if isinstance(value, list) and len(value) > 0:
|
|
484
|
+
# Array attributes like multiple
|
|
485
|
+
attrs.append({'name': key, 'value': value})
|
|
486
|
+
elif isinstance(value, str) and value.strip():
|
|
487
|
+
# String attributes like text, single_radio, single_dropdown
|
|
488
|
+
attrs.append({'name': key, 'value': value})
|
|
489
|
+
|
|
490
|
+
tools_data['classification'].append({
|
|
491
|
+
'id': item_id,
|
|
492
|
+
'classification': classification,
|
|
493
|
+
'attrs': attrs,
|
|
494
|
+
'data': classification_data, # Empty object for full text classification
|
|
495
|
+
})
|
|
496
|
+
|
|
497
|
+
def _convert_prompt(self, item, item_id, classification, tools_data, id_to_full_classification=None):
|
|
498
|
+
"""Process prompt annotation."""
|
|
499
|
+
if 'prompt' not in tools_data:
|
|
500
|
+
tools_data['prompt'] = []
|
|
501
|
+
|
|
502
|
+
# Process prompt input data from annotationsData
|
|
503
|
+
prompt_data = {}
|
|
504
|
+
attrs = []
|
|
505
|
+
|
|
506
|
+
if 'input' in item and isinstance(item['input'], list):
|
|
507
|
+
# Store complete input structure
|
|
508
|
+
input_items = []
|
|
509
|
+
for input_item in item['input']:
|
|
510
|
+
if isinstance(input_item, dict):
|
|
511
|
+
input_items.append(input_item)
|
|
512
|
+
# Extract text value for easy access
|
|
513
|
+
if input_item.get('type') == 'text' and 'value' in input_item:
|
|
514
|
+
prompt_data['text'] = input_item['value']
|
|
515
|
+
attrs.append('text')
|
|
516
|
+
|
|
517
|
+
prompt_data['input'] = input_items
|
|
518
|
+
attrs.append('input')
|
|
519
|
+
|
|
520
|
+
# Include any additional metadata
|
|
521
|
+
for key in ['model', 'displayName', 'generatedBy', 'timestamp']:
|
|
522
|
+
if key in item:
|
|
523
|
+
prompt_data[key] = item[key]
|
|
524
|
+
attrs.append(key)
|
|
525
|
+
|
|
526
|
+
result_item = {
|
|
527
|
+
'id': item_id,
|
|
528
|
+
'classification': classification,
|
|
529
|
+
'attrs': attrs,
|
|
530
|
+
'data': prompt_data, # Format: {text: "prompt text", input: [...], ...}
|
|
531
|
+
}
|
|
532
|
+
tools_data['prompt'].append(result_item)
|
|
533
|
+
|
|
534
|
+
def _convert_answer(self, item, item_id, classification, tools_data, id_to_full_classification=None):
|
|
535
|
+
"""Process answer annotation."""
|
|
536
|
+
if 'answer' not in tools_data:
|
|
537
|
+
tools_data['answer'] = []
|
|
538
|
+
|
|
539
|
+
# Process answer output data from annotationsData
|
|
540
|
+
answer_data = {}
|
|
541
|
+
attrs = []
|
|
542
|
+
|
|
543
|
+
if 'output' in item and isinstance(item['output'], list):
|
|
544
|
+
# Store complete output structure
|
|
545
|
+
output_items = []
|
|
546
|
+
for output_item in item['output']:
|
|
547
|
+
if isinstance(output_item, dict):
|
|
548
|
+
output_items.append(output_item)
|
|
549
|
+
# Extract text value for easy access
|
|
550
|
+
if output_item.get('type') == 'text' and 'value' in output_item:
|
|
551
|
+
answer_data['text'] = output_item['value']
|
|
552
|
+
attrs.append('text')
|
|
553
|
+
|
|
554
|
+
answer_data['output'] = output_items
|
|
555
|
+
attrs.append('output')
|
|
556
|
+
|
|
557
|
+
# Include all additional metadata from annotationsData
|
|
558
|
+
metadata_fields = ['model', 'displayName', 'generatedBy', 'promptAnnotationId', 'timestamp', 'primaryKey']
|
|
559
|
+
for key in metadata_fields:
|
|
560
|
+
if key in item:
|
|
561
|
+
answer_data[key] = item[key]
|
|
562
|
+
attrs.append(key)
|
|
563
|
+
|
|
564
|
+
result_item = {
|
|
565
|
+
'id': item_id,
|
|
566
|
+
'classification': classification,
|
|
567
|
+
'attrs': attrs,
|
|
568
|
+
'data': answer_data, # Format: {text: "answer text", output: [...], model: "...", ...}
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
tools_data['answer'].append(result_item)
|
|
572
|
+
|
|
573
|
+
def _convert_3d_segmentation(self, item, item_id, classification, tools_data, id_to_full_classification=None):
|
|
574
|
+
"""Process 3D segmentation annotation."""
|
|
575
|
+
if '3d_segmentation' not in tools_data:
|
|
576
|
+
tools_data['3d_segmentation'] = []
|
|
577
|
+
|
|
578
|
+
# Process 3D segmentation point data from annotationsData
|
|
579
|
+
segmentation_data = {}
|
|
580
|
+
attrs = []
|
|
581
|
+
|
|
582
|
+
if 'points' in item and isinstance(item['points'], list):
|
|
583
|
+
segmentation_data['points'] = item['points']
|
|
584
|
+
attrs.append('points')
|
|
585
|
+
|
|
586
|
+
# Include any additional metadata
|
|
587
|
+
for key in ['tool']:
|
|
588
|
+
if key in item:
|
|
589
|
+
segmentation_data[key] = item[key]
|
|
590
|
+
attrs.append(key)
|
|
591
|
+
|
|
592
|
+
result_item = {
|
|
593
|
+
'id': item_id,
|
|
594
|
+
'classification': classification,
|
|
595
|
+
'attrs': attrs,
|
|
596
|
+
'data': segmentation_data, # Format: {points: [146534, 146662, ...], ...}
|
|
597
|
+
}
|
|
598
|
+
tools_data['3d_segmentation'].append(result_item)
|
|
599
|
+
|
|
600
|
+
def _convert_polygon(self, item, item_id, classification, tools_data, id_to_full_classification=None):
|
|
601
|
+
"""Process polygon annotation."""
|
|
602
|
+
return self._process_polygon_common(item, item_id, classification, tools_data, id_to_full_classification)
|
|
603
|
+
|
|
604
|
+
def _convert_polyline(self, item, item_id, classification, tools_data, id_to_full_classification=None):
|
|
605
|
+
"""Process polyline annotation."""
|
|
606
|
+
return self._process_polyline_common(item, item_id, classification, tools_data, id_to_full_classification)
|
|
607
|
+
|
|
608
|
+
def _convert_keypoint(self, item, item_id, classification, tools_data, id_to_full_classification=None):
|
|
609
|
+
"""Process keypoint annotation."""
|
|
610
|
+
return self._process_keypoint_common(item, item_id, classification, tools_data, id_to_full_classification)
|
|
611
|
+
|
|
612
|
+
# Segmentation methods
|
|
613
|
+
def _convert_image_segmentation(self, item, item_id, classification, tools_data, id_to_full_classification=None):
|
|
614
|
+
"""Process segmentation annotation for image."""
|
|
615
|
+
return self._convert_image_segmentation_data(
|
|
616
|
+
item, item_id, classification, tools_data, id_to_full_classification
|
|
617
|
+
)
|
|
618
|
+
|
|
619
|
+
def _convert_video_segmentation(self, item, item_id, classification, tools_data, id_to_full_classification=None):
|
|
620
|
+
"""Process segmentation annotation for video."""
|
|
621
|
+
return self._convert_video_segmentation_data(
|
|
622
|
+
item, item_id, classification, tools_data, id_to_full_classification
|
|
623
|
+
)
|
|
624
|
+
|
|
625
|
+
def _convert_relation(self, item, item_id, classification, tools_data, id_to_full_classification=None):
|
|
626
|
+
"""Process relation annotation."""
|
|
627
|
+
return self._process_relation_common(item, item_id, classification, tools_data, id_to_full_classification)
|