lightly-studio 0.4.6__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.
- lightly_studio/__init__.py +12 -0
- lightly_studio/api/__init__.py +0 -0
- lightly_studio/api/app.py +131 -0
- lightly_studio/api/cache.py +77 -0
- lightly_studio/api/db_tables.py +35 -0
- lightly_studio/api/features.py +5 -0
- lightly_studio/api/routes/api/annotation.py +305 -0
- lightly_studio/api/routes/api/annotation_label.py +87 -0
- lightly_studio/api/routes/api/annotations/__init__.py +7 -0
- lightly_studio/api/routes/api/annotations/create_annotation.py +52 -0
- lightly_studio/api/routes/api/caption.py +100 -0
- lightly_studio/api/routes/api/classifier.py +384 -0
- lightly_studio/api/routes/api/dataset.py +191 -0
- lightly_studio/api/routes/api/dataset_tag.py +266 -0
- lightly_studio/api/routes/api/embeddings2d.py +90 -0
- lightly_studio/api/routes/api/exceptions.py +114 -0
- lightly_studio/api/routes/api/export.py +114 -0
- lightly_studio/api/routes/api/features.py +17 -0
- lightly_studio/api/routes/api/frame.py +241 -0
- lightly_studio/api/routes/api/image.py +155 -0
- lightly_studio/api/routes/api/metadata.py +161 -0
- lightly_studio/api/routes/api/operator.py +75 -0
- lightly_studio/api/routes/api/sample.py +103 -0
- lightly_studio/api/routes/api/selection.py +87 -0
- lightly_studio/api/routes/api/settings.py +41 -0
- lightly_studio/api/routes/api/status.py +19 -0
- lightly_studio/api/routes/api/text_embedding.py +50 -0
- lightly_studio/api/routes/api/validators.py +17 -0
- lightly_studio/api/routes/api/video.py +133 -0
- lightly_studio/api/routes/healthz.py +13 -0
- lightly_studio/api/routes/images.py +104 -0
- lightly_studio/api/routes/video_frames_media.py +116 -0
- lightly_studio/api/routes/video_media.py +223 -0
- lightly_studio/api/routes/webapp.py +51 -0
- lightly_studio/api/server.py +94 -0
- lightly_studio/core/__init__.py +0 -0
- lightly_studio/core/add_samples.py +533 -0
- lightly_studio/core/add_videos.py +294 -0
- lightly_studio/core/dataset.py +780 -0
- lightly_studio/core/dataset_query/__init__.py +14 -0
- lightly_studio/core/dataset_query/boolean_expression.py +67 -0
- lightly_studio/core/dataset_query/dataset_query.py +317 -0
- lightly_studio/core/dataset_query/field.py +113 -0
- lightly_studio/core/dataset_query/field_expression.py +79 -0
- lightly_studio/core/dataset_query/match_expression.py +23 -0
- lightly_studio/core/dataset_query/order_by.py +79 -0
- lightly_studio/core/dataset_query/sample_field.py +37 -0
- lightly_studio/core/dataset_query/tags_expression.py +46 -0
- lightly_studio/core/image_sample.py +36 -0
- lightly_studio/core/loading_log.py +56 -0
- lightly_studio/core/sample.py +291 -0
- lightly_studio/core/start_gui.py +54 -0
- lightly_studio/core/video_sample.py +38 -0
- lightly_studio/dataset/__init__.py +0 -0
- lightly_studio/dataset/edge_embedding_generator.py +155 -0
- lightly_studio/dataset/embedding_generator.py +129 -0
- lightly_studio/dataset/embedding_manager.py +349 -0
- lightly_studio/dataset/env.py +20 -0
- lightly_studio/dataset/file_utils.py +49 -0
- lightly_studio/dataset/fsspec_lister.py +275 -0
- lightly_studio/dataset/mobileclip_embedding_generator.py +158 -0
- lightly_studio/dataset/perception_encoder_embedding_generator.py +260 -0
- lightly_studio/db_manager.py +166 -0
- lightly_studio/dist_lightly_studio_view_app/_app/env.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/0.GcXvs2l7.css +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/12.Dx6SXgAb.css +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/17.9X9_k6TP.css +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/18.BxiimdIO.css +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/2.CkOblLn7.css +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/ClassifierSamplesGrid.BJbCDlvs.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-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-Medium.DVUZMR_6.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/_layout.CefECEWA.css +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/_layout.D5tDcjY-.css +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/_page.9X9_k6TP.css +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/_page.BxiimdIO.css +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/_page.Dx6SXgAb.css +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/transform._-1mPSEI.css +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/0dDyq72A.js +20 -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/BK4An2kI.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/BRmB-kJ9.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/B_1cpokE.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/BiqpDEr0.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/BpLiSKgx.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/BscxbINH.js +39 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/C1FmrZbK.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/C80h3dJx.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/C8mfFM-u.js +2 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CGY1p9L4.js +517 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/COfLknXM.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/CmLg0ys7.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CvGjimpO.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/D3RDXHoj.js +39 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/D4y7iiT3.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/D9SC3jBb.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DCuAdx1Q.js +20 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DDBy-_jD.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/DL9a7v5o.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DSKECuqX.js +39 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/D_FFv0Oe.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DiZ5o5vz.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DkbXUtyG.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DmK2hulV.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DqnHaLTj.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DtWZc_tl.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DuUalyFS.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DwIonDAZ.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/Il-mSPmK.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/KNLP4aJU.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/KjYeVjkE.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/MErlcOXj.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/VRI4prUD.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/VYb2dkNs.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/VqWvU2yF.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/dHC3otuL.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/da7Oy_lO.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/eAy8rZzC.js +2 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/erjNR5MX.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/f1oG3eFE.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/rsLi1iKv.js +20 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/rwuuBP9f.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/xGHZQ1pe.js +3 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/entry/app.DrTRUgT3.js +2 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/entry/start.BK5EOJl2.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/0.CIvTuljF.js +4 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/1.UBvSzxdA.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/10.CQ_tiLJa.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/11.KqkAcaxW.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/12.DoYsmxQc.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/13.571n2LZA.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/14.DGs689M-.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/15.CWG1ehzT.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/16.Dpq6jbSh.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/17.B5AZbHUU.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/18.CBga8cnq.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/2.D2HXgz-8.js +1090 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/3.f4HAg-y3.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/4.BKF4xuKQ.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/5.BAE0Pm_f.js +39 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/6.CouWWpzA.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/7.UBHT0ktp.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/8.FiYNElcc.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/9.B3-UaT23.js +1 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/workers/clustering.worker-DKqeLtG0.js +2 -0
- lightly_studio/dist_lightly_studio_view_app/_app/immutable/workers/search.worker-vNSty3B0.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 +45 -0
- lightly_studio/errors.py +5 -0
- lightly_studio/examples/example.py +25 -0
- lightly_studio/examples/example_coco.py +27 -0
- lightly_studio/examples/example_coco_caption.py +29 -0
- lightly_studio/examples/example_metadata.py +369 -0
- lightly_studio/examples/example_operators.py +111 -0
- lightly_studio/examples/example_selection.py +28 -0
- lightly_studio/examples/example_split_work.py +48 -0
- lightly_studio/examples/example_video.py +22 -0
- lightly_studio/examples/example_video_annotations.py +157 -0
- lightly_studio/examples/example_yolo.py +22 -0
- lightly_studio/export/coco_captions.py +69 -0
- lightly_studio/export/export_dataset.py +104 -0
- lightly_studio/export/lightly_studio_label_input.py +120 -0
- lightly_studio/export_schema.py +18 -0
- lightly_studio/export_version.py +57 -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 +644 -0
- lightly_studio/few_shot_classifier/random_forest_classifier.py +495 -0
- lightly_studio/metadata/complex_metadata.py +47 -0
- lightly_studio/metadata/compute_similarity.py +84 -0
- lightly_studio/metadata/compute_typicality.py +67 -0
- lightly_studio/metadata/gps_coordinate.py +41 -0
- lightly_studio/metadata/metadata_protocol.py +17 -0
- lightly_studio/models/__init__.py +1 -0
- lightly_studio/models/annotation/__init__.py +0 -0
- lightly_studio/models/annotation/annotation_base.py +303 -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/caption.py +49 -0
- lightly_studio/models/classifier.py +20 -0
- lightly_studio/models/dataset.py +70 -0
- lightly_studio/models/embedding_model.py +30 -0
- lightly_studio/models/image.py +96 -0
- lightly_studio/models/metadata.py +208 -0
- lightly_studio/models/range.py +17 -0
- lightly_studio/models/sample.py +154 -0
- lightly_studio/models/sample_embedding.py +36 -0
- lightly_studio/models/settings.py +69 -0
- lightly_studio/models/tag.py +96 -0
- lightly_studio/models/two_dim_embedding.py +16 -0
- lightly_studio/models/video.py +161 -0
- lightly_studio/plugins/__init__.py +0 -0
- lightly_studio/plugins/base_operator.py +60 -0
- lightly_studio/plugins/operator_registry.py +47 -0
- lightly_studio/plugins/parameter.py +70 -0
- lightly_studio/py.typed +0 -0
- lightly_studio/resolvers/__init__.py +0 -0
- lightly_studio/resolvers/annotation_label_resolver/__init__.py +22 -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 +37 -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 +40 -0
- lightly_studio/resolvers/annotation_resolver/count_annotations_by_dataset.py +129 -0
- lightly_studio/resolvers/annotation_resolver/create_many.py +124 -0
- lightly_studio/resolvers/annotation_resolver/delete_annotation.py +87 -0
- lightly_studio/resolvers/annotation_resolver/delete_annotations.py +60 -0
- lightly_studio/resolvers/annotation_resolver/get_all.py +85 -0
- lightly_studio/resolvers/annotation_resolver/get_all_with_payload.py +179 -0
- lightly_studio/resolvers/annotation_resolver/get_by_id.py +34 -0
- lightly_studio/resolvers/annotation_resolver/get_by_id_with_payload.py +130 -0
- lightly_studio/resolvers/annotation_resolver/update_annotation_label.py +142 -0
- lightly_studio/resolvers/annotation_resolver/update_bounding_box.py +68 -0
- lightly_studio/resolvers/annotations/__init__.py +1 -0
- lightly_studio/resolvers/annotations/annotations_filter.py +88 -0
- lightly_studio/resolvers/caption_resolver.py +129 -0
- lightly_studio/resolvers/dataset_resolver/__init__.py +55 -0
- lightly_studio/resolvers/dataset_resolver/check_dataset_type.py +29 -0
- lightly_studio/resolvers/dataset_resolver/create.py +20 -0
- lightly_studio/resolvers/dataset_resolver/delete.py +20 -0
- lightly_studio/resolvers/dataset_resolver/export.py +267 -0
- lightly_studio/resolvers/dataset_resolver/get_all.py +19 -0
- lightly_studio/resolvers/dataset_resolver/get_by_id.py +16 -0
- lightly_studio/resolvers/dataset_resolver/get_by_name.py +12 -0
- lightly_studio/resolvers/dataset_resolver/get_dataset_details.py +27 -0
- lightly_studio/resolvers/dataset_resolver/get_hierarchy.py +31 -0
- lightly_studio/resolvers/dataset_resolver/get_or_create_child_dataset.py +58 -0
- lightly_studio/resolvers/dataset_resolver/get_parent_dataset_by_sample_id.py +27 -0
- lightly_studio/resolvers/dataset_resolver/get_parent_dataset_id.py +22 -0
- lightly_studio/resolvers/dataset_resolver/get_root_dataset.py +61 -0
- lightly_studio/resolvers/dataset_resolver/get_root_datasets_overview.py +41 -0
- lightly_studio/resolvers/dataset_resolver/update.py +25 -0
- lightly_studio/resolvers/embedding_model_resolver.py +120 -0
- lightly_studio/resolvers/image_filter.py +50 -0
- lightly_studio/resolvers/image_resolver/__init__.py +21 -0
- lightly_studio/resolvers/image_resolver/create_many.py +52 -0
- lightly_studio/resolvers/image_resolver/delete.py +20 -0
- lightly_studio/resolvers/image_resolver/filter_new_paths.py +23 -0
- lightly_studio/resolvers/image_resolver/get_all_by_dataset_id.py +117 -0
- lightly_studio/resolvers/image_resolver/get_by_id.py +14 -0
- lightly_studio/resolvers/image_resolver/get_dimension_bounds.py +75 -0
- lightly_studio/resolvers/image_resolver/get_many_by_id.py +22 -0
- lightly_studio/resolvers/image_resolver/get_samples_excluding.py +43 -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_update_metadata.py +46 -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 +132 -0
- lightly_studio/resolvers/sample_resolver/__init__.py +17 -0
- lightly_studio/resolvers/sample_resolver/count_by_dataset_id.py +16 -0
- lightly_studio/resolvers/sample_resolver/create.py +16 -0
- lightly_studio/resolvers/sample_resolver/create_many.py +25 -0
- lightly_studio/resolvers/sample_resolver/get_by_id.py +14 -0
- lightly_studio/resolvers/sample_resolver/get_filtered_samples.py +56 -0
- lightly_studio/resolvers/sample_resolver/get_many_by_id.py +22 -0
- lightly_studio/resolvers/sample_resolver/sample_filter.py +74 -0
- lightly_studio/resolvers/settings_resolver.py +62 -0
- lightly_studio/resolvers/tag_resolver.py +299 -0
- lightly_studio/resolvers/twodim_embedding_resolver.py +119 -0
- lightly_studio/resolvers/video_frame_resolver/__init__.py +23 -0
- lightly_studio/resolvers/video_frame_resolver/count_video_frames_annotations.py +83 -0
- lightly_studio/resolvers/video_frame_resolver/create_many.py +57 -0
- lightly_studio/resolvers/video_frame_resolver/get_all_by_dataset_id.py +63 -0
- lightly_studio/resolvers/video_frame_resolver/get_by_id.py +13 -0
- lightly_studio/resolvers/video_frame_resolver/get_table_fields_bounds.py +44 -0
- lightly_studio/resolvers/video_frame_resolver/video_frame_annotations_counter_filter.py +47 -0
- lightly_studio/resolvers/video_frame_resolver/video_frame_filter.py +57 -0
- lightly_studio/resolvers/video_resolver/__init__.py +27 -0
- lightly_studio/resolvers/video_resolver/count_video_frame_annotations_by_video_dataset.py +86 -0
- lightly_studio/resolvers/video_resolver/create_many.py +58 -0
- lightly_studio/resolvers/video_resolver/filter_new_paths.py +33 -0
- lightly_studio/resolvers/video_resolver/get_all_by_dataset_id.py +181 -0
- lightly_studio/resolvers/video_resolver/get_by_id.py +22 -0
- lightly_studio/resolvers/video_resolver/get_table_fields_bounds.py +72 -0
- lightly_studio/resolvers/video_resolver/get_view_by_id.py +52 -0
- lightly_studio/resolvers/video_resolver/video_count_annotations_filter.py +50 -0
- lightly_studio/resolvers/video_resolver/video_filter.py +98 -0
- lightly_studio/selection/__init__.py +1 -0
- lightly_studio/selection/mundig.py +143 -0
- lightly_studio/selection/select.py +203 -0
- lightly_studio/selection/select_via_db.py +273 -0
- lightly_studio/selection/selection_config.py +49 -0
- lightly_studio/services/annotations_service/__init__.py +33 -0
- lightly_studio/services/annotations_service/create_annotation.py +64 -0
- lightly_studio/services/annotations_service/delete_annotation.py +22 -0
- lightly_studio/services/annotations_service/get_annotation_by_id.py +31 -0
- lightly_studio/services/annotations_service/update_annotation.py +54 -0
- lightly_studio/services/annotations_service/update_annotation_bounding_box.py +36 -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 +59 -0
- lightly_studio/type_definitions.py +31 -0
- lightly_studio/utils/__init__.py +3 -0
- lightly_studio/utils/download.py +94 -0
- lightly_studio/vendor/__init__.py +1 -0
- lightly_studio/vendor/mobileclip/ACKNOWLEDGEMENTS +422 -0
- lightly_studio/vendor/mobileclip/LICENSE +31 -0
- lightly_studio/vendor/mobileclip/LICENSE_weights_data +50 -0
- lightly_studio/vendor/mobileclip/README.md +5 -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/vendor/perception_encoder/LICENSE.PE +201 -0
- lightly_studio/vendor/perception_encoder/README.md +11 -0
- lightly_studio/vendor/perception_encoder/vision_encoder/__init__.py +0 -0
- lightly_studio/vendor/perception_encoder/vision_encoder/bpe_simple_vocab_16e6.txt.gz +0 -0
- lightly_studio/vendor/perception_encoder/vision_encoder/config.py +205 -0
- lightly_studio/vendor/perception_encoder/vision_encoder/config_src.py +264 -0
- lightly_studio/vendor/perception_encoder/vision_encoder/pe.py +766 -0
- lightly_studio/vendor/perception_encoder/vision_encoder/rope.py +352 -0
- lightly_studio/vendor/perception_encoder/vision_encoder/tokenizer.py +347 -0
- lightly_studio/vendor/perception_encoder/vision_encoder/transforms.py +36 -0
- lightly_studio-0.4.6.dist-info/METADATA +88 -0
- lightly_studio-0.4.6.dist-info/RECORD +356 -0
- lightly_studio-0.4.6.dist-info/WHEEL +4 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"""GPS coordinate representation for complex metadata."""
|
|
2
|
+
|
|
3
|
+
from typing import Dict
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class GPSCoordinate:
|
|
7
|
+
"""Represents a GPS coordinate."""
|
|
8
|
+
|
|
9
|
+
def __init__(self, lat: float, lon: float):
|
|
10
|
+
"""Initialize GPS coordinate.
|
|
11
|
+
|
|
12
|
+
Args:
|
|
13
|
+
lat: Latitude in decimal degrees.
|
|
14
|
+
lon: Longitude in decimal degrees.
|
|
15
|
+
"""
|
|
16
|
+
self.lat = lat
|
|
17
|
+
self.lon = lon
|
|
18
|
+
|
|
19
|
+
def __repr__(self) -> str:
|
|
20
|
+
"""String representation of the GPS coordinate."""
|
|
21
|
+
return f"GPSCoordinate(lat={self.lat}, lon={self.lon})"
|
|
22
|
+
|
|
23
|
+
def as_dict(self) -> Dict[str, float]:
|
|
24
|
+
"""Convert the GPSCoordinate to a dictionary.
|
|
25
|
+
|
|
26
|
+
Returns:
|
|
27
|
+
Dictionary with 'lat' and 'lon' keys.
|
|
28
|
+
"""
|
|
29
|
+
return {"lat": self.lat, "lon": self.lon}
|
|
30
|
+
|
|
31
|
+
@classmethod
|
|
32
|
+
def from_dict(cls, data: Dict[str, float]) -> "GPSCoordinate":
|
|
33
|
+
"""Create a GPSCoordinate from a dictionary.
|
|
34
|
+
|
|
35
|
+
Args:
|
|
36
|
+
data: Dictionary with 'lat' and 'lon' keys.
|
|
37
|
+
|
|
38
|
+
Returns:
|
|
39
|
+
A GPSCoordinate instance.
|
|
40
|
+
"""
|
|
41
|
+
return cls(lat=data["lat"], lon=data["lon"])
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"""Protocol for complex metadata types that can be stored in JSON columns."""
|
|
2
|
+
|
|
3
|
+
from typing import Any, Dict, Protocol, runtime_checkable
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
@runtime_checkable
|
|
7
|
+
class ComplexMetadata(Protocol):
|
|
8
|
+
"""Protocol for complex types that can be serialized to/from JSON."""
|
|
9
|
+
|
|
10
|
+
def as_dict(self) -> Dict[str, Any]:
|
|
11
|
+
"""Convert the complex metadata to a dictionary for JSON storage."""
|
|
12
|
+
...
|
|
13
|
+
|
|
14
|
+
@classmethod
|
|
15
|
+
def from_dict(cls, data: Dict[str, Any]) -> "ComplexMetadata":
|
|
16
|
+
"""Create the complex metadata from a dictionary."""
|
|
17
|
+
...
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
File without changes
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
"""This module defines the base annotation model."""
|
|
2
|
+
|
|
3
|
+
from datetime import datetime, timezone
|
|
4
|
+
from enum import Enum
|
|
5
|
+
from typing import TYPE_CHECKING, List, Optional, Union
|
|
6
|
+
from uuid import UUID
|
|
7
|
+
|
|
8
|
+
from pydantic import BaseModel, ConfigDict
|
|
9
|
+
from pydantic import Field as PydanticField
|
|
10
|
+
from sqlalchemy.orm import Mapped
|
|
11
|
+
from sqlmodel import Field, Relationship, SQLModel
|
|
12
|
+
|
|
13
|
+
from lightly_studio.models.annotation.instance_segmentation import (
|
|
14
|
+
InstanceSegmentationAnnotationTable,
|
|
15
|
+
InstanceSegmentationAnnotationView,
|
|
16
|
+
)
|
|
17
|
+
from lightly_studio.models.annotation.links import AnnotationTagLinkTable
|
|
18
|
+
from lightly_studio.models.annotation.object_detection import (
|
|
19
|
+
ObjectDetectionAnnotationTable,
|
|
20
|
+
ObjectDetectionAnnotationView,
|
|
21
|
+
)
|
|
22
|
+
from lightly_studio.models.annotation.semantic_segmentation import (
|
|
23
|
+
SemanticSegmentationAnnotationTable,
|
|
24
|
+
SemanticSegmentationAnnotationView,
|
|
25
|
+
)
|
|
26
|
+
from lightly_studio.models.dataset import SampleType
|
|
27
|
+
from lightly_studio.models.sample import SampleTable
|
|
28
|
+
from lightly_studio.models.video import VideoFrameTable
|
|
29
|
+
|
|
30
|
+
if TYPE_CHECKING:
|
|
31
|
+
from lightly_studio.models.annotation_label import (
|
|
32
|
+
AnnotationLabelTable,
|
|
33
|
+
)
|
|
34
|
+
from lightly_studio.models.image import ImageTable
|
|
35
|
+
from lightly_studio.models.tag import TagTable
|
|
36
|
+
|
|
37
|
+
else:
|
|
38
|
+
TagTable = object
|
|
39
|
+
AnnotationLabelTable = object
|
|
40
|
+
ImageTable = object
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class AnnotationType(str, Enum):
|
|
44
|
+
"""The type of annotation task."""
|
|
45
|
+
|
|
46
|
+
CLASSIFICATION = "classification"
|
|
47
|
+
SEMANTIC_SEGMENTATION = "semantic_segmentation"
|
|
48
|
+
INSTANCE_SEGMENTATION = "instance_segmentation"
|
|
49
|
+
OBJECT_DETECTION = "object_detection"
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class AnnotationBaseTable(SQLModel, table=True):
|
|
53
|
+
"""Base class for all annotation models."""
|
|
54
|
+
|
|
55
|
+
__tablename__ = "annotation_base"
|
|
56
|
+
|
|
57
|
+
created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc), index=True)
|
|
58
|
+
|
|
59
|
+
sample_id: UUID = Field(foreign_key="sample.sample_id", primary_key=True)
|
|
60
|
+
annotation_type: AnnotationType
|
|
61
|
+
annotation_label_id: UUID = Field(foreign_key="annotation_label.annotation_label_id")
|
|
62
|
+
|
|
63
|
+
confidence: Optional[float] = None
|
|
64
|
+
parent_sample_id: UUID = Field(foreign_key="sample.sample_id")
|
|
65
|
+
|
|
66
|
+
annotation_label: Mapped["AnnotationLabelTable"] = Relationship(
|
|
67
|
+
sa_relationship_kwargs={"lazy": "select"},
|
|
68
|
+
)
|
|
69
|
+
sample: Mapped["SampleTable"] = Relationship(
|
|
70
|
+
sa_relationship_kwargs={
|
|
71
|
+
"lazy": "select",
|
|
72
|
+
"foreign_keys": "[AnnotationBaseTable.sample_id]",
|
|
73
|
+
},
|
|
74
|
+
)
|
|
75
|
+
parent_sample: Mapped[Optional["SampleTable"]] = Relationship(
|
|
76
|
+
back_populates="annotations",
|
|
77
|
+
sa_relationship_kwargs={
|
|
78
|
+
"lazy": "select",
|
|
79
|
+
"foreign_keys": "[AnnotationBaseTable.parent_sample_id]",
|
|
80
|
+
},
|
|
81
|
+
)
|
|
82
|
+
tags: Mapped[List["TagTable"]] = Relationship(
|
|
83
|
+
back_populates="annotations",
|
|
84
|
+
link_model=AnnotationTagLinkTable,
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
""" Details about object detection. """
|
|
88
|
+
object_detection_details: Mapped[Optional["ObjectDetectionAnnotationTable"]] = Relationship(
|
|
89
|
+
back_populates="annotation_base",
|
|
90
|
+
sa_relationship_kwargs={"lazy": "select"},
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
""" Details about instance segmentation. """
|
|
94
|
+
instance_segmentation_details: Mapped[Optional["InstanceSegmentationAnnotationTable"]] = (
|
|
95
|
+
Relationship(
|
|
96
|
+
back_populates="annotation_base",
|
|
97
|
+
sa_relationship_kwargs={"lazy": "select"},
|
|
98
|
+
)
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
""" Details about semantic segmentation. """
|
|
102
|
+
semantic_segmentation_details: Mapped[Optional["SemanticSegmentationAnnotationTable"]] = (
|
|
103
|
+
Relationship(
|
|
104
|
+
back_populates="annotation_base",
|
|
105
|
+
sa_relationship_kwargs={"lazy": "select"},
|
|
106
|
+
)
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
class AnnotationCreate(SQLModel):
|
|
111
|
+
"""Input model for creating annotations."""
|
|
112
|
+
|
|
113
|
+
""" Required properties for all annotations. """
|
|
114
|
+
annotation_label_id: UUID
|
|
115
|
+
annotation_type: AnnotationType
|
|
116
|
+
confidence: Optional[float] = None
|
|
117
|
+
parent_sample_id: UUID
|
|
118
|
+
|
|
119
|
+
""" Optional properties for object detection. """
|
|
120
|
+
x: Optional[int] = None
|
|
121
|
+
y: Optional[int] = None
|
|
122
|
+
width: Optional[int] = None
|
|
123
|
+
height: Optional[int] = None
|
|
124
|
+
|
|
125
|
+
""" Optional properties for instance and semantic segmentation. """
|
|
126
|
+
segmentation_mask: Optional[List[int]] = None
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
class AnnotationView(BaseModel):
|
|
130
|
+
"""Response model for bounding box annotation."""
|
|
131
|
+
|
|
132
|
+
model_config = ConfigDict(populate_by_name=True, from_attributes=True)
|
|
133
|
+
|
|
134
|
+
class AnnotationLabel(SQLModel):
|
|
135
|
+
"""Model used when retrieving an annotation label."""
|
|
136
|
+
|
|
137
|
+
annotation_label_name: str
|
|
138
|
+
|
|
139
|
+
class AnnotationViewTag(SQLModel):
|
|
140
|
+
"""Tag view inside Annotation view."""
|
|
141
|
+
|
|
142
|
+
tag_id: UUID
|
|
143
|
+
name: str
|
|
144
|
+
|
|
145
|
+
parent_sample_id: UUID
|
|
146
|
+
sample_id: UUID
|
|
147
|
+
annotation_type: AnnotationType
|
|
148
|
+
annotation_label: AnnotationLabel
|
|
149
|
+
confidence: Optional[float] = None
|
|
150
|
+
created_at: datetime
|
|
151
|
+
|
|
152
|
+
object_detection_details: Optional[ObjectDetectionAnnotationView] = None
|
|
153
|
+
instance_segmentation_details: Optional[InstanceSegmentationAnnotationView] = None
|
|
154
|
+
semantic_segmentation_details: Optional[SemanticSegmentationAnnotationView] = None
|
|
155
|
+
|
|
156
|
+
tags: List[AnnotationViewTag] = []
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
class AnnotationViewsWithCount(BaseModel):
|
|
160
|
+
"""Response model for counted annotations."""
|
|
161
|
+
|
|
162
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
163
|
+
|
|
164
|
+
annotations: List[AnnotationView] = PydanticField(..., alias="data")
|
|
165
|
+
total_count: int
|
|
166
|
+
next_cursor: Optional[int] = PydanticField(..., alias="nextCursor")
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
class SampleAnnotationView(BaseModel):
|
|
170
|
+
"""Response model for sample annotation view."""
|
|
171
|
+
|
|
172
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
173
|
+
|
|
174
|
+
dataset_id: UUID
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
class ImageAnnotationView(BaseModel):
|
|
178
|
+
"""Response model for image annotation view."""
|
|
179
|
+
|
|
180
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
181
|
+
|
|
182
|
+
sample_id: UUID
|
|
183
|
+
file_path_abs: str
|
|
184
|
+
width: int
|
|
185
|
+
height: int
|
|
186
|
+
sample: SampleAnnotationView
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
class VideoAnnotationView(BaseModel):
|
|
190
|
+
"""Response model for video view."""
|
|
191
|
+
|
|
192
|
+
height: int
|
|
193
|
+
width: int
|
|
194
|
+
file_path_abs: str
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
class VideoFrameAnnotationView(BaseModel):
|
|
198
|
+
"""Response model for video frame annotation view."""
|
|
199
|
+
|
|
200
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
201
|
+
|
|
202
|
+
sample_id: UUID
|
|
203
|
+
video: VideoAnnotationView
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
class AnnotationWithPayloadView(BaseModel):
|
|
207
|
+
"""Response model for annotation with payload."""
|
|
208
|
+
|
|
209
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
210
|
+
|
|
211
|
+
parent_sample_type: SampleType
|
|
212
|
+
annotation: AnnotationView
|
|
213
|
+
parent_sample_data: Union[ImageAnnotationView, VideoFrameAnnotationView]
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
class AnnotationWithPayloadAndCountView(BaseModel):
|
|
217
|
+
"""Response model for counted annotations with payload."""
|
|
218
|
+
|
|
219
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
220
|
+
|
|
221
|
+
annotations: List[AnnotationWithPayloadView] = PydanticField(..., alias="data")
|
|
222
|
+
total_count: int
|
|
223
|
+
next_cursor: Optional[int] = PydanticField(None, alias="nextCursor")
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
class SampleAnnotationDetailsView(BaseModel):
|
|
227
|
+
"""Response model for sample annotation details view."""
|
|
228
|
+
|
|
229
|
+
sample_id: UUID
|
|
230
|
+
dataset_id: UUID
|
|
231
|
+
tags: List["TagTable"] = []
|
|
232
|
+
|
|
233
|
+
@classmethod
|
|
234
|
+
def from_sample_table(cls, sample: SampleTable) -> "SampleAnnotationDetailsView":
|
|
235
|
+
"""Convert sample table to sample annotation details view."""
|
|
236
|
+
return SampleAnnotationDetailsView(
|
|
237
|
+
sample_id=sample.sample_id,
|
|
238
|
+
tags=sample.tags,
|
|
239
|
+
dataset_id=sample.dataset_id,
|
|
240
|
+
)
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
class ImageAnnotationDetailsView(BaseModel):
|
|
244
|
+
"""Response model for image annotation details view."""
|
|
245
|
+
|
|
246
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
247
|
+
|
|
248
|
+
file_path_abs: str
|
|
249
|
+
file_name: str
|
|
250
|
+
width: int
|
|
251
|
+
height: int
|
|
252
|
+
sample: SampleAnnotationDetailsView
|
|
253
|
+
|
|
254
|
+
@classmethod
|
|
255
|
+
def from_image_table(cls, image: ImageTable) -> "ImageAnnotationDetailsView":
|
|
256
|
+
"""Convert image table to image annotation details view."""
|
|
257
|
+
return ImageAnnotationDetailsView(
|
|
258
|
+
height=image.height,
|
|
259
|
+
width=image.width,
|
|
260
|
+
file_path_abs=image.file_path_abs,
|
|
261
|
+
file_name=image.file_name,
|
|
262
|
+
sample=SampleAnnotationDetailsView.from_sample_table(image.sample),
|
|
263
|
+
)
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
class VideoFrameAnnotationDetailsView(BaseModel):
|
|
267
|
+
"""Response model for video frame annotation view."""
|
|
268
|
+
|
|
269
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
270
|
+
|
|
271
|
+
sample_id: UUID
|
|
272
|
+
frame_number: int
|
|
273
|
+
frame_timestamp_s: float
|
|
274
|
+
|
|
275
|
+
video: VideoAnnotationView
|
|
276
|
+
sample: SampleAnnotationDetailsView
|
|
277
|
+
|
|
278
|
+
@classmethod
|
|
279
|
+
def from_video_frame_table(
|
|
280
|
+
cls, video_frame: VideoFrameTable
|
|
281
|
+
) -> "VideoFrameAnnotationDetailsView":
|
|
282
|
+
"""Convert video frame table to video frame annotation details view."""
|
|
283
|
+
return VideoFrameAnnotationDetailsView(
|
|
284
|
+
sample_id=video_frame.sample_id,
|
|
285
|
+
frame_number=video_frame.frame_number,
|
|
286
|
+
frame_timestamp_s=video_frame.frame_timestamp_s,
|
|
287
|
+
video=VideoAnnotationView(
|
|
288
|
+
width=video_frame.video.width,
|
|
289
|
+
height=video_frame.video.height,
|
|
290
|
+
file_path_abs=video_frame.video.file_path_abs,
|
|
291
|
+
),
|
|
292
|
+
sample=SampleAnnotationDetailsView.from_sample_table(video_frame.sample),
|
|
293
|
+
)
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
class AnnotationDetailsWithPayloadView(BaseModel):
|
|
297
|
+
"""Response model for annotation details with payload."""
|
|
298
|
+
|
|
299
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
300
|
+
|
|
301
|
+
parent_sample_type: SampleType
|
|
302
|
+
annotation: AnnotationView
|
|
303
|
+
parent_sample_data: Union[ImageAnnotationDetailsView, VideoFrameAnnotationDetailsView]
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"""Instance segmentation annotation models.
|
|
2
|
+
|
|
3
|
+
Instance segmentation combines object detection and semantic segmentation,
|
|
4
|
+
identifying objects and providing pixel-level masks for each instance.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import TYPE_CHECKING, List, Optional
|
|
8
|
+
from uuid import UUID, uuid4
|
|
9
|
+
|
|
10
|
+
from sqlalchemy import ARRAY, Column, Integer
|
|
11
|
+
from sqlalchemy.orm import Mapped
|
|
12
|
+
from sqlmodel import Field, Relationship, SQLModel
|
|
13
|
+
|
|
14
|
+
if TYPE_CHECKING:
|
|
15
|
+
from lightly_studio.models.annotation.annotation_base import (
|
|
16
|
+
AnnotationBaseTable,
|
|
17
|
+
)
|
|
18
|
+
else:
|
|
19
|
+
AnnotationBaseTable = object
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class InstanceSegmentationAnnotationTable(SQLModel, table=True):
|
|
23
|
+
"""Database table model for instance segmentation annotations."""
|
|
24
|
+
|
|
25
|
+
__tablename__ = "instance_segmentation_annotation"
|
|
26
|
+
|
|
27
|
+
sample_id: UUID = Field(
|
|
28
|
+
default_factory=uuid4,
|
|
29
|
+
primary_key=True,
|
|
30
|
+
foreign_key="annotation_base.sample_id",
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
annotation_base: Mapped["AnnotationBaseTable"] = Relationship(
|
|
34
|
+
back_populates="instance_segmentation_details"
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
x: int
|
|
38
|
+
y: int
|
|
39
|
+
width: int
|
|
40
|
+
height: int
|
|
41
|
+
# TODO(Kondrat 06/2025): We need to fix logic in the loader,
|
|
42
|
+
# because it shouldn't be optional.
|
|
43
|
+
# lightly_studio/dataset/loader.py#L148
|
|
44
|
+
segmentation_mask: Optional[List[int]] = Field(
|
|
45
|
+
default=None, sa_column=Column(ARRAY(Integer), nullable=True)
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class InstanceSegmentationAnnotationView(SQLModel):
|
|
50
|
+
"""API response model for instance segmentation annotations."""
|
|
51
|
+
|
|
52
|
+
x: int
|
|
53
|
+
y: int
|
|
54
|
+
width: int
|
|
55
|
+
height: int
|
|
56
|
+
segmentation_mask: Optional[List[int]] = None
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"""This module defines the base annotation model."""
|
|
2
|
+
|
|
3
|
+
from typing import Optional
|
|
4
|
+
from uuid import UUID
|
|
5
|
+
|
|
6
|
+
from sqlmodel import Field, SQLModel
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class AnnotationTagLinkTable(SQLModel, table=True):
|
|
10
|
+
"""Model defines the link table between annotations and tags."""
|
|
11
|
+
|
|
12
|
+
annotation_sample_id: Optional[UUID] = Field(
|
|
13
|
+
default=None,
|
|
14
|
+
foreign_key="annotation_base.sample_id",
|
|
15
|
+
primary_key=True,
|
|
16
|
+
)
|
|
17
|
+
tag_id: Optional[UUID] = Field(default=None, foreign_key="tag.tag_id", primary_key=True)
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"""Object detection annotation models.
|
|
2
|
+
|
|
3
|
+
Object detection identifies and locates objects in images using bounding boxes.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from typing import TYPE_CHECKING
|
|
7
|
+
from uuid import UUID, uuid4
|
|
8
|
+
|
|
9
|
+
from sqlalchemy.orm import Mapped
|
|
10
|
+
from sqlmodel import Field, Relationship, SQLModel
|
|
11
|
+
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from lightly_studio.models.annotation.annotation_base import (
|
|
14
|
+
AnnotationBaseTable,
|
|
15
|
+
)
|
|
16
|
+
else:
|
|
17
|
+
AnnotationBaseTable = object
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class ObjectDetectionAnnotationTable(SQLModel, table=True):
|
|
21
|
+
"""Database table model for object detection annotations."""
|
|
22
|
+
|
|
23
|
+
__tablename__ = "object_detection_annotation"
|
|
24
|
+
|
|
25
|
+
sample_id: UUID = Field(
|
|
26
|
+
default_factory=uuid4,
|
|
27
|
+
primary_key=True,
|
|
28
|
+
foreign_key="annotation_base.sample_id",
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
annotation_base: Mapped["AnnotationBaseTable"] = Relationship(
|
|
32
|
+
back_populates="object_detection_details"
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
x: int
|
|
36
|
+
y: int
|
|
37
|
+
width: int
|
|
38
|
+
height: int
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class ObjectDetectionAnnotationView(SQLModel):
|
|
42
|
+
"""API response model for object detection annotations."""
|
|
43
|
+
|
|
44
|
+
x: float
|
|
45
|
+
y: float
|
|
46
|
+
width: float
|
|
47
|
+
height: float
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"""This module defines the semantic segmentation annotation model.
|
|
2
|
+
|
|
3
|
+
Semantic segmentation is a computer vision task that assigns a class label to
|
|
4
|
+
each pixel in an image. This module provides the data models for storing and
|
|
5
|
+
managing semantic segmentation annotations.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from typing import TYPE_CHECKING, List
|
|
9
|
+
from uuid import UUID, uuid4
|
|
10
|
+
|
|
11
|
+
from sqlalchemy import ARRAY, Column, Integer
|
|
12
|
+
from sqlalchemy.orm import Mapped
|
|
13
|
+
from sqlmodel import Field, Relationship, SQLModel
|
|
14
|
+
|
|
15
|
+
if TYPE_CHECKING:
|
|
16
|
+
from lightly_studio.models.annotation.annotation_base import (
|
|
17
|
+
AnnotationBaseTable,
|
|
18
|
+
)
|
|
19
|
+
else:
|
|
20
|
+
AnnotationBaseTable = object
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class SemanticSegmentationAnnotationTable(SQLModel, table=True):
|
|
24
|
+
"""Model used to define semantic segmentation annotation table."""
|
|
25
|
+
|
|
26
|
+
__tablename__ = "semantic_segmentation_annotation"
|
|
27
|
+
|
|
28
|
+
sample_id: UUID = Field(
|
|
29
|
+
default_factory=uuid4,
|
|
30
|
+
primary_key=True,
|
|
31
|
+
foreign_key="annotation_base.sample_id",
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
segmentation_mask: List[int] = Field(sa_column=Column(ARRAY(Integer), nullable=True))
|
|
35
|
+
|
|
36
|
+
annotation_base: Mapped["AnnotationBaseTable"] = Relationship(
|
|
37
|
+
back_populates="semantic_segmentation_details"
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class SemanticSegmentationAnnotationView(SQLModel):
|
|
42
|
+
"""Response model for semantic segmentation annotation."""
|
|
43
|
+
|
|
44
|
+
segmentation_mask: List[int]
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"""This module defines the AnnotationLabel model for the application."""
|
|
2
|
+
|
|
3
|
+
from datetime import datetime, timezone
|
|
4
|
+
from typing import TYPE_CHECKING, List
|
|
5
|
+
from uuid import UUID, uuid4
|
|
6
|
+
|
|
7
|
+
from sqlalchemy.orm import Mapped
|
|
8
|
+
from sqlmodel import Field, Relationship, SQLModel
|
|
9
|
+
|
|
10
|
+
if TYPE_CHECKING:
|
|
11
|
+
from lightly_studio.models.annotation.annotation_base import (
|
|
12
|
+
AnnotationBaseTable,
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
else:
|
|
16
|
+
AnnotationBaseTable = object
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class AnnotationLabelBase(SQLModel):
|
|
20
|
+
"""Base class for the AnnotationLabel model."""
|
|
21
|
+
|
|
22
|
+
annotation_label_name: str = Field(unique=True)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class AnnotationLabelCreate(AnnotationLabelBase):
|
|
26
|
+
"""Model used when creating an annotation label."""
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class AnnotationLabelView(AnnotationLabelBase):
|
|
30
|
+
"""Model used when retrieving an annotation label."""
|
|
31
|
+
|
|
32
|
+
annotation_label_id: UUID
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class AnnotationLabelTable(AnnotationLabelBase, table=True):
|
|
36
|
+
"""This class defines the AnnotationLabel model."""
|
|
37
|
+
|
|
38
|
+
__tablename__ = "annotation_label"
|
|
39
|
+
|
|
40
|
+
annotation_label_id: UUID = Field(default_factory=uuid4, primary_key=True)
|
|
41
|
+
created_at: str = Field(
|
|
42
|
+
default_factory=lambda: datetime.now(timezone.utc),
|
|
43
|
+
index=True,
|
|
44
|
+
)
|
|
45
|
+
annotations: Mapped[List["AnnotationBaseTable"]] = Relationship(
|
|
46
|
+
back_populates="annotation_label",
|
|
47
|
+
)
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"""This module defines the caption model."""
|
|
2
|
+
|
|
3
|
+
from datetime import datetime, timezone
|
|
4
|
+
from uuid import UUID
|
|
5
|
+
|
|
6
|
+
from sqlalchemy.orm import Mapped
|
|
7
|
+
from sqlmodel import Field, Relationship, SQLModel
|
|
8
|
+
|
|
9
|
+
from lightly_studio.models.sample import SampleTable
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class CaptionTable(SQLModel, table=True):
|
|
13
|
+
"""Class for caption model."""
|
|
14
|
+
|
|
15
|
+
__tablename__ = "caption"
|
|
16
|
+
|
|
17
|
+
sample_id: UUID = Field(foreign_key="sample.sample_id", primary_key=True)
|
|
18
|
+
parent_sample_id: UUID = Field(foreign_key="sample.sample_id")
|
|
19
|
+
created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc), index=True)
|
|
20
|
+
text: str
|
|
21
|
+
|
|
22
|
+
sample: Mapped["SampleTable"] = Relationship(
|
|
23
|
+
sa_relationship_kwargs={
|
|
24
|
+
"lazy": "select",
|
|
25
|
+
"foreign_keys": "[CaptionTable.sample_id]",
|
|
26
|
+
},
|
|
27
|
+
)
|
|
28
|
+
parent_sample: Mapped["SampleTable"] = Relationship(
|
|
29
|
+
back_populates="captions",
|
|
30
|
+
sa_relationship_kwargs={
|
|
31
|
+
"lazy": "select",
|
|
32
|
+
"foreign_keys": "[CaptionTable.parent_sample_id]",
|
|
33
|
+
},
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class CaptionCreate(SQLModel):
|
|
38
|
+
"""Input model for creating captions."""
|
|
39
|
+
|
|
40
|
+
parent_sample_id: UUID
|
|
41
|
+
text: str
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class CaptionView(SQLModel):
|
|
45
|
+
"""Response model for caption."""
|
|
46
|
+
|
|
47
|
+
parent_sample_id: UUID
|
|
48
|
+
sample_id: UUID
|
|
49
|
+
text: str
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"""This module defines the data model for the classifier."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from uuid import UUID
|
|
6
|
+
|
|
7
|
+
from pydantic import BaseModel
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class EmbeddingClassifier(BaseModel):
|
|
11
|
+
"""Base class for the Classifier model."""
|
|
12
|
+
|
|
13
|
+
"""The name of the classifier."""
|
|
14
|
+
classifier_name: str
|
|
15
|
+
|
|
16
|
+
"""The ID of the classifier."""
|
|
17
|
+
classifier_id: UUID
|
|
18
|
+
|
|
19
|
+
"""List of classes supported by the classifier."""
|
|
20
|
+
class_list: list[str]
|