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.
Files changed (356) hide show
  1. lightly_studio/__init__.py +12 -0
  2. lightly_studio/api/__init__.py +0 -0
  3. lightly_studio/api/app.py +131 -0
  4. lightly_studio/api/cache.py +77 -0
  5. lightly_studio/api/db_tables.py +35 -0
  6. lightly_studio/api/features.py +5 -0
  7. lightly_studio/api/routes/api/annotation.py +305 -0
  8. lightly_studio/api/routes/api/annotation_label.py +87 -0
  9. lightly_studio/api/routes/api/annotations/__init__.py +7 -0
  10. lightly_studio/api/routes/api/annotations/create_annotation.py +52 -0
  11. lightly_studio/api/routes/api/caption.py +100 -0
  12. lightly_studio/api/routes/api/classifier.py +384 -0
  13. lightly_studio/api/routes/api/dataset.py +191 -0
  14. lightly_studio/api/routes/api/dataset_tag.py +266 -0
  15. lightly_studio/api/routes/api/embeddings2d.py +90 -0
  16. lightly_studio/api/routes/api/exceptions.py +114 -0
  17. lightly_studio/api/routes/api/export.py +114 -0
  18. lightly_studio/api/routes/api/features.py +17 -0
  19. lightly_studio/api/routes/api/frame.py +241 -0
  20. lightly_studio/api/routes/api/image.py +155 -0
  21. lightly_studio/api/routes/api/metadata.py +161 -0
  22. lightly_studio/api/routes/api/operator.py +75 -0
  23. lightly_studio/api/routes/api/sample.py +103 -0
  24. lightly_studio/api/routes/api/selection.py +87 -0
  25. lightly_studio/api/routes/api/settings.py +41 -0
  26. lightly_studio/api/routes/api/status.py +19 -0
  27. lightly_studio/api/routes/api/text_embedding.py +50 -0
  28. lightly_studio/api/routes/api/validators.py +17 -0
  29. lightly_studio/api/routes/api/video.py +133 -0
  30. lightly_studio/api/routes/healthz.py +13 -0
  31. lightly_studio/api/routes/images.py +104 -0
  32. lightly_studio/api/routes/video_frames_media.py +116 -0
  33. lightly_studio/api/routes/video_media.py +223 -0
  34. lightly_studio/api/routes/webapp.py +51 -0
  35. lightly_studio/api/server.py +94 -0
  36. lightly_studio/core/__init__.py +0 -0
  37. lightly_studio/core/add_samples.py +533 -0
  38. lightly_studio/core/add_videos.py +294 -0
  39. lightly_studio/core/dataset.py +780 -0
  40. lightly_studio/core/dataset_query/__init__.py +14 -0
  41. lightly_studio/core/dataset_query/boolean_expression.py +67 -0
  42. lightly_studio/core/dataset_query/dataset_query.py +317 -0
  43. lightly_studio/core/dataset_query/field.py +113 -0
  44. lightly_studio/core/dataset_query/field_expression.py +79 -0
  45. lightly_studio/core/dataset_query/match_expression.py +23 -0
  46. lightly_studio/core/dataset_query/order_by.py +79 -0
  47. lightly_studio/core/dataset_query/sample_field.py +37 -0
  48. lightly_studio/core/dataset_query/tags_expression.py +46 -0
  49. lightly_studio/core/image_sample.py +36 -0
  50. lightly_studio/core/loading_log.py +56 -0
  51. lightly_studio/core/sample.py +291 -0
  52. lightly_studio/core/start_gui.py +54 -0
  53. lightly_studio/core/video_sample.py +38 -0
  54. lightly_studio/dataset/__init__.py +0 -0
  55. lightly_studio/dataset/edge_embedding_generator.py +155 -0
  56. lightly_studio/dataset/embedding_generator.py +129 -0
  57. lightly_studio/dataset/embedding_manager.py +349 -0
  58. lightly_studio/dataset/env.py +20 -0
  59. lightly_studio/dataset/file_utils.py +49 -0
  60. lightly_studio/dataset/fsspec_lister.py +275 -0
  61. lightly_studio/dataset/mobileclip_embedding_generator.py +158 -0
  62. lightly_studio/dataset/perception_encoder_embedding_generator.py +260 -0
  63. lightly_studio/db_manager.py +166 -0
  64. lightly_studio/dist_lightly_studio_view_app/_app/env.js +1 -0
  65. lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/0.GcXvs2l7.css +1 -0
  66. lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/12.Dx6SXgAb.css +1 -0
  67. lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/17.9X9_k6TP.css +1 -0
  68. lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/18.BxiimdIO.css +1 -0
  69. lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/2.CkOblLn7.css +1 -0
  70. lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/ClassifierSamplesGrid.BJbCDlvs.css +1 -0
  71. lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/LightlyLogo.BNjCIww-.png +0 -0
  72. lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/OpenSans-Bold.DGvYQtcs.ttf +0 -0
  73. lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/OpenSans-Italic-VariableFont_wdth_wght.B4AZ-wl6.ttf +0 -0
  74. lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/OpenSans-Medium.DVUZMR_6.ttf +0 -0
  75. lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/OpenSans-Regular.DxJTClRG.ttf +0 -0
  76. lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/OpenSans-SemiBold.D3TTYgdB.ttf +0 -0
  77. lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/OpenSans-VariableFont_wdth_wght.BZBpG5Iz.ttf +0 -0
  78. lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/_layout.CefECEWA.css +1 -0
  79. lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/_layout.D5tDcjY-.css +1 -0
  80. lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/_page.9X9_k6TP.css +1 -0
  81. lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/_page.BxiimdIO.css +1 -0
  82. lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/_page.Dx6SXgAb.css +1 -0
  83. lightly_studio/dist_lightly_studio_view_app/_app/immutable/assets/transform._-1mPSEI.css +1 -0
  84. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/0dDyq72A.js +20 -0
  85. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/69_IOA4Y.js +1 -0
  86. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/BK4An2kI.js +1 -0
  87. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/BRmB-kJ9.js +1 -0
  88. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/B_1cpokE.js +1 -0
  89. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/BiqpDEr0.js +1 -0
  90. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/BpLiSKgx.js +1 -0
  91. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/BscxbINH.js +39 -0
  92. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/C1FmrZbK.js +1 -0
  93. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/C80h3dJx.js +1 -0
  94. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/C8mfFM-u.js +2 -0
  95. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CGY1p9L4.js +517 -0
  96. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/COfLknXM.js +1 -0
  97. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CWj6FrbW.js +1 -0
  98. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CYgJF_JY.js +1 -0
  99. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CmLg0ys7.js +1 -0
  100. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/CvGjimpO.js +1 -0
  101. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/D3RDXHoj.js +39 -0
  102. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/D4y7iiT3.js +1 -0
  103. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/D9SC3jBb.js +1 -0
  104. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DCuAdx1Q.js +20 -0
  105. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DDBy-_jD.js +1 -0
  106. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DIeogL5L.js +1 -0
  107. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DL9a7v5o.js +1 -0
  108. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DSKECuqX.js +39 -0
  109. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/D_FFv0Oe.js +1 -0
  110. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DiZ5o5vz.js +1 -0
  111. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DkbXUtyG.js +1 -0
  112. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DmK2hulV.js +1 -0
  113. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DqnHaLTj.js +1 -0
  114. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DtWZc_tl.js +1 -0
  115. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DuUalyFS.js +1 -0
  116. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/DwIonDAZ.js +1 -0
  117. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/Il-mSPmK.js +1 -0
  118. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/KNLP4aJU.js +1 -0
  119. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/KjYeVjkE.js +1 -0
  120. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/MErlcOXj.js +1 -0
  121. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/VRI4prUD.js +1 -0
  122. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/VYb2dkNs.js +1 -0
  123. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/VqWvU2yF.js +1 -0
  124. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/dHC3otuL.js +1 -0
  125. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/da7Oy_lO.js +1 -0
  126. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/eAy8rZzC.js +2 -0
  127. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/erjNR5MX.js +1 -0
  128. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/f1oG3eFE.js +1 -0
  129. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/rsLi1iKv.js +20 -0
  130. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/rwuuBP9f.js +1 -0
  131. lightly_studio/dist_lightly_studio_view_app/_app/immutable/chunks/xGHZQ1pe.js +3 -0
  132. lightly_studio/dist_lightly_studio_view_app/_app/immutable/entry/app.DrTRUgT3.js +2 -0
  133. lightly_studio/dist_lightly_studio_view_app/_app/immutable/entry/start.BK5EOJl2.js +1 -0
  134. lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/0.CIvTuljF.js +4 -0
  135. lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/1.UBvSzxdA.js +1 -0
  136. lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/10.CQ_tiLJa.js +1 -0
  137. lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/11.KqkAcaxW.js +1 -0
  138. lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/12.DoYsmxQc.js +1 -0
  139. lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/13.571n2LZA.js +1 -0
  140. lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/14.DGs689M-.js +1 -0
  141. lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/15.CWG1ehzT.js +1 -0
  142. lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/16.Dpq6jbSh.js +1 -0
  143. lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/17.B5AZbHUU.js +1 -0
  144. lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/18.CBga8cnq.js +1 -0
  145. lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/2.D2HXgz-8.js +1090 -0
  146. lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/3.f4HAg-y3.js +1 -0
  147. lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/4.BKF4xuKQ.js +1 -0
  148. lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/5.BAE0Pm_f.js +39 -0
  149. lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/6.CouWWpzA.js +1 -0
  150. lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/7.UBHT0ktp.js +1 -0
  151. lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/8.FiYNElcc.js +1 -0
  152. lightly_studio/dist_lightly_studio_view_app/_app/immutable/nodes/9.B3-UaT23.js +1 -0
  153. lightly_studio/dist_lightly_studio_view_app/_app/immutable/workers/clustering.worker-DKqeLtG0.js +2 -0
  154. lightly_studio/dist_lightly_studio_view_app/_app/immutable/workers/search.worker-vNSty3B0.js +1 -0
  155. lightly_studio/dist_lightly_studio_view_app/_app/version.json +1 -0
  156. lightly_studio/dist_lightly_studio_view_app/apple-touch-icon-precomposed.png +0 -0
  157. lightly_studio/dist_lightly_studio_view_app/apple-touch-icon.png +0 -0
  158. lightly_studio/dist_lightly_studio_view_app/favicon.png +0 -0
  159. lightly_studio/dist_lightly_studio_view_app/index.html +45 -0
  160. lightly_studio/errors.py +5 -0
  161. lightly_studio/examples/example.py +25 -0
  162. lightly_studio/examples/example_coco.py +27 -0
  163. lightly_studio/examples/example_coco_caption.py +29 -0
  164. lightly_studio/examples/example_metadata.py +369 -0
  165. lightly_studio/examples/example_operators.py +111 -0
  166. lightly_studio/examples/example_selection.py +28 -0
  167. lightly_studio/examples/example_split_work.py +48 -0
  168. lightly_studio/examples/example_video.py +22 -0
  169. lightly_studio/examples/example_video_annotations.py +157 -0
  170. lightly_studio/examples/example_yolo.py +22 -0
  171. lightly_studio/export/coco_captions.py +69 -0
  172. lightly_studio/export/export_dataset.py +104 -0
  173. lightly_studio/export/lightly_studio_label_input.py +120 -0
  174. lightly_studio/export_schema.py +18 -0
  175. lightly_studio/export_version.py +57 -0
  176. lightly_studio/few_shot_classifier/__init__.py +0 -0
  177. lightly_studio/few_shot_classifier/classifier.py +80 -0
  178. lightly_studio/few_shot_classifier/classifier_manager.py +644 -0
  179. lightly_studio/few_shot_classifier/random_forest_classifier.py +495 -0
  180. lightly_studio/metadata/complex_metadata.py +47 -0
  181. lightly_studio/metadata/compute_similarity.py +84 -0
  182. lightly_studio/metadata/compute_typicality.py +67 -0
  183. lightly_studio/metadata/gps_coordinate.py +41 -0
  184. lightly_studio/metadata/metadata_protocol.py +17 -0
  185. lightly_studio/models/__init__.py +1 -0
  186. lightly_studio/models/annotation/__init__.py +0 -0
  187. lightly_studio/models/annotation/annotation_base.py +303 -0
  188. lightly_studio/models/annotation/instance_segmentation.py +56 -0
  189. lightly_studio/models/annotation/links.py +17 -0
  190. lightly_studio/models/annotation/object_detection.py +47 -0
  191. lightly_studio/models/annotation/semantic_segmentation.py +44 -0
  192. lightly_studio/models/annotation_label.py +47 -0
  193. lightly_studio/models/caption.py +49 -0
  194. lightly_studio/models/classifier.py +20 -0
  195. lightly_studio/models/dataset.py +70 -0
  196. lightly_studio/models/embedding_model.py +30 -0
  197. lightly_studio/models/image.py +96 -0
  198. lightly_studio/models/metadata.py +208 -0
  199. lightly_studio/models/range.py +17 -0
  200. lightly_studio/models/sample.py +154 -0
  201. lightly_studio/models/sample_embedding.py +36 -0
  202. lightly_studio/models/settings.py +69 -0
  203. lightly_studio/models/tag.py +96 -0
  204. lightly_studio/models/two_dim_embedding.py +16 -0
  205. lightly_studio/models/video.py +161 -0
  206. lightly_studio/plugins/__init__.py +0 -0
  207. lightly_studio/plugins/base_operator.py +60 -0
  208. lightly_studio/plugins/operator_registry.py +47 -0
  209. lightly_studio/plugins/parameter.py +70 -0
  210. lightly_studio/py.typed +0 -0
  211. lightly_studio/resolvers/__init__.py +0 -0
  212. lightly_studio/resolvers/annotation_label_resolver/__init__.py +22 -0
  213. lightly_studio/resolvers/annotation_label_resolver/create.py +27 -0
  214. lightly_studio/resolvers/annotation_label_resolver/delete.py +28 -0
  215. lightly_studio/resolvers/annotation_label_resolver/get_all.py +37 -0
  216. lightly_studio/resolvers/annotation_label_resolver/get_by_id.py +24 -0
  217. lightly_studio/resolvers/annotation_label_resolver/get_by_ids.py +25 -0
  218. lightly_studio/resolvers/annotation_label_resolver/get_by_label_name.py +24 -0
  219. lightly_studio/resolvers/annotation_label_resolver/names_by_ids.py +25 -0
  220. lightly_studio/resolvers/annotation_label_resolver/update.py +38 -0
  221. lightly_studio/resolvers/annotation_resolver/__init__.py +40 -0
  222. lightly_studio/resolvers/annotation_resolver/count_annotations_by_dataset.py +129 -0
  223. lightly_studio/resolvers/annotation_resolver/create_many.py +124 -0
  224. lightly_studio/resolvers/annotation_resolver/delete_annotation.py +87 -0
  225. lightly_studio/resolvers/annotation_resolver/delete_annotations.py +60 -0
  226. lightly_studio/resolvers/annotation_resolver/get_all.py +85 -0
  227. lightly_studio/resolvers/annotation_resolver/get_all_with_payload.py +179 -0
  228. lightly_studio/resolvers/annotation_resolver/get_by_id.py +34 -0
  229. lightly_studio/resolvers/annotation_resolver/get_by_id_with_payload.py +130 -0
  230. lightly_studio/resolvers/annotation_resolver/update_annotation_label.py +142 -0
  231. lightly_studio/resolvers/annotation_resolver/update_bounding_box.py +68 -0
  232. lightly_studio/resolvers/annotations/__init__.py +1 -0
  233. lightly_studio/resolvers/annotations/annotations_filter.py +88 -0
  234. lightly_studio/resolvers/caption_resolver.py +129 -0
  235. lightly_studio/resolvers/dataset_resolver/__init__.py +55 -0
  236. lightly_studio/resolvers/dataset_resolver/check_dataset_type.py +29 -0
  237. lightly_studio/resolvers/dataset_resolver/create.py +20 -0
  238. lightly_studio/resolvers/dataset_resolver/delete.py +20 -0
  239. lightly_studio/resolvers/dataset_resolver/export.py +267 -0
  240. lightly_studio/resolvers/dataset_resolver/get_all.py +19 -0
  241. lightly_studio/resolvers/dataset_resolver/get_by_id.py +16 -0
  242. lightly_studio/resolvers/dataset_resolver/get_by_name.py +12 -0
  243. lightly_studio/resolvers/dataset_resolver/get_dataset_details.py +27 -0
  244. lightly_studio/resolvers/dataset_resolver/get_hierarchy.py +31 -0
  245. lightly_studio/resolvers/dataset_resolver/get_or_create_child_dataset.py +58 -0
  246. lightly_studio/resolvers/dataset_resolver/get_parent_dataset_by_sample_id.py +27 -0
  247. lightly_studio/resolvers/dataset_resolver/get_parent_dataset_id.py +22 -0
  248. lightly_studio/resolvers/dataset_resolver/get_root_dataset.py +61 -0
  249. lightly_studio/resolvers/dataset_resolver/get_root_datasets_overview.py +41 -0
  250. lightly_studio/resolvers/dataset_resolver/update.py +25 -0
  251. lightly_studio/resolvers/embedding_model_resolver.py +120 -0
  252. lightly_studio/resolvers/image_filter.py +50 -0
  253. lightly_studio/resolvers/image_resolver/__init__.py +21 -0
  254. lightly_studio/resolvers/image_resolver/create_many.py +52 -0
  255. lightly_studio/resolvers/image_resolver/delete.py +20 -0
  256. lightly_studio/resolvers/image_resolver/filter_new_paths.py +23 -0
  257. lightly_studio/resolvers/image_resolver/get_all_by_dataset_id.py +117 -0
  258. lightly_studio/resolvers/image_resolver/get_by_id.py +14 -0
  259. lightly_studio/resolvers/image_resolver/get_dimension_bounds.py +75 -0
  260. lightly_studio/resolvers/image_resolver/get_many_by_id.py +22 -0
  261. lightly_studio/resolvers/image_resolver/get_samples_excluding.py +43 -0
  262. lightly_studio/resolvers/metadata_resolver/__init__.py +15 -0
  263. lightly_studio/resolvers/metadata_resolver/metadata_filter.py +163 -0
  264. lightly_studio/resolvers/metadata_resolver/sample/__init__.py +21 -0
  265. lightly_studio/resolvers/metadata_resolver/sample/bulk_update_metadata.py +46 -0
  266. lightly_studio/resolvers/metadata_resolver/sample/get_by_sample_id.py +24 -0
  267. lightly_studio/resolvers/metadata_resolver/sample/get_metadata_info.py +104 -0
  268. lightly_studio/resolvers/metadata_resolver/sample/get_value_for_sample.py +27 -0
  269. lightly_studio/resolvers/metadata_resolver/sample/set_value_for_sample.py +53 -0
  270. lightly_studio/resolvers/sample_embedding_resolver.py +132 -0
  271. lightly_studio/resolvers/sample_resolver/__init__.py +17 -0
  272. lightly_studio/resolvers/sample_resolver/count_by_dataset_id.py +16 -0
  273. lightly_studio/resolvers/sample_resolver/create.py +16 -0
  274. lightly_studio/resolvers/sample_resolver/create_many.py +25 -0
  275. lightly_studio/resolvers/sample_resolver/get_by_id.py +14 -0
  276. lightly_studio/resolvers/sample_resolver/get_filtered_samples.py +56 -0
  277. lightly_studio/resolvers/sample_resolver/get_many_by_id.py +22 -0
  278. lightly_studio/resolvers/sample_resolver/sample_filter.py +74 -0
  279. lightly_studio/resolvers/settings_resolver.py +62 -0
  280. lightly_studio/resolvers/tag_resolver.py +299 -0
  281. lightly_studio/resolvers/twodim_embedding_resolver.py +119 -0
  282. lightly_studio/resolvers/video_frame_resolver/__init__.py +23 -0
  283. lightly_studio/resolvers/video_frame_resolver/count_video_frames_annotations.py +83 -0
  284. lightly_studio/resolvers/video_frame_resolver/create_many.py +57 -0
  285. lightly_studio/resolvers/video_frame_resolver/get_all_by_dataset_id.py +63 -0
  286. lightly_studio/resolvers/video_frame_resolver/get_by_id.py +13 -0
  287. lightly_studio/resolvers/video_frame_resolver/get_table_fields_bounds.py +44 -0
  288. lightly_studio/resolvers/video_frame_resolver/video_frame_annotations_counter_filter.py +47 -0
  289. lightly_studio/resolvers/video_frame_resolver/video_frame_filter.py +57 -0
  290. lightly_studio/resolvers/video_resolver/__init__.py +27 -0
  291. lightly_studio/resolvers/video_resolver/count_video_frame_annotations_by_video_dataset.py +86 -0
  292. lightly_studio/resolvers/video_resolver/create_many.py +58 -0
  293. lightly_studio/resolvers/video_resolver/filter_new_paths.py +33 -0
  294. lightly_studio/resolvers/video_resolver/get_all_by_dataset_id.py +181 -0
  295. lightly_studio/resolvers/video_resolver/get_by_id.py +22 -0
  296. lightly_studio/resolvers/video_resolver/get_table_fields_bounds.py +72 -0
  297. lightly_studio/resolvers/video_resolver/get_view_by_id.py +52 -0
  298. lightly_studio/resolvers/video_resolver/video_count_annotations_filter.py +50 -0
  299. lightly_studio/resolvers/video_resolver/video_filter.py +98 -0
  300. lightly_studio/selection/__init__.py +1 -0
  301. lightly_studio/selection/mundig.py +143 -0
  302. lightly_studio/selection/select.py +203 -0
  303. lightly_studio/selection/select_via_db.py +273 -0
  304. lightly_studio/selection/selection_config.py +49 -0
  305. lightly_studio/services/annotations_service/__init__.py +33 -0
  306. lightly_studio/services/annotations_service/create_annotation.py +64 -0
  307. lightly_studio/services/annotations_service/delete_annotation.py +22 -0
  308. lightly_studio/services/annotations_service/get_annotation_by_id.py +31 -0
  309. lightly_studio/services/annotations_service/update_annotation.py +54 -0
  310. lightly_studio/services/annotations_service/update_annotation_bounding_box.py +36 -0
  311. lightly_studio/services/annotations_service/update_annotation_label.py +48 -0
  312. lightly_studio/services/annotations_service/update_annotations.py +29 -0
  313. lightly_studio/setup_logging.py +59 -0
  314. lightly_studio/type_definitions.py +31 -0
  315. lightly_studio/utils/__init__.py +3 -0
  316. lightly_studio/utils/download.py +94 -0
  317. lightly_studio/vendor/__init__.py +1 -0
  318. lightly_studio/vendor/mobileclip/ACKNOWLEDGEMENTS +422 -0
  319. lightly_studio/vendor/mobileclip/LICENSE +31 -0
  320. lightly_studio/vendor/mobileclip/LICENSE_weights_data +50 -0
  321. lightly_studio/vendor/mobileclip/README.md +5 -0
  322. lightly_studio/vendor/mobileclip/__init__.py +96 -0
  323. lightly_studio/vendor/mobileclip/clip.py +77 -0
  324. lightly_studio/vendor/mobileclip/configs/mobileclip_b.json +18 -0
  325. lightly_studio/vendor/mobileclip/configs/mobileclip_s0.json +18 -0
  326. lightly_studio/vendor/mobileclip/configs/mobileclip_s1.json +18 -0
  327. lightly_studio/vendor/mobileclip/configs/mobileclip_s2.json +18 -0
  328. lightly_studio/vendor/mobileclip/image_encoder.py +67 -0
  329. lightly_studio/vendor/mobileclip/logger.py +154 -0
  330. lightly_studio/vendor/mobileclip/models/__init__.py +10 -0
  331. lightly_studio/vendor/mobileclip/models/mci.py +933 -0
  332. lightly_studio/vendor/mobileclip/models/vit.py +433 -0
  333. lightly_studio/vendor/mobileclip/modules/__init__.py +4 -0
  334. lightly_studio/vendor/mobileclip/modules/common/__init__.py +4 -0
  335. lightly_studio/vendor/mobileclip/modules/common/mobileone.py +341 -0
  336. lightly_studio/vendor/mobileclip/modules/common/transformer.py +451 -0
  337. lightly_studio/vendor/mobileclip/modules/image/__init__.py +4 -0
  338. lightly_studio/vendor/mobileclip/modules/image/image_projection.py +113 -0
  339. lightly_studio/vendor/mobileclip/modules/image/replknet.py +188 -0
  340. lightly_studio/vendor/mobileclip/modules/text/__init__.py +4 -0
  341. lightly_studio/vendor/mobileclip/modules/text/repmixer.py +281 -0
  342. lightly_studio/vendor/mobileclip/modules/text/tokenizer.py +38 -0
  343. lightly_studio/vendor/mobileclip/text_encoder.py +245 -0
  344. lightly_studio/vendor/perception_encoder/LICENSE.PE +201 -0
  345. lightly_studio/vendor/perception_encoder/README.md +11 -0
  346. lightly_studio/vendor/perception_encoder/vision_encoder/__init__.py +0 -0
  347. lightly_studio/vendor/perception_encoder/vision_encoder/bpe_simple_vocab_16e6.txt.gz +0 -0
  348. lightly_studio/vendor/perception_encoder/vision_encoder/config.py +205 -0
  349. lightly_studio/vendor/perception_encoder/vision_encoder/config_src.py +264 -0
  350. lightly_studio/vendor/perception_encoder/vision_encoder/pe.py +766 -0
  351. lightly_studio/vendor/perception_encoder/vision_encoder/rope.py +352 -0
  352. lightly_studio/vendor/perception_encoder/vision_encoder/tokenizer.py +347 -0
  353. lightly_studio/vendor/perception_encoder/vision_encoder/transforms.py +36 -0
  354. lightly_studio-0.4.6.dist-info/METADATA +88 -0
  355. lightly_studio-0.4.6.dist-info/RECORD +356 -0
  356. 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]