lightly-studio 0.3.4__tar.gz → 0.4.1__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.4 → lightly_studio-0.4.1}/.gitignore +3 -0
- lightly_studio-0.4.1/PKG-INFO +78 -0
- lightly_studio-0.4.1/USAGE.md +36 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/pyproject.toml +16 -2
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/__init__.py +1 -2
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/db_tables.py +3 -0
- lightly_studio-0.4.1/src/lightly_studio/api/features.py +5 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/api/dataset.py +5 -3
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/api/dataset_tag.py +10 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/api/embeddings2d.py +6 -47
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/core/dataset.py +89 -2
- lightly_studio-0.4.1/src/lightly_studio/core/dataset_query/__init__.py +14 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/core/dataset_query/dataset_query.py +98 -2
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/core/dataset_query/sample_field.py +11 -2
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/core/sample.py +33 -1
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/db_manager.py +4 -2
- lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/env.js +1 -0
- lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/0.B-Bn8V7R.css +1 -0
- lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/Samples.CTl60pQb.css +1 -0
- lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/_layout.CxuTMeYy.css +1 -0
- lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/transform.Bte-FZ4V.css +1 -0
- lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/7XnHnNk_.js +1 -0
- lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/BDE1kT04.js +2 -0
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DQ8aZ1o-.js → lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/BHoO7UL_.js +2 -2
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CZGpyrcA.js → lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/BTpMiPuk.js +1 -1
- lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/BbG6fgnL.js +1 -0
- lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/Bip0vTKl.js +1 -0
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/D_JuJOO3.js → lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/BzYRexN9.js +1 -1
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/Frwd2CjB.js → lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/C3xJX0nD.js +1 -1
- lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/C5oezL0m.js +39 -0
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/H4l0JFh9.js → lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CANX9QXL.js +1 -1
- lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CAPx0Bfm.js +1 -0
- lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CEPpkZIV.js +1 -0
- lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/ChO13USc.js +96 -0
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DzBTnFhV.js → lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/Cj4nZbtb.js +1 -1
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/Bqz7dyEC.js → lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CmNXvs5e.js +1 -1
- lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CpbA3HU7.js +2 -0
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DSxvnAMh.js → lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/D9WxTSWa.js +1 -1
- lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DELrRF6e.js +4 -0
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/sLqs1uaK.js → lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DFib3GIP.js +1 -1
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CSCQddQS.js → lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DNJnBfHs.js +1 -1
- lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DVxjPOJB.js +1 -0
- lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DeAqvaPB.js +1 -0
- lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DgCXCApo.js +438 -0
- lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DmGM9V9Q.js +1 -0
- lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DoEId1MK.js +1 -0
- lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DqhovIS0.js +1 -0
- lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/SiegjVo0.js +1 -0
- lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/gBp1tBnA.js +1 -0
- lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/xQhUoIl9.js +1 -0
- lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/entry/app.CED-eiXl.js +2 -0
- lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/entry/start.D6UcpqyO.js +1 -0
- lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/0.waSqEGqm.js +4 -0
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/1.Cdy-7S5q.js → lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/1.Bb_sKkYl.js +1 -1
- lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/10.D9Uicmfq.js +1 -0
- lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/11.DKnK0EcJ.js +1 -0
- lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/13.D7dGgxYC.js +1 -0
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/2.BIldfkxL.js → lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/2.BzK1sjoM.js +144 -105
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/3.BC9z_TWM.js → lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/3.B08UPFst.js +1 -1
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/4.D8X_Ch5n.js → lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/4.C19_Nx95.js +1 -1
- lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/5.B2cR7brs.js +39 -0
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/6.DRA5Ru_2.js → lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/6.C9Y2LZxG.js +1 -1
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/7.WVBsruHQ.js → lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/7.CEbWmgIF.js +1 -1
- lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/8.Con-GcPz.js +20 -0
- lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/9.DW7FBNNH.js +1 -0
- lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/version.json +1 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/dist_lightly_studio_view_app/index.html +13 -14
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/models/annotation/annotation_base.py +9 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/models/caption.py +1 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/models/dataset.py +6 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/models/sample.py +8 -1
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/models/settings.py +5 -0
- lightly_studio-0.4.1/src/lightly_studio/models/two_dim_embedding.py +16 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/annotation_resolver/get_all.py +3 -1
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/dataset_resolver.py +20 -5
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/sample_embedding_resolver.py +44 -2
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/sample_resolver.py +2 -3
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/settings_resolver.py +3 -0
- lightly_studio-0.4.1/src/lightly_studio/resolvers/twodim_embedding_resolver.py +119 -0
- lightly_studio-0.4.1/src/lightly_studio/selection/__init__.py +1 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/selection/mundig.py +41 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/selection/select.py +70 -1
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/selection/selection_config.py +1 -1
- lightly_studio-0.3.4/PKG-INFO +0 -879
- lightly_studio-0.3.4/USAGE.md +0 -837
- lightly_studio-0.3.4/src/lightly_studio/api/features.py +0 -7
- lightly_studio-0.3.4/src/lightly_studio/dataset/loader.py +0 -581
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/env.js +0 -1
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/0.B3oFNb6O.css +0 -1
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/Samples.CIbricz7.css +0 -1
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/_layout.7Ma7YdVg.css +0 -1
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/transform.2jKMtOWG.css +0 -1
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/-DXuGN29.js +0 -1
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/B7302SU7.js +0 -1
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/BeWf8-vJ.js +0 -1
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CfQ4mGwl.js +0 -1
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CiaNZCBa.js +0 -1
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/Cqo0Vpvt.js +0 -417
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/Cy4fgWTG.js +0 -1
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/D5w4xp5l.js +0 -1
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DD63uD-T.js +0 -1
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/D_ynJAfY.js +0 -2
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/Dafy4oEQ.js +0 -1
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/Dj4O-5se.js +0 -1
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DmjAI-UV.js +0 -1
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/Dug7Bq1S.js +0 -1
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/Dv5BSBQG.js +0 -1
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DzX_yyqb.js +0 -1
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/H60ATh8g.js +0 -2
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/qIv1kPyv.js +0 -1
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/u-it74zV.js +0 -96
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/entry/app.BPc0HQPq.js +0 -2
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/entry/start.SNvc2nrm.js +0 -1
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/0.5jT7P06o.js +0 -1
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/10.C_uoESTX.js +0 -1
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/12.DcO8wIAc.js +0 -1
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/5.CAXhxJu6.js +0 -39
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/8.BuKUrCEN.js +0 -20
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/9.CUIn1yCR.js +0 -1
- lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/version.json +0 -1
- lightly_studio-0.3.4/src/lightly_studio/models/annotation/__init__.py +0 -0
- lightly_studio-0.3.4/src/lightly_studio/selection/README.md +0 -6
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/__init__.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/app.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/cache.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/api/annotation.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/api/annotation_label.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/api/annotations/__init__.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/api/annotations/create_annotation.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/api/caption.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/api/classifier.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/api/exceptions.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/api/export.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/api/features.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/api/metadata.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/api/sample.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/api/selection.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/api/settings.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/api/status.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/api/text_embedding.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/api/validators.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/healthz.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/images.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/webapp.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/server.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/core/__init__.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/core/add_samples.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/core/dataset_query/boolean_expression.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/core/dataset_query/field.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/core/dataset_query/field_expression.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/core/dataset_query/match_expression.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/core/dataset_query/order_by.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/core/dataset_query/tags_expression.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/core/start_gui.py +0 -0
- {lightly_studio-0.3.4/src/lightly_studio/core/dataset_query → lightly_studio-0.4.1/src/lightly_studio/dataset}/__init__.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/dataset/edge_embedding_generator.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/dataset/embedding_generator.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/dataset/embedding_manager.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/dataset/env.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/dataset/file_utils.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/dataset/fsspec_lister.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/dataset/mobileclip_embedding_generator.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/2.CkOblLn7.css +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/LightlyLogo.BNjCIww-.png +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/OpenSans-Bold.DGvYQtcs.ttf +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/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.4 → lightly_studio-0.4.1}/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/OpenSans-Medium.DVUZMR_6.ttf +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/OpenSans-Regular.DxJTClRG.ttf +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/OpenSans-SemiBold.D3TTYgdB.ttf +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/OpenSans-VariableFont_wdth_wght.BZBpG5Iz.ttf +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/_layout.CefECEWA.css +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/69_IOA4Y.js +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/B90CZVMX.js +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/C1FmrZbK.js +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CWj6FrbW.js +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CYgJF_JY.js +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DIeogL5L.js +0 -0
- /lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/11.CWG1ehzT.js → /lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/12.CWG1ehzT.js +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/workers/clustering.worker-DKqeLtG0.js +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/workers/search.worker-vNSty3B0.js +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/dist_lightly_studio_view_app/apple-touch-icon-precomposed.png +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/dist_lightly_studio_view_app/apple-touch-icon.png +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/dist_lightly_studio_view_app/favicon.png +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/examples/example.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/examples/example_coco.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/examples/example_coco_caption.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/examples/example_metadata.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/examples/example_selection.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/examples/example_split_work.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/examples/example_yolo.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/export/export_dataset.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/export/lightly_studio_label_input.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/export_schema.py +0 -0
- {lightly_studio-0.3.4/src/lightly_studio/dataset → lightly_studio-0.4.1/src/lightly_studio/few_shot_classifier}/__init__.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/few_shot_classifier/classifier.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/few_shot_classifier/classifier_manager.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/few_shot_classifier/random_forest_classifier.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/metadata/complex_metadata.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/metadata/compute_typicality.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/metadata/gps_coordinate.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/metadata/metadata_protocol.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/models/__init__.py +0 -0
- {lightly_studio-0.3.4/src/lightly_studio/few_shot_classifier → lightly_studio-0.4.1/src/lightly_studio/models/annotation}/__init__.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/models/annotation/instance_segmentation.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/models/annotation/links.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/models/annotation/object_detection.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/models/annotation/semantic_segmentation.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/models/annotation_label.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/models/classifier.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/models/embedding_model.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/models/metadata.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/models/sample_embedding.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/models/tag.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/py.typed +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/__init__.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/annotation_label_resolver/__init__.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/annotation_label_resolver/create.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/annotation_label_resolver/delete.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/annotation_label_resolver/get_all.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/annotation_label_resolver/get_by_id.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/annotation_label_resolver/get_by_ids.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/annotation_label_resolver/get_by_label_name.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/annotation_label_resolver/names_by_ids.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/annotation_label_resolver/update.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/annotation_resolver/__init__.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/annotation_resolver/count_annotations_by_dataset.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/annotation_resolver/create_many.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/annotation_resolver/delete_annotation.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/annotation_resolver/delete_annotations.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/annotation_resolver/get_by_id.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/annotation_resolver/update_annotation_label.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/annotation_resolver/update_bounding_box.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/annotations/__init__.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/annotations/annotations_filter.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/caption_resolver.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/embedding_model_resolver.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/metadata_resolver/__init__.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/metadata_resolver/metadata_filter.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/metadata_resolver/sample/__init__.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/metadata_resolver/sample/bulk_update_metadata.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/metadata_resolver/sample/get_by_sample_id.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/metadata_resolver/sample/get_metadata_info.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/metadata_resolver/sample/get_value_for_sample.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/metadata_resolver/sample/set_value_for_sample.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/samples_filter.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/tag_resolver.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/selection/select_via_db.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/services/annotations_service/__init__.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/services/annotations_service/create_annotation.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/services/annotations_service/delete_annotation.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/services/annotations_service/get_annotation_by_id.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/services/annotations_service/update_annotation.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/services/annotations_service/update_annotation_bounding_box.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/services/annotations_service/update_annotation_label.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/services/annotations_service/update_annotations.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/setup_logging.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/type_definitions.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/ACKNOWLEDGEMENTS +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/LICENSE +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/LICENSE_weights_data +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/README.md +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/__init__.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/mobileclip/__init__.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/mobileclip/clip.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/mobileclip/configs/mobileclip_b.json +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/mobileclip/configs/mobileclip_s0.json +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/mobileclip/configs/mobileclip_s1.json +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/mobileclip/configs/mobileclip_s2.json +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/mobileclip/image_encoder.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/mobileclip/logger.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/mobileclip/models/__init__.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/mobileclip/models/mci.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/mobileclip/models/vit.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/mobileclip/modules/__init__.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/mobileclip/modules/common/__init__.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/mobileclip/modules/common/mobileone.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/mobileclip/modules/common/transformer.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/mobileclip/modules/image/__init__.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/mobileclip/modules/image/image_projection.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/mobileclip/modules/image/replknet.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/mobileclip/modules/text/__init__.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/mobileclip/modules/text/repmixer.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/mobileclip/modules/text/tokenizer.py +0 -0
- {lightly_studio-0.3.4 → lightly_studio-0.4.1}/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.1
|
|
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,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "lightly-studio"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.4.1"
|
|
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
6
|
requires-python = ">=3.8,<3.13"
|
|
@@ -44,7 +44,7 @@ dependencies = [
|
|
|
44
44
|
# lightly-mundig==$version
|
|
45
45
|
# Then lock the version. The uv.lock file is updated accordingly.
|
|
46
46
|
# uv lock --upgrade-package lightly-mundig==$version
|
|
47
|
-
"lightly-mundig==0.1.
|
|
47
|
+
"lightly-mundig==0.1.7",
|
|
48
48
|
"pyarrow>=17.0.0",
|
|
49
49
|
]
|
|
50
50
|
|
|
@@ -75,6 +75,15 @@ dev = [
|
|
|
75
75
|
"pytest-xdist>=3.6.1",
|
|
76
76
|
]
|
|
77
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
|
+
|
|
78
87
|
|
|
79
88
|
[tool.mypy]
|
|
80
89
|
strict = true
|
|
@@ -132,3 +141,8 @@ explicit = true
|
|
|
132
141
|
artifacts = [
|
|
133
142
|
"src/lightly_studio/**/*",
|
|
134
143
|
]
|
|
144
|
+
|
|
145
|
+
[tool.ruff]
|
|
146
|
+
extend-exclude = [
|
|
147
|
+
"docs",
|
|
148
|
+
]
|
|
@@ -5,7 +5,6 @@ from lightly_studio.core.dataset import Dataset
|
|
|
5
5
|
from lightly_studio.core.start_gui import start_gui
|
|
6
6
|
|
|
7
7
|
# TODO (Jonas 08/25): This will be removed as soon as the new interface is used in the examples
|
|
8
|
-
from lightly_studio.dataset.loader import DatasetLoader
|
|
9
8
|
from lightly_studio.models.annotation.annotation_base import AnnotationType
|
|
10
9
|
|
|
11
|
-
__all__ = ["AnnotationType", "Dataset", "
|
|
10
|
+
__all__ = ["AnnotationType", "Dataset", "start_gui"]
|
|
@@ -27,3 +27,6 @@ from lightly_studio.models.settings import (
|
|
|
27
27
|
from lightly_studio.models.tag import (
|
|
28
28
|
TagTable, # noqa: F401, required for SQLModel to work properly
|
|
29
29
|
)
|
|
30
|
+
from lightly_studio.models.two_dim_embedding import (
|
|
31
|
+
TwoDimEmbeddingTable, # noqa: F401, required for SQLModel to work properly
|
|
32
|
+
)
|
|
@@ -19,6 +19,7 @@ from lightly_studio.models.dataset import (
|
|
|
19
19
|
DatasetCreate,
|
|
20
20
|
DatasetTable,
|
|
21
21
|
DatasetView,
|
|
22
|
+
DatasetViewWithCount,
|
|
22
23
|
)
|
|
23
24
|
from lightly_studio.resolvers import dataset_resolver
|
|
24
25
|
from lightly_studio.resolvers.dataset_resolver import (
|
|
@@ -64,16 +65,17 @@ def read_datasets(
|
|
|
64
65
|
return dataset_resolver.get_all(session=session, offset=paginated.offset, limit=paginated.limit)
|
|
65
66
|
|
|
66
67
|
|
|
67
|
-
@dataset_router.get("/datasets/{dataset_id}")
|
|
68
|
+
@dataset_router.get("/datasets/{dataset_id}", response_model=DatasetViewWithCount)
|
|
68
69
|
def read_dataset(
|
|
70
|
+
session: SessionDep,
|
|
69
71
|
dataset: Annotated[
|
|
70
72
|
DatasetTable,
|
|
71
73
|
Path(title="Dataset Id"),
|
|
72
74
|
Depends(get_and_validate_dataset_id),
|
|
73
75
|
],
|
|
74
|
-
) ->
|
|
76
|
+
) -> DatasetViewWithCount:
|
|
75
77
|
"""Retrieve a single dataset from the database."""
|
|
76
|
-
return dataset
|
|
78
|
+
return dataset_resolver.get_dataset_details(session=session, dataset=dataset)
|
|
77
79
|
|
|
78
80
|
|
|
79
81
|
@dataset_router.put("/datasets/{dataset_id}")
|
{lightly_studio-0.3.4 → lightly_studio-0.4.1}/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.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/api/embeddings2d.py
RENAMED
|
@@ -5,19 +5,16 @@ from __future__ import annotations
|
|
|
5
5
|
import io
|
|
6
6
|
from uuid import UUID
|
|
7
7
|
|
|
8
|
-
import numpy as np
|
|
9
8
|
import pyarrow as pa
|
|
10
9
|
from fastapi import APIRouter, HTTPException, Response
|
|
11
|
-
from numpy.typing import NDArray
|
|
12
10
|
from pyarrow import ipc
|
|
13
11
|
from pydantic import BaseModel, Field
|
|
14
|
-
from sklearn.manifold import TSNE
|
|
15
12
|
from sqlmodel import select
|
|
16
13
|
|
|
17
14
|
from lightly_studio.db_manager import SessionDep
|
|
18
15
|
from lightly_studio.models.dataset import DatasetTable
|
|
19
16
|
from lightly_studio.models.embedding_model import EmbeddingModelTable
|
|
20
|
-
from lightly_studio.resolvers import
|
|
17
|
+
from lightly_studio.resolvers import sample_resolver, twodim_embedding_resolver
|
|
21
18
|
from lightly_studio.resolvers.samples_filter import SampleFilter
|
|
22
19
|
|
|
23
20
|
embeddings2d_router = APIRouter()
|
|
@@ -32,8 +29,8 @@ class GetEmbeddings2DRequest(BaseModel):
|
|
|
32
29
|
)
|
|
33
30
|
|
|
34
31
|
|
|
35
|
-
@embeddings2d_router.post("/embeddings2d/
|
|
36
|
-
def
|
|
32
|
+
@embeddings2d_router.post("/embeddings2d/default")
|
|
33
|
+
def get_2d_embeddings(
|
|
37
34
|
session: SessionDep,
|
|
38
35
|
body: GetEmbeddings2DRequest | None = None,
|
|
39
36
|
) -> Response:
|
|
@@ -52,17 +49,12 @@ def get_embeddings2d__tsne(
|
|
|
52
49
|
if embedding_model is None:
|
|
53
50
|
raise HTTPException(status_code=404, detail="No embedding model configured.")
|
|
54
51
|
|
|
55
|
-
|
|
52
|
+
x_array, y_array, sample_ids = twodim_embedding_resolver.get_twodim_embeddings(
|
|
56
53
|
session=session,
|
|
57
54
|
dataset_id=dataset.dataset_id,
|
|
58
55
|
embedding_model_id=embedding_model.embedding_model_id,
|
|
59
56
|
)
|
|
60
57
|
|
|
61
|
-
embedding_values = np.asarray([e.embedding for e in embeddings], dtype=np.float32)
|
|
62
|
-
embedding_values_tsne = _calculate_tsne_embeddings(embedding_values)
|
|
63
|
-
x = embedding_values_tsne[:, 0]
|
|
64
|
-
y = embedding_values_tsne[:, 1]
|
|
65
|
-
|
|
66
58
|
matching_sample_ids: set[UUID] | None = None
|
|
67
59
|
filters = body.filters if body else None
|
|
68
60
|
if filters:
|
|
@@ -73,20 +65,15 @@ def get_embeddings2d__tsne(
|
|
|
73
65
|
)
|
|
74
66
|
matching_sample_ids = {sample.sample_id for sample in matching_samples_result.samples}
|
|
75
67
|
|
|
76
|
-
sample_ids = [embedding.sample_id for embedding in embeddings]
|
|
77
68
|
if matching_sample_ids is None:
|
|
78
69
|
fulfils_filter = [1] * len(sample_ids)
|
|
79
70
|
else:
|
|
80
71
|
fulfils_filter = [1 if sample_id in matching_sample_ids else 0 for sample_id in sample_ids]
|
|
81
72
|
|
|
82
|
-
# TODO(Malte, 09/2025): Save the 2D-embeddings in the database to avoid recomputing
|
|
83
|
-
# them on every request.
|
|
84
|
-
|
|
85
|
-
# TODO(Malte, 09/2025): Include a sample identifier in the returned payload.
|
|
86
73
|
table = pa.table(
|
|
87
74
|
{
|
|
88
|
-
"x": pa.array(
|
|
89
|
-
"y": pa.array(
|
|
75
|
+
"x": pa.array(x_array, type=pa.float32()),
|
|
76
|
+
"y": pa.array(y_array, type=pa.float32()),
|
|
90
77
|
"fulfils_filter": pa.array(fulfils_filter, type=pa.uint8()),
|
|
91
78
|
"sample_id": pa.array([str(sample_id) for sample_id in sample_ids], type=pa.string()),
|
|
92
79
|
}
|
|
@@ -106,31 +93,3 @@ def get_embeddings2d__tsne(
|
|
|
106
93
|
"X-Content-Type-Options": "nosniff",
|
|
107
94
|
},
|
|
108
95
|
)
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
def _calculate_tsne_embeddings(embedding_values: NDArray[np.float32]) -> NDArray[np.float32]:
|
|
112
|
-
# TODO(Malte, 10/2025): Switch to a better and faster projection method than
|
|
113
|
-
# scikit-learn's TSNE.
|
|
114
|
-
# See https://linear.app/lightly/issue/LIG-7678/embedding-plot-investigate-fasterandbetter-2d-computation-options
|
|
115
|
-
n_samples = embedding_values.shape[0]
|
|
116
|
-
# For 0, 1 or 2 samples we hard-code deterministic coordinates.
|
|
117
|
-
if n_samples == 0:
|
|
118
|
-
return np.zeros((0, 2), dtype=np.float32)
|
|
119
|
-
if n_samples == 1:
|
|
120
|
-
return np.asarray([[0.0, 0.0]], dtype=np.float32)
|
|
121
|
-
if n_samples == 2: # noqa: PLR2004
|
|
122
|
-
return np.asarray([[0.0, 0.0], [1.0, 1.0]], dtype=np.float32)
|
|
123
|
-
|
|
124
|
-
# Copied from lightly-core:
|
|
125
|
-
# https://github.com/lightly-ai/lightly-core/blob/b738952516e916eba42fdd28498491ff18df5c1e/appv2/packages/queueworker/src/jobs/embeddings2d/function-source/main.py#L179-L186
|
|
126
|
-
embeddings_2d: NDArray[np.float32] = TSNE(
|
|
127
|
-
init="pca", # changed in https://github.com/scikit-learn/scikit-learn/issues/18018
|
|
128
|
-
learning_rate="auto", # changed in https://github.com/scikit-learn/scikit-learn/issues/18018
|
|
129
|
-
n_components=2,
|
|
130
|
-
# Perplexity must be _less_ than the number of entries. 30 is the default value.
|
|
131
|
-
# https://scikit-learn.org/stable/modules/generated/sklearn.manifold.TSNE.html
|
|
132
|
-
perplexity=min(30.0, float(n_samples - 1)),
|
|
133
|
-
# Make the computation deterministic.
|
|
134
|
-
random_state=0,
|
|
135
|
-
).fit_transform(embedding_values)
|
|
136
|
-
return embeddings_2d
|
|
@@ -38,6 +38,7 @@ from lightly_studio.models.sample import SampleTable
|
|
|
38
38
|
from lightly_studio.resolvers import (
|
|
39
39
|
dataset_resolver,
|
|
40
40
|
embedding_model_resolver,
|
|
41
|
+
sample_embedding_resolver,
|
|
41
42
|
sample_resolver,
|
|
42
43
|
tag_resolver,
|
|
43
44
|
)
|
|
@@ -53,7 +54,40 @@ _SliceType = slice # to avoid shadowing built-in slice in type annotations
|
|
|
53
54
|
class Dataset:
|
|
54
55
|
"""A LightlyStudio Dataset.
|
|
55
56
|
|
|
56
|
-
|
|
57
|
+
It can be created or loaded using one of the static methods:
|
|
58
|
+
```python
|
|
59
|
+
dataset = Dataset.create()
|
|
60
|
+
dataset = Dataset.load()
|
|
61
|
+
dataset = Dataset.load_or_create()
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Samples can be added to the dataset using various methods:
|
|
65
|
+
```python
|
|
66
|
+
dataset.add_samples_from_path(...)
|
|
67
|
+
dataset.add_samples_from_yolo(...)
|
|
68
|
+
dataset.add_samples_from_coco(...)
|
|
69
|
+
dataset.add_samples_from_coco_caption(...)
|
|
70
|
+
dataset.add_samples_from_labelformat(...)
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
The dataset samples can be queried directly by iterating over it or slicing it:
|
|
74
|
+
```python
|
|
75
|
+
dataset = Dataset.load("my_dataset")
|
|
76
|
+
first_ten_samples = dataset[:10]
|
|
77
|
+
for sample in dataset:
|
|
78
|
+
print(sample.file_name)
|
|
79
|
+
sample.metadata["new_key"] = "new_value"
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
For filtering or ordering samples first, use the query interface:
|
|
83
|
+
```python
|
|
84
|
+
from lightly_studio.core.dataset_query.sample_field import SampleField
|
|
85
|
+
|
|
86
|
+
dataset = Dataset.load("my_dataset")
|
|
87
|
+
query = dataset.match(SampleField.width > 10).order_by(SampleField.file_name)
|
|
88
|
+
for sample in query:
|
|
89
|
+
...
|
|
90
|
+
```
|
|
57
91
|
"""
|
|
58
92
|
|
|
59
93
|
def __init__(self, dataset: DatasetTable) -> None:
|
|
@@ -84,7 +118,10 @@ class Dataset:
|
|
|
84
118
|
dataset = dataset_resolver.get_by_name(session=db_manager.persistent_session(), name=name)
|
|
85
119
|
if dataset is None:
|
|
86
120
|
raise ValueError(f"Dataset with name '{name}' not found.")
|
|
87
|
-
|
|
121
|
+
# If we have embeddings in the database enable the FSC and embedding search features.
|
|
122
|
+
_enable_embedding_features_if_available(
|
|
123
|
+
session=db_manager.persistent_session(), dataset_id=dataset.dataset_id
|
|
124
|
+
)
|
|
88
125
|
return Dataset(dataset=dataset)
|
|
89
126
|
|
|
90
127
|
@staticmethod
|
|
@@ -97,6 +134,10 @@ class Dataset:
|
|
|
97
134
|
if dataset is None:
|
|
98
135
|
return Dataset.create(name=name)
|
|
99
136
|
|
|
137
|
+
# If we have embeddings in the database enable the FSC and embedding search features.
|
|
138
|
+
_enable_embedding_features_if_available(
|
|
139
|
+
session=db_manager.persistent_session(), dataset_id=dataset.dataset_id
|
|
140
|
+
)
|
|
100
141
|
return Dataset(dataset=dataset)
|
|
101
142
|
|
|
102
143
|
def __iter__(self) -> Iterator[Sample]:
|
|
@@ -500,6 +541,9 @@ def _generate_embeddings(session: Session, dataset_id: UUID, sample_ids: list[UU
|
|
|
500
541
|
# Mark the embedding search feature as enabled.
|
|
501
542
|
if "embeddingSearchEnabled" not in features.lightly_studio_active_features:
|
|
502
543
|
features.lightly_studio_active_features.append("embeddingSearchEnabled")
|
|
544
|
+
# Mark the FSC feature as enabled.
|
|
545
|
+
if "fewShotClassifierEnabled" not in features.lightly_studio_active_features:
|
|
546
|
+
features.lightly_studio_active_features.append("fewShotClassifierEnabled")
|
|
503
547
|
|
|
504
548
|
|
|
505
549
|
def _resolve_yolo_splits(data_yaml: Path, input_split: str | None) -> list[str]:
|
|
@@ -520,3 +564,46 @@ def _resolve_yolo_splits(data_yaml: Path, input_split: str | None) -> list[str]:
|
|
|
520
564
|
if not splits:
|
|
521
565
|
raise ValueError(f"No splits found in config file '{data_yaml}'")
|
|
522
566
|
return splits
|
|
567
|
+
|
|
568
|
+
|
|
569
|
+
def _are_embeddings_available(session: Session, dataset_id: UUID) -> bool:
|
|
570
|
+
"""Check if there are any embeddings available for the given dataset.
|
|
571
|
+
|
|
572
|
+
Args:
|
|
573
|
+
session: Database session for resolver operations.
|
|
574
|
+
dataset_id: The ID of the dataset to check for embeddings.
|
|
575
|
+
|
|
576
|
+
Returns:
|
|
577
|
+
True if embeddings exist for the dataset, False otherwise.
|
|
578
|
+
"""
|
|
579
|
+
embedding_manager = EmbeddingManagerProvider.get_embedding_manager()
|
|
580
|
+
model_id = embedding_manager.load_or_get_default_model(
|
|
581
|
+
session=session,
|
|
582
|
+
dataset_id=dataset_id,
|
|
583
|
+
)
|
|
584
|
+
if model_id is None:
|
|
585
|
+
# No default embedding model loaded for this dataset.
|
|
586
|
+
return False
|
|
587
|
+
|
|
588
|
+
return (
|
|
589
|
+
len(
|
|
590
|
+
sample_embedding_resolver.get_all_by_dataset_id(
|
|
591
|
+
session=session, dataset_id=dataset_id, embedding_model_id=model_id
|
|
592
|
+
)
|
|
593
|
+
)
|
|
594
|
+
> 0
|
|
595
|
+
)
|
|
596
|
+
|
|
597
|
+
|
|
598
|
+
def _enable_embedding_features_if_available(session: Session, dataset_id: UUID) -> None:
|
|
599
|
+
"""Enable embedding-related features if embeddings are available in the DB.
|
|
600
|
+
|
|
601
|
+
Args:
|
|
602
|
+
session: Database session for resolver operations.
|
|
603
|
+
dataset_id: The ID of the dataset to check for embeddings.
|
|
604
|
+
"""
|
|
605
|
+
if _are_embeddings_available(session=session, dataset_id=dataset_id):
|
|
606
|
+
if "embeddingSearchEnabled" not in features.lightly_studio_active_features:
|
|
607
|
+
features.lightly_studio_active_features.append("embeddingSearchEnabled")
|
|
608
|
+
if "fewShotClassifierEnabled" not in features.lightly_studio_active_features:
|
|
609
|
+
features.lightly_studio_active_features.append("fewShotClassifierEnabled")
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
from .boolean_expression import AND, NOT, OR
|
|
2
|
+
from .dataset_query import DatasetQuery
|
|
3
|
+
from .order_by import OrderByExpression, OrderByField
|
|
4
|
+
from .sample_field import SampleField
|
|
5
|
+
|
|
6
|
+
__all__ = [
|
|
7
|
+
"AND",
|
|
8
|
+
"NOT",
|
|
9
|
+
"OR",
|
|
10
|
+
"DatasetQuery",
|
|
11
|
+
"OrderByExpression",
|
|
12
|
+
"OrderByField",
|
|
13
|
+
"SampleField",
|
|
14
|
+
]
|
{lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/core/dataset_query/dataset_query.py
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""
|
|
1
|
+
"""Dataset query utilities for filtering, ordering, and slicing samples."""
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
@@ -20,7 +20,103 @@ _SliceType = slice # to avoid shadowing built-in slice in type annotations
|
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
class DatasetQuery:
|
|
23
|
-
"""Class for executing
|
|
23
|
+
"""Class for executing a query on a dataset.
|
|
24
|
+
|
|
25
|
+
# Filtering, ordering, and slicing samples in a dataset
|
|
26
|
+
Allows filtering, ordering, and slicing of samples in a dataset.
|
|
27
|
+
This class can be accessed via calling `.query()` on a Dataset instance.
|
|
28
|
+
```python
|
|
29
|
+
dataset : Dataset = ...
|
|
30
|
+
query = dataset.query()
|
|
31
|
+
```
|
|
32
|
+
The `match()`, `order_by()`, and `slice()` methods can be chained in this order.
|
|
33
|
+
You can also access the methods directly on the Dataset instance:
|
|
34
|
+
```python
|
|
35
|
+
dataset.match(...) # shorthand for dataset.query().match(...)
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
The object is converted to a SQL query that is lazily evaluated when iterating over
|
|
39
|
+
it or converting it to a list.
|
|
40
|
+
|
|
41
|
+
## match() - Filtering samples
|
|
42
|
+
Filtering is done via the `match()` method.
|
|
43
|
+
```python
|
|
44
|
+
from lightly_studio.core.dataset_query import SampleField
|
|
45
|
+
|
|
46
|
+
query_1 = dataset.query().match(SampleField.width > 100)
|
|
47
|
+
query_2 = dataset.query().match(SampleField.tags.contains('cat'))
|
|
48
|
+
```
|
|
49
|
+
AND and OR operators are available for combining multiple conditions.
|
|
50
|
+
```python
|
|
51
|
+
from lightly_studio.core.dataset_query import SampleField, AND, OR
|
|
52
|
+
|
|
53
|
+
query = dataset.query().match(
|
|
54
|
+
AND(
|
|
55
|
+
SampleField.height < 200,
|
|
56
|
+
OR(
|
|
57
|
+
SampleField.file_name == 'image.png',
|
|
58
|
+
SampleField.file_name == 'image2.png',
|
|
59
|
+
)
|
|
60
|
+
)
|
|
61
|
+
)
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## order_by() - Ordering samples
|
|
65
|
+
The results can be ordered by using `order_by()`. For tie-breaking, multiple fields
|
|
66
|
+
can be provided. The first field has the highest priority. The default is
|
|
67
|
+
ascending order. To order in descending order, use `OrderByField(...).desc()`.
|
|
68
|
+
```python
|
|
69
|
+
from lightly_studio.core.dataset_query import OrderByField, SampleField
|
|
70
|
+
query = query.order_by(
|
|
71
|
+
OrderByField(SampleField.width),
|
|
72
|
+
OrderByField(SampleField.file_name).desc()
|
|
73
|
+
)
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## slice() - Slicing samples
|
|
77
|
+
Slicing can be applied via `slice()` or bracket notation.
|
|
78
|
+
```python
|
|
79
|
+
query = query.slice(offset=10, limit=20)
|
|
80
|
+
query = query[10:30] # equivalent to slice(offset=10, limit=20)
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
# Usage of the filtered, ordered and sliced query
|
|
84
|
+
|
|
85
|
+
## Iterating and converting to list
|
|
86
|
+
Finally, the query can be executed by iterating over it or converting to a list.
|
|
87
|
+
```python
|
|
88
|
+
for sample in query:
|
|
89
|
+
print(sample.file_name)
|
|
90
|
+
samples = query.to_list()
|
|
91
|
+
```
|
|
92
|
+
The samples returned are instances of the `Sample` class. They are writable, and
|
|
93
|
+
changes to them will be persisted to the database.
|
|
94
|
+
|
|
95
|
+
## Adding tags to matching samples
|
|
96
|
+
The filtered set can also be used to add a tag to all matching samples.
|
|
97
|
+
```python
|
|
98
|
+
query.add_tag('my_tag')
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Selecting a subset of samples using smart selection
|
|
102
|
+
A Selection interface can be created from the current query results. It will only
|
|
103
|
+
select the samples matching the current query at the time of calling selection().
|
|
104
|
+
```python
|
|
105
|
+
# Choosing 100 diverse samples from the 'cat' tag.
|
|
106
|
+
# Save them under the tag name "diverse_cats".
|
|
107
|
+
selection = dataset.query().match(
|
|
108
|
+
SampleField.tags.contains('cat')
|
|
109
|
+
).selection()
|
|
110
|
+
selection.diverse(100, "diverse_cats")
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Exporting the query results
|
|
114
|
+
An export interface can be created from the current query results.
|
|
115
|
+
```python
|
|
116
|
+
export = dataset.query().match(...).export()
|
|
117
|
+
export.to_coco_object_detections('/path/to/coco.json')
|
|
118
|
+
```
|
|
119
|
+
"""
|
|
24
120
|
|
|
25
121
|
def __init__(self, dataset: DatasetTable, session: Session) -> None:
|
|
26
122
|
"""Initialize with dataset and database session.
|
{lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/core/dataset_query/sample_field.py
RENAMED
|
@@ -16,8 +16,17 @@ from lightly_studio.models.sample import SampleTable
|
|
|
16
16
|
class SampleField:
|
|
17
17
|
"""Providing access to predefined sample fields for queries.
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
It is used for the `query.match(...)` and `query.order_by(...)` methods of the
|
|
20
|
+
`DatasetQuery` class.
|
|
21
|
+
|
|
22
|
+
```python
|
|
23
|
+
from lightly_studio.core.dataset_query import DatasetQuery, SampleField, OrderByField
|
|
24
|
+
|
|
25
|
+
query = dataset.query()
|
|
26
|
+
query.match(SampleField.tags.contains("cat"))
|
|
27
|
+
query.order_by(OrderByField(SampleField.file_path_abs))
|
|
28
|
+
samples = query.to_list()
|
|
29
|
+
```
|
|
21
30
|
"""
|
|
22
31
|
|
|
23
32
|
file_name = StringField(col(SampleTable.file_name))
|
|
@@ -50,7 +50,39 @@ class DBField(Generic[T]):
|
|
|
50
50
|
|
|
51
51
|
|
|
52
52
|
class Sample:
|
|
53
|
-
"""Interface to a dataset sample.
|
|
53
|
+
"""Interface to a dataset sample.
|
|
54
|
+
|
|
55
|
+
It is usually returned by a query to the dataset.
|
|
56
|
+
```python
|
|
57
|
+
for sample in dataset:
|
|
58
|
+
...
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Many properties of the sample are directly accessible as attributes of this class.
|
|
62
|
+
```python
|
|
63
|
+
print(f"Sample file name: {sample.file_name}")
|
|
64
|
+
print(f"Sample file path: {sample.file_path_abs}")
|
|
65
|
+
print(f"Sample width: {sample.width}")
|
|
66
|
+
print(f"Sample height: {sample.height}")
|
|
67
|
+
```
|
|
68
|
+
Note that some attributes like the `sample_id` are technically writable, but changing
|
|
69
|
+
them is not recommended and may lead to inconsistent states.
|
|
70
|
+
|
|
71
|
+
Access sample's metadata via the `metadata` property, which
|
|
72
|
+
provides a dictionary-like interface to get and set metadata key-value pairs.
|
|
73
|
+
```python
|
|
74
|
+
some_value = sample.metadata["some_key"]
|
|
75
|
+
sample.metadata["another_key"] = "new_value"
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Access sample's tags via the `tags` property.
|
|
79
|
+
```python
|
|
80
|
+
sample.tags = ["tag1", "tag2"] # Replace all tags
|
|
81
|
+
print(f"Current tags: {sample.tags}")
|
|
82
|
+
sample.add_tag("tag_3")
|
|
83
|
+
sample.remove_tag("tag_1")
|
|
84
|
+
```
|
|
85
|
+
"""
|
|
54
86
|
|
|
55
87
|
file_name = DBField(col(SampleTable.file_name))
|
|
56
88
|
width = DBField(col(SampleTable.width))
|