lightly-studio 0.3.3__tar.gz → 0.4.0__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 lightly-studio might be problematic. Click here for more details.
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/.gitignore +3 -0
- lightly_studio-0.4.0/PKG-INFO +78 -0
- lightly_studio-0.4.0/USAGE.md +36 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/pyproject.toml +18 -3
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/api/app.py +2 -0
- lightly_studio-0.4.0/src/lightly_studio/api/features.py +5 -0
- lightly_studio-0.4.0/src/lightly_studio/api/routes/api/caption.py +30 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/api/routes/api/dataset_tag.py +10 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/api/routes/api/embeddings2d.py +42 -39
- lightly_studio-0.4.0/src/lightly_studio/api/routes/api/metadata.py +91 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/core/add_samples.py +138 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/core/dataset.py +232 -18
- lightly_studio-0.4.0/src/lightly_studio/core/dataset_query/__init__.py +14 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/core/sample.py +33 -1
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/dataset/loader.py +2 -8
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/db_manager.py +14 -6
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/env.js +1 -0
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/0.CN4hnTks.css +1 -0
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/2.CkOblLn7.css +1 -0
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/Samples.C0_eo9eP.css +1 -0
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/useFeatureFlags.CV-KWLNP.css → lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/_layout.CefECEWA.css +1 -1
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/_layout.kFFGI0zL.css +1 -0
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/transform.sLzR40om.css +1 -0
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/6t3IJ0vQ.js → lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/BOmrKuMn.js +1 -1
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/Cs1XmhiF.js → lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/BPpOWbDa.js +1 -1
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/BaFFwDFr.js +1 -0
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/BiGQqqJP.js +1 -0
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/BrNKoXwc.js +20 -0
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/BsaJCCG_.js +96 -0
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/BtXGzlpP.js +20 -0
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/C1FmrZbK.js +1 -0
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/C3xJX0nD.js +1 -0
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CANX9QXL.js +1 -0
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CAPx0Bfm.js +1 -0
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CP9M7pei.js +39 -0
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CWuDkrMZ.js +436 -0
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/ChlxSwqI.js +1 -0
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/Cj4nZbtb.js +1 -0
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/ClzkJBWk.js +1 -0
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CpbA3HU7.js +2 -0
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/D8ZGoCPm.js +3 -0
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DMJzr1NB.js +1 -0
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/BdfTHw61.js → lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DNJnBfHs.js +1 -1
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/keKYsoph.js → lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DUtlYNuP.js +1 -1
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DVxjPOJB.js +1 -0
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DmGM9V9Q.js +1 -0
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DoEId1MK.js +1 -0
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DthpwYR_.js +2 -0
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DyIcJj6J.js +1 -0
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/SiegjVo0.js +1 -0
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/BfHVnyNT.js → lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/WEyXQRi6.js +1 -1
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/gBp1tBnA.js +1 -0
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/xQhUoIl9.js +1 -0
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/entry/app.Y-sSoz5q.js +2 -0
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/entry/start.CvxVp0Cu.js +1 -0
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/0.0Fm6E-5B.js +4 -0
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/1.DB-0vkHb.js +1 -0
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/10.vaUePh5k.js +1 -0
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/11.7i7ljNVT.js +1 -0
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/13.9qy3WtZv.js +1 -0
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/2.C8HLK8mj.js → lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/2.Drwwdm7A.js +267 -111
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/3.CLvg3QcJ.js → lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/3.D3X_-Wan.js +1 -1
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/4.BQhDtXUI.js → lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/4.C9TqY3tA.js +1 -1
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/5.iRw6HCWX.js +39 -0
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/6.uBV1Lhat.js → lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/6.fqfYR7dB.js +1 -1
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/7.C7gMM-gk.js +1 -0
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/8.C4v1w-oS.js +20 -0
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/9.DbHcSiMn.js +1 -0
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/version.json +1 -0
- lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/index.html +45 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/examples/example.py +4 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/examples/example_coco.py +4 -0
- lightly_studio-0.4.0/src/lightly_studio/examples/example_coco_caption.py +24 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/examples/example_metadata.py +4 -1
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/examples/example_selection.py +4 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/examples/example_split_work.py +4 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/examples/example_yolo.py +4 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/export/export_dataset.py +11 -3
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/metadata/compute_typicality.py +1 -1
- lightly_studio-0.4.0/src/lightly_studio/models/caption.py +74 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/models/dataset.py +1 -2
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/models/metadata.py +1 -1
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/models/sample.py +9 -2
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/models/settings.py +5 -0
- lightly_studio-0.4.0/src/lightly_studio/resolvers/caption_resolver.py +80 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/resolvers/dataset_resolver.py +6 -11
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/resolvers/metadata_resolver/__init__.py +2 -2
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/resolvers/metadata_resolver/sample/__init__.py +3 -3
- lightly_studio-0.4.0/src/lightly_studio/resolvers/metadata_resolver/sample/bulk_update_metadata.py +46 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/resolvers/sample_resolver.py +1 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/resolvers/samples_filter.py +18 -10
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/resolvers/settings_resolver.py +3 -0
- lightly_studio-0.4.0/src/lightly_studio/resolvers/twodim_embedding_resolver.py +29 -0
- lightly_studio-0.4.0/src/lightly_studio/selection/__init__.py +1 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/selection/mundig.py +41 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/type_definitions.py +2 -0
- lightly_studio-0.3.3/PKG-INFO +0 -814
- lightly_studio-0.3.3/USAGE.md +0 -773
- lightly_studio-0.3.3/src/lightly_studio/api/features.py +0 -7
- lightly_studio-0.3.3/src/lightly_studio/api/routes/api/metadata.py +0 -35
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/env.js +0 -1
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/0.CA_CXIBb.css +0 -1
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/_layout.DS78jgNY.css +0 -1
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/index.BVs_sZj9.css +0 -1
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/transform.D487hwJk.css +0 -1
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/8NsknIT2.js +0 -1
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/BND_-4Kp.js +0 -1
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/BjkP1AHA.js +0 -1
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/BuuNVL9G.js +0 -1
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/BzKGpnl4.js +0 -1
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CCx7Ho51.js +0 -1
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CH6P3X75.js +0 -1
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CR2upx_Q.js +0 -4
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CWPZrTTJ.js +0 -1
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CwPowJfP.js +0 -1
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CxFKfZ9T.js +0 -1
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/Cxevwdid.js +0 -1
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/D4whDBUi.js +0 -1
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/D6r9vr07.js +0 -1
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DA6bFLPR.js +0 -1
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DEgUu98i.js +0 -3
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DGTPl6Gk.js +0 -1
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DKGxBSlK.js +0 -1
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DQXoLcsF.js +0 -1
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DQe_kdRt.js +0 -92
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DcY4jgG3.js +0 -1
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/H7C68rOM.js +0 -1
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/RmD8FzRo.js +0 -1
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/V-MnMC1X.js +0 -1
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/entry/app.BVr6DYqP.js +0 -2
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/entry/start.u7zsVvqp.js +0 -1
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/0.Da2agmdd.js +0 -1
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/1.B11tVRJV.js +0 -1
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/10.l30Zud4h.js +0 -1
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/12.CgKPGcAP.js +0 -1
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/5.-6XqWX5G.js +0 -1
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/7.BXsgoQZh.js +0 -1
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/8.BkbcnUs8.js +0 -1
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/9.Bkrv-Vww.js +0 -1
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/version.json +0 -1
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/index.html +0 -44
- lightly_studio-0.3.3/src/lightly_studio/models/annotation/__init__.py +0 -0
- lightly_studio-0.3.3/src/lightly_studio/resolvers/metadata_resolver/sample/bulk_set_metadata.py +0 -48
- lightly_studio-0.3.3/src/lightly_studio/selection/README.md +0 -6
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/__init__.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/api/__init__.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/api/cache.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/api/db_tables.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/api/routes/api/annotation.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/api/routes/api/annotation_label.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/api/routes/api/annotations/__init__.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/api/routes/api/annotations/create_annotation.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/api/routes/api/classifier.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/api/routes/api/dataset.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/api/routes/api/exceptions.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/api/routes/api/export.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/api/routes/api/features.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/api/routes/api/sample.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/api/routes/api/selection.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/api/routes/api/settings.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/api/routes/api/status.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/api/routes/api/text_embedding.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/api/routes/api/validators.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/api/routes/healthz.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/api/routes/images.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/api/routes/webapp.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/api/server.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/core/__init__.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/core/dataset_query/boolean_expression.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/core/dataset_query/dataset_query.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/core/dataset_query/field.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/core/dataset_query/field_expression.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/core/dataset_query/match_expression.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/core/dataset_query/order_by.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/core/dataset_query/sample_field.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/core/dataset_query/tags_expression.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/core/start_gui.py +0 -0
- {lightly_studio-0.3.3/src/lightly_studio/core/dataset_query → lightly_studio-0.4.0/src/lightly_studio/dataset}/__init__.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/dataset/edge_embedding_generator.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/dataset/embedding_generator.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/dataset/embedding_manager.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/dataset/env.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/dataset/file_utils.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/dataset/fsspec_lister.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/dataset/mobileclip_embedding_generator.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/LightlyLogo.BNjCIww-.png +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/OpenSans-Bold.DGvYQtcs.ttf +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/OpenSans-Italic-VariableFont_wdth_wght.B4AZ-wl6.ttf +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/OpenSans-Medium.DVUZMR_6.ttf +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/OpenSans-Regular.DxJTClRG.ttf +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/OpenSans-SemiBold.D3TTYgdB.ttf +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/OpenSans-VariableFont_wdth_wght.BZBpG5Iz.ttf +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/69_IOA4Y.js +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/B90CZVMX.js +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CWj6FrbW.js +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CYgJF_JY.js +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DIeogL5L.js +0 -0
- /lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/11.CWG1ehzT.js → /lightly_studio-0.4.0/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/12.CWG1ehzT.js +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/workers/clustering.worker-DKqeLtG0.js +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/workers/search.worker-vNSty3B0.js +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/dist_lightly_studio_view_app/apple-touch-icon-precomposed.png +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/dist_lightly_studio_view_app/apple-touch-icon.png +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/dist_lightly_studio_view_app/favicon.png +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/export/lightly_studio_label_input.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/export_schema.py +0 -0
- {lightly_studio-0.3.3/src/lightly_studio/dataset → lightly_studio-0.4.0/src/lightly_studio/few_shot_classifier}/__init__.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/few_shot_classifier/classifier.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/few_shot_classifier/classifier_manager.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/few_shot_classifier/random_forest_classifier.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/metadata/complex_metadata.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/metadata/gps_coordinate.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/metadata/metadata_protocol.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/models/__init__.py +0 -0
- {lightly_studio-0.3.3/src/lightly_studio/few_shot_classifier → lightly_studio-0.4.0/src/lightly_studio/models/annotation}/__init__.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/models/annotation/annotation_base.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/models/annotation/instance_segmentation.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/models/annotation/links.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/models/annotation/object_detection.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/models/annotation/semantic_segmentation.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/models/annotation_label.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/models/classifier.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/models/embedding_model.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/models/sample_embedding.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/models/tag.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/py.typed +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/resolvers/__init__.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/resolvers/annotation_label_resolver/__init__.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/resolvers/annotation_label_resolver/create.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/resolvers/annotation_label_resolver/delete.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/resolvers/annotation_label_resolver/get_all.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/resolvers/annotation_label_resolver/get_by_id.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/resolvers/annotation_label_resolver/get_by_ids.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/resolvers/annotation_label_resolver/get_by_label_name.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/resolvers/annotation_label_resolver/names_by_ids.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/resolvers/annotation_label_resolver/update.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/resolvers/annotation_resolver/__init__.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/resolvers/annotation_resolver/count_annotations_by_dataset.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/resolvers/annotation_resolver/create_many.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/resolvers/annotation_resolver/delete_annotation.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/resolvers/annotation_resolver/delete_annotations.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/resolvers/annotation_resolver/get_all.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/resolvers/annotation_resolver/get_by_id.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/resolvers/annotation_resolver/update_annotation_label.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/resolvers/annotation_resolver/update_bounding_box.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/resolvers/annotations/__init__.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/resolvers/annotations/annotations_filter.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/resolvers/embedding_model_resolver.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/resolvers/metadata_resolver/metadata_filter.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/resolvers/metadata_resolver/sample/get_by_sample_id.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/resolvers/metadata_resolver/sample/get_metadata_info.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/resolvers/metadata_resolver/sample/get_value_for_sample.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/resolvers/metadata_resolver/sample/set_value_for_sample.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/resolvers/sample_embedding_resolver.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/resolvers/tag_resolver.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/selection/select.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/selection/select_via_db.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/selection/selection_config.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/services/annotations_service/__init__.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/services/annotations_service/create_annotation.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/services/annotations_service/delete_annotation.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/services/annotations_service/get_annotation_by_id.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/services/annotations_service/update_annotation.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/services/annotations_service/update_annotation_bounding_box.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/services/annotations_service/update_annotation_label.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/services/annotations_service/update_annotations.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/setup_logging.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/vendor/ACKNOWLEDGEMENTS +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/vendor/LICENSE +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/vendor/LICENSE_weights_data +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/vendor/README.md +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/vendor/__init__.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/vendor/mobileclip/__init__.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/vendor/mobileclip/clip.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/vendor/mobileclip/configs/mobileclip_b.json +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/vendor/mobileclip/configs/mobileclip_s0.json +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/vendor/mobileclip/configs/mobileclip_s1.json +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/vendor/mobileclip/configs/mobileclip_s2.json +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/vendor/mobileclip/image_encoder.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/vendor/mobileclip/logger.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/vendor/mobileclip/models/__init__.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/vendor/mobileclip/models/mci.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/vendor/mobileclip/models/vit.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/vendor/mobileclip/modules/__init__.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/vendor/mobileclip/modules/common/__init__.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/vendor/mobileclip/modules/common/mobileone.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/vendor/mobileclip/modules/common/transformer.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/vendor/mobileclip/modules/image/__init__.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/vendor/mobileclip/modules/image/image_projection.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/vendor/mobileclip/modules/image/replknet.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/vendor/mobileclip/modules/text/__init__.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/vendor/mobileclip/modules/text/repmixer.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/vendor/mobileclip/modules/text/tokenizer.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/vendor/mobileclip/text_encoder.py +0 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: lightly-studio
|
|
3
|
+
Version: 0.4.0
|
|
4
|
+
Summary: LightlyStudio is a lightweight, fast, and easy-to-use data exploration tool for data scientists and engineers.
|
|
5
|
+
Classifier: Operating System :: MacOS :: MacOS X
|
|
6
|
+
Classifier: Operating System :: Microsoft :: Windows
|
|
7
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
8
|
+
Classifier: Programming Language :: Python :: 3
|
|
9
|
+
Classifier: Programming Language :: Python :: 3.8
|
|
10
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
11
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
14
|
+
Requires-Python: <3.13,>=3.8
|
|
15
|
+
Requires-Dist: annotated-types==0.7.0
|
|
16
|
+
Requires-Dist: duckdb-engine<0.17,>=0.15.0
|
|
17
|
+
Requires-Dist: duckdb<1.3,>=1.2.2
|
|
18
|
+
Requires-Dist: environs<12.0.0
|
|
19
|
+
Requires-Dist: eval-type-backport>=0.2.2
|
|
20
|
+
Requires-Dist: fastapi>=0.115.5
|
|
21
|
+
Requires-Dist: faster-coco-eval>=1.6.5
|
|
22
|
+
Requires-Dist: fsspec>=2023.1.0
|
|
23
|
+
Requires-Dist: labelformat>=0.1.7
|
|
24
|
+
Requires-Dist: lightly-mundig==0.1.7
|
|
25
|
+
Requires-Dist: open-clip-torch>=2.20.0
|
|
26
|
+
Requires-Dist: pyarrow>=17.0.0
|
|
27
|
+
Requires-Dist: python-multipart>=0.0.20
|
|
28
|
+
Requires-Dist: scikit-learn==1.3.2
|
|
29
|
+
Requires-Dist: sqlmodel>=0.0.22
|
|
30
|
+
Requires-Dist: tqdm>=4.65.0
|
|
31
|
+
Requires-Dist: typing-extensions>=4.12.2
|
|
32
|
+
Requires-Dist: uvicorn>=0.32.1
|
|
33
|
+
Requires-Dist: xxhash>=3.5.0
|
|
34
|
+
Provides-Extra: cloud-storage
|
|
35
|
+
Requires-Dist: adlfs>=2023.1.0; extra == 'cloud-storage'
|
|
36
|
+
Requires-Dist: gcsfs>=2023.1.0; extra == 'cloud-storage'
|
|
37
|
+
Requires-Dist: s3fs>=2023.1.0; extra == 'cloud-storage'
|
|
38
|
+
Provides-Extra: lightly-edge
|
|
39
|
+
Requires-Dist: lightly-edge-sdk>=1.0.1b2; extra == 'lightly-edge'
|
|
40
|
+
Requires-Dist: opencv-python; extra == 'lightly-edge'
|
|
41
|
+
Description-Content-Type: text/markdown
|
|
42
|
+
|
|
43
|
+
<p align="center">
|
|
44
|
+
<a href="https://lightly.ai/lightly-studio">
|
|
45
|
+
<img src="https://cdn.prod.website-files.com/62cd5ce03261cba217188442/66dac501a8e9a90495970876_Logo%20dark-short-p-800.png" height="50" alt="LightlyStudio logo" />
|
|
46
|
+
</a>
|
|
47
|
+
</p>
|
|
48
|
+
<p align="center"><strong>Curate, Annotate, and Manage Your Data in LightlyStudio.</strong></p>
|
|
49
|
+
<p align="center">
|
|
50
|
+
<a href="https://pypi.org/project/lightly-studio">
|
|
51
|
+
<img src="https://img.shields.io/pypi/pyversions/lightly-studio" alt="PyPI python" />
|
|
52
|
+
</a>
|
|
53
|
+
<a href="https://pypi.org/project/lightly-studio">
|
|
54
|
+
<img src="https://badge.fury.io/py/lightly-studio.svg" alt="PyPI version" />
|
|
55
|
+
</a>
|
|
56
|
+
<a href="LICENSE">
|
|
57
|
+
<img src="https://img.shields.io/badge/License-Apache%202.0-blue.svg" alt="License" />
|
|
58
|
+
</a>
|
|
59
|
+
<a href="https://docs.lightly.ai/studio">
|
|
60
|
+
<img src="https://img.shields.io/badge/Docs-blue" alt="Docs" />
|
|
61
|
+
</a>
|
|
62
|
+
</p>
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
# Welcome to LightlyStudio!
|
|
67
|
+
|
|
68
|
+
We at **[Lightly](https://lightly.ai)** created **[LightlyStudio](https://www.lightly.ai/lightly-studio)**, an open-source tool designed to unify your data workflows from curation, annotation and management in a single tool. Since we're big fans of Rust we used it to speed things up. You can work with COCO and ImageNet on a Macbook Pro with M1 and 16GB of memory!
|
|
69
|
+
|
|
70
|
+
Explore [LightlyStudio on GitHub](https://github.com/lightly-ai/lightly-studio).
|
|
71
|
+
|
|
72
|
+
Learn more in our [documentation](https://docs.lightly.ai/studio).
|
|
73
|
+
|
|
74
|
+
<p align="center">
|
|
75
|
+
<img alt="LightlyStudio Overview" src="https://storage.googleapis.com/lightly-public/studio/studio_overview.gif" width="70%">
|
|
76
|
+
<br/>
|
|
77
|
+
<em>Curate, Annotate, and Manage Your Data in LightlyStudio.</em>
|
|
78
|
+
</p>
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<a href="https://lightly.ai/lightly-studio">
|
|
3
|
+
<img src="https://cdn.prod.website-files.com/62cd5ce03261cba217188442/66dac501a8e9a90495970876_Logo%20dark-short-p-800.png" height="50" alt="LightlyStudio logo" />
|
|
4
|
+
</a>
|
|
5
|
+
</p>
|
|
6
|
+
<p align="center"><strong>Curate, Annotate, and Manage Your Data in LightlyStudio.</strong></p>
|
|
7
|
+
<p align="center">
|
|
8
|
+
<a href="https://pypi.org/project/lightly-studio">
|
|
9
|
+
<img src="https://img.shields.io/pypi/pyversions/lightly-studio" alt="PyPI python" />
|
|
10
|
+
</a>
|
|
11
|
+
<a href="https://pypi.org/project/lightly-studio">
|
|
12
|
+
<img src="https://badge.fury.io/py/lightly-studio.svg" alt="PyPI version" />
|
|
13
|
+
</a>
|
|
14
|
+
<a href="LICENSE">
|
|
15
|
+
<img src="https://img.shields.io/badge/License-Apache%202.0-blue.svg" alt="License" />
|
|
16
|
+
</a>
|
|
17
|
+
<a href="https://docs.lightly.ai/studio">
|
|
18
|
+
<img src="https://img.shields.io/badge/Docs-blue" alt="Docs" />
|
|
19
|
+
</a>
|
|
20
|
+
</p>
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
# Welcome to LightlyStudio!
|
|
25
|
+
|
|
26
|
+
We at **[Lightly](https://lightly.ai)** created **[LightlyStudio](https://www.lightly.ai/lightly-studio)**, an open-source tool designed to unify your data workflows from curation, annotation and management in a single tool. Since we're big fans of Rust we used it to speed things up. You can work with COCO and ImageNet on a Macbook Pro with M1 and 16GB of memory!
|
|
27
|
+
|
|
28
|
+
Explore [LightlyStudio on GitHub](https://github.com/lightly-ai/lightly-studio).
|
|
29
|
+
|
|
30
|
+
Learn more in our [documentation](https://docs.lightly.ai/studio).
|
|
31
|
+
|
|
32
|
+
<p align="center">
|
|
33
|
+
<img alt="LightlyStudio Overview" src="https://storage.googleapis.com/lightly-public/studio/studio_overview.gif" width="70%">
|
|
34
|
+
<br/>
|
|
35
|
+
<em>Curate, Annotate, and Manage Your Data in LightlyStudio.</em>
|
|
36
|
+
</p>
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "lightly-studio"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.4.0"
|
|
4
4
|
description = "LightlyStudio is a lightweight, fast, and easy-to-use data exploration tool for data scientists and engineers."
|
|
5
5
|
readme = "USAGE.md"
|
|
6
|
-
requires-python = ">=3.8"
|
|
6
|
+
requires-python = ">=3.8,<3.13"
|
|
7
7
|
classifiers = [
|
|
8
8
|
"Programming Language :: Python :: 3",
|
|
9
9
|
"Programming Language :: Python :: 3.8",
|
|
10
10
|
"Programming Language :: Python :: 3.9",
|
|
11
11
|
"Programming Language :: Python :: 3.10",
|
|
12
12
|
"Programming Language :: Python :: 3.11",
|
|
13
|
+
"Programming Language :: Python :: 3.12",
|
|
13
14
|
"Operating System :: POSIX :: Linux",
|
|
14
15
|
"Operating System :: MacOS :: MacOS X",
|
|
15
16
|
"Operating System :: Microsoft :: Windows",
|
|
@@ -43,7 +44,7 @@ dependencies = [
|
|
|
43
44
|
# lightly-mundig==$version
|
|
44
45
|
# Then lock the version. The uv.lock file is updated accordingly.
|
|
45
46
|
# uv lock --upgrade-package lightly-mundig==$version
|
|
46
|
-
"lightly-mundig==0.1.
|
|
47
|
+
"lightly-mundig==0.1.7",
|
|
47
48
|
"pyarrow>=17.0.0",
|
|
48
49
|
]
|
|
49
50
|
|
|
@@ -74,6 +75,15 @@ dev = [
|
|
|
74
75
|
"pytest-xdist>=3.6.1",
|
|
75
76
|
]
|
|
76
77
|
|
|
78
|
+
docs = [
|
|
79
|
+
"mkdocs>=1.5.0",
|
|
80
|
+
"mkdocs-material>=9.4.0",
|
|
81
|
+
"mkdocs-git-revision-date-localized-plugin>=1.2.0",
|
|
82
|
+
"mkdocstrings[python]>=0.24.0",
|
|
83
|
+
"mkdocstrings-python>=1.8.0",
|
|
84
|
+
"pymdown-extensions>=10.0.0",
|
|
85
|
+
]
|
|
86
|
+
|
|
77
87
|
|
|
78
88
|
[tool.mypy]
|
|
79
89
|
strict = true
|
|
@@ -131,3 +141,8 @@ explicit = true
|
|
|
131
141
|
artifacts = [
|
|
132
142
|
"src/lightly_studio/**/*",
|
|
133
143
|
]
|
|
144
|
+
|
|
145
|
+
[tool.ruff]
|
|
146
|
+
extend-exclude = [
|
|
147
|
+
"docs",
|
|
148
|
+
]
|
|
@@ -16,6 +16,7 @@ from lightly_studio.api.routes import healthz, images, webapp
|
|
|
16
16
|
from lightly_studio.api.routes.api import (
|
|
17
17
|
annotation,
|
|
18
18
|
annotation_label,
|
|
19
|
+
caption,
|
|
19
20
|
classifier,
|
|
20
21
|
dataset,
|
|
21
22
|
dataset_tag,
|
|
@@ -89,6 +90,7 @@ api_router.include_router(export.export_router)
|
|
|
89
90
|
api_router.include_router(sample.samples_router)
|
|
90
91
|
api_router.include_router(annotation_label.annotations_label_router)
|
|
91
92
|
api_router.include_router(annotation.annotations_router)
|
|
93
|
+
api_router.include_router(caption.captions_router)
|
|
92
94
|
api_router.include_router(text_embedding.text_embedding_router)
|
|
93
95
|
api_router.include_router(settings.settings_router)
|
|
94
96
|
api_router.include_router(classifier.classifier_router)
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"""API routes for dataset captions."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from uuid import UUID
|
|
6
|
+
|
|
7
|
+
from fastapi import APIRouter, Depends, Path
|
|
8
|
+
from typing_extensions import Annotated
|
|
9
|
+
|
|
10
|
+
from lightly_studio.api.routes.api.validators import Paginated, PaginatedWithCursor
|
|
11
|
+
from lightly_studio.db_manager import SessionDep
|
|
12
|
+
from lightly_studio.models.caption import CaptionsListView
|
|
13
|
+
from lightly_studio.resolvers import caption_resolver
|
|
14
|
+
from lightly_studio.resolvers.caption_resolver import GetAllCaptionsResult
|
|
15
|
+
|
|
16
|
+
captions_router = APIRouter(prefix="/datasets/{dataset_id}", tags=["captions"])
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@captions_router.get("/captions", response_model=CaptionsListView)
|
|
20
|
+
def read_captions(
|
|
21
|
+
dataset_id: Annotated[UUID, Path(title="Dataset Id")],
|
|
22
|
+
session: SessionDep,
|
|
23
|
+
pagination: Annotated[PaginatedWithCursor, Depends()],
|
|
24
|
+
) -> GetAllCaptionsResult:
|
|
25
|
+
"""Retrieve captions for a dataset."""
|
|
26
|
+
return caption_resolver.get_all(
|
|
27
|
+
session=session,
|
|
28
|
+
dataset_id=dataset_id,
|
|
29
|
+
pagination=Paginated(offset=pagination.offset, limit=pagination.limit),
|
|
30
|
+
)
|
{lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/api/routes/api/dataset_tag.py
RENAMED
|
@@ -164,6 +164,11 @@ class SampleIdsBody(BaseModel):
|
|
|
164
164
|
)
|
|
165
165
|
def add_sample_ids_to_tag_id(
|
|
166
166
|
session: SessionDep,
|
|
167
|
+
# dataset_id is needed for the generator
|
|
168
|
+
dataset_id: Annotated[ # noqa: ARG001
|
|
169
|
+
UUID,
|
|
170
|
+
Path(title="Dataset Id", description="The ID of the dataset"),
|
|
171
|
+
],
|
|
167
172
|
tag_id: UUID,
|
|
168
173
|
body: SampleIdsBody,
|
|
169
174
|
) -> bool:
|
|
@@ -215,6 +220,11 @@ class AnnotationIdsBody(BaseModel):
|
|
|
215
220
|
)
|
|
216
221
|
def add_annotation_ids_to_tag_id(
|
|
217
222
|
session: SessionDep,
|
|
223
|
+
# dataset_id is needed for the generator
|
|
224
|
+
dataset_id: Annotated[ # noqa: ARG001
|
|
225
|
+
UUID,
|
|
226
|
+
Path(title="Dataset Id", description="The ID of the dataset"),
|
|
227
|
+
],
|
|
218
228
|
tag_id: UUID,
|
|
219
229
|
body: AnnotationIdsBody,
|
|
220
230
|
) -> bool:
|
{lightly_studio-0.3.3 → lightly_studio-0.4.0}/src/lightly_studio/api/routes/api/embeddings2d.py
RENAMED
|
@@ -3,25 +3,38 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
import io
|
|
6
|
+
from uuid import UUID
|
|
6
7
|
|
|
7
|
-
import numpy as np
|
|
8
8
|
import pyarrow as pa
|
|
9
9
|
from fastapi import APIRouter, HTTPException, Response
|
|
10
|
-
from numpy.typing import NDArray
|
|
11
10
|
from pyarrow import ipc
|
|
12
|
-
from
|
|
11
|
+
from pydantic import BaseModel, Field
|
|
13
12
|
from sqlmodel import select
|
|
14
13
|
|
|
15
14
|
from lightly_studio.db_manager import SessionDep
|
|
16
15
|
from lightly_studio.models.dataset import DatasetTable
|
|
17
16
|
from lightly_studio.models.embedding_model import EmbeddingModelTable
|
|
18
|
-
from lightly_studio.resolvers import sample_embedding_resolver
|
|
17
|
+
from lightly_studio.resolvers import sample_embedding_resolver, sample_resolver
|
|
18
|
+
from lightly_studio.resolvers.samples_filter import SampleFilter
|
|
19
|
+
from lightly_studio.resolvers.twodim_embedding_resolver import _calculate_2d_embeddings
|
|
19
20
|
|
|
20
21
|
embeddings2d_router = APIRouter()
|
|
21
22
|
|
|
22
23
|
|
|
23
|
-
|
|
24
|
-
|
|
24
|
+
class GetEmbeddings2DRequest(BaseModel):
|
|
25
|
+
"""Request body for retrieving 2D embeddings."""
|
|
26
|
+
|
|
27
|
+
filters: SampleFilter | None = Field(
|
|
28
|
+
None,
|
|
29
|
+
description="Filter parameters identifying matching samples",
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@embeddings2d_router.post("/embeddings2d/default")
|
|
34
|
+
def get_2d_embeddings(
|
|
35
|
+
session: SessionDep,
|
|
36
|
+
body: GetEmbeddings2DRequest | None = None,
|
|
37
|
+
) -> Response:
|
|
25
38
|
"""Return 2D embeddings serialized as an Arrow stream."""
|
|
26
39
|
# TODO(Malte, 09/2025): Support choosing the dataset via API parameter.
|
|
27
40
|
dataset = session.exec(select(DatasetTable).limit(1)).first()
|
|
@@ -37,17 +50,33 @@ def get_embeddings2d__tsne(session: SessionDep) -> Response:
|
|
|
37
50
|
if embedding_model is None:
|
|
38
51
|
raise HTTPException(status_code=404, detail="No embedding model configured.")
|
|
39
52
|
|
|
40
|
-
# TODO(Malte, 09/2025): Support choosing a subset of samples via API parameter.
|
|
41
53
|
embeddings = sample_embedding_resolver.get_all_by_dataset_id(
|
|
42
54
|
session=session,
|
|
43
55
|
dataset_id=dataset.dataset_id,
|
|
44
56
|
embedding_model_id=embedding_model.embedding_model_id,
|
|
45
57
|
)
|
|
46
58
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
59
|
+
planar_embeddings = _calculate_2d_embeddings([e.embedding for e in embeddings])
|
|
60
|
+
# TODO(lukas 10/2025): This can become very slow for large datasets, we should consider using
|
|
61
|
+
# `pa.chunked_array` to directly construct the xy array.
|
|
62
|
+
x = (x for (x, _) in planar_embeddings)
|
|
63
|
+
y = (y for (_, y) in planar_embeddings)
|
|
64
|
+
|
|
65
|
+
matching_sample_ids: set[UUID] | None = None
|
|
66
|
+
filters = body.filters if body else None
|
|
67
|
+
if filters:
|
|
68
|
+
matching_samples_result = sample_resolver.get_all_by_dataset_id(
|
|
69
|
+
session=session,
|
|
70
|
+
dataset_id=dataset.dataset_id,
|
|
71
|
+
filters=filters,
|
|
72
|
+
)
|
|
73
|
+
matching_sample_ids = {sample.sample_id for sample in matching_samples_result.samples}
|
|
74
|
+
|
|
75
|
+
sample_ids = [embedding.sample_id for embedding in embeddings]
|
|
76
|
+
if matching_sample_ids is None:
|
|
77
|
+
fulfils_filter = [1] * len(sample_ids)
|
|
78
|
+
else:
|
|
79
|
+
fulfils_filter = [1 if sample_id in matching_sample_ids else 0 for sample_id in sample_ids]
|
|
51
80
|
|
|
52
81
|
# TODO(Malte, 09/2025): Save the 2D-embeddings in the database to avoid recomputing
|
|
53
82
|
# them on every request.
|
|
@@ -57,6 +86,8 @@ def get_embeddings2d__tsne(session: SessionDep) -> Response:
|
|
|
57
86
|
{
|
|
58
87
|
"x": pa.array(x, type=pa.float32()),
|
|
59
88
|
"y": pa.array(y, type=pa.float32()),
|
|
89
|
+
"fulfils_filter": pa.array(fulfils_filter, type=pa.uint8()),
|
|
90
|
+
"sample_id": pa.array([str(sample_id) for sample_id in sample_ids], type=pa.string()),
|
|
60
91
|
}
|
|
61
92
|
)
|
|
62
93
|
|
|
@@ -74,31 +105,3 @@ def get_embeddings2d__tsne(session: SessionDep) -> Response:
|
|
|
74
105
|
"X-Content-Type-Options": "nosniff",
|
|
75
106
|
},
|
|
76
107
|
)
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
def _calculate_tsne_embeddings(embedding_values: NDArray[np.float32]) -> NDArray[np.float32]:
|
|
80
|
-
# TODO(Malte, 10/2025): Switch to a better and faster projection method than
|
|
81
|
-
# scikit-learn's TSNE.
|
|
82
|
-
# See https://linear.app/lightly/issue/LIG-7678/embedding-plot-investigate-fasterandbetter-2d-computation-options
|
|
83
|
-
n_samples = embedding_values.shape[0]
|
|
84
|
-
# For 0, 1 or 2 samples we hard-code deterministic coordinates.
|
|
85
|
-
if n_samples == 0:
|
|
86
|
-
return np.zeros((0, 2), dtype=np.float32)
|
|
87
|
-
if n_samples == 1:
|
|
88
|
-
return np.asarray([[0.0, 0.0]], dtype=np.float32)
|
|
89
|
-
if n_samples == 2: # noqa: PLR2004
|
|
90
|
-
return np.asarray([[0.0, 0.0], [1.0, 1.0]], dtype=np.float32)
|
|
91
|
-
|
|
92
|
-
# Copied from lightly-core:
|
|
93
|
-
# https://github.com/lightly-ai/lightly-core/blob/b738952516e916eba42fdd28498491ff18df5c1e/appv2/packages/queueworker/src/jobs/embeddings2d/function-source/main.py#L179-L186
|
|
94
|
-
embeddings_2d: NDArray[np.float32] = TSNE(
|
|
95
|
-
init="pca", # changed in https://github.com/scikit-learn/scikit-learn/issues/18018
|
|
96
|
-
learning_rate="auto", # changed in https://github.com/scikit-learn/scikit-learn/issues/18018
|
|
97
|
-
n_components=2,
|
|
98
|
-
# Perplexity must be _less_ than the number of entries. 30 is the default value.
|
|
99
|
-
# https://scikit-learn.org/stable/modules/generated/sklearn.manifold.TSNE.html
|
|
100
|
-
perplexity=min(30.0, float(n_samples - 1)),
|
|
101
|
-
# Make the computation deterministic.
|
|
102
|
-
random_state=0,
|
|
103
|
-
).fit_transform(embedding_values)
|
|
104
|
-
return embeddings_2d
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"""This module contains the API routes for managing datasets."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import List
|
|
6
|
+
from uuid import UUID
|
|
7
|
+
|
|
8
|
+
from fastapi import APIRouter, Depends, Path
|
|
9
|
+
from pydantic import BaseModel, Field
|
|
10
|
+
from typing_extensions import Annotated
|
|
11
|
+
|
|
12
|
+
from lightly_studio.api.routes.api.dataset import get_and_validate_dataset_id
|
|
13
|
+
from lightly_studio.db_manager import SessionDep
|
|
14
|
+
from lightly_studio.metadata import compute_typicality
|
|
15
|
+
from lightly_studio.models.dataset import DatasetTable
|
|
16
|
+
from lightly_studio.models.metadata import MetadataInfoView
|
|
17
|
+
from lightly_studio.resolvers import embedding_model_resolver
|
|
18
|
+
from lightly_studio.resolvers.metadata_resolver.sample.get_metadata_info import (
|
|
19
|
+
get_all_metadata_keys_and_schema,
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
metadata_router = APIRouter(prefix="/datasets/{dataset_id}", tags=["metadata"])
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@metadata_router.get("/metadata/info", response_model=List[MetadataInfoView])
|
|
26
|
+
def get_metadata_info(
|
|
27
|
+
session: SessionDep,
|
|
28
|
+
dataset_id: Annotated[UUID, Path(title="Dataset Id")],
|
|
29
|
+
) -> list[MetadataInfoView]:
|
|
30
|
+
"""Get all metadata keys and their schema for a dataset.
|
|
31
|
+
|
|
32
|
+
Args:
|
|
33
|
+
session: The database session.
|
|
34
|
+
dataset_id: The ID of the dataset.
|
|
35
|
+
|
|
36
|
+
Returns:
|
|
37
|
+
List of metadata info objects with name, type, and optionally min/max values
|
|
38
|
+
for numerical metadata types.
|
|
39
|
+
"""
|
|
40
|
+
return get_all_metadata_keys_and_schema(session=session, dataset_id=dataset_id)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class ComputeTypicalityRequest(BaseModel):
|
|
44
|
+
"""Request model for computing typicality metadata."""
|
|
45
|
+
|
|
46
|
+
embedding_model_name: str | None = Field(
|
|
47
|
+
default=None,
|
|
48
|
+
description="Embedding model name (uses default if not specified)",
|
|
49
|
+
)
|
|
50
|
+
metadata_name: str = Field(
|
|
51
|
+
default="typicality",
|
|
52
|
+
description="Metadata field name (defaults to 'typicality')",
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
@metadata_router.post(
|
|
57
|
+
"/metadata/typicality",
|
|
58
|
+
status_code=204,
|
|
59
|
+
response_model=None,
|
|
60
|
+
)
|
|
61
|
+
def compute_typicality_metadata(
|
|
62
|
+
session: SessionDep,
|
|
63
|
+
dataset: Annotated[
|
|
64
|
+
DatasetTable,
|
|
65
|
+
Depends(get_and_validate_dataset_id),
|
|
66
|
+
],
|
|
67
|
+
request: ComputeTypicalityRequest,
|
|
68
|
+
) -> None:
|
|
69
|
+
"""Compute typicality metadata for a dataset.
|
|
70
|
+
|
|
71
|
+
Args:
|
|
72
|
+
session: The database session.
|
|
73
|
+
dataset: The dataset to compute typicality for.
|
|
74
|
+
request: Request parameters including optional embedding model name
|
|
75
|
+
and metadata field name.
|
|
76
|
+
|
|
77
|
+
Returns:
|
|
78
|
+
None (204 No Content on success).
|
|
79
|
+
"""
|
|
80
|
+
embedding_model = embedding_model_resolver.get_by_name(
|
|
81
|
+
session=session,
|
|
82
|
+
dataset_id=dataset.dataset_id,
|
|
83
|
+
embedding_model_name=request.embedding_model_name,
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
compute_typicality.compute_typicality_metadata(
|
|
87
|
+
session=session,
|
|
88
|
+
dataset_id=dataset.dataset_id,
|
|
89
|
+
embedding_model_id=embedding_model.embedding_model_id,
|
|
90
|
+
metadata_name=request.metadata_name,
|
|
91
|
+
)
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
import json
|
|
6
|
+
from collections import defaultdict
|
|
5
7
|
from dataclasses import dataclass, field
|
|
6
8
|
from pathlib import Path
|
|
7
9
|
from typing import Iterable
|
|
@@ -26,10 +28,12 @@ from tqdm import tqdm
|
|
|
26
28
|
|
|
27
29
|
from lightly_studio.models.annotation.annotation_base import AnnotationCreate
|
|
28
30
|
from lightly_studio.models.annotation_label import AnnotationLabelCreate
|
|
31
|
+
from lightly_studio.models.caption import CaptionCreate
|
|
29
32
|
from lightly_studio.models.sample import SampleCreate, SampleTable
|
|
30
33
|
from lightly_studio.resolvers import (
|
|
31
34
|
annotation_label_resolver,
|
|
32
35
|
annotation_resolver,
|
|
36
|
+
caption_resolver,
|
|
33
37
|
sample_resolver,
|
|
34
38
|
)
|
|
35
39
|
|
|
@@ -218,6 +222,111 @@ def load_into_dataset_from_labelformat(
|
|
|
218
222
|
return created_sample_ids
|
|
219
223
|
|
|
220
224
|
|
|
225
|
+
def load_into_dataset_from_coco_captions(
|
|
226
|
+
session: Session,
|
|
227
|
+
dataset_id: UUID,
|
|
228
|
+
annotations_json: Path,
|
|
229
|
+
images_path: Path,
|
|
230
|
+
) -> list[UUID]:
|
|
231
|
+
"""Load samples and captions from a COCO captions file into the dataset.
|
|
232
|
+
|
|
233
|
+
Args:
|
|
234
|
+
session: Database session used for resolver operations.
|
|
235
|
+
dataset_id: Identifier of the dataset that receives the samples.
|
|
236
|
+
annotations_json: Path to the COCO captions annotations file.
|
|
237
|
+
images_path: Directory containing the referenced images.
|
|
238
|
+
|
|
239
|
+
Returns:
|
|
240
|
+
The list of newly created sample identifiers.
|
|
241
|
+
"""
|
|
242
|
+
with fsspec.open(str(annotations_json), "r") as file:
|
|
243
|
+
coco_payload = json.load(file)
|
|
244
|
+
|
|
245
|
+
images: list[dict[str, object]] = coco_payload.get("images", [])
|
|
246
|
+
annotations: list[dict[str, object]] = coco_payload.get("annotations", [])
|
|
247
|
+
|
|
248
|
+
captions_by_image_id: dict[int, list[str]] = defaultdict(list)
|
|
249
|
+
for annotation in annotations:
|
|
250
|
+
image_id = annotation["image_id"]
|
|
251
|
+
caption = annotation["caption"]
|
|
252
|
+
if not isinstance(image_id, int):
|
|
253
|
+
continue
|
|
254
|
+
if not isinstance(caption, str):
|
|
255
|
+
continue
|
|
256
|
+
caption_text = caption.strip()
|
|
257
|
+
if not caption_text:
|
|
258
|
+
continue
|
|
259
|
+
captions_by_image_id[image_id].append(caption_text)
|
|
260
|
+
|
|
261
|
+
logging_context = _LoadingLoggingContext(
|
|
262
|
+
n_samples_to_be_inserted=len(images),
|
|
263
|
+
n_samples_before_loading=sample_resolver.count_by_dataset_id(
|
|
264
|
+
session=session, dataset_id=dataset_id
|
|
265
|
+
),
|
|
266
|
+
)
|
|
267
|
+
|
|
268
|
+
captions_to_create: list[CaptionCreate] = []
|
|
269
|
+
samples_to_create: list[SampleCreate] = []
|
|
270
|
+
created_sample_ids: list[UUID] = []
|
|
271
|
+
image_path_to_captions: dict[str, list[str]] = {}
|
|
272
|
+
|
|
273
|
+
for image_info in tqdm(images, desc="Processing images", unit=" images"):
|
|
274
|
+
if isinstance(image_info["id"], int):
|
|
275
|
+
image_id_raw = image_info["id"]
|
|
276
|
+
else:
|
|
277
|
+
continue
|
|
278
|
+
file_name_raw = str(image_info["file_name"])
|
|
279
|
+
|
|
280
|
+
width = image_info["width"] if isinstance(image_info["width"], int) else 0
|
|
281
|
+
height = image_info["height"] if isinstance(image_info["height"], int) else 0
|
|
282
|
+
sample = SampleCreate(
|
|
283
|
+
file_name=file_name_raw,
|
|
284
|
+
file_path_abs=str(images_path / file_name_raw),
|
|
285
|
+
width=width,
|
|
286
|
+
height=height,
|
|
287
|
+
dataset_id=dataset_id,
|
|
288
|
+
)
|
|
289
|
+
samples_to_create.append(sample)
|
|
290
|
+
image_path_to_captions[sample.file_path_abs] = captions_by_image_id.get(image_id_raw, [])
|
|
291
|
+
|
|
292
|
+
if len(samples_to_create) >= SAMPLE_BATCH_SIZE:
|
|
293
|
+
created_samples_batch, paths_not_inserted = _create_batch_samples(
|
|
294
|
+
session=session, samples=samples_to_create
|
|
295
|
+
)
|
|
296
|
+
created_sample_ids.extend(s.sample_id for s in created_samples_batch)
|
|
297
|
+
logging_context.update_example_paths(paths_not_inserted)
|
|
298
|
+
_process_batch_captions(
|
|
299
|
+
session=session,
|
|
300
|
+
dataset_id=dataset_id,
|
|
301
|
+
stored_samples=created_samples_batch,
|
|
302
|
+
image_path_to_captions=image_path_to_captions,
|
|
303
|
+
captions_to_create=captions_to_create,
|
|
304
|
+
)
|
|
305
|
+
samples_to_create.clear()
|
|
306
|
+
image_path_to_captions.clear()
|
|
307
|
+
|
|
308
|
+
if samples_to_create:
|
|
309
|
+
created_samples_batch, paths_not_inserted = _create_batch_samples(
|
|
310
|
+
session=session, samples=samples_to_create
|
|
311
|
+
)
|
|
312
|
+
created_sample_ids.extend(s.sample_id for s in created_samples_batch)
|
|
313
|
+
logging_context.update_example_paths(paths_not_inserted)
|
|
314
|
+
_process_batch_captions(
|
|
315
|
+
session=session,
|
|
316
|
+
dataset_id=dataset_id,
|
|
317
|
+
stored_samples=created_samples_batch,
|
|
318
|
+
image_path_to_captions=image_path_to_captions,
|
|
319
|
+
captions_to_create=captions_to_create,
|
|
320
|
+
)
|
|
321
|
+
|
|
322
|
+
if captions_to_create:
|
|
323
|
+
caption_resolver.create_many(session=session, captions=captions_to_create)
|
|
324
|
+
|
|
325
|
+
_log_loading_results(session=session, dataset_id=dataset_id, logging_context=logging_context)
|
|
326
|
+
|
|
327
|
+
return created_sample_ids
|
|
328
|
+
|
|
329
|
+
|
|
221
330
|
def _log_loading_results(
|
|
222
331
|
session: Session, dataset_id: UUID, logging_context: _LoadingLoggingContext
|
|
223
332
|
) -> None:
|
|
@@ -372,3 +481,32 @@ def _process_batch_annotations( # noqa: PLR0913
|
|
|
372
481
|
if len(annotations_to_create) >= ANNOTATION_BATCH_SIZE:
|
|
373
482
|
annotation_resolver.create_many(session=session, annotations=annotations_to_create)
|
|
374
483
|
annotations_to_create.clear()
|
|
484
|
+
|
|
485
|
+
|
|
486
|
+
def _process_batch_captions(
|
|
487
|
+
session: Session,
|
|
488
|
+
dataset_id: UUID,
|
|
489
|
+
stored_samples: list[SampleTable],
|
|
490
|
+
image_path_to_captions: dict[str, list[str]],
|
|
491
|
+
captions_to_create: list[CaptionCreate],
|
|
492
|
+
) -> None:
|
|
493
|
+
"""Process captions for a batch of samples."""
|
|
494
|
+
if not stored_samples:
|
|
495
|
+
return
|
|
496
|
+
|
|
497
|
+
for stored_sample in stored_samples:
|
|
498
|
+
captions = image_path_to_captions[stored_sample.file_path_abs]
|
|
499
|
+
if not captions:
|
|
500
|
+
continue
|
|
501
|
+
|
|
502
|
+
for caption_text in captions:
|
|
503
|
+
caption = CaptionCreate(
|
|
504
|
+
dataset_id=dataset_id,
|
|
505
|
+
sample_id=stored_sample.sample_id,
|
|
506
|
+
text=caption_text,
|
|
507
|
+
)
|
|
508
|
+
captions_to_create.append(caption)
|
|
509
|
+
|
|
510
|
+
if len(captions_to_create) >= ANNOTATION_BATCH_SIZE:
|
|
511
|
+
caption_resolver.create_many(session=session, captions=captions_to_create)
|
|
512
|
+
captions_to_create.clear()
|