synapse-sdk 1.0.0a78__tar.gz → 1.0.0a80__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 synapse-sdk might be problematic. Click here for more details.
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/PKG-INFO +1 -1
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/utils/converters/__init__.py +32 -3
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/utils/converters/coco/from_dm.py +56 -3
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/utils/converters/coco/to_dm.py +102 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/utils/converters/pascal/from_dm.py +48 -3
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/utils/converters/pascal/to_dm.py +80 -1
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/utils/converters/yolo/from_dm.py +85 -3
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/utils/converters/yolo/to_dm.py +74 -1
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk.egg-info/PKG-INFO +1 -1
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/.claude/commands/compare-branch.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/.claude/commands/review-pr.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/.coverage +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/.github/workflows/lint.yml +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/.github/workflows/pypi-publish.yml +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/.github/workflows/test.yml +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/.gitignore +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/.mcp.json +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/.pre-commit-config.yaml +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/AGENT.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/CLAUDE.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/GEMINI.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/LICENSE +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/Makefile +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/P1_rules.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/P2_rules.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/P3_rules.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/P4_rules.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/README.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/docs/api/clients/agent.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/docs/api/clients/backend.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/docs/api/clients/base.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/docs/api/index.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/docs/api/plugins/categories.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/docs/api/plugins/models.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/docs/api/plugins/utils.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/docs/api/utils/file.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/docs/api/utils/storage.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/docs/api/utils/types.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/docs/categories.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/docs/concepts/index.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/docs/configuration.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/docs/contributing.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/docs/examples/index.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/docs/faq.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/docs/features/converters/index.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/docs/features/index.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/docs/features/plugins/index.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/docs/i18n/ko/code.json +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/docs/i18n/ko/docusaurus-plugin-content-docs/current/introduction.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/docs/i18n/ko/docusaurus-plugin-content-docs/current.json +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/docs/i18n/ko/docusaurus-theme-classic/footer.json +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/docs/i18n/ko/docusaurus-theme-classic/navbar.json +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/docs/installation.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/docs/introduction.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/docs/quickstart.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/docs/troubleshooting.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/docs/tutorial-basics/_category_.json +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/docs/tutorial-basics/congratulations.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/docs/tutorial-basics/create-a-blog-post.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/docs/tutorial-basics/create-a-document.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/docs/tutorial-basics/create-a-page.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/docs/tutorial-basics/deploy-your-site.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/docs/tutorial-basics/markdown-features.mdx +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/docs/tutorial-extras/_category_.json +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/docs/tutorial-extras/img/docsVersionDropdown.png +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/docs/tutorial-extras/img/localeDropdown.png +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/docs/tutorial-extras/manage-docs-versions.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/docs/tutorial-extras/translate-your-site.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/locale/en/LC_MESSAGES/messages.mo +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/locale/en/LC_MESSAGES/messages.po +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/locale/ko/LC_MESSAGES/messages.mo +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/locale/ko/LC_MESSAGES/messages.po +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/pyproject.toml +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/pytest-ci.ini +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/pytest.ini +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/requirements.test.txt +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/requirements.txt +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/setup.cfg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/cli/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/cli/alias/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/cli/alias/create.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/cli/alias/dataclass.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/cli/alias/default.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/cli/alias/delete.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/cli/alias/list.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/cli/alias/read.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/cli/alias/update.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/cli/alias/utils.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/cli/config.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/cli/devtools.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/cli/plugin/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/cli/plugin/create.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/cli/plugin/publish.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/cli/plugin/run.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/clients/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/clients/agent/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/clients/agent/core.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/clients/agent/ray.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/clients/agent/service.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/clients/backend/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/clients/backend/annotation.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/clients/backend/core.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/clients/backend/data_collection.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/clients/backend/hitl.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/clients/backend/integration.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/clients/backend/ml.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/clients/backend/models.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/clients/base.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/clients/exceptions.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/clients/ray/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/clients/ray/core.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/clients/ray/serve.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/clients/utils.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/clients/validators/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/clients/validators/collections.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/config.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/docs/.gitignore +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/docs/README.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/docs/blog/2019-05-28-first-blog-post.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/docs/blog/2019-05-29-long-blog-post.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/docs/blog/2021-08-01-mdx-blog-post.mdx +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/docs/blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/docs/blog/2021-08-26-welcome/index.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/docs/blog/authors.yml +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/docs/blog/tags.yml +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/docs/docusaurus.config.ts +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/docs/package-lock.json +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/docs/package.json +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/docs/sidebars.ts +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/docs/src/components/HomepageFeatures/index.tsx +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/docs/src/components/HomepageFeatures/styles.module.css +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/docs/src/css/custom.css +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/docs/src/pages/index.module.css +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/docs/src/pages/index.tsx +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/docs/src/pages/markdown-page.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/docs/static/.nojekyll +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/docs/static/img/docusaurus-social-card.jpg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/docs/static/img/docusaurus.png +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/docs/static/img/favicon.ico +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/docs/static/img/logo.png +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/docs/static/img/undraw_docusaurus_mountain.svg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/docs/static/img/undraw_docusaurus_react.svg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/docs/static/img/undraw_docusaurus_tree.svg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/docs/tsconfig.json +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/models.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/server.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/utils.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/web/.gitignore +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/web/README.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/web/dist/index.html +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/web/index.html +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/web/jsconfig.json +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/web/package-lock.json +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/web/package.json +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/web/pnpm-lock.yaml +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/web/src/App.jsx +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/web/src/App.module.css +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/web/src/assets/favicon.ico +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/web/src/components/Breadcrumbs.jsx +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/web/src/components/Layout.jsx +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/web/src/components/LogViewer.jsx +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/web/src/components/MessageViewer.jsx +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/web/src/components/NavigationSidebar.jsx +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/web/src/components/ServerStatusBar.jsx +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/web/src/components/icons.jsx +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/web/src/index.css +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/web/src/index.jsx +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/web/src/logo.svg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/web/src/router.jsx +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/web/src/utils/api.js +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/web/src/views/ApplicationDetailView.jsx +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/web/src/views/ApplicationsView.jsx +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/web/src/views/HomeView.jsx +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/web/src/views/JobDetailView.jsx +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/web/src/views/PluginView.jsx +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/devtools/web/vite.config.js +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/i18n.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/loggers.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/base.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/data_validation/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/data_validation/actions/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/data_validation/actions/validation.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/data_validation/templates/config.yaml +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/data_validation/templates/plugin/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/data_validation/templates/plugin/validation.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/decorators.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/export/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/export/actions/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/export/actions/export.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/export/enums.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/export/templates/config.yaml +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/export/templates/plugin/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/export/templates/plugin/export.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/neural_net/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/neural_net/actions/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/neural_net/actions/deployment.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/neural_net/actions/gradio.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/neural_net/actions/inference.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/neural_net/actions/test.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/neural_net/actions/train.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/neural_net/actions/tune.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/neural_net/base/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/neural_net/base/inference.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/neural_net/templates/config.yaml +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/neural_net/templates/plugin/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/neural_net/templates/plugin/inference.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/neural_net/templates/plugin/test.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/neural_net/templates/plugin/train.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/post_annotation/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/post_annotation/actions/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/post_annotation/actions/post_annotation.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/post_annotation/templates/config.yaml +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/post_annotation/templates/plugin/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/post_annotation/templates/plugin/post_annotation.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/pre_annotation/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/pre_annotation/actions/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/pre_annotation/actions/pre_annotation.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/pre_annotation/actions/to_task.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/pre_annotation/templates/config.yaml +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/pre_annotation/templates/plugin/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/pre_annotation/templates/plugin/pre_annotation.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/pre_annotation/templates/plugin/to_task.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/registry.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/smart_tool/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/smart_tool/actions/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/smart_tool/actions/auto_label.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/smart_tool/templates/config.yaml +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/smart_tool/templates/plugin/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/smart_tool/templates/plugin/auto_label.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/templates.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/upload/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/upload/actions/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/upload/actions/upload.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/upload/templates/config.yaml +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/upload/templates/plugin/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/categories/upload/templates/plugin/upload.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/enums.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/exceptions.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/models.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/templates/cookiecutter.json +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/templates/hooks/post_gen_project.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/templates/hooks/pre_prompt.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/templates/plugin-config-schema.json +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/templates/schema.json +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/.gitignore +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/.pre-commit-config.yaml +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/README.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/config.yaml +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/plugin/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/pyproject.toml +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/requirements.txt +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/upload.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/utils/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/utils/actions.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/utils/config.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/utils/legacy.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/plugins/utils/registry.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/shared/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/shared/enums.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/types.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/utils/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/utils/converters/coco/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/utils/converters/dm/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/utils/converters/dm/from_v1.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/utils/converters/dm/to_v1.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/utils/converters/pascal/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/utils/converters/yolo/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/utils/dataset.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/utils/debug.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/utils/file.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/utils/http.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/utils/module_loading.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/utils/network.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/utils/pydantic/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/utils/pydantic/config.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/utils/pydantic/errors.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/utils/pydantic/validators.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/utils/storage/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/utils/storage/providers/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/utils/storage/providers/gcp.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/utils/storage/providers/http.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/utils/storage/providers/s3.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/utils/storage/providers/sftp.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/utils/storage/registry.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/utils/string.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk.egg-info/SOURCES.txt +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk.egg-info/dependency_links.txt +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk.egg-info/entry_points.txt +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk.egg-info/requires.txt +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk.egg-info/top_level.txt +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/README.md +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/clients/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/clients/conftest.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/clients/test_backend_models.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/clients/test_base_client.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/clients/test_collection_validators.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/conftest.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/loggers/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/loggers/conftest.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/loggers/test_base_logger.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/plugins/conftest.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/plugins/utils/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/plugins/utils/test_actions.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/plugins/utils/test_config.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/plugins/utils/test_registry.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/test_cli.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/test_cli_integration.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/__init__,py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/conftest.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/__init__.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/coco.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/coco/categorized/test/annotations.json +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/coco/categorized/test/new_dm_data8.jpg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/coco/categorized/test/new_dm_data9.jpg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/coco/categorized/train/annotations.json +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/coco/categorized/train/new_dm_data4.jpg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/coco/categorized/train/new_dm_data5.jpg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/coco/categorized/train/new_dm_data6.jpg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/coco/categorized/valid/annotations.json +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/coco/categorized/valid/new_dm_data7.jpg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/coco/not_categorized/annotations.json +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/coco/not_categorized/new_dm_data1.jpg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/coco/not_categorized/new_dm_data2.jpg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/coco/not_categorized/new_dm_data3.jpg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/dm/categorized/test/json/dm_1.json +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/dm/categorized/test/json/dm_2.json +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/dm/categorized/test/json/dm_3.json +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/dm/categorized/test/original_files/dm_1.jpg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/dm/categorized/test/original_files/dm_2.jpg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/dm/categorized/test/original_files/dm_3.jpg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/dm/categorized/train/json/dm_4.json +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/dm/categorized/train/json/dm_5.json +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/dm/categorized/train/json/dm_6.json +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/dm/categorized/train/json/dm_7.json +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/dm/categorized/train/original_files/dm_4.jpg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/dm/categorized/train/original_files/dm_5.jpg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/dm/categorized/train/original_files/dm_6.jpg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/dm/categorized/train/original_files/dm_7.jpg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/dm/categorized/valid/json/dm_8.json +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/dm/categorized/valid/json/dm_9.json +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/dm/categorized/valid/original_files/dm_8.jpg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/dm/categorized/valid/original_files/dm_9.jpg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/dm/not_categorized/json/dm_1.json +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/dm/not_categorized/json/dm_2.json +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/dm/not_categorized/json/dm_3.json +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/dm/not_categorized/original_files/dm_1.jpg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/dm/not_categorized/original_files/dm_2.jpg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/dm/not_categorized/original_files/dm_3.jpg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/dm/ver1/json/25669.json +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/dm/ver2/json/25669.json +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/pascal/categorized/classes.txt +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/pascal/categorized/test/Annotations/9139.xml +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/pascal/categorized/test/Annotations/9140.xml +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/pascal/categorized/test/Annotations/9141.xml +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/pascal/categorized/test/Images/9139.jpg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/pascal/categorized/test/Images/9140.jpg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/pascal/categorized/test/Images/9141.jpg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/pascal/categorized/train/Annotations/9136.xml +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/pascal/categorized/train/Annotations/9137.xml +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/pascal/categorized/train/Annotations/9138.xml +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/pascal/categorized/train/Images/9136.jpg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/pascal/categorized/train/Images/9137.jpg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/pascal/categorized/train/Images/9138.jpg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/pascal/categorized/valid/Annotations/9125.xml +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/pascal/categorized/valid/Annotations/9126.xml +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/pascal/categorized/valid/Annotations/9127.xml +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/pascal/categorized/valid/Images/9125.jpg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/pascal/categorized/valid/Images/9126.jpg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/pascal/categorized/valid/Images/9127.jpg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/pascal/not_categorized/Annotations/9122.xml +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/pascal/not_categorized/Annotations/9123.xml +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/pascal/not_categorized/Annotations/9124.xml +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/pascal/not_categorized/Images/9122.jpg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/pascal/not_categorized/Images/9123.jpg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/pascal/not_categorized/Images/9124.jpg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/pascal/not_categorized/classes.txt +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/yolo/categorized/dataset.yaml +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/yolo/categorized/test/images/13744.jpg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/yolo/categorized/test/images/13745.jpg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/yolo/categorized/test/images/13746.jpg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/yolo/categorized/test/labels/13744.txt +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/yolo/categorized/test/labels/13745.txt +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/yolo/categorized/test/labels/13746.txt +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/yolo/categorized/train/images/13782.jpg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/yolo/categorized/train/labels/13782.txt +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/yolo/categorized/valid/images/13761.jpg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/yolo/categorized/valid/images/13764.jpg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/yolo/categorized/valid/labels/13761.txt +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/yolo/categorized/valid/labels/13764.txt +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/yolo/not_categorized/classes.txt +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/yolo/not_categorized/dataset.yaml +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/yolo/not_categorized/images/25332.jpg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/yolo/not_categorized/images/25334.jpg +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/yolo/not_categorized/labels/25332.txt +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/image/yolo/not_categorized/labels/25334.txt +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/pcd/dm/ver1/json/23791.json +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/pcd/dm/ver2/json/23791.json +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/prompt/dm/ver1/json/18662.json +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/prompt/dm/ver2/json/18662.json +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/text/dm/ver1/json/23811.json +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/text/dm/ver2/json/23811.json +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/video/dm/ver1/json/23831.json +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/data_types/video/dm/ver2/json/23831.json +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/dm_schema.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/pascal.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/fixtures/yolo.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/test_coco_from_dm.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/test_coco_to_dm.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/test_dm_v1_to_v2.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/test_dm_v2_to_v1.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/test_pascal_from_dm.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/test_pascal_to_dm.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/test_yolo_from_dm.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/converters/test_yolo_to_dm.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/storage/conftest.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/storage/test_provider_selection.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/tests/utils/test_debug.py +0 -0
- {synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/uv.lock +0 -0
|
@@ -2,16 +2,25 @@ import json
|
|
|
2
2
|
import os
|
|
3
3
|
import shutil
|
|
4
4
|
import uuid
|
|
5
|
+
from typing import IO
|
|
5
6
|
|
|
6
7
|
|
|
7
8
|
class BaseConverter:
|
|
8
9
|
"""Base class for shared logic between converters."""
|
|
9
10
|
|
|
10
|
-
def __init__(
|
|
11
|
+
def __init__(
|
|
12
|
+
self, root_dir: str = None, is_categorized_dataset: bool = False, is_single_conversion: bool = False
|
|
13
|
+
) -> None:
|
|
11
14
|
self.root_dir: str = root_dir
|
|
12
15
|
self.is_categorized_dataset: bool = is_categorized_dataset
|
|
16
|
+
self.is_single_conversion: bool = is_single_conversion
|
|
13
17
|
self.converted_data = None
|
|
14
18
|
|
|
19
|
+
# Set directories if single_conversion is False.
|
|
20
|
+
if not is_single_conversion:
|
|
21
|
+
if not root_dir:
|
|
22
|
+
raise ValueError('root_dir must be specified for conversion')
|
|
23
|
+
|
|
15
24
|
@staticmethod
|
|
16
25
|
def ensure_dir(path: str) -> None:
|
|
17
26
|
"""Ensure that the directory exists, creating it if necessary."""
|
|
@@ -55,6 +64,24 @@ class BaseConverter:
|
|
|
55
64
|
|
|
56
65
|
return splits
|
|
57
66
|
|
|
67
|
+
def convert_single_file(self, data, original_file: IO, **kwargs):
|
|
68
|
+
"""Convert a single data object and corresponding original file.
|
|
69
|
+
|
|
70
|
+
This method should be implemented by subclasses for single file conversion.
|
|
71
|
+
Only available when is_single_conversion=True.
|
|
72
|
+
|
|
73
|
+
Args:
|
|
74
|
+
data: The data object to convert (dict for JSON data, etc.)
|
|
75
|
+
original_file_path: File object for the corresponding original file
|
|
76
|
+
**kwargs: Additional parameters specific to each converter
|
|
77
|
+
|
|
78
|
+
Returns:
|
|
79
|
+
Converted data in the target format
|
|
80
|
+
"""
|
|
81
|
+
if not self.is_single_conversion:
|
|
82
|
+
raise RuntimeError('convert_single_file is only available when is_single_conversion=True')
|
|
83
|
+
raise NotImplementedError('Subclasses must implement convert_single_file method')
|
|
84
|
+
|
|
58
85
|
def _set_directories(self, split=None):
|
|
59
86
|
"""Set `self.json_dir` and `self.original_file_dir` based on the dataset split."""
|
|
60
87
|
if split:
|
|
@@ -106,8 +133,10 @@ class FromDMConverter(BaseConverter):
|
|
|
106
133
|
converter.save_to_folder('/my/target/output') # Writes files/folders to output location
|
|
107
134
|
"""
|
|
108
135
|
|
|
109
|
-
def __init__(
|
|
110
|
-
|
|
136
|
+
def __init__(
|
|
137
|
+
self, root_dir: str = None, is_categorized_dataset: bool = False, is_single_conversion: bool = False
|
|
138
|
+
) -> None:
|
|
139
|
+
super().__init__(root_dir, is_categorized_dataset, is_single_conversion)
|
|
111
140
|
self.version: str = '1.0'
|
|
112
141
|
|
|
113
142
|
def convert(self):
|
|
@@ -3,7 +3,7 @@ import json
|
|
|
3
3
|
import os
|
|
4
4
|
import shutil
|
|
5
5
|
from glob import glob
|
|
6
|
-
from typing import Any, Dict
|
|
6
|
+
from typing import Any, Dict, IO
|
|
7
7
|
|
|
8
8
|
from PIL import Image
|
|
9
9
|
from tqdm import tqdm
|
|
@@ -22,14 +22,23 @@ class FromDMToCOCOConverter(FromDMConverter):
|
|
|
22
22
|
# 'audio': ['.wav', '.mp3', ...]
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
def __init__(
|
|
25
|
+
def __init__(
|
|
26
|
+
self,
|
|
27
|
+
root_dir=None,
|
|
28
|
+
info_dict=None,
|
|
29
|
+
licenses_list=None,
|
|
30
|
+
data_type='img',
|
|
31
|
+
is_categorized_dataset=False,
|
|
32
|
+
is_single_conversion=False,
|
|
33
|
+
):
|
|
26
34
|
"""Args:
|
|
27
35
|
root_dir (str): Root directory containing data.
|
|
28
36
|
info_dict, licenses_list: COCO metadata.
|
|
29
37
|
data_type (str): Which data type to use (default: 'img').
|
|
30
38
|
is_categorized_dataset (bool): Whether to handle train, test, valid splits.
|
|
39
|
+
is_single_conversion (bool): Whether to use single file conversion mode.
|
|
31
40
|
"""
|
|
32
|
-
super().__init__(root_dir, is_categorized_dataset)
|
|
41
|
+
super().__init__(root_dir, is_categorized_dataset, is_single_conversion)
|
|
33
42
|
self.data_type = data_type
|
|
34
43
|
self.info_dict = info_dict or self._default_info()
|
|
35
44
|
self.licenses_list = licenses_list or self._default_licenses()
|
|
@@ -267,3 +276,47 @@ class FromDMToCOCOConverter(FromDMConverter):
|
|
|
267
276
|
shutil.copy(src_path, dst_path)
|
|
268
277
|
else:
|
|
269
278
|
print(f'[WARNING] Image not found: {src_path}')
|
|
279
|
+
|
|
280
|
+
def convert_single_file(self, data: Dict[str, Any], original_file: IO) -> Dict[str, Any]:
|
|
281
|
+
"""Convert a single DM data dict and corresponding image file object to COCO format.
|
|
282
|
+
|
|
283
|
+
Args:
|
|
284
|
+
data: DM format data dictionary (JSON content)
|
|
285
|
+
original_file: File object for the corresponding original image
|
|
286
|
+
|
|
287
|
+
Returns:
|
|
288
|
+
Dictionary containing COCO format data for the single file
|
|
289
|
+
"""
|
|
290
|
+
if not self.is_single_conversion:
|
|
291
|
+
raise RuntimeError('convert_single_file is only available when is_single_conversion=True')
|
|
292
|
+
|
|
293
|
+
self.reset_state()
|
|
294
|
+
self.coco_dict = {
|
|
295
|
+
'info': self.info_dict,
|
|
296
|
+
'licenses': self.licenses_list,
|
|
297
|
+
'images': [],
|
|
298
|
+
'annotations': [],
|
|
299
|
+
'categories': [],
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
# Process the image file
|
|
303
|
+
with Image.open(original_file) as im:
|
|
304
|
+
width, height = im.size
|
|
305
|
+
|
|
306
|
+
image_info = {
|
|
307
|
+
'id': self.img_id,
|
|
308
|
+
'file_name': getattr(original_file, 'name', 'image.jpg'),
|
|
309
|
+
'width': width,
|
|
310
|
+
'height': height,
|
|
311
|
+
'license': self.license_id,
|
|
312
|
+
}
|
|
313
|
+
self.coco_dict['images'].append(image_info)
|
|
314
|
+
|
|
315
|
+
# Process annotations from the first (and only) image in data
|
|
316
|
+
if 'images' in data and len(data['images']) > 0:
|
|
317
|
+
anns = data['images'][0]
|
|
318
|
+
self._process_polylines(anns)
|
|
319
|
+
self._process_bboxes(anns)
|
|
320
|
+
self._process_keypoints(anns)
|
|
321
|
+
|
|
322
|
+
return self.coco_dict
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import os
|
|
3
|
+
from typing import IO, Any, Dict
|
|
3
4
|
|
|
4
5
|
from synapse_sdk.utils.converters import ToDMConverter
|
|
5
6
|
|
|
@@ -7,6 +8,9 @@ from synapse_sdk.utils.converters import ToDMConverter
|
|
|
7
8
|
class COCOToDMConverter(ToDMConverter):
|
|
8
9
|
"""Convert COCO format annotations to DM (Data Manager) format."""
|
|
9
10
|
|
|
11
|
+
def __init__(self, root_dir: str = None, is_categorized_dataset: bool = False, is_single_conversion: bool = False):
|
|
12
|
+
super().__init__(root_dir, is_categorized_dataset, is_single_conversion)
|
|
13
|
+
|
|
10
14
|
def convert(self):
|
|
11
15
|
if self.is_categorized_dataset:
|
|
12
16
|
splits = self._validate_splits(['train', 'valid'], ['test'])
|
|
@@ -111,3 +115,101 @@ class COCOToDMConverter(ToDMConverter):
|
|
|
111
115
|
dm_json = {'images': [dm_img]}
|
|
112
116
|
result[img_filename] = (dm_json, img_path)
|
|
113
117
|
return result
|
|
118
|
+
|
|
119
|
+
def convert_single_file(self, data: Dict[str, Any], original_file: IO) -> Dict[str, Any]:
|
|
120
|
+
"""Convert a single COCO annotation data and corresponding image to DM format.
|
|
121
|
+
|
|
122
|
+
Args:
|
|
123
|
+
data: COCO format data dictionary (JSON content)
|
|
124
|
+
original_file: File object for the corresponding original image
|
|
125
|
+
|
|
126
|
+
Returns:
|
|
127
|
+
Dictionary containing DM format data for the single file
|
|
128
|
+
"""
|
|
129
|
+
if not self.is_single_conversion:
|
|
130
|
+
raise RuntimeError('convert_single_file is only available when is_single_conversion=True')
|
|
131
|
+
|
|
132
|
+
images = data.get('images', [])
|
|
133
|
+
annotations = data.get('annotations', [])
|
|
134
|
+
categories = data.get('categories', [])
|
|
135
|
+
|
|
136
|
+
if not images:
|
|
137
|
+
raise ValueError('No images found in COCO data')
|
|
138
|
+
|
|
139
|
+
# Get file name from original_file
|
|
140
|
+
img_path = getattr(original_file, 'name', None)
|
|
141
|
+
if not img_path:
|
|
142
|
+
raise ValueError('original_file must have a "name" attribute representing its path or filename.')
|
|
143
|
+
img_basename = os.path.basename(img_path)
|
|
144
|
+
|
|
145
|
+
# Find the matching image info in COCO 'images' section by comparing file name
|
|
146
|
+
# COCO image dicts might use 'file_name', 'filename', or similar
|
|
147
|
+
matched_img = None
|
|
148
|
+
for img in images:
|
|
149
|
+
for key in ['file_name', 'filename', 'name']:
|
|
150
|
+
if key in img and os.path.basename(img[key]) == img_basename:
|
|
151
|
+
matched_img = img
|
|
152
|
+
break
|
|
153
|
+
if matched_img:
|
|
154
|
+
break
|
|
155
|
+
|
|
156
|
+
if not matched_img:
|
|
157
|
+
raise ValueError(f'No matching image found in COCO data for file: {img_basename}')
|
|
158
|
+
|
|
159
|
+
img_id = matched_img['id']
|
|
160
|
+
print('img_id : ', img_id)
|
|
161
|
+
cat_map = {cat['id']: cat for cat in categories}
|
|
162
|
+
anns = [ann for ann in annotations if ann['image_id'] == img_id]
|
|
163
|
+
|
|
164
|
+
dm_img = {
|
|
165
|
+
'bounding_box': [],
|
|
166
|
+
'keypoint': [],
|
|
167
|
+
'relation': [],
|
|
168
|
+
'group': [],
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
bbox_ids = []
|
|
172
|
+
for ann in anns:
|
|
173
|
+
cat = cat_map.get(ann['category_id'], {})
|
|
174
|
+
if 'bbox' in ann and ann['bbox']:
|
|
175
|
+
bbox_id = self._generate_unique_id()
|
|
176
|
+
bbox_ids.append(bbox_id)
|
|
177
|
+
dm_img['bounding_box'].append({
|
|
178
|
+
'id': bbox_id,
|
|
179
|
+
'classification': cat.get('name', str(ann['category_id'])),
|
|
180
|
+
'attrs': ann.get('attrs', []),
|
|
181
|
+
'data': list(ann['bbox']),
|
|
182
|
+
})
|
|
183
|
+
|
|
184
|
+
for ann in anns:
|
|
185
|
+
cat = cat_map.get(ann['category_id'], {})
|
|
186
|
+
attrs = ann.get('attrs', [])
|
|
187
|
+
if 'keypoints' in ann and ann['keypoints']:
|
|
188
|
+
kp_names = cat.get('keypoints', [])
|
|
189
|
+
kps = ann['keypoints']
|
|
190
|
+
keypoint_ids = []
|
|
191
|
+
for idx in range(min(len(kps) // 3, len(kp_names))):
|
|
192
|
+
x, y, _ = kps[idx * 3 : idx * 3 + 3]
|
|
193
|
+
kp_id = self._generate_unique_id()
|
|
194
|
+
keypoint_ids.append(kp_id)
|
|
195
|
+
dm_img['keypoint'].append({
|
|
196
|
+
'id': kp_id,
|
|
197
|
+
'classification': kp_names[idx] if idx < len(kp_names) else f'keypoint_{idx}',
|
|
198
|
+
'attrs': attrs,
|
|
199
|
+
'data': [x, y],
|
|
200
|
+
})
|
|
201
|
+
group_ids = bbox_ids + keypoint_ids
|
|
202
|
+
if group_ids:
|
|
203
|
+
dm_img['group'].append({
|
|
204
|
+
'id': self._generate_unique_id(),
|
|
205
|
+
'classification': cat.get('name', str(ann['category_id'])),
|
|
206
|
+
'attrs': attrs,
|
|
207
|
+
'data': group_ids,
|
|
208
|
+
})
|
|
209
|
+
|
|
210
|
+
dm_json = {'images': [dm_img]}
|
|
211
|
+
return {
|
|
212
|
+
'dm_json': dm_json,
|
|
213
|
+
'image_path': img_path,
|
|
214
|
+
'image_name': img_basename,
|
|
215
|
+
}
|
{synapse_sdk-1.0.0a78 → synapse_sdk-1.0.0a80}/synapse_sdk/utils/converters/pascal/from_dm.py
RENAMED
|
@@ -3,7 +3,7 @@ import os
|
|
|
3
3
|
import shutil
|
|
4
4
|
import xml.etree.ElementTree as ET
|
|
5
5
|
from glob import glob
|
|
6
|
-
from typing import Any, List, Optional
|
|
6
|
+
from typing import Any, Dict, IO, List, Optional
|
|
7
7
|
|
|
8
8
|
from PIL import Image
|
|
9
9
|
|
|
@@ -15,8 +15,8 @@ class FromDMToPascalConverter(FromDMConverter):
|
|
|
15
15
|
|
|
16
16
|
IMG_EXTENSIONS = ['.jpg', '.jpeg', '.png', '.bmp']
|
|
17
17
|
|
|
18
|
-
def __init__(self, root_dir: str, is_categorized_dataset: bool = False):
|
|
19
|
-
super().__init__(root_dir, is_categorized_dataset)
|
|
18
|
+
def __init__(self, root_dir: str = None, is_categorized_dataset: bool = False, is_single_conversion: bool = False):
|
|
19
|
+
super().__init__(root_dir, is_categorized_dataset, is_single_conversion)
|
|
20
20
|
self.class_names = set()
|
|
21
21
|
|
|
22
22
|
def find_image_for_base(self, img_dir: str, base: str) -> Optional[str]:
|
|
@@ -175,3 +175,48 @@ class FromDMToPascalConverter(FromDMConverter):
|
|
|
175
175
|
for c in sorted(self.class_names):
|
|
176
176
|
f.write(f'{c}\n')
|
|
177
177
|
print(f'Pascal VOC data exported to {outdir}')
|
|
178
|
+
|
|
179
|
+
def convert_single_file(self, data: Dict[str, Any], original_file: IO) -> Dict[str, Any]:
|
|
180
|
+
"""Convert a single DM data dict and corresponding image file object to Pascal VOC format.
|
|
181
|
+
|
|
182
|
+
Args:
|
|
183
|
+
data: DM format data dictionary (JSON content)
|
|
184
|
+
original_file: File object for the corresponding original image
|
|
185
|
+
|
|
186
|
+
Returns:
|
|
187
|
+
Dictionary containing Pascal VOC format data for the single file
|
|
188
|
+
"""
|
|
189
|
+
if not self.is_single_conversion:
|
|
190
|
+
raise RuntimeError('convert_single_file is only available when is_single_conversion=True')
|
|
191
|
+
|
|
192
|
+
# Extract image info from file object
|
|
193
|
+
with Image.open(original_file) as img:
|
|
194
|
+
width, height = img.size
|
|
195
|
+
depth = len(img.getbands())
|
|
196
|
+
|
|
197
|
+
# Get filename from original_file
|
|
198
|
+
img_filename = getattr(original_file, 'name', 'image.jpg')
|
|
199
|
+
if img_filename:
|
|
200
|
+
img_filename = os.path.basename(img_filename)
|
|
201
|
+
|
|
202
|
+
# Process annotations from the first (and only) image in data
|
|
203
|
+
if 'images' in data and len(data['images']) > 0:
|
|
204
|
+
img_ann = data['images'][0]
|
|
205
|
+
objects = self.parse_dm_annotations(img_ann)
|
|
206
|
+
else:
|
|
207
|
+
objects = []
|
|
208
|
+
|
|
209
|
+
# Build Pascal VOC XML
|
|
210
|
+
xml_tree = self.build_pascal_xml(img_filename, (width, height, depth), objects)
|
|
211
|
+
xml_filename = os.path.splitext(img_filename)[0] + '.xml'
|
|
212
|
+
|
|
213
|
+
# Convert XML tree to string for easy viewing
|
|
214
|
+
xml_string = ET.tostring(xml_tree.getroot(), encoding='unicode', xml_declaration=True)
|
|
215
|
+
|
|
216
|
+
return {
|
|
217
|
+
'xml_tree': xml_tree,
|
|
218
|
+
'xml_content': xml_string,
|
|
219
|
+
'xml_filename': xml_filename,
|
|
220
|
+
'image_filename': img_filename,
|
|
221
|
+
'class_names': sorted(list(self.class_names)),
|
|
222
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import os
|
|
2
2
|
import xml.etree.ElementTree as ET
|
|
3
|
-
from typing import Any, Dict, List, Optional, Tuple
|
|
3
|
+
from typing import Any, Dict, IO, List, Optional, Tuple
|
|
4
4
|
|
|
5
5
|
from PIL import Image
|
|
6
6
|
|
|
@@ -12,6 +12,9 @@ class PascalToDMConverter(ToDMConverter):
|
|
|
12
12
|
|
|
13
13
|
IMG_EXTENSIONS = ['.jpg', '.jpeg', '.png', '.bmp']
|
|
14
14
|
|
|
15
|
+
def __init__(self, root_dir: str = None, is_categorized_dataset: bool = False, is_single_conversion: bool = False):
|
|
16
|
+
super().__init__(root_dir, is_categorized_dataset, is_single_conversion)
|
|
17
|
+
|
|
15
18
|
def convert(self):
|
|
16
19
|
"""Convert the Pascal VOC dataset to DM format."""
|
|
17
20
|
if self.is_categorized_dataset:
|
|
@@ -133,3 +136,79 @@ class PascalToDMConverter(ToDMConverter):
|
|
|
133
136
|
print(f'[WARNING] Error processing {xml_filename}: {e}, skipping.')
|
|
134
137
|
continue
|
|
135
138
|
return result
|
|
139
|
+
|
|
140
|
+
def convert_single_file(self, data: str, original_file: IO) -> Dict[str, Any]:
|
|
141
|
+
"""Convert a single Pascal VOC XML data and corresponding image to DM format.
|
|
142
|
+
|
|
143
|
+
Args:
|
|
144
|
+
data: Pascal VOC XML content as string
|
|
145
|
+
original_file: File object for the corresponding original image
|
|
146
|
+
|
|
147
|
+
Returns:
|
|
148
|
+
Dictionary containing DM format data for the single file
|
|
149
|
+
"""
|
|
150
|
+
if not self.is_single_conversion:
|
|
151
|
+
raise RuntimeError('convert_single_file is only available when is_single_conversion=True')
|
|
152
|
+
|
|
153
|
+
# Get filename from original_file
|
|
154
|
+
img_path = getattr(original_file, 'name', None)
|
|
155
|
+
if not img_path:
|
|
156
|
+
raise ValueError('original_file must have a "name" attribute representing its path or filename.')
|
|
157
|
+
|
|
158
|
+
img_filename = os.path.basename(img_path)
|
|
159
|
+
|
|
160
|
+
# Parse XML data from string
|
|
161
|
+
try:
|
|
162
|
+
root = ET.fromstring(data)
|
|
163
|
+
except ET.ParseError as e:
|
|
164
|
+
raise ValueError(f'Failed to parse Pascal VOC XML data: {e}')
|
|
165
|
+
|
|
166
|
+
# Extract objects from XML
|
|
167
|
+
objects = []
|
|
168
|
+
for obj in root.findall('object'):
|
|
169
|
+
name_elem = obj.find('name')
|
|
170
|
+
bndbox_elem = obj.find('bndbox')
|
|
171
|
+
if name_elem is None or bndbox_elem is None:
|
|
172
|
+
continue
|
|
173
|
+
|
|
174
|
+
class_name = name_elem.text
|
|
175
|
+
xmin_elem = bndbox_elem.find('xmin')
|
|
176
|
+
ymin_elem = bndbox_elem.find('ymin')
|
|
177
|
+
xmax_elem = bndbox_elem.find('xmax')
|
|
178
|
+
ymax_elem = bndbox_elem.find('ymax')
|
|
179
|
+
|
|
180
|
+
if any(elem is None for elem in [xmin_elem, ymin_elem, xmax_elem, ymax_elem]):
|
|
181
|
+
continue
|
|
182
|
+
|
|
183
|
+
xmin = int(float(xmin_elem.text))
|
|
184
|
+
ymin = int(float(ymin_elem.text))
|
|
185
|
+
xmax = int(float(xmax_elem.text))
|
|
186
|
+
ymax = int(float(ymax_elem.text))
|
|
187
|
+
width = xmax - xmin
|
|
188
|
+
height = ymax - ymin
|
|
189
|
+
|
|
190
|
+
objects.append({'classification': class_name, 'data': [xmin, ymin, width, height]})
|
|
191
|
+
|
|
192
|
+
# Prepare DM annotation structure
|
|
193
|
+
dm_img = {
|
|
194
|
+
'bounding_box': [],
|
|
195
|
+
'polygon': [],
|
|
196
|
+
'keypoint': [],
|
|
197
|
+
'relation': [],
|
|
198
|
+
'group': [],
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
for obj in objects:
|
|
202
|
+
dm_img['bounding_box'].append({
|
|
203
|
+
'id': self._generate_unique_id(),
|
|
204
|
+
'classification': obj['classification'],
|
|
205
|
+
'attrs': [],
|
|
206
|
+
'data': obj['data'],
|
|
207
|
+
})
|
|
208
|
+
|
|
209
|
+
dm_json = {'images': [dm_img]}
|
|
210
|
+
return {
|
|
211
|
+
'dm_json': dm_json,
|
|
212
|
+
'image_path': img_path,
|
|
213
|
+
'image_name': img_filename,
|
|
214
|
+
}
|
|
@@ -2,7 +2,7 @@ import json
|
|
|
2
2
|
import os
|
|
3
3
|
import shutil
|
|
4
4
|
from glob import glob
|
|
5
|
-
from typing import Any, Dict, List, Optional, Union
|
|
5
|
+
from typing import IO, Any, Dict, List, Optional, Union
|
|
6
6
|
|
|
7
7
|
from PIL import Image
|
|
8
8
|
|
|
@@ -14,8 +14,8 @@ class FromDMToYOLOConverter(FromDMConverter):
|
|
|
14
14
|
|
|
15
15
|
IMG_EXTENSIONS = ['.jpg', '.jpeg', '.png', '.bmp']
|
|
16
16
|
|
|
17
|
-
def __init__(self, root_dir: str, is_categorized_dataset: bool = False):
|
|
18
|
-
super().__init__(root_dir, is_categorized_dataset)
|
|
17
|
+
def __init__(self, root_dir: str = None, is_categorized_dataset: bool = False, is_single_conversion: bool = False):
|
|
18
|
+
super().__init__(root_dir, is_categorized_dataset, is_single_conversion)
|
|
19
19
|
self.class_names: List[str] = []
|
|
20
20
|
self.class_map: Dict[str, int] = {}
|
|
21
21
|
self.dataset_yaml_content: str = ''
|
|
@@ -300,3 +300,85 @@ class FromDMToYOLOConverter(FromDMConverter):
|
|
|
300
300
|
for c in self.class_names:
|
|
301
301
|
f.write(f'{c}\n')
|
|
302
302
|
print(f'YOLO data exported to {output_dir}')
|
|
303
|
+
|
|
304
|
+
def convert_single_file(
|
|
305
|
+
self, data: Dict[str, Any], original_file: IO, class_names: Optional[List[str]] = None
|
|
306
|
+
) -> Dict[str, Any]:
|
|
307
|
+
"""Convert a single DM data dict and corresponding image file object to YOLO format.
|
|
308
|
+
|
|
309
|
+
Args:
|
|
310
|
+
data: DM format data dictionary (JSON content)
|
|
311
|
+
original_file: File object for the corresponding original image
|
|
312
|
+
class_names: Optional list of class names. If not provided, classes will be extracted from data.
|
|
313
|
+
|
|
314
|
+
Returns:
|
|
315
|
+
Dictionary containing YOLO format data for the single file
|
|
316
|
+
"""
|
|
317
|
+
if not self.is_single_conversion:
|
|
318
|
+
raise RuntimeError('convert_single_file is only available when is_single_conversion=True')
|
|
319
|
+
|
|
320
|
+
if class_names is None:
|
|
321
|
+
classes = set()
|
|
322
|
+
for img_ann in data['images']:
|
|
323
|
+
for k in ['bounding_box', 'polygon', 'keypoint']:
|
|
324
|
+
if k in img_ann:
|
|
325
|
+
for ann in img_ann[k]:
|
|
326
|
+
classes.add(ann['classification'])
|
|
327
|
+
class_names = sorted(list(classes))
|
|
328
|
+
|
|
329
|
+
class_map = {name: idx for idx, name in enumerate(class_names)}
|
|
330
|
+
# You need to update get_image_size to accept a file object
|
|
331
|
+
width, height = self.get_image_size(original_file)
|
|
332
|
+
|
|
333
|
+
img_ann = data['images'][0]
|
|
334
|
+
label_lines = []
|
|
335
|
+
|
|
336
|
+
# bbox
|
|
337
|
+
if 'bounding_box' in img_ann:
|
|
338
|
+
for box in img_ann['bounding_box']:
|
|
339
|
+
if box['classification'] not in class_map:
|
|
340
|
+
continue
|
|
341
|
+
cidx = class_map[box['classification']]
|
|
342
|
+
x, y, w, h = box['data']
|
|
343
|
+
cx = x + w / 2
|
|
344
|
+
cy = y + h / 2
|
|
345
|
+
cx /= width
|
|
346
|
+
cy /= height
|
|
347
|
+
w /= width
|
|
348
|
+
h /= height
|
|
349
|
+
label_lines.append(f'{cidx} {cx:.6f} {cy:.6f} {w:.6f} {h:.6f}')
|
|
350
|
+
|
|
351
|
+
# polygon
|
|
352
|
+
if 'polygon' in img_ann:
|
|
353
|
+
for poly in img_ann['polygon']:
|
|
354
|
+
if poly['classification'] not in class_map:
|
|
355
|
+
continue
|
|
356
|
+
cidx = class_map[poly['classification']]
|
|
357
|
+
poly_str = self.polygon_to_yolo_string(poly['data'], width, height)
|
|
358
|
+
if poly_str:
|
|
359
|
+
label_lines.append(f'{cidx} {poly_str}')
|
|
360
|
+
|
|
361
|
+
# keypoint
|
|
362
|
+
if 'keypoint' in img_ann:
|
|
363
|
+
for kp in img_ann['keypoint']:
|
|
364
|
+
if kp['classification'] not in class_map:
|
|
365
|
+
continue
|
|
366
|
+
cidx = class_map[kp['classification']]
|
|
367
|
+
if 'bounding_box' in kp:
|
|
368
|
+
x, y, w, h = kp['bounding_box']
|
|
369
|
+
cx = x + w / 2
|
|
370
|
+
cy = y + h / 2
|
|
371
|
+
cx /= width
|
|
372
|
+
cy /= height
|
|
373
|
+
w /= width
|
|
374
|
+
h /= height
|
|
375
|
+
else:
|
|
376
|
+
cx, cy, w, h = 0.5, 0.5, 1.0, 1.0
|
|
377
|
+
kp_str = self.keypoints_to_yolo_string(kp['data'], width, height)
|
|
378
|
+
label_lines.append(f'{cidx} {cx:.6f} {cy:.6f} {w:.6f} {h:.6f} {kp_str}')
|
|
379
|
+
|
|
380
|
+
return {
|
|
381
|
+
'label_lines': label_lines,
|
|
382
|
+
'class_names': class_names,
|
|
383
|
+
'class_map': class_map,
|
|
384
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import os
|
|
2
|
-
from typing import Any, Dict, List, Tuple
|
|
2
|
+
from typing import IO, Any, Dict, List, Tuple
|
|
3
3
|
|
|
4
4
|
import yaml
|
|
5
5
|
from PIL import Image
|
|
@@ -12,6 +12,9 @@ class YOLOToDMConverter(ToDMConverter):
|
|
|
12
12
|
|
|
13
13
|
IMG_EXTENSIONS = ['.jpg', '.jpeg', '.png', '.bmp']
|
|
14
14
|
|
|
15
|
+
def __init__(self, root_dir: str = None, is_categorized_dataset: bool = False, is_single_conversion: bool = False):
|
|
16
|
+
super().__init__(root_dir, is_categorized_dataset, is_single_conversion)
|
|
17
|
+
|
|
15
18
|
def convert(self):
|
|
16
19
|
"""Convert YOLO dataset to DM format."""
|
|
17
20
|
if self.is_categorized_dataset:
|
|
@@ -183,3 +186,73 @@ class YOLOToDMConverter(ToDMConverter):
|
|
|
183
186
|
dm_json = {'images': [dm_img]}
|
|
184
187
|
result[os.path.basename(img_path)] = (dm_json, img_path)
|
|
185
188
|
return result
|
|
189
|
+
|
|
190
|
+
def convert_single_file(self, data: List[str], original_file: IO, class_names: List[str]) -> Dict[str, Any]:
|
|
191
|
+
"""Convert a single YOLO label data and corresponding image to DM format.
|
|
192
|
+
|
|
193
|
+
Args:
|
|
194
|
+
data: List of YOLO label lines (strings from .txt file content)
|
|
195
|
+
original_file: File object for the corresponding original image
|
|
196
|
+
class_names: List of class names corresponding to indices in the label data
|
|
197
|
+
|
|
198
|
+
Returns:
|
|
199
|
+
Dictionary containing DM format data for the single file
|
|
200
|
+
"""
|
|
201
|
+
if not self.is_single_conversion:
|
|
202
|
+
raise RuntimeError('convert_single_file is only available when is_single_conversion=True')
|
|
203
|
+
|
|
204
|
+
img_path = getattr(original_file, 'name', None)
|
|
205
|
+
if not img_path:
|
|
206
|
+
raise ValueError('original_file must have a "name" attribute representing its path or filename.')
|
|
207
|
+
|
|
208
|
+
if hasattr(self, '_get_image_size'):
|
|
209
|
+
img_size = self._get_image_size(original_file)
|
|
210
|
+
else:
|
|
211
|
+
raise AttributeError('Converter missing _get_image_size method for file objects.')
|
|
212
|
+
|
|
213
|
+
# data is already a list of label lines
|
|
214
|
+
label_lines = [line.strip() for line in data if line.strip()]
|
|
215
|
+
|
|
216
|
+
# Prepare DM annotation structure
|
|
217
|
+
dm_img = {
|
|
218
|
+
'bounding_box': [],
|
|
219
|
+
'polygon': [],
|
|
220
|
+
'keypoint': [],
|
|
221
|
+
'relation': [],
|
|
222
|
+
'group': [],
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
for line in label_lines:
|
|
226
|
+
ann = self._parse_yolo_line(line, class_names, img_size)
|
|
227
|
+
if ann is None:
|
|
228
|
+
continue
|
|
229
|
+
|
|
230
|
+
if ann['type'] == 'bounding_box':
|
|
231
|
+
dm_img['bounding_box'].append({
|
|
232
|
+
'id': self._generate_unique_id(),
|
|
233
|
+
'classification': ann['classification'],
|
|
234
|
+
'attrs': [],
|
|
235
|
+
'data': ann['data'],
|
|
236
|
+
})
|
|
237
|
+
elif ann['type'] == 'polygon':
|
|
238
|
+
dm_img['polygon'].append({
|
|
239
|
+
'id': self._generate_unique_id(),
|
|
240
|
+
'classification': ann['classification'],
|
|
241
|
+
'attrs': [],
|
|
242
|
+
'data': ann['data'],
|
|
243
|
+
})
|
|
244
|
+
elif ann['type'] == 'keypoint':
|
|
245
|
+
dm_img['keypoint'].append({
|
|
246
|
+
'id': self._generate_unique_id(),
|
|
247
|
+
'classification': ann['classification'],
|
|
248
|
+
'attrs': [],
|
|
249
|
+
'data': ann['data'],
|
|
250
|
+
'bounding_box': ann['bounding_box'],
|
|
251
|
+
})
|
|
252
|
+
|
|
253
|
+
dm_json = {'images': [dm_img]}
|
|
254
|
+
return {
|
|
255
|
+
'dm_json': dm_json,
|
|
256
|
+
'image_path': img_path,
|
|
257
|
+
'image_name': os.path.basename(img_path),
|
|
258
|
+
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|