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.

Files changed (284) hide show
  1. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/.gitignore +3 -0
  2. lightly_studio-0.4.1/PKG-INFO +78 -0
  3. lightly_studio-0.4.1/USAGE.md +36 -0
  4. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/pyproject.toml +16 -2
  5. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/__init__.py +1 -2
  6. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/db_tables.py +3 -0
  7. lightly_studio-0.4.1/src/lightly_studio/api/features.py +5 -0
  8. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/api/dataset.py +5 -3
  9. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/api/dataset_tag.py +10 -0
  10. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/api/embeddings2d.py +6 -47
  11. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/core/dataset.py +89 -2
  12. lightly_studio-0.4.1/src/lightly_studio/core/dataset_query/__init__.py +14 -0
  13. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/core/dataset_query/dataset_query.py +98 -2
  14. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/core/dataset_query/sample_field.py +11 -2
  15. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/core/sample.py +33 -1
  16. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/db_manager.py +4 -2
  17. lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/env.js +1 -0
  18. lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/0.B-Bn8V7R.css +1 -0
  19. lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/Samples.CTl60pQb.css +1 -0
  20. lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/_layout.CxuTMeYy.css +1 -0
  21. lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/transform.Bte-FZ4V.css +1 -0
  22. lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/7XnHnNk_.js +1 -0
  23. lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/BDE1kT04.js +2 -0
  24. 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
  25. 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
  26. lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/BbG6fgnL.js +1 -0
  27. lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/Bip0vTKl.js +1 -0
  28. 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
  29. 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
  30. lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/C5oezL0m.js +39 -0
  31. 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
  32. lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CAPx0Bfm.js +1 -0
  33. lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CEPpkZIV.js +1 -0
  34. lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/ChO13USc.js +96 -0
  35. 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
  36. 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
  37. lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CpbA3HU7.js +2 -0
  38. 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
  39. lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DELrRF6e.js +4 -0
  40. 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
  41. 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
  42. lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DVxjPOJB.js +1 -0
  43. lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DeAqvaPB.js +1 -0
  44. lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DgCXCApo.js +438 -0
  45. lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DmGM9V9Q.js +1 -0
  46. lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DoEId1MK.js +1 -0
  47. lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DqhovIS0.js +1 -0
  48. lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/SiegjVo0.js +1 -0
  49. lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/gBp1tBnA.js +1 -0
  50. lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/xQhUoIl9.js +1 -0
  51. lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/entry/app.CED-eiXl.js +2 -0
  52. lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/entry/start.D6UcpqyO.js +1 -0
  53. lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/0.waSqEGqm.js +4 -0
  54. 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
  55. lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/10.D9Uicmfq.js +1 -0
  56. lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/11.DKnK0EcJ.js +1 -0
  57. lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/13.D7dGgxYC.js +1 -0
  58. 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
  59. 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
  60. 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
  61. lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/5.B2cR7brs.js +39 -0
  62. 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
  63. 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
  64. lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/8.Con-GcPz.js +20 -0
  65. lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/9.DW7FBNNH.js +1 -0
  66. lightly_studio-0.4.1/src/lightly_studio/dist_lightly_studio_view_app/_app/version.json +1 -0
  67. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/dist_lightly_studio_view_app/index.html +13 -14
  68. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/models/annotation/annotation_base.py +9 -0
  69. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/models/caption.py +1 -0
  70. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/models/dataset.py +6 -0
  71. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/models/sample.py +8 -1
  72. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/models/settings.py +5 -0
  73. lightly_studio-0.4.1/src/lightly_studio/models/two_dim_embedding.py +16 -0
  74. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/annotation_resolver/get_all.py +3 -1
  75. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/dataset_resolver.py +20 -5
  76. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/sample_embedding_resolver.py +44 -2
  77. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/sample_resolver.py +2 -3
  78. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/settings_resolver.py +3 -0
  79. lightly_studio-0.4.1/src/lightly_studio/resolvers/twodim_embedding_resolver.py +119 -0
  80. lightly_studio-0.4.1/src/lightly_studio/selection/__init__.py +1 -0
  81. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/selection/mundig.py +41 -0
  82. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/selection/select.py +70 -1
  83. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/selection/selection_config.py +1 -1
  84. lightly_studio-0.3.4/PKG-INFO +0 -879
  85. lightly_studio-0.3.4/USAGE.md +0 -837
  86. lightly_studio-0.3.4/src/lightly_studio/api/features.py +0 -7
  87. lightly_studio-0.3.4/src/lightly_studio/dataset/loader.py +0 -581
  88. lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/env.js +0 -1
  89. lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/0.B3oFNb6O.css +0 -1
  90. lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/Samples.CIbricz7.css +0 -1
  91. lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/_layout.7Ma7YdVg.css +0 -1
  92. lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/transform.2jKMtOWG.css +0 -1
  93. lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/-DXuGN29.js +0 -1
  94. lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/B7302SU7.js +0 -1
  95. lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/BeWf8-vJ.js +0 -1
  96. lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CfQ4mGwl.js +0 -1
  97. lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CiaNZCBa.js +0 -1
  98. lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/Cqo0Vpvt.js +0 -417
  99. lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/Cy4fgWTG.js +0 -1
  100. lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/D5w4xp5l.js +0 -1
  101. lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DD63uD-T.js +0 -1
  102. lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/D_ynJAfY.js +0 -2
  103. lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/Dafy4oEQ.js +0 -1
  104. lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/Dj4O-5se.js +0 -1
  105. lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DmjAI-UV.js +0 -1
  106. lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/Dug7Bq1S.js +0 -1
  107. lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/Dv5BSBQG.js +0 -1
  108. lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DzX_yyqb.js +0 -1
  109. lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/H60ATh8g.js +0 -2
  110. lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/qIv1kPyv.js +0 -1
  111. lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/u-it74zV.js +0 -96
  112. lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/entry/app.BPc0HQPq.js +0 -2
  113. lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/entry/start.SNvc2nrm.js +0 -1
  114. lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/0.5jT7P06o.js +0 -1
  115. lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/10.C_uoESTX.js +0 -1
  116. lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/12.DcO8wIAc.js +0 -1
  117. lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/5.CAXhxJu6.js +0 -39
  118. lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/8.BuKUrCEN.js +0 -20
  119. lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/9.CUIn1yCR.js +0 -1
  120. lightly_studio-0.3.4/src/lightly_studio/dist_lightly_studio_view_app/_app/version.json +0 -1
  121. lightly_studio-0.3.4/src/lightly_studio/models/annotation/__init__.py +0 -0
  122. lightly_studio-0.3.4/src/lightly_studio/selection/README.md +0 -6
  123. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/__init__.py +0 -0
  124. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/app.py +0 -0
  125. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/cache.py +0 -0
  126. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/api/annotation.py +0 -0
  127. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/api/annotation_label.py +0 -0
  128. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/api/annotations/__init__.py +0 -0
  129. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/api/annotations/create_annotation.py +0 -0
  130. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/api/caption.py +0 -0
  131. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/api/classifier.py +0 -0
  132. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/api/exceptions.py +0 -0
  133. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/api/export.py +0 -0
  134. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/api/features.py +0 -0
  135. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/api/metadata.py +0 -0
  136. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/api/sample.py +0 -0
  137. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/api/selection.py +0 -0
  138. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/api/settings.py +0 -0
  139. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/api/status.py +0 -0
  140. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/api/text_embedding.py +0 -0
  141. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/api/validators.py +0 -0
  142. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/healthz.py +0 -0
  143. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/images.py +0 -0
  144. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/routes/webapp.py +0 -0
  145. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/api/server.py +0 -0
  146. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/core/__init__.py +0 -0
  147. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/core/add_samples.py +0 -0
  148. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/core/dataset_query/boolean_expression.py +0 -0
  149. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/core/dataset_query/field.py +0 -0
  150. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/core/dataset_query/field_expression.py +0 -0
  151. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/core/dataset_query/match_expression.py +0 -0
  152. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/core/dataset_query/order_by.py +0 -0
  153. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/core/dataset_query/tags_expression.py +0 -0
  154. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/core/start_gui.py +0 -0
  155. {lightly_studio-0.3.4/src/lightly_studio/core/dataset_query → lightly_studio-0.4.1/src/lightly_studio/dataset}/__init__.py +0 -0
  156. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/dataset/edge_embedding_generator.py +0 -0
  157. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/dataset/embedding_generator.py +0 -0
  158. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/dataset/embedding_manager.py +0 -0
  159. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/dataset/env.py +0 -0
  160. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/dataset/file_utils.py +0 -0
  161. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/dataset/fsspec_lister.py +0 -0
  162. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/dataset/mobileclip_embedding_generator.py +0 -0
  163. {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
  164. {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
  165. {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
  166. {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
  167. {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
  168. {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
  169. {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
  170. {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
  171. {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
  172. {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
  173. {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
  174. {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
  175. {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
  176. {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
  177. {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
  178. /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
  179. {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
  180. {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
  181. {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
  182. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/dist_lightly_studio_view_app/apple-touch-icon.png +0 -0
  183. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/dist_lightly_studio_view_app/favicon.png +0 -0
  184. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/examples/example.py +0 -0
  185. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/examples/example_coco.py +0 -0
  186. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/examples/example_coco_caption.py +0 -0
  187. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/examples/example_metadata.py +0 -0
  188. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/examples/example_selection.py +0 -0
  189. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/examples/example_split_work.py +0 -0
  190. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/examples/example_yolo.py +0 -0
  191. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/export/export_dataset.py +0 -0
  192. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/export/lightly_studio_label_input.py +0 -0
  193. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/export_schema.py +0 -0
  194. {lightly_studio-0.3.4/src/lightly_studio/dataset → lightly_studio-0.4.1/src/lightly_studio/few_shot_classifier}/__init__.py +0 -0
  195. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/few_shot_classifier/classifier.py +0 -0
  196. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/few_shot_classifier/classifier_manager.py +0 -0
  197. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/few_shot_classifier/random_forest_classifier.py +0 -0
  198. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/metadata/complex_metadata.py +0 -0
  199. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/metadata/compute_typicality.py +0 -0
  200. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/metadata/gps_coordinate.py +0 -0
  201. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/metadata/metadata_protocol.py +0 -0
  202. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/models/__init__.py +0 -0
  203. {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
  204. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/models/annotation/instance_segmentation.py +0 -0
  205. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/models/annotation/links.py +0 -0
  206. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/models/annotation/object_detection.py +0 -0
  207. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/models/annotation/semantic_segmentation.py +0 -0
  208. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/models/annotation_label.py +0 -0
  209. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/models/classifier.py +0 -0
  210. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/models/embedding_model.py +0 -0
  211. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/models/metadata.py +0 -0
  212. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/models/sample_embedding.py +0 -0
  213. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/models/tag.py +0 -0
  214. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/py.typed +0 -0
  215. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/__init__.py +0 -0
  216. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/annotation_label_resolver/__init__.py +0 -0
  217. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/annotation_label_resolver/create.py +0 -0
  218. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/annotation_label_resolver/delete.py +0 -0
  219. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/annotation_label_resolver/get_all.py +0 -0
  220. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/annotation_label_resolver/get_by_id.py +0 -0
  221. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/annotation_label_resolver/get_by_ids.py +0 -0
  222. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/annotation_label_resolver/get_by_label_name.py +0 -0
  223. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/annotation_label_resolver/names_by_ids.py +0 -0
  224. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/annotation_label_resolver/update.py +0 -0
  225. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/annotation_resolver/__init__.py +0 -0
  226. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/annotation_resolver/count_annotations_by_dataset.py +0 -0
  227. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/annotation_resolver/create_many.py +0 -0
  228. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/annotation_resolver/delete_annotation.py +0 -0
  229. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/annotation_resolver/delete_annotations.py +0 -0
  230. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/annotation_resolver/get_by_id.py +0 -0
  231. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/annotation_resolver/update_annotation_label.py +0 -0
  232. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/annotation_resolver/update_bounding_box.py +0 -0
  233. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/annotations/__init__.py +0 -0
  234. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/annotations/annotations_filter.py +0 -0
  235. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/caption_resolver.py +0 -0
  236. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/embedding_model_resolver.py +0 -0
  237. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/metadata_resolver/__init__.py +0 -0
  238. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/metadata_resolver/metadata_filter.py +0 -0
  239. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/metadata_resolver/sample/__init__.py +0 -0
  240. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/metadata_resolver/sample/bulk_update_metadata.py +0 -0
  241. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/metadata_resolver/sample/get_by_sample_id.py +0 -0
  242. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/metadata_resolver/sample/get_metadata_info.py +0 -0
  243. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/metadata_resolver/sample/get_value_for_sample.py +0 -0
  244. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/metadata_resolver/sample/set_value_for_sample.py +0 -0
  245. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/samples_filter.py +0 -0
  246. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/resolvers/tag_resolver.py +0 -0
  247. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/selection/select_via_db.py +0 -0
  248. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/services/annotations_service/__init__.py +0 -0
  249. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/services/annotations_service/create_annotation.py +0 -0
  250. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/services/annotations_service/delete_annotation.py +0 -0
  251. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/services/annotations_service/get_annotation_by_id.py +0 -0
  252. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/services/annotations_service/update_annotation.py +0 -0
  253. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/services/annotations_service/update_annotation_bounding_box.py +0 -0
  254. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/services/annotations_service/update_annotation_label.py +0 -0
  255. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/services/annotations_service/update_annotations.py +0 -0
  256. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/setup_logging.py +0 -0
  257. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/type_definitions.py +0 -0
  258. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/ACKNOWLEDGEMENTS +0 -0
  259. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/LICENSE +0 -0
  260. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/LICENSE_weights_data +0 -0
  261. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/README.md +0 -0
  262. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/__init__.py +0 -0
  263. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/mobileclip/__init__.py +0 -0
  264. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/mobileclip/clip.py +0 -0
  265. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/mobileclip/configs/mobileclip_b.json +0 -0
  266. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/mobileclip/configs/mobileclip_s0.json +0 -0
  267. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/mobileclip/configs/mobileclip_s1.json +0 -0
  268. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/mobileclip/configs/mobileclip_s2.json +0 -0
  269. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/mobileclip/image_encoder.py +0 -0
  270. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/mobileclip/logger.py +0 -0
  271. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/mobileclip/models/__init__.py +0 -0
  272. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/mobileclip/models/mci.py +0 -0
  273. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/mobileclip/models/vit.py +0 -0
  274. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/mobileclip/modules/__init__.py +0 -0
  275. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/mobileclip/modules/common/__init__.py +0 -0
  276. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/mobileclip/modules/common/mobileone.py +0 -0
  277. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/mobileclip/modules/common/transformer.py +0 -0
  278. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/mobileclip/modules/image/__init__.py +0 -0
  279. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/mobileclip/modules/image/image_projection.py +0 -0
  280. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/mobileclip/modules/image/replknet.py +0 -0
  281. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/mobileclip/modules/text/__init__.py +0 -0
  282. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/mobileclip/modules/text/repmixer.py +0 -0
  283. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/mobileclip/modules/text/tokenizer.py +0 -0
  284. {lightly_studio-0.3.4 → lightly_studio-0.4.1}/src/lightly_studio/vendor/mobileclip/text_encoder.py +0 -0
@@ -16,3 +16,6 @@ datasets
16
16
 
17
17
  # Generated API schema
18
18
  openapi.json
19
+
20
+ # docs build
21
+ /docs/site
@@ -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.4"
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.4",
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", "DatasetLoader", "start_gui"]
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
+ )
@@ -0,0 +1,5 @@
1
+ """Global list of the active features."""
2
+
3
+ from __future__ import annotations
4
+
5
+ lightly_studio_active_features: list[str] = []
@@ -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
- ) -> DatasetTable:
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}")
@@ -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:
@@ -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 sample_embedding_resolver, sample_resolver
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/tsne")
36
- def get_embeddings2d__tsne(
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
- embeddings = sample_embedding_resolver.get_all_by_dataset_id(
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(x, type=pa.float32()),
89
- "y": pa.array(y, type=pa.float32()),
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
- Keeps a reference to the underlying DatasetTable.
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
+ ]
@@ -1,4 +1,4 @@
1
- """Matching functionality for filtering database samples based on field conditions."""
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 querying on a dataset."""
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.
@@ -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
- This class provides static instances of different field types that can be
20
- used to build database queries on sample properties.
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))