lightly-studio 0.3.1__py3-none-any.whl
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/__init__.py +11 -0
- lightly_studio/api/__init__.py +0 -0
- lightly_studio/api/app.py +110 -0
- lightly_studio/api/cache.py +77 -0
- lightly_studio/api/db.py +133 -0
- lightly_studio/api/db_tables.py +32 -0
- lightly_studio/api/features.py +7 -0
- lightly_studio/api/routes/api/annotation.py +233 -0
- lightly_studio/api/routes/api/annotation_label.py +90 -0
- lightly_studio/api/routes/api/annotation_task.py +38 -0
- lightly_studio/api/routes/api/classifier.py +387 -0
- lightly_studio/api/routes/api/dataset.py +182 -0
- lightly_studio/api/routes/api/dataset_tag.py +257 -0
- lightly_studio/api/routes/api/exceptions.py +96 -0
- lightly_studio/api/routes/api/features.py +17 -0
- lightly_studio/api/routes/api/metadata.py +37 -0
- lightly_studio/api/routes/api/metrics.py +80 -0
- lightly_studio/api/routes/api/sample.py +196 -0
- lightly_studio/api/routes/api/settings.py +45 -0
- lightly_studio/api/routes/api/status.py +19 -0
- lightly_studio/api/routes/api/text_embedding.py +48 -0
- lightly_studio/api/routes/api/validators.py +17 -0
- lightly_studio/api/routes/healthz.py +13 -0
- lightly_studio/api/routes/images.py +104 -0
- lightly_studio/api/routes/webapp.py +51 -0
- lightly_studio/api/server.py +82 -0
- lightly_studio/core/__init__.py +0 -0
- lightly_studio/core/dataset.py +523 -0
- lightly_studio/core/sample.py +77 -0
- lightly_studio/core/start_gui.py +15 -0
- lightly_studio/dataset/__init__.py +0 -0
- lightly_studio/dataset/edge_embedding_generator.py +144 -0
- lightly_studio/dataset/embedding_generator.py +91 -0
- lightly_studio/dataset/embedding_manager.py +163 -0
- lightly_studio/dataset/env.py +16 -0
- lightly_studio/dataset/file_utils.py +35 -0
- lightly_studio/dataset/loader.py +622 -0
- lightly_studio/dataset/mobileclip_embedding_generator.py +144 -0
- lightly_studio/dist_lightly_studio_view_app/_app/env.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/0.DenzbfeK.css +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/LightlyLogo.BNjCIww-.png +0 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/OpenSans- +0 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/OpenSans-Bold.DGvYQtcs.ttf +0 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/OpenSans-Italic-VariableFont_wdth_wght.B4AZ-wl6.ttf +0 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/OpenSans-Regular.DxJTClRG.ttf +0 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/OpenSans-SemiBold.D3TTYgdB.ttf +0 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/OpenSans-VariableFont_wdth_wght.BZBpG5Iz.ttf +0 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/SelectableSvgGroup.OwPEPQZu.css +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/SelectableSvgGroup.b653GmVf.css +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/_layout.T-zjSUd3.css +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/useFeatureFlags.CV-KWLNP.css +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/69_IOA4Y.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/B2FVR0s0.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/B90CZVMX.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/B9zumHo5.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/BJXwVxaE.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/Bsi3UGy5.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/Bu7uvVrG.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/Bx1xMsFy.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/BylOuP6i.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/C8I8rFJQ.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CDnpyLsT.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CWj6FrbW.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CYgJF_JY.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CcaPhhk3.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CvOmgdoc.js +93 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CxtLVaYz.js +3 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/D5-A_Ffd.js +4 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/D6RI2Zrd.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/D6su9Aln.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/D98V7j6A.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DIRAtgl0.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DIeogL5L.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DOlTMNyt.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DjUWrjOv.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DjfY96ND.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/H7C68rOM.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/O-EABkf9.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/XO7A28GO.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/hQVEETDE.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/l7KrR96u.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/nAHhluT7.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/r64xT6ao.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/vC4nQVEB.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/x9G_hzyY.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/entry/app.CjnvpsmS.js +2 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/entry/start.0o1H7wM9.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/0.XRq_TUwu.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/1.B4rNYwVp.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/10.DfBwOEhN.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/11.CWG1ehzT.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/12.CwF2_8mP.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/2.CS4muRY-.js +6 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/3.CWHpKonm.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/4.OUWOLQeV.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/5.Dm6t9F5W.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/6.Bw5ck4gK.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/7.CF0EDTR6.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/8.Cw30LEcV.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/9.CPu3CiBc.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/version.json +1 -0
- lightly_studio/dist_lightly_studio_view_app/apple-touch-icon-precomposed.png +0 -0
- lightly_studio/dist_lightly_studio_view_app/apple-touch-icon.png +0 -0
- lightly_studio/dist_lightly_studio_view_app/favicon.png +0 -0
- lightly_studio/dist_lightly_studio_view_app/index.html +44 -0
- lightly_studio/examples/example.py +23 -0
- lightly_studio/examples/example_metadata.py +338 -0
- lightly_studio/examples/example_selection.py +39 -0
- lightly_studio/examples/example_split_work.py +67 -0
- lightly_studio/examples/example_v2.py +21 -0
- lightly_studio/export_schema.py +18 -0
- lightly_studio/few_shot_classifier/__init__.py +0 -0
- lightly_studio/few_shot_classifier/classifier.py +80 -0
- lightly_studio/few_shot_classifier/classifier_manager.py +663 -0
- lightly_studio/few_shot_classifier/random_forest_classifier.py +489 -0
- lightly_studio/metadata/complex_metadata.py +47 -0
- lightly_studio/metadata/gps_coordinate.py +41 -0
- lightly_studio/metadata/metadata_protocol.py +17 -0
- lightly_studio/metrics/__init__.py +0 -0
- lightly_studio/metrics/detection/__init__.py +0 -0
- lightly_studio/metrics/detection/map.py +268 -0
- lightly_studio/models/__init__.py +1 -0
- lightly_studio/models/annotation/__init__.py +0 -0
- lightly_studio/models/annotation/annotation_base.py +171 -0
- lightly_studio/models/annotation/instance_segmentation.py +56 -0
- lightly_studio/models/annotation/links.py +17 -0
- lightly_studio/models/annotation/object_detection.py +47 -0
- lightly_studio/models/annotation/semantic_segmentation.py +44 -0
- lightly_studio/models/annotation_label.py +47 -0
- lightly_studio/models/annotation_task.py +28 -0
- lightly_studio/models/classifier.py +20 -0
- lightly_studio/models/dataset.py +84 -0
- lightly_studio/models/embedding_model.py +30 -0
- lightly_studio/models/metadata.py +208 -0
- lightly_studio/models/sample.py +180 -0
- lightly_studio/models/sample_embedding.py +37 -0
- lightly_studio/models/settings.py +60 -0
- lightly_studio/models/tag.py +96 -0
- lightly_studio/py.typed +0 -0
- lightly_studio/resolvers/__init__.py +7 -0
- lightly_studio/resolvers/annotation_label_resolver/__init__.py +21 -0
- lightly_studio/resolvers/annotation_label_resolver/create.py +27 -0
- lightly_studio/resolvers/annotation_label_resolver/delete.py +28 -0
- lightly_studio/resolvers/annotation_label_resolver/get_all.py +22 -0
- lightly_studio/resolvers/annotation_label_resolver/get_by_id.py +24 -0
- lightly_studio/resolvers/annotation_label_resolver/get_by_ids.py +25 -0
- lightly_studio/resolvers/annotation_label_resolver/get_by_label_name.py +24 -0
- lightly_studio/resolvers/annotation_label_resolver/names_by_ids.py +25 -0
- lightly_studio/resolvers/annotation_label_resolver/update.py +38 -0
- lightly_studio/resolvers/annotation_resolver/__init__.py +33 -0
- lightly_studio/resolvers/annotation_resolver/count_annotations_by_dataset.py +120 -0
- lightly_studio/resolvers/annotation_resolver/create.py +19 -0
- lightly_studio/resolvers/annotation_resolver/create_many.py +96 -0
- lightly_studio/resolvers/annotation_resolver/delete_annotation.py +45 -0
- lightly_studio/resolvers/annotation_resolver/delete_annotations.py +56 -0
- lightly_studio/resolvers/annotation_resolver/get_all.py +74 -0
- lightly_studio/resolvers/annotation_resolver/get_by_id.py +18 -0
- lightly_studio/resolvers/annotation_resolver/update_annotation_label.py +144 -0
- lightly_studio/resolvers/annotation_resolver/update_bounding_box.py +68 -0
- lightly_studio/resolvers/annotation_task_resolver.py +31 -0
- lightly_studio/resolvers/annotations/__init__.py +1 -0
- lightly_studio/resolvers/annotations/annotations_filter.py +89 -0
- lightly_studio/resolvers/dataset_resolver.py +278 -0
- lightly_studio/resolvers/embedding_model_resolver.py +100 -0
- lightly_studio/resolvers/metadata_resolver/__init__.py +15 -0
- lightly_studio/resolvers/metadata_resolver/metadata_filter.py +163 -0
- lightly_studio/resolvers/metadata_resolver/sample/__init__.py +21 -0
- lightly_studio/resolvers/metadata_resolver/sample/bulk_set_metadata.py +48 -0
- lightly_studio/resolvers/metadata_resolver/sample/get_by_sample_id.py +24 -0
- lightly_studio/resolvers/metadata_resolver/sample/get_metadata_info.py +104 -0
- lightly_studio/resolvers/metadata_resolver/sample/get_value_for_sample.py +27 -0
- lightly_studio/resolvers/metadata_resolver/sample/set_value_for_sample.py +53 -0
- lightly_studio/resolvers/sample_embedding_resolver.py +86 -0
- lightly_studio/resolvers/sample_resolver.py +249 -0
- lightly_studio/resolvers/samples_filter.py +81 -0
- lightly_studio/resolvers/settings_resolver.py +58 -0
- lightly_studio/resolvers/tag_resolver.py +276 -0
- lightly_studio/selection/README.md +6 -0
- lightly_studio/selection/mundig.py +105 -0
- lightly_studio/selection/select.py +96 -0
- lightly_studio/selection/select_via_db.py +93 -0
- lightly_studio/selection/selection_config.py +31 -0
- lightly_studio/services/annotations_service/__init__.py +21 -0
- lightly_studio/services/annotations_service/get_annotation_by_id.py +31 -0
- lightly_studio/services/annotations_service/update_annotation.py +65 -0
- lightly_studio/services/annotations_service/update_annotation_label.py +48 -0
- lightly_studio/services/annotations_service/update_annotations.py +29 -0
- lightly_studio/setup_logging.py +19 -0
- lightly_studio/type_definitions.py +19 -0
- lightly_studio/vendor/ACKNOWLEDGEMENTS +422 -0
- lightly_studio/vendor/LICENSE +31 -0
- lightly_studio/vendor/LICENSE_weights_data +50 -0
- lightly_studio/vendor/README.md +5 -0
- lightly_studio/vendor/__init__.py +1 -0
- lightly_studio/vendor/mobileclip/__init__.py +96 -0
- lightly_studio/vendor/mobileclip/clip.py +77 -0
- lightly_studio/vendor/mobileclip/configs/mobileclip_b.json +18 -0
- lightly_studio/vendor/mobileclip/configs/mobileclip_s0.json +18 -0
- lightly_studio/vendor/mobileclip/configs/mobileclip_s1.json +18 -0
- lightly_studio/vendor/mobileclip/configs/mobileclip_s2.json +18 -0
- lightly_studio/vendor/mobileclip/image_encoder.py +67 -0
- lightly_studio/vendor/mobileclip/logger.py +154 -0
- lightly_studio/vendor/mobileclip/models/__init__.py +10 -0
- lightly_studio/vendor/mobileclip/models/mci.py +933 -0
- lightly_studio/vendor/mobileclip/models/vit.py +433 -0
- lightly_studio/vendor/mobileclip/modules/__init__.py +4 -0
- lightly_studio/vendor/mobileclip/modules/common/__init__.py +4 -0
- lightly_studio/vendor/mobileclip/modules/common/mobileone.py +341 -0
- lightly_studio/vendor/mobileclip/modules/common/transformer.py +451 -0
- lightly_studio/vendor/mobileclip/modules/image/__init__.py +4 -0
- lightly_studio/vendor/mobileclip/modules/image/image_projection.py +113 -0
- lightly_studio/vendor/mobileclip/modules/image/replknet.py +188 -0
- lightly_studio/vendor/mobileclip/modules/text/__init__.py +4 -0
- lightly_studio/vendor/mobileclip/modules/text/repmixer.py +281 -0
- lightly_studio/vendor/mobileclip/modules/text/tokenizer.py +38 -0
- lightly_studio/vendor/mobileclip/text_encoder.py +245 -0
- lightly_studio-0.3.1.dist-info/METADATA +520 -0
- lightly_studio-0.3.1.dist-info/RECORD +219 -0
- lightly_studio-0.3.1.dist-info/WHEEL +4 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"""Example of how to run selection class."""
|
|
2
|
+
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
|
|
5
|
+
from environs import Env
|
|
6
|
+
|
|
7
|
+
from lightly_studio import DatasetLoader
|
|
8
|
+
from lightly_studio.selection.select import Selection
|
|
9
|
+
|
|
10
|
+
# Read environment variables
|
|
11
|
+
env = Env()
|
|
12
|
+
env.read_env()
|
|
13
|
+
|
|
14
|
+
# Define the path to the dataset directory
|
|
15
|
+
dataset_path = Path(env.path("DATASET_PATH", "/path/to/your/dataset"))
|
|
16
|
+
dataset_path = dataset_path.parent if dataset_path.is_file() else dataset_path
|
|
17
|
+
|
|
18
|
+
# Create a DatasetLoader from a path
|
|
19
|
+
loader = DatasetLoader()
|
|
20
|
+
dataset = loader.from_directory(
|
|
21
|
+
dataset_name="clothing_small_test",
|
|
22
|
+
img_dir=str(dataset_path),
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
# Create the selection interface
|
|
26
|
+
# TODO(Malte, 08/2025): Replace this with using a DatasetView.
|
|
27
|
+
# See the Select class for more details on the TODO.
|
|
28
|
+
select = Selection(
|
|
29
|
+
dataset_id=dataset.dataset_id,
|
|
30
|
+
session=loader.session,
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
# Select a diverse subset of 10 samples.
|
|
34
|
+
select.diverse(
|
|
35
|
+
n_samples_to_select=10,
|
|
36
|
+
selection_result_tag_name="diverse_selection",
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
loader.start_gui()
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"""Example of how to add tags to samples to set up a split review workflow."""
|
|
2
|
+
|
|
3
|
+
import math
|
|
4
|
+
|
|
5
|
+
from environs import Env
|
|
6
|
+
|
|
7
|
+
from lightly_studio import DatasetLoader
|
|
8
|
+
from lightly_studio.models.tag import TagCreate
|
|
9
|
+
from lightly_studio.resolvers import (
|
|
10
|
+
tag_resolver,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
# Read environment variables
|
|
14
|
+
env = Env()
|
|
15
|
+
env.read_env()
|
|
16
|
+
|
|
17
|
+
# Create a DatasetLoader instance
|
|
18
|
+
loader = DatasetLoader()
|
|
19
|
+
|
|
20
|
+
# Define the path to the dataset (folder containing data.yaml)
|
|
21
|
+
dataset_path = env.path("DATASET_PATH", "/path/to/your/yolo/dataset/data.yaml")
|
|
22
|
+
|
|
23
|
+
# Load YOLO dataset using data.yaml path
|
|
24
|
+
dataset = loader.from_yolo(
|
|
25
|
+
str(dataset_path),
|
|
26
|
+
input_split=env.str("LIGHTLY_STUDIO_DATASET_SPLIT", "test"),
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
# Define the reviewers
|
|
30
|
+
# This should be a comma-separated list of reviewers
|
|
31
|
+
# we will then create a tag for each reviewer and assign them samples
|
|
32
|
+
# to work on.
|
|
33
|
+
reviewers = env.str("DATASET_REVIEWERS", "Alice, Bob, Charlie, David")
|
|
34
|
+
|
|
35
|
+
# Get all samples from the db
|
|
36
|
+
samples = dataset.get_samples()
|
|
37
|
+
|
|
38
|
+
# Create a tag for each reviewer to work on
|
|
39
|
+
tags = []
|
|
40
|
+
for reviewer in reviewers.split(","):
|
|
41
|
+
tags.append(
|
|
42
|
+
tag_resolver.create(
|
|
43
|
+
session=loader.session,
|
|
44
|
+
tag=TagCreate(
|
|
45
|
+
dataset_id=dataset.dataset_id,
|
|
46
|
+
name=f"""{reviewer.strip()} tasks""",
|
|
47
|
+
kind="sample",
|
|
48
|
+
),
|
|
49
|
+
)
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
# Chunk the samples into portions equally divided among the reviewers.
|
|
53
|
+
chunk_size = math.ceil(len(samples) / len(tags))
|
|
54
|
+
for i, tag in enumerate(tags):
|
|
55
|
+
# allocate all samples for this tag
|
|
56
|
+
sample_ids = [sample.sample_id for sample in samples[i * chunk_size : (i + 1) * chunk_size]]
|
|
57
|
+
|
|
58
|
+
# Add sample_ids to the tag
|
|
59
|
+
tag_resolver.add_sample_ids_to_tag_id(
|
|
60
|
+
session=loader.session,
|
|
61
|
+
tag_id=tag.tag_id,
|
|
62
|
+
sample_ids=sample_ids,
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
# Launch the server to load data
|
|
67
|
+
loader.start_gui()
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"""Example of how to load samples from path with the dataset class."""
|
|
2
|
+
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
|
|
5
|
+
from environs import Env
|
|
6
|
+
|
|
7
|
+
import lightly_studio as ls
|
|
8
|
+
|
|
9
|
+
# Read environment variables
|
|
10
|
+
env = Env()
|
|
11
|
+
env.read_env()
|
|
12
|
+
|
|
13
|
+
# Define the path to the dataset directory
|
|
14
|
+
dataset_path = Path(env.path("DATASET_PATH", "/path/to/your/dataset"))
|
|
15
|
+
dataset_path = dataset_path.parent if dataset_path.is_file() else dataset_path
|
|
16
|
+
|
|
17
|
+
# Create a DatasetLoader from a path
|
|
18
|
+
dataset = ls.Dataset("clothing_small_test")
|
|
19
|
+
dataset.add_samples_from_path(path=dataset_path)
|
|
20
|
+
|
|
21
|
+
ls.start_gui()
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"""Export OpenAPI schema from FastAPI application to JSON file."""
|
|
2
|
+
|
|
3
|
+
import argparse
|
|
4
|
+
import json
|
|
5
|
+
|
|
6
|
+
from lightly_studio.api.app import app
|
|
7
|
+
|
|
8
|
+
parser = argparse.ArgumentParser(description="Export OpenAPI schema to a file.")
|
|
9
|
+
parser.add_argument(
|
|
10
|
+
"--output",
|
|
11
|
+
type=str,
|
|
12
|
+
default="openapi.json",
|
|
13
|
+
help="The output file path for the OpenAPI schema (default: openapi.json).",
|
|
14
|
+
)
|
|
15
|
+
args = parser.parse_args()
|
|
16
|
+
|
|
17
|
+
with open(args.output, "w") as f:
|
|
18
|
+
json.dump(app.openapi(), f, indent=2)
|
|
File without changes
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"""FewShotClassifier Protocol."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import io
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
from typing import Literal, Protocol, runtime_checkable
|
|
9
|
+
|
|
10
|
+
ExportType = Literal["sklearn", "lightly"]
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@dataclass
|
|
14
|
+
class AnnotatedEmbedding:
|
|
15
|
+
"""Annotated embedding class.
|
|
16
|
+
|
|
17
|
+
Attributes:
|
|
18
|
+
embedding: The embedding vector as a list of floats.
|
|
19
|
+
annotation: The annotation for the embedding.
|
|
20
|
+
Note: Currently it is an string but it can be a integer or
|
|
21
|
+
any other type.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
embedding: list[float]
|
|
25
|
+
annotation: str
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@runtime_checkable
|
|
29
|
+
class FewShotClassifier(Protocol):
|
|
30
|
+
"""Protocol defining the interface for classifiers."""
|
|
31
|
+
|
|
32
|
+
def train(self, annotated_embeddings: list[AnnotatedEmbedding]) -> None:
|
|
33
|
+
"""Trains a classifier using the provided input.
|
|
34
|
+
|
|
35
|
+
Args:
|
|
36
|
+
annotated_embeddings: A list of annotated embeddings to train the
|
|
37
|
+
classifier.
|
|
38
|
+
|
|
39
|
+
Raises:
|
|
40
|
+
ValueError: If annotated_embeddings is empty or contains invalid
|
|
41
|
+
classes.
|
|
42
|
+
"""
|
|
43
|
+
...
|
|
44
|
+
|
|
45
|
+
def predict(self, embeddings: list[list[float]]) -> list[list[float]]:
|
|
46
|
+
"""Predicts the classification scores for a list of embeddings.
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
embeddings: A list of embeddings, where each embedding is a list of
|
|
50
|
+
floats.
|
|
51
|
+
|
|
52
|
+
Returns:
|
|
53
|
+
A list of lists, where each inner list represents the probability
|
|
54
|
+
distribution over classes for the corresponding input embedding.
|
|
55
|
+
Each value in the inner list corresponds to the likelihood of the
|
|
56
|
+
embedding belonging to a specific class.
|
|
57
|
+
If embeddings is empty, returns an empty list.
|
|
58
|
+
"""
|
|
59
|
+
...
|
|
60
|
+
|
|
61
|
+
def export(
|
|
62
|
+
self,
|
|
63
|
+
export_path: Path | None,
|
|
64
|
+
buffer: io.BytesIO | None,
|
|
65
|
+
export_type: ExportType,
|
|
66
|
+
) -> None:
|
|
67
|
+
"""Exports the classifier to a specified file.
|
|
68
|
+
|
|
69
|
+
This method saves the trained classifier to the given file path so that
|
|
70
|
+
it can be reused or shared.
|
|
71
|
+
|
|
72
|
+
Args:
|
|
73
|
+
export_path: The path to the file where the classifier should
|
|
74
|
+
be saved.
|
|
75
|
+
buffer: An optional in-memory buffer to write the exported
|
|
76
|
+
classifier to.
|
|
77
|
+
export_type: The type of export format to use. This can be either
|
|
78
|
+
"sklearn_instance" or "raw".
|
|
79
|
+
"""
|
|
80
|
+
...
|