lightly-studio 0.3.3__tar.gz → 0.3.4__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.3.4}/PKG-INFO +86 -21
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/USAGE.md +83 -19
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/pyproject.toml +3 -2
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/api/app.py +2 -0
- lightly_studio-0.3.4/src/lightly_studio/api/routes/api/caption.py +30 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/api/routes/api/embeddings2d.py +36 -4
- lightly_studio-0.3.4/src/lightly_studio/api/routes/api/metadata.py +91 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/core/add_samples.py +138 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/core/dataset.py +143 -16
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/dataset/loader.py +2 -8
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/db_manager.py +10 -4
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/0.B3oFNb6O.css +1 -0
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/2.CkOblLn7.css +1 -0
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/Samples.CIbricz7.css +1 -0
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/_layout.7Ma7YdVg.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.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/_layout.CefECEWA.css +1 -1
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/transform.2jKMtOWG.css +1 -0
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/-DXuGN29.js +1 -0
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/Cs1XmhiF.js → lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/B7302SU7.js +1 -1
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/BeWf8-vJ.js +1 -0
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/Bqz7dyEC.js +1 -0
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/C1FmrZbK.js +1 -0
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/BdfTHw61.js → lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CSCQddQS.js +1 -1
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CZGpyrcA.js +1 -0
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CfQ4mGwl.js +1 -0
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CiaNZCBa.js +1 -0
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/Cqo0Vpvt.js +417 -0
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/Cy4fgWTG.js +1 -0
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/D5w4xp5l.js +1 -0
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DD63uD-T.js +1 -0
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DQ8aZ1o-.js +3 -0
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/keKYsoph.js → lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DSxvnAMh.js +1 -1
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/D_JuJOO3.js +20 -0
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/D_ynJAfY.js +2 -0
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/Dafy4oEQ.js +1 -0
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/BfHVnyNT.js → lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/Dj4O-5se.js +1 -1
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DmjAI-UV.js +1 -0
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/Dug7Bq1S.js +1 -0
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/Dv5BSBQG.js +1 -0
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DzBTnFhV.js +1 -0
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DzX_yyqb.js +1 -0
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/Frwd2CjB.js +1 -0
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/H4l0JFh9.js +1 -0
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/H60ATh8g.js +2 -0
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/6t3IJ0vQ.js → lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/qIv1kPyv.js +1 -1
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/sLqs1uaK.js +20 -0
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/u-it74zV.js +96 -0
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/entry/app.BPc0HQPq.js +2 -0
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/entry/start.SNvc2nrm.js +1 -0
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/0.5jT7P06o.js +1 -0
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/1.Cdy-7S5q.js +1 -0
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/10.C_uoESTX.js +1 -0
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/12.DcO8wIAc.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.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/2.BIldfkxL.js +268 -113
- lightly_studio-0.3.3/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/3.CLvg3QcJ.js → lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/3.BC9z_TWM.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.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/4.D8X_Ch5n.js +1 -1
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/5.CAXhxJu6.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.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/6.DRA5Ru_2.js +1 -1
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/7.WVBsruHQ.js +1 -0
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/8.BuKUrCEN.js +20 -0
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/9.CUIn1yCR.js +1 -0
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/version.json +1 -0
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/index.html +45 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/examples/example.py +4 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/examples/example_coco.py +4 -0
- lightly_studio-0.3.4/src/lightly_studio/examples/example_coco_caption.py +24 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/examples/example_metadata.py +4 -1
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/examples/example_selection.py +4 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/examples/example_split_work.py +4 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/examples/example_yolo.py +4 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/export/export_dataset.py +11 -3
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/metadata/compute_typicality.py +1 -1
- lightly_studio-0.3.4/src/lightly_studio/models/caption.py +73 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/models/dataset.py +1 -2
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/models/metadata.py +1 -1
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/models/sample.py +2 -2
- lightly_studio-0.3.4/src/lightly_studio/resolvers/caption_resolver.py +80 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/resolvers/dataset_resolver.py +4 -7
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/resolvers/metadata_resolver/__init__.py +2 -2
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/resolvers/metadata_resolver/sample/__init__.py +3 -3
- lightly_studio-0.3.4/src/lightly_studio/resolvers/metadata_resolver/sample/bulk_update_metadata.py +46 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/resolvers/samples_filter.py +18 -10
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/type_definitions.py +2 -0
- 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/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/resolvers/metadata_resolver/sample/bulk_set_metadata.py +0 -48
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/.gitignore +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/__init__.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/api/__init__.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/api/cache.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/api/db_tables.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/api/features.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/api/routes/api/annotation.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/api/routes/api/annotation_label.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/api/routes/api/annotations/__init__.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/api/routes/api/annotations/create_annotation.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/api/routes/api/classifier.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/api/routes/api/dataset.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/api/routes/api/dataset_tag.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/api/routes/api/exceptions.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/api/routes/api/export.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/api/routes/api/features.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/api/routes/api/sample.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/api/routes/api/selection.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/api/routes/api/settings.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/api/routes/api/status.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/api/routes/api/text_embedding.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/api/routes/api/validators.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/api/routes/healthz.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/api/routes/images.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/api/routes/webapp.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/api/server.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/core/__init__.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/core/dataset_query/__init__.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/core/dataset_query/boolean_expression.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/core/dataset_query/dataset_query.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/core/dataset_query/field.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/core/dataset_query/field_expression.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/core/dataset_query/match_expression.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/core/dataset_query/order_by.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/core/dataset_query/sample_field.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/core/dataset_query/tags_expression.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/core/sample.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/core/start_gui.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/dataset/__init__.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/dataset/edge_embedding_generator.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/dataset/embedding_generator.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/dataset/embedding_manager.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/dataset/env.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/dataset/file_utils.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/dataset/fsspec_lister.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/dataset/mobileclip_embedding_generator.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/dist_lightly_studio_view_app/_app/env.js +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/LightlyLogo.BNjCIww-.png +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/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.3.4}/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.3.4}/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.3.4}/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.3.4}/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.3.4}/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.3.4}/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/69_IOA4Y.js +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/B90CZVMX.js +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CWj6FrbW.js +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CYgJF_JY.js +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DIeogL5L.js +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/11.CWG1ehzT.js +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/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.3.4}/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.3.4}/src/lightly_studio/dist_lightly_studio_view_app/apple-touch-icon-precomposed.png +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/dist_lightly_studio_view_app/apple-touch-icon.png +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/dist_lightly_studio_view_app/favicon.png +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/export/lightly_studio_label_input.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/export_schema.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/few_shot_classifier/__init__.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/few_shot_classifier/classifier.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/few_shot_classifier/classifier_manager.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/few_shot_classifier/random_forest_classifier.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/metadata/complex_metadata.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/metadata/gps_coordinate.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/metadata/metadata_protocol.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/models/__init__.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/models/annotation/__init__.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/models/annotation/annotation_base.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/models/annotation/instance_segmentation.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/models/annotation/links.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/models/annotation/object_detection.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/models/annotation/semantic_segmentation.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/models/annotation_label.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/models/classifier.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/models/embedding_model.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/models/sample_embedding.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/models/settings.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/models/tag.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/py.typed +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/resolvers/__init__.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/resolvers/annotation_label_resolver/__init__.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/resolvers/annotation_label_resolver/create.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/resolvers/annotation_label_resolver/delete.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/resolvers/annotation_label_resolver/get_all.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/resolvers/annotation_label_resolver/get_by_id.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/resolvers/annotation_label_resolver/get_by_ids.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/resolvers/annotation_label_resolver/get_by_label_name.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/resolvers/annotation_label_resolver/names_by_ids.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/resolvers/annotation_label_resolver/update.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/resolvers/annotation_resolver/__init__.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/resolvers/annotation_resolver/count_annotations_by_dataset.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/resolvers/annotation_resolver/create_many.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/resolvers/annotation_resolver/delete_annotation.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/resolvers/annotation_resolver/delete_annotations.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/resolvers/annotation_resolver/get_all.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/resolvers/annotation_resolver/get_by_id.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/resolvers/annotation_resolver/update_annotation_label.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/resolvers/annotation_resolver/update_bounding_box.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/resolvers/annotations/__init__.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/resolvers/annotations/annotations_filter.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/resolvers/embedding_model_resolver.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/resolvers/metadata_resolver/metadata_filter.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/resolvers/metadata_resolver/sample/get_by_sample_id.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/resolvers/metadata_resolver/sample/get_metadata_info.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/resolvers/metadata_resolver/sample/get_value_for_sample.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/resolvers/metadata_resolver/sample/set_value_for_sample.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/resolvers/sample_embedding_resolver.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/resolvers/sample_resolver.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/resolvers/settings_resolver.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/resolvers/tag_resolver.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/selection/README.md +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/selection/mundig.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/selection/select.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/selection/select_via_db.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/selection/selection_config.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/services/annotations_service/__init__.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/services/annotations_service/create_annotation.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/services/annotations_service/delete_annotation.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/services/annotations_service/get_annotation_by_id.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/services/annotations_service/update_annotation.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/services/annotations_service/update_annotation_bounding_box.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/services/annotations_service/update_annotation_label.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/services/annotations_service/update_annotations.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/setup_logging.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/vendor/ACKNOWLEDGEMENTS +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/vendor/LICENSE +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/vendor/LICENSE_weights_data +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/vendor/README.md +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/vendor/__init__.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/vendor/mobileclip/__init__.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/vendor/mobileclip/clip.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/vendor/mobileclip/configs/mobileclip_b.json +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/vendor/mobileclip/configs/mobileclip_s0.json +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/vendor/mobileclip/configs/mobileclip_s1.json +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/vendor/mobileclip/configs/mobileclip_s2.json +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/vendor/mobileclip/image_encoder.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/vendor/mobileclip/logger.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/vendor/mobileclip/models/__init__.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/vendor/mobileclip/models/mci.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/vendor/mobileclip/models/vit.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/vendor/mobileclip/modules/__init__.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/vendor/mobileclip/modules/common/__init__.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/vendor/mobileclip/modules/common/mobileone.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/vendor/mobileclip/modules/common/transformer.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/vendor/mobileclip/modules/image/__init__.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/vendor/mobileclip/modules/image/image_projection.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/vendor/mobileclip/modules/image/replknet.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/vendor/mobileclip/modules/text/__init__.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/vendor/mobileclip/modules/text/repmixer.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/vendor/mobileclip/modules/text/tokenizer.py +0 -0
- {lightly_studio-0.3.3 → lightly_studio-0.3.4}/src/lightly_studio/vendor/mobileclip/text_encoder.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: lightly-studio
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.4
|
|
4
4
|
Summary: LightlyStudio is a lightweight, fast, and easy-to-use data exploration tool for data scientists and engineers.
|
|
5
5
|
Classifier: Operating System :: MacOS :: MacOS X
|
|
6
6
|
Classifier: Operating System :: Microsoft :: Windows
|
|
@@ -10,7 +10,8 @@ Classifier: Programming Language :: Python :: 3.8
|
|
|
10
10
|
Classifier: Programming Language :: Python :: 3.9
|
|
11
11
|
Classifier: Programming Language :: Python :: 3.10
|
|
12
12
|
Classifier: Programming Language :: Python :: 3.11
|
|
13
|
-
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
14
|
+
Requires-Python: <3.13,>=3.8
|
|
14
15
|
Requires-Dist: annotated-types==0.7.0
|
|
15
16
|
Requires-Dist: duckdb-engine<0.17,>=0.15.0
|
|
16
17
|
Requires-Dist: duckdb<1.3,>=1.2.2
|
|
@@ -60,7 +61,7 @@ Description-Content-Type: text/markdown
|
|
|
60
61
|
|
|
61
62
|
We at **[Lightly](https://lightly.ai)** created **LightlyStudio**, an open-source tool
|
|
62
63
|
designed to supercharge your data curation workflows for computer vision datasets. Explore
|
|
63
|
-
your data, visualize annotations and crops, tag samples, and export curated lists to improve
|
|
64
|
+
your data, visualize captions, annotations and crops, tag samples, and export curated lists to improve
|
|
64
65
|
your machine learning pipelines. And much more!
|
|
65
66
|
|
|
66
67
|
LightlyStudio runs entirely locally on your machine, keeping your data private. It consists
|
|
@@ -72,7 +73,7 @@ Using LightlyStudio typically involves these steps:
|
|
|
72
73
|
|
|
73
74
|
1. **Index Your Dataset:** Run a Python script using the `lightly_studio` library to process your local dataset (images and annotations) and save metadata into a local `lightly_studio.db` file.
|
|
74
75
|
2. **Launch the UI:** The script then starts a local web server.
|
|
75
|
-
3. **Explore & Curate:** Use the UI to visualize images, annotations, and object crops. Filter and search your data (experimental text search available). Apply tags to interesting samples (e.g., "mislabeled", "review").
|
|
76
|
+
3. **Explore & Curate:** Use the UI to visualize images, annotations, captions, and object crops. Filter and search your data (experimental text search available). Apply tags to interesting samples (e.g., "mislabeled", "review").
|
|
76
77
|
4. **Export Curated Data:** Export information (like filenames) for your tagged samples from the UI to use downstream.
|
|
77
78
|
5. **Stop the Server:** Close the terminal running the script (Ctrl+C) when done.
|
|
78
79
|
|
|
@@ -111,7 +112,7 @@ The library is OS-independent and works on Windows, Linux, and macOS.
|
|
|
111
112
|
|
|
112
113
|
```shell
|
|
113
114
|
# 1. Create and activate a virtual environment (Recommended)
|
|
114
|
-
# On Linux/
|
|
115
|
+
# On Linux/MacOS:
|
|
115
116
|
python3 -m venv venv
|
|
116
117
|
source venv/bin/activate
|
|
117
118
|
|
|
@@ -139,14 +140,12 @@ following contents in the same directory that contains the `dataset_examples/` f
|
|
|
139
140
|
```python
|
|
140
141
|
# example_yolo.py
|
|
141
142
|
|
|
142
|
-
from pathlib import Path
|
|
143
143
|
import lightly_studio as ls
|
|
144
144
|
|
|
145
145
|
# Create a dataset and add the samples from the yolo format
|
|
146
146
|
dataset = ls.Dataset.create()
|
|
147
147
|
dataset.add_samples_from_yolo(
|
|
148
148
|
data_yaml="dataset_examples/road_signs_yolo/data.yaml",
|
|
149
|
-
input_split="test",
|
|
150
149
|
)
|
|
151
150
|
|
|
152
151
|
# Start the UI application on the port 8001.
|
|
@@ -202,7 +201,6 @@ the `dataset_examples/` folder:
|
|
|
202
201
|
```python
|
|
203
202
|
# example_coco.py
|
|
204
203
|
|
|
205
|
-
from pathlib import Path
|
|
206
204
|
import lightly_studio as ls
|
|
207
205
|
|
|
208
206
|
# Create a dataset and add the samples from the coco format
|
|
@@ -245,6 +243,56 @@ COCO uses a single JSON file containing all annotations. The format consists of
|
|
|
245
243
|
|
|
246
244
|
</details>
|
|
247
245
|
|
|
246
|
+
### COCO Captions
|
|
247
|
+
|
|
248
|
+
To run a caption example using a COCO dataset, create a file named
|
|
249
|
+
`example_coco_captions.py` with the following contents in the same directory that contains
|
|
250
|
+
the `dataset_examples/` folder:
|
|
251
|
+
|
|
252
|
+
```python
|
|
253
|
+
# example_coco_captions.py
|
|
254
|
+
|
|
255
|
+
import lightly_studio as ls
|
|
256
|
+
|
|
257
|
+
# Create a dataset and add the samples from the coco format
|
|
258
|
+
dataset = ls.Dataset.create()
|
|
259
|
+
dataset.add_samples_from_coco_caption(
|
|
260
|
+
annotations_json="dataset_examples/coco_subset_128_images/captions_train2017.json",
|
|
261
|
+
images_path="dataset_examples/coco_subset_128_images/images",
|
|
262
|
+
)
|
|
263
|
+
|
|
264
|
+
# Start the UI application on the port 8001.
|
|
265
|
+
ls.start_gui()
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
Run the script:
|
|
269
|
+
|
|
270
|
+
```
|
|
271
|
+
python example_coco_captions.py
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
Now you can inspect samples with their assigned captions in the app. When you are done,
|
|
275
|
+
stop the app by pressing Ctrl+C in the terminal.
|
|
276
|
+
|
|
277
|
+
<details>
|
|
278
|
+
<summary>The COCO format details:</summary>
|
|
279
|
+
|
|
280
|
+
```
|
|
281
|
+
coco_subset_128_images/
|
|
282
|
+
├── images/
|
|
283
|
+
│ ├── image1.jpg
|
|
284
|
+
│ ├── image2.jpg
|
|
285
|
+
│ └── ...
|
|
286
|
+
└── captions_train2017.json # Single JSON file containing all captions
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
COCO uses a single JSON file containing all captions. The format consists of three main components:
|
|
290
|
+
|
|
291
|
+
- Images: Defines metadata for each image in the dataset.
|
|
292
|
+
- Annotations: Defines the captions.
|
|
293
|
+
|
|
294
|
+
</details>
|
|
295
|
+
|
|
248
296
|
## 🔍 How It Works
|
|
249
297
|
|
|
250
298
|
1. Your **Python script** uses the `lightly_studio` **Dataset**.
|
|
@@ -330,7 +378,6 @@ import lightly_studio as ls
|
|
|
330
378
|
dataset = ls.Dataset.create()
|
|
331
379
|
dataset.add_samples_from_yolo(
|
|
332
380
|
data_yaml="my_yolo_dataset/data.yaml",
|
|
333
|
-
input_split="val",
|
|
334
381
|
)
|
|
335
382
|
|
|
336
383
|
ls.start_gui()
|
|
@@ -628,12 +675,12 @@ query.add_tag("tag_name")
|
|
|
628
675
|
|
|
629
676
|
#### Export Samples
|
|
630
677
|
|
|
631
|
-
Currently, exporting to the COCO object detection format is supported
|
|
678
|
+
Currently, exporting to the COCO object detection format is supported and only annotations
|
|
679
|
+
of type object detection are exported. The following example exports the samples in the query
|
|
680
|
+
to a COCO JSON file named `coco_export.json`:
|
|
632
681
|
|
|
633
682
|
```py
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
query.export().to_coco_object_detections(Path("coco_export.json"))
|
|
683
|
+
query.export().to_coco_object_detections()
|
|
637
684
|
```
|
|
638
685
|
|
|
639
686
|
### Examples
|
|
@@ -697,7 +744,11 @@ samples.
|
|
|
697
744
|
Set the `LIGHTLY_STUDIO_LICENSE_KEY` environment variable before using selection features:
|
|
698
745
|
|
|
699
746
|
```bash
|
|
747
|
+
# On Linux/MacOS
|
|
700
748
|
export LIGHTLY_STUDIO_LICENSE_KEY="license_key_here"
|
|
749
|
+
|
|
750
|
+
# On Windows (PowerShell)
|
|
751
|
+
$env:LIGHTLY_STUDIO_LICENSE_KEY="license_key_here"
|
|
701
752
|
```
|
|
702
753
|
|
|
703
754
|
Alternatively, set it inside your Python script:
|
|
@@ -707,6 +758,12 @@ import os
|
|
|
707
758
|
os.environ["LIGHTLY_STUDIO_LICENSE_KEY"] = "license_key_here"
|
|
708
759
|
```
|
|
709
760
|
|
|
761
|
+
Or in a `.env` file:
|
|
762
|
+
|
|
763
|
+
```
|
|
764
|
+
LIGHTLY_STUDIO_LICENSE_KEY="license_key_here"
|
|
765
|
+
```
|
|
766
|
+
|
|
710
767
|
#### Diversity Selection
|
|
711
768
|
|
|
712
769
|
Diversity selection can be configured directly from a `DatasetQuery`. The example below showcases a simple case of selecting diverse samples.
|
|
@@ -796,19 +853,27 @@ with open("export.txt", "w") as f:
|
|
|
796
853
|
|
|
797
854
|
## 📚 **FAQ**
|
|
798
855
|
|
|
799
|
-
###
|
|
856
|
+
### Does LightlyStudio persist the datasets?
|
|
800
857
|
|
|
801
|
-
Yes, the information about datasets is
|
|
802
|
-
|
|
858
|
+
Yes, the information about datasets is persisted in a database file. You can see inspect
|
|
859
|
+
it after the dataset is processed. Use `Dataset.load()` to load a dataset from a pre-existing
|
|
860
|
+
database.
|
|
803
861
|
|
|
804
862
|
### Can I change the database path?
|
|
805
863
|
|
|
806
|
-
|
|
864
|
+
Yes, the database can be selected as follows:
|
|
865
|
+
```py
|
|
866
|
+
import lightly_studio as ls
|
|
867
|
+
|
|
868
|
+
ls.db_manager.connect(db_file="custom.db")
|
|
869
|
+
```
|
|
807
870
|
|
|
808
|
-
### Can I
|
|
871
|
+
### Can I use LightlyStudio from two scripts in parallel?
|
|
809
872
|
|
|
810
|
-
|
|
873
|
+
Only one script can be run at one time as the app uses a database lock for data integrity.
|
|
811
874
|
|
|
812
|
-
### Can I change the API backend port?
|
|
875
|
+
### Can I change the API backend host and port?
|
|
813
876
|
|
|
814
|
-
Yes
|
|
877
|
+
Yes, by setting environment variables. For the host set the LIGHTLY_STUDIO_HOST variable,
|
|
878
|
+
to change the port set the LIGHTLY_STUDIO_PORT variable. Note that if the port is unavailable
|
|
879
|
+
at runtime the app uses a random port number.
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
We at **[Lightly](https://lightly.ai)** created **LightlyStudio**, an open-source tool
|
|
21
21
|
designed to supercharge your data curation workflows for computer vision datasets. Explore
|
|
22
|
-
your data, visualize annotations and crops, tag samples, and export curated lists to improve
|
|
22
|
+
your data, visualize captions, annotations and crops, tag samples, and export curated lists to improve
|
|
23
23
|
your machine learning pipelines. And much more!
|
|
24
24
|
|
|
25
25
|
LightlyStudio runs entirely locally on your machine, keeping your data private. It consists
|
|
@@ -31,7 +31,7 @@ Using LightlyStudio typically involves these steps:
|
|
|
31
31
|
|
|
32
32
|
1. **Index Your Dataset:** Run a Python script using the `lightly_studio` library to process your local dataset (images and annotations) and save metadata into a local `lightly_studio.db` file.
|
|
33
33
|
2. **Launch the UI:** The script then starts a local web server.
|
|
34
|
-
3. **Explore & Curate:** Use the UI to visualize images, annotations, and object crops. Filter and search your data (experimental text search available). Apply tags to interesting samples (e.g., "mislabeled", "review").
|
|
34
|
+
3. **Explore & Curate:** Use the UI to visualize images, annotations, captions, and object crops. Filter and search your data (experimental text search available). Apply tags to interesting samples (e.g., "mislabeled", "review").
|
|
35
35
|
4. **Export Curated Data:** Export information (like filenames) for your tagged samples from the UI to use downstream.
|
|
36
36
|
5. **Stop the Server:** Close the terminal running the script (Ctrl+C) when done.
|
|
37
37
|
|
|
@@ -70,7 +70,7 @@ The library is OS-independent and works on Windows, Linux, and macOS.
|
|
|
70
70
|
|
|
71
71
|
```shell
|
|
72
72
|
# 1. Create and activate a virtual environment (Recommended)
|
|
73
|
-
# On Linux/
|
|
73
|
+
# On Linux/MacOS:
|
|
74
74
|
python3 -m venv venv
|
|
75
75
|
source venv/bin/activate
|
|
76
76
|
|
|
@@ -98,14 +98,12 @@ following contents in the same directory that contains the `dataset_examples/` f
|
|
|
98
98
|
```python
|
|
99
99
|
# example_yolo.py
|
|
100
100
|
|
|
101
|
-
from pathlib import Path
|
|
102
101
|
import lightly_studio as ls
|
|
103
102
|
|
|
104
103
|
# Create a dataset and add the samples from the yolo format
|
|
105
104
|
dataset = ls.Dataset.create()
|
|
106
105
|
dataset.add_samples_from_yolo(
|
|
107
106
|
data_yaml="dataset_examples/road_signs_yolo/data.yaml",
|
|
108
|
-
input_split="test",
|
|
109
107
|
)
|
|
110
108
|
|
|
111
109
|
# Start the UI application on the port 8001.
|
|
@@ -161,7 +159,6 @@ the `dataset_examples/` folder:
|
|
|
161
159
|
```python
|
|
162
160
|
# example_coco.py
|
|
163
161
|
|
|
164
|
-
from pathlib import Path
|
|
165
162
|
import lightly_studio as ls
|
|
166
163
|
|
|
167
164
|
# Create a dataset and add the samples from the coco format
|
|
@@ -204,6 +201,56 @@ COCO uses a single JSON file containing all annotations. The format consists of
|
|
|
204
201
|
|
|
205
202
|
</details>
|
|
206
203
|
|
|
204
|
+
### COCO Captions
|
|
205
|
+
|
|
206
|
+
To run a caption example using a COCO dataset, create a file named
|
|
207
|
+
`example_coco_captions.py` with the following contents in the same directory that contains
|
|
208
|
+
the `dataset_examples/` folder:
|
|
209
|
+
|
|
210
|
+
```python
|
|
211
|
+
# example_coco_captions.py
|
|
212
|
+
|
|
213
|
+
import lightly_studio as ls
|
|
214
|
+
|
|
215
|
+
# Create a dataset and add the samples from the coco format
|
|
216
|
+
dataset = ls.Dataset.create()
|
|
217
|
+
dataset.add_samples_from_coco_caption(
|
|
218
|
+
annotations_json="dataset_examples/coco_subset_128_images/captions_train2017.json",
|
|
219
|
+
images_path="dataset_examples/coco_subset_128_images/images",
|
|
220
|
+
)
|
|
221
|
+
|
|
222
|
+
# Start the UI application on the port 8001.
|
|
223
|
+
ls.start_gui()
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
Run the script:
|
|
227
|
+
|
|
228
|
+
```
|
|
229
|
+
python example_coco_captions.py
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
Now you can inspect samples with their assigned captions in the app. When you are done,
|
|
233
|
+
stop the app by pressing Ctrl+C in the terminal.
|
|
234
|
+
|
|
235
|
+
<details>
|
|
236
|
+
<summary>The COCO format details:</summary>
|
|
237
|
+
|
|
238
|
+
```
|
|
239
|
+
coco_subset_128_images/
|
|
240
|
+
├── images/
|
|
241
|
+
│ ├── image1.jpg
|
|
242
|
+
│ ├── image2.jpg
|
|
243
|
+
│ └── ...
|
|
244
|
+
└── captions_train2017.json # Single JSON file containing all captions
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
COCO uses a single JSON file containing all captions. The format consists of three main components:
|
|
248
|
+
|
|
249
|
+
- Images: Defines metadata for each image in the dataset.
|
|
250
|
+
- Annotations: Defines the captions.
|
|
251
|
+
|
|
252
|
+
</details>
|
|
253
|
+
|
|
207
254
|
## 🔍 How It Works
|
|
208
255
|
|
|
209
256
|
1. Your **Python script** uses the `lightly_studio` **Dataset**.
|
|
@@ -289,7 +336,6 @@ import lightly_studio as ls
|
|
|
289
336
|
dataset = ls.Dataset.create()
|
|
290
337
|
dataset.add_samples_from_yolo(
|
|
291
338
|
data_yaml="my_yolo_dataset/data.yaml",
|
|
292
|
-
input_split="val",
|
|
293
339
|
)
|
|
294
340
|
|
|
295
341
|
ls.start_gui()
|
|
@@ -587,12 +633,12 @@ query.add_tag("tag_name")
|
|
|
587
633
|
|
|
588
634
|
#### Export Samples
|
|
589
635
|
|
|
590
|
-
Currently, exporting to the COCO object detection format is supported
|
|
636
|
+
Currently, exporting to the COCO object detection format is supported and only annotations
|
|
637
|
+
of type object detection are exported. The following example exports the samples in the query
|
|
638
|
+
to a COCO JSON file named `coco_export.json`:
|
|
591
639
|
|
|
592
640
|
```py
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
query.export().to_coco_object_detections(Path("coco_export.json"))
|
|
641
|
+
query.export().to_coco_object_detections()
|
|
596
642
|
```
|
|
597
643
|
|
|
598
644
|
### Examples
|
|
@@ -656,7 +702,11 @@ samples.
|
|
|
656
702
|
Set the `LIGHTLY_STUDIO_LICENSE_KEY` environment variable before using selection features:
|
|
657
703
|
|
|
658
704
|
```bash
|
|
705
|
+
# On Linux/MacOS
|
|
659
706
|
export LIGHTLY_STUDIO_LICENSE_KEY="license_key_here"
|
|
707
|
+
|
|
708
|
+
# On Windows (PowerShell)
|
|
709
|
+
$env:LIGHTLY_STUDIO_LICENSE_KEY="license_key_here"
|
|
660
710
|
```
|
|
661
711
|
|
|
662
712
|
Alternatively, set it inside your Python script:
|
|
@@ -666,6 +716,12 @@ import os
|
|
|
666
716
|
os.environ["LIGHTLY_STUDIO_LICENSE_KEY"] = "license_key_here"
|
|
667
717
|
```
|
|
668
718
|
|
|
719
|
+
Or in a `.env` file:
|
|
720
|
+
|
|
721
|
+
```
|
|
722
|
+
LIGHTLY_STUDIO_LICENSE_KEY="license_key_here"
|
|
723
|
+
```
|
|
724
|
+
|
|
669
725
|
#### Diversity Selection
|
|
670
726
|
|
|
671
727
|
Diversity selection can be configured directly from a `DatasetQuery`. The example below showcases a simple case of selecting diverse samples.
|
|
@@ -755,19 +811,27 @@ with open("export.txt", "w") as f:
|
|
|
755
811
|
|
|
756
812
|
## 📚 **FAQ**
|
|
757
813
|
|
|
758
|
-
###
|
|
814
|
+
### Does LightlyStudio persist the datasets?
|
|
759
815
|
|
|
760
|
-
Yes, the information about datasets is
|
|
761
|
-
|
|
816
|
+
Yes, the information about datasets is persisted in a database file. You can see inspect
|
|
817
|
+
it after the dataset is processed. Use `Dataset.load()` to load a dataset from a pre-existing
|
|
818
|
+
database.
|
|
762
819
|
|
|
763
820
|
### Can I change the database path?
|
|
764
821
|
|
|
765
|
-
|
|
822
|
+
Yes, the database can be selected as follows:
|
|
823
|
+
```py
|
|
824
|
+
import lightly_studio as ls
|
|
825
|
+
|
|
826
|
+
ls.db_manager.connect(db_file="custom.db")
|
|
827
|
+
```
|
|
766
828
|
|
|
767
|
-
### Can I
|
|
829
|
+
### Can I use LightlyStudio from two scripts in parallel?
|
|
768
830
|
|
|
769
|
-
|
|
831
|
+
Only one script can be run at one time as the app uses a database lock for data integrity.
|
|
770
832
|
|
|
771
|
-
### Can I change the API backend port?
|
|
833
|
+
### Can I change the API backend host and port?
|
|
772
834
|
|
|
773
|
-
Yes
|
|
835
|
+
Yes, by setting environment variables. For the host set the LIGHTLY_STUDIO_HOST variable,
|
|
836
|
+
to change the port set the LIGHTLY_STUDIO_PORT variable. Note that if the port is unavailable
|
|
837
|
+
at runtime the app uses a random port number.
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "lightly-studio"
|
|
3
|
-
version = "0.3.
|
|
3
|
+
version = "0.3.4"
|
|
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",
|
|
@@ -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.3.4}/src/lightly_studio/api/routes/api/embeddings2d.py
RENAMED
|
@@ -3,25 +3,40 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
import io
|
|
6
|
+
from uuid import UUID
|
|
6
7
|
|
|
7
8
|
import numpy as np
|
|
8
9
|
import pyarrow as pa
|
|
9
10
|
from fastapi import APIRouter, HTTPException, Response
|
|
10
11
|
from numpy.typing import NDArray
|
|
11
12
|
from pyarrow import ipc
|
|
13
|
+
from pydantic import BaseModel, Field
|
|
12
14
|
from sklearn.manifold import TSNE
|
|
13
15
|
from sqlmodel import select
|
|
14
16
|
|
|
15
17
|
from lightly_studio.db_manager import SessionDep
|
|
16
18
|
from lightly_studio.models.dataset import DatasetTable
|
|
17
19
|
from lightly_studio.models.embedding_model import EmbeddingModelTable
|
|
18
|
-
from lightly_studio.resolvers import sample_embedding_resolver
|
|
20
|
+
from lightly_studio.resolvers import sample_embedding_resolver, sample_resolver
|
|
21
|
+
from lightly_studio.resolvers.samples_filter import SampleFilter
|
|
19
22
|
|
|
20
23
|
embeddings2d_router = APIRouter()
|
|
21
24
|
|
|
22
25
|
|
|
23
|
-
|
|
24
|
-
|
|
26
|
+
class GetEmbeddings2DRequest(BaseModel):
|
|
27
|
+
"""Request body for retrieving 2D embeddings."""
|
|
28
|
+
|
|
29
|
+
filters: SampleFilter | None = Field(
|
|
30
|
+
None,
|
|
31
|
+
description="Filter parameters identifying matching samples",
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@embeddings2d_router.post("/embeddings2d/tsne")
|
|
36
|
+
def get_embeddings2d__tsne(
|
|
37
|
+
session: SessionDep,
|
|
38
|
+
body: GetEmbeddings2DRequest | None = None,
|
|
39
|
+
) -> Response:
|
|
25
40
|
"""Return 2D embeddings serialized as an Arrow stream."""
|
|
26
41
|
# TODO(Malte, 09/2025): Support choosing the dataset via API parameter.
|
|
27
42
|
dataset = session.exec(select(DatasetTable).limit(1)).first()
|
|
@@ -37,7 +52,6 @@ def get_embeddings2d__tsne(session: SessionDep) -> Response:
|
|
|
37
52
|
if embedding_model is None:
|
|
38
53
|
raise HTTPException(status_code=404, detail="No embedding model configured.")
|
|
39
54
|
|
|
40
|
-
# TODO(Malte, 09/2025): Support choosing a subset of samples via API parameter.
|
|
41
55
|
embeddings = sample_embedding_resolver.get_all_by_dataset_id(
|
|
42
56
|
session=session,
|
|
43
57
|
dataset_id=dataset.dataset_id,
|
|
@@ -49,6 +63,22 @@ def get_embeddings2d__tsne(session: SessionDep) -> Response:
|
|
|
49
63
|
x = embedding_values_tsne[:, 0]
|
|
50
64
|
y = embedding_values_tsne[:, 1]
|
|
51
65
|
|
|
66
|
+
matching_sample_ids: set[UUID] | None = None
|
|
67
|
+
filters = body.filters if body else None
|
|
68
|
+
if filters:
|
|
69
|
+
matching_samples_result = sample_resolver.get_all_by_dataset_id(
|
|
70
|
+
session=session,
|
|
71
|
+
dataset_id=dataset.dataset_id,
|
|
72
|
+
filters=filters,
|
|
73
|
+
)
|
|
74
|
+
matching_sample_ids = {sample.sample_id for sample in matching_samples_result.samples}
|
|
75
|
+
|
|
76
|
+
sample_ids = [embedding.sample_id for embedding in embeddings]
|
|
77
|
+
if matching_sample_ids is None:
|
|
78
|
+
fulfils_filter = [1] * len(sample_ids)
|
|
79
|
+
else:
|
|
80
|
+
fulfils_filter = [1 if sample_id in matching_sample_ids else 0 for sample_id in sample_ids]
|
|
81
|
+
|
|
52
82
|
# TODO(Malte, 09/2025): Save the 2D-embeddings in the database to avoid recomputing
|
|
53
83
|
# them on every request.
|
|
54
84
|
|
|
@@ -57,6 +87,8 @@ def get_embeddings2d__tsne(session: SessionDep) -> Response:
|
|
|
57
87
|
{
|
|
58
88
|
"x": pa.array(x, type=pa.float32()),
|
|
59
89
|
"y": pa.array(y, type=pa.float32()),
|
|
90
|
+
"fulfils_filter": pa.array(fulfils_filter, type=pa.uint8()),
|
|
91
|
+
"sample_id": pa.array([str(sample_id) for sample_id in sample_ids], type=pa.string()),
|
|
60
92
|
}
|
|
61
93
|
)
|
|
62
94
|
|
|
@@ -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
|
+
)
|