supervisely 6.73.438__py3-none-any.whl → 6.73.513__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 (203) hide show
  1. supervisely/__init__.py +137 -1
  2. supervisely/_utils.py +81 -0
  3. supervisely/annotation/annotation.py +8 -2
  4. supervisely/annotation/json_geometries_map.py +14 -11
  5. supervisely/annotation/label.py +80 -3
  6. supervisely/api/annotation_api.py +14 -11
  7. supervisely/api/api.py +59 -38
  8. supervisely/api/app_api.py +11 -2
  9. supervisely/api/dataset_api.py +74 -12
  10. supervisely/api/entities_collection_api.py +10 -0
  11. supervisely/api/entity_annotation/figure_api.py +52 -4
  12. supervisely/api/entity_annotation/object_api.py +3 -3
  13. supervisely/api/entity_annotation/tag_api.py +63 -12
  14. supervisely/api/guides_api.py +210 -0
  15. supervisely/api/image_api.py +72 -1
  16. supervisely/api/labeling_job_api.py +83 -1
  17. supervisely/api/labeling_queue_api.py +33 -7
  18. supervisely/api/module_api.py +9 -0
  19. supervisely/api/project_api.py +71 -26
  20. supervisely/api/storage_api.py +3 -1
  21. supervisely/api/task_api.py +13 -2
  22. supervisely/api/team_api.py +4 -3
  23. supervisely/api/video/video_annotation_api.py +119 -3
  24. supervisely/api/video/video_api.py +65 -14
  25. supervisely/api/video/video_figure_api.py +24 -11
  26. supervisely/app/__init__.py +1 -1
  27. supervisely/app/content.py +23 -7
  28. supervisely/app/development/development.py +18 -2
  29. supervisely/app/fastapi/__init__.py +1 -0
  30. supervisely/app/fastapi/custom_static_files.py +1 -1
  31. supervisely/app/fastapi/multi_user.py +105 -0
  32. supervisely/app/fastapi/subapp.py +88 -42
  33. supervisely/app/fastapi/websocket.py +77 -9
  34. supervisely/app/singleton.py +21 -0
  35. supervisely/app/v1/app_service.py +18 -2
  36. supervisely/app/v1/constants.py +7 -1
  37. supervisely/app/widgets/__init__.py +6 -0
  38. supervisely/app/widgets/activity_feed/__init__.py +0 -0
  39. supervisely/app/widgets/activity_feed/activity_feed.py +239 -0
  40. supervisely/app/widgets/activity_feed/style.css +78 -0
  41. supervisely/app/widgets/activity_feed/template.html +22 -0
  42. supervisely/app/widgets/card/card.py +20 -0
  43. supervisely/app/widgets/classes_list_selector/classes_list_selector.py +121 -9
  44. supervisely/app/widgets/classes_list_selector/template.html +60 -93
  45. supervisely/app/widgets/classes_mapping/classes_mapping.py +13 -12
  46. supervisely/app/widgets/classes_table/classes_table.py +1 -0
  47. supervisely/app/widgets/deploy_model/deploy_model.py +56 -35
  48. supervisely/app/widgets/dialog/dialog.py +12 -0
  49. supervisely/app/widgets/dialog/template.html +2 -1
  50. supervisely/app/widgets/ecosystem_model_selector/ecosystem_model_selector.py +1 -1
  51. supervisely/app/widgets/experiment_selector/experiment_selector.py +8 -0
  52. supervisely/app/widgets/fast_table/fast_table.py +184 -60
  53. supervisely/app/widgets/fast_table/template.html +1 -1
  54. supervisely/app/widgets/heatmap/__init__.py +0 -0
  55. supervisely/app/widgets/heatmap/heatmap.py +564 -0
  56. supervisely/app/widgets/heatmap/script.js +533 -0
  57. supervisely/app/widgets/heatmap/style.css +233 -0
  58. supervisely/app/widgets/heatmap/template.html +21 -0
  59. supervisely/app/widgets/modal/__init__.py +0 -0
  60. supervisely/app/widgets/modal/modal.py +198 -0
  61. supervisely/app/widgets/modal/template.html +10 -0
  62. supervisely/app/widgets/object_class_view/object_class_view.py +3 -0
  63. supervisely/app/widgets/radio_tabs/radio_tabs.py +18 -2
  64. supervisely/app/widgets/radio_tabs/template.html +1 -0
  65. supervisely/app/widgets/select/select.py +6 -3
  66. supervisely/app/widgets/select_class/__init__.py +0 -0
  67. supervisely/app/widgets/select_class/select_class.py +363 -0
  68. supervisely/app/widgets/select_class/template.html +50 -0
  69. supervisely/app/widgets/select_cuda/select_cuda.py +22 -0
  70. supervisely/app/widgets/select_dataset_tree/select_dataset_tree.py +65 -7
  71. supervisely/app/widgets/select_tag/__init__.py +0 -0
  72. supervisely/app/widgets/select_tag/select_tag.py +352 -0
  73. supervisely/app/widgets/select_tag/template.html +64 -0
  74. supervisely/app/widgets/select_team/select_team.py +37 -4
  75. supervisely/app/widgets/select_team/template.html +4 -5
  76. supervisely/app/widgets/select_user/__init__.py +0 -0
  77. supervisely/app/widgets/select_user/select_user.py +270 -0
  78. supervisely/app/widgets/select_user/template.html +13 -0
  79. supervisely/app/widgets/select_workspace/select_workspace.py +59 -10
  80. supervisely/app/widgets/select_workspace/template.html +9 -12
  81. supervisely/app/widgets/table/table.py +68 -13
  82. supervisely/app/widgets/tree_select/tree_select.py +2 -0
  83. supervisely/aug/aug.py +6 -2
  84. supervisely/convert/base_converter.py +1 -0
  85. supervisely/convert/converter.py +2 -2
  86. supervisely/convert/image/csv/csv_converter.py +24 -15
  87. supervisely/convert/image/image_converter.py +3 -1
  88. supervisely/convert/image/image_helper.py +48 -4
  89. supervisely/convert/image/label_studio/label_studio_converter.py +2 -0
  90. supervisely/convert/image/medical2d/medical2d_helper.py +2 -24
  91. supervisely/convert/image/multispectral/multispectral_converter.py +6 -0
  92. supervisely/convert/image/pascal_voc/pascal_voc_converter.py +8 -5
  93. supervisely/convert/image/pascal_voc/pascal_voc_helper.py +7 -0
  94. supervisely/convert/pointcloud/kitti_3d/kitti_3d_converter.py +33 -3
  95. supervisely/convert/pointcloud/kitti_3d/kitti_3d_helper.py +12 -5
  96. supervisely/convert/pointcloud/las/las_converter.py +13 -1
  97. supervisely/convert/pointcloud/las/las_helper.py +110 -11
  98. supervisely/convert/pointcloud/nuscenes_conv/nuscenes_converter.py +27 -16
  99. supervisely/convert/pointcloud/pointcloud_converter.py +91 -3
  100. supervisely/convert/pointcloud_episodes/nuscenes_conv/nuscenes_converter.py +58 -22
  101. supervisely/convert/pointcloud_episodes/nuscenes_conv/nuscenes_helper.py +21 -47
  102. supervisely/convert/video/__init__.py +1 -0
  103. supervisely/convert/video/multi_view/__init__.py +0 -0
  104. supervisely/convert/video/multi_view/multi_view.py +543 -0
  105. supervisely/convert/video/sly/sly_video_converter.py +359 -3
  106. supervisely/convert/video/video_converter.py +24 -4
  107. supervisely/convert/volume/dicom/dicom_converter.py +13 -5
  108. supervisely/convert/volume/dicom/dicom_helper.py +30 -18
  109. supervisely/geometry/constants.py +1 -0
  110. supervisely/geometry/geometry.py +4 -0
  111. supervisely/geometry/helpers.py +5 -1
  112. supervisely/geometry/oriented_bbox.py +676 -0
  113. supervisely/geometry/polyline_3d.py +110 -0
  114. supervisely/geometry/rectangle.py +2 -1
  115. supervisely/io/env.py +76 -1
  116. supervisely/io/fs.py +21 -0
  117. supervisely/nn/benchmark/base_evaluator.py +104 -11
  118. supervisely/nn/benchmark/instance_segmentation/evaluator.py +1 -8
  119. supervisely/nn/benchmark/object_detection/evaluator.py +20 -4
  120. supervisely/nn/benchmark/object_detection/vis_metrics/pr_curve.py +10 -5
  121. supervisely/nn/benchmark/semantic_segmentation/evaluator.py +34 -16
  122. supervisely/nn/benchmark/semantic_segmentation/vis_metrics/confusion_matrix.py +1 -1
  123. supervisely/nn/benchmark/semantic_segmentation/vis_metrics/frequently_confused.py +1 -1
  124. supervisely/nn/benchmark/semantic_segmentation/vis_metrics/overview.py +1 -1
  125. supervisely/nn/benchmark/visualization/evaluation_result.py +66 -4
  126. supervisely/nn/inference/cache.py +43 -18
  127. supervisely/nn/inference/gui/serving_gui_template.py +5 -2
  128. supervisely/nn/inference/inference.py +916 -222
  129. supervisely/nn/inference/inference_request.py +55 -10
  130. supervisely/nn/inference/predict_app/gui/classes_selector.py +83 -12
  131. supervisely/nn/inference/predict_app/gui/gui.py +676 -488
  132. supervisely/nn/inference/predict_app/gui/input_selector.py +205 -26
  133. supervisely/nn/inference/predict_app/gui/model_selector.py +2 -4
  134. supervisely/nn/inference/predict_app/gui/output_selector.py +46 -6
  135. supervisely/nn/inference/predict_app/gui/settings_selector.py +756 -59
  136. supervisely/nn/inference/predict_app/gui/tags_selector.py +1 -1
  137. supervisely/nn/inference/predict_app/gui/utils.py +236 -119
  138. supervisely/nn/inference/predict_app/predict_app.py +2 -2
  139. supervisely/nn/inference/session.py +43 -35
  140. supervisely/nn/inference/tracking/bbox_tracking.py +118 -35
  141. supervisely/nn/inference/tracking/point_tracking.py +5 -1
  142. supervisely/nn/inference/tracking/tracker_interface.py +10 -1
  143. supervisely/nn/inference/uploader.py +139 -12
  144. supervisely/nn/live_training/__init__.py +7 -0
  145. supervisely/nn/live_training/api_server.py +111 -0
  146. supervisely/nn/live_training/artifacts_utils.py +243 -0
  147. supervisely/nn/live_training/checkpoint_utils.py +229 -0
  148. supervisely/nn/live_training/dynamic_sampler.py +44 -0
  149. supervisely/nn/live_training/helpers.py +14 -0
  150. supervisely/nn/live_training/incremental_dataset.py +146 -0
  151. supervisely/nn/live_training/live_training.py +497 -0
  152. supervisely/nn/live_training/loss_plateau_detector.py +111 -0
  153. supervisely/nn/live_training/request_queue.py +52 -0
  154. supervisely/nn/model/model_api.py +9 -0
  155. supervisely/nn/model/prediction.py +2 -1
  156. supervisely/nn/model/prediction_session.py +26 -14
  157. supervisely/nn/prediction_dto.py +19 -1
  158. supervisely/nn/tracker/base_tracker.py +11 -1
  159. supervisely/nn/tracker/botsort/botsort_config.yaml +0 -1
  160. supervisely/nn/tracker/botsort/tracker/mc_bot_sort.py +7 -4
  161. supervisely/nn/tracker/botsort_tracker.py +94 -65
  162. supervisely/nn/tracker/utils.py +4 -5
  163. supervisely/nn/tracker/visualize.py +93 -93
  164. supervisely/nn/training/gui/classes_selector.py +16 -1
  165. supervisely/nn/training/gui/train_val_splits_selector.py +52 -31
  166. supervisely/nn/training/train_app.py +46 -31
  167. supervisely/project/data_version.py +115 -51
  168. supervisely/project/download.py +1 -1
  169. supervisely/project/pointcloud_episode_project.py +37 -8
  170. supervisely/project/pointcloud_project.py +30 -2
  171. supervisely/project/project.py +14 -2
  172. supervisely/project/project_meta.py +27 -1
  173. supervisely/project/project_settings.py +32 -18
  174. supervisely/project/versioning/__init__.py +1 -0
  175. supervisely/project/versioning/common.py +20 -0
  176. supervisely/project/versioning/schema_fields.py +35 -0
  177. supervisely/project/versioning/video_schema.py +221 -0
  178. supervisely/project/versioning/volume_schema.py +87 -0
  179. supervisely/project/video_project.py +717 -15
  180. supervisely/project/volume_project.py +623 -5
  181. supervisely/template/experiment/experiment.html.jinja +4 -4
  182. supervisely/template/experiment/experiment_generator.py +14 -21
  183. supervisely/template/live_training/__init__.py +0 -0
  184. supervisely/template/live_training/header.html.jinja +96 -0
  185. supervisely/template/live_training/live_training.html.jinja +51 -0
  186. supervisely/template/live_training/live_training_generator.py +464 -0
  187. supervisely/template/live_training/sly-style.css +402 -0
  188. supervisely/template/live_training/template.html.jinja +18 -0
  189. supervisely/versions.json +28 -26
  190. supervisely/video/sampling.py +39 -20
  191. supervisely/video/video.py +41 -12
  192. supervisely/video_annotation/video_figure.py +38 -4
  193. supervisely/video_annotation/video_object.py +29 -4
  194. supervisely/volume/stl_converter.py +2 -0
  195. supervisely/worker_api/agent_rpc.py +24 -1
  196. supervisely/worker_api/rpc_servicer.py +31 -7
  197. {supervisely-6.73.438.dist-info → supervisely-6.73.513.dist-info}/METADATA +58 -40
  198. {supervisely-6.73.438.dist-info → supervisely-6.73.513.dist-info}/RECORD +203 -155
  199. {supervisely-6.73.438.dist-info → supervisely-6.73.513.dist-info}/WHEEL +1 -1
  200. supervisely_lib/__init__.py +6 -1
  201. {supervisely-6.73.438.dist-info → supervisely-6.73.513.dist-info}/entry_points.txt +0 -0
  202. {supervisely-6.73.438.dist-info → supervisely-6.73.513.dist-info/licenses}/LICENSE +0 -0
  203. {supervisely-6.73.438.dist-info → supervisely-6.73.513.dist-info}/top_level.txt +0 -0
@@ -17,7 +17,7 @@ Here are prediction samples made with **{{ experiment.training.checkpoints.pytor
17
17
  The **{{ experiment.training.checkpoints.pytorch.name }}** checkpoint was evaluated on the validation set containing **{{ experiment.project.splits.val.size }}
18
18
  images**.
19
19
 
20
- See the full [📊 Evaluation Report]({{ experiment.training.evaluation.url }}) for details and visualizations.
20
+ See the full [📊 Evaluation Report]({{ experiment.training.evaluation.url }}){:target="_blank"} for details and visualizations.
21
21
  {{ widgets.tables.metrics | safe }}
22
22
 
23
23
  {% else %}
@@ -114,11 +114,11 @@ The training process was configured with the following hyperparameters. You can
114
114
 
115
115
  The quick actions on this page, such as **Deploy**, **Predict**, or **Fine-tune**, help you to quickly work with your model. But you can also run the apps manually from the Supervisely Platform. Here are related apps to this experiment:
116
116
 
117
- - [Serve {{ experiment.model.framework }}]({{ env.server_address }}/ecosystem/apps/{{ resources.apps.serve.slug
117
+ - [Serve {{ experiment.model.framework }}](/ecosystem/apps/{{ resources.apps.serve.slug
118
118
  }}){:target="_blank"} - deploy your model in the Supervisely Platform.
119
- - [Train {{ experiment.model.framework }}]({{ env.server_address }}/ecosystem/apps/{{ resources.apps.train.slug
119
+ - [Train {{ experiment.model.framework }}](/ecosystem/apps/{{ resources.apps.train.slug
120
120
  }}){:target="_blank"} - train a model in the Supervisely Platform.
121
- - [Predict App]({{ env.server_address }}/ecosystem/apps/{{ resources.apps.predict.slug }}){:target="_blank"} -
121
+ - [Predict App](/ecosystem/apps/{{ resources.apps.predict.slug }}){:target="_blank"} -
122
122
  deploy your model and make predictions.
123
123
 
124
124
  ## API Integration & Deployment
@@ -26,6 +26,7 @@ from supervisely.geometry.pointcloud import Pointcloud
26
26
  from supervisely.geometry.polygon import Polygon
27
27
  from supervisely.geometry.polyline import Polyline
28
28
  from supervisely.geometry.rectangle import Rectangle
29
+ from supervisely.geometry.oriented_bbox import OrientedBBox
29
30
  from supervisely.imaging.color import rgb2hex
30
31
  from supervisely.nn.benchmark.object_detection.metric_provider import (
31
32
  METRIC_NAMES as OBJECT_DETECTION_METRIC_NAMES,
@@ -91,10 +92,9 @@ class ExperimentGenerator(BaseGenerator):
91
92
  return f"{server_address}/nn/experiments/{template_id}"
92
93
 
93
94
  def _datasets_url_with_entities_filter(self, project_id: int, entities_filter: List[dict]) -> str:
94
- base_url = self.api.server_address.rstrip('/')
95
95
  path = f"/projects/{project_id}/datasets"
96
96
  query = urlencode({"entitiesFilter": json.dumps(entities_filter)})
97
- return f"{base_url}{path}?{query}"
97
+ return f"{path}?{query}"
98
98
 
99
99
  def upload_to_artifacts(self):
100
100
  remote_dir = os.path.join(self.info["artifacts_dir"], "visualization")
@@ -251,6 +251,7 @@ class ExperimentGenerator(BaseGenerator):
251
251
  Pointcloud: "zmdi zmdi-cloud-outline",
252
252
  MultichannelBitmap: "zmdi zmdi-layers",
253
253
  Point3d: "zmdi zmdi-filter-center-focus",
254
+ OrientedBBox: "zmdi zmdi-rotate-cw",
254
255
  }
255
256
 
256
257
  if not hasattr(self.model_meta, "obj_classes"):
@@ -475,10 +476,7 @@ class ExperimentGenerator(BaseGenerator):
475
476
  }
476
477
  return training_session
477
478
 
478
- training_session = {
479
- "id": task_id,
480
- "url": f"{self.api.server_address}/apps/sessions/{task_id}",
481
- }
479
+ training_session = {"id": task_id, "url": f"/apps/sessions/{task_id}"}
482
480
  return training_session
483
481
 
484
482
  def _get_training_duration(self) -> str:
@@ -788,6 +786,7 @@ class ExperimentGenerator(BaseGenerator):
788
786
  return train_app, serve_app
789
787
 
790
788
  def _get_agent_info(self) -> str:
789
+ # Not used
791
790
  task_id = self.info.get("task_id", None)
792
791
 
793
792
  agent_info = {
@@ -803,7 +802,7 @@ class ExperimentGenerator(BaseGenerator):
803
802
  if task_info is not None:
804
803
  agent_info["name"] = task_info["agentName"]
805
804
  agent_info["id"] = task_info["agentId"]
806
- agent_info["link"] = f"{self.api.server_address}/nodes/{agent_info['id']}/info"
805
+ agent_info["link"] = f"/nodes/{agent_info['id']}/info"
807
806
  return agent_info
808
807
 
809
808
  def _get_class_names(self, model_classes: list) -> dict:
@@ -909,7 +908,7 @@ class ExperimentGenerator(BaseGenerator):
909
908
  version_info = {
910
909
  "version": project_version["version"],
911
910
  "id": project_version["id"],
912
- "url": f"{self.api.server_address}/projects/{project_info.id}/versions",
911
+ "url": f"/projects/{project_info.id}/versions",
913
912
  }
914
913
  return version_info
915
914
 
@@ -918,7 +917,7 @@ class ExperimentGenerator(BaseGenerator):
918
917
  project_info = self.api.project.get_info_by_id(project_id)
919
918
  project_version = self._get_project_version(project_info)
920
919
  project_type = project_info.type
921
- project_url = f"{self.api.server_address}/projects/{project_id}/datasets"
920
+ project_url = f"/projects/{project_id}/datasets"
922
921
  model_classes = [cls.name for cls in self.model_meta.obj_classes]
923
922
  class_names = self._get_class_names(model_classes)
924
923
  splits = self._get_project_splits()
@@ -949,9 +948,7 @@ class ExperimentGenerator(BaseGenerator):
949
948
  )
950
949
  base_checkpoint_name = base_checkpoint_info.name
951
950
  base_checkpoint_link = base_checkpoint_info.full_storage_url
952
- base_checkpoint_path = (
953
- f"{self.api.server_address}/files/?path={base_checkpoint_info.path}"
954
- )
951
+ base_checkpoint_path = f"/files/?path={base_checkpoint_info.path}"
955
952
 
956
953
  base_checkpoint = {
957
954
  "name": base_checkpoint_name,
@@ -981,7 +978,7 @@ class ExperimentGenerator(BaseGenerator):
981
978
  onnx_checkpoint, trt_checkpoint = self._get_optimized_checkpoints()
982
979
 
983
980
  logs_path = self.info.get("logs", {}).get("link")
984
- logs_url = f"{self.api.server_address}/files/?path={logs_path}" if logs_path else None
981
+ logs_url = f"/files/?path={logs_path}" if logs_path else None
985
982
 
986
983
  primary_metric = self._get_primary_metric()
987
984
  display_metrics = self._get_display_metrics(self.info["task_type"])
@@ -1000,7 +997,7 @@ class ExperimentGenerator(BaseGenerator):
1000
997
  "logs": {"path": logs_path, "url": logs_url},
1001
998
  "evaluation": {
1002
999
  "id": self.info.get("evaluation_report_id"),
1003
- "url": self.info.get("evaluation_report_link"),
1000
+ "url": f"/model-benchmark/?id={self.info.get('evaluation_report_id')}",
1004
1001
  "primary_metric": primary_metric,
1005
1002
  "display_metrics": display_metrics,
1006
1003
  "metrics": self.info.get("evaluation_metrics"),
@@ -1030,15 +1027,15 @@ class ExperimentGenerator(BaseGenerator):
1030
1027
  "paths": {
1031
1028
  "experiment_dir": {
1032
1029
  "path": experiment_dir,
1033
- "url": f"{self.api.server_address}/files/?path={experiment_dir.rstrip('/') + '/'}",
1030
+ "url": f"/files/?path={experiment_dir.rstrip('/') + '/'}",
1034
1031
  },
1035
1032
  "artifacts_dir": {
1036
1033
  "path": artifacts_dir,
1037
- "url": f"{self.api.server_address}/files/?path={artifacts_dir.rstrip('/') + '/'}",
1034
+ "url": f"/files/?path={artifacts_dir.rstrip('/') + '/'}",
1038
1035
  },
1039
1036
  "checkpoints_dir": {
1040
1037
  "path": checkpoints_dir,
1041
- "url": f"{self.api.server_address}/files/?path={checkpoints_dir.rstrip('/') + '/'}",
1038
+ "url": f"/files/?path={checkpoints_dir.rstrip('/') + '/'}",
1042
1039
  },
1043
1040
  },
1044
1041
  }
@@ -1136,7 +1133,3 @@ class ExperimentGenerator(BaseGenerator):
1136
1133
  except Exception as e:
1137
1134
  logger.warning(f"Failed to build or save static training plot: {e}")
1138
1135
  return None
1139
-
1140
-
1141
- # Pylint Errors: ************* Module supervisely.api.app_api
1142
- # supervisely/api/app_api.py:1463:20: E0606: Possibly using variable 'progress' before assignment (possibly-used-before-assignment)
File without changes
@@ -0,0 +1,96 @@
1
+ <div class="experiment-info-header">
2
+ <div class="experiment-info-subheader">
3
+ <h1>{{ session.name }}</h1>
4
+
5
+ <div class="experiment-info-buttons">
6
+ <!-- Download -->
7
+ <sly-iw-download-button
8
+ style="padding: 7px 8px;"
9
+ :disabled="false"
10
+ teamFilesPath="{{ session.artifacts_dir + '/' }}"
11
+ :command="command">
12
+ <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAAAsTAAALEwEAmpwYAAABn0lEQVR4nO2YT04CMRSHPzdzDEAT4lZIvICDHsiFia7Y4BEQTsF50CiCW42iCzeTjKkpyXNScDodp4P0S17Sgfb1/fr6ZzoQCAQC/5VDYAE8Am22kCsg1XbJFtIXAlR56+gHAZ4JGfBNyIBvQgbKogWMgScgEXu7tE9gYJGBa90mNVii+xoBTdfgz4D3NR1l7SOngD1dN4/PJdBzGfm8wdtmYLAhA6lBRKOIgLFw8gCcAFEFizgCYmAm2t8UiP97Hq4cqOCr3oVi0X5eoP2PBWsz8mUJiDIL2xo5D32dA6lLDDsj4AC4A+6Bbg4BXV1Xzet2HQSci3ovQoRJQFfXWf1+UQcBrUxQqtwxCOgY6u3XQYBpZFV5Ip4nhv/ldPMuQHEEPOc4WV+B4z+KwbnxbyJsgve2ja4TYRu813MgK6JI8N4PMrVIb4FpzgVbOwFlkO60gMTxbdSVyPVtdOF4H3ClJ/pXn+itGQkHM+2wikxEwGnmRjYs4qip76OpZ3sreidGj/rSc/AxjjR0CucbvguVaYnua+gy8oFAIEAlfAG3TJLaWbXlEAAAAABJRU5ErkJggg==" alt="download--v1">
13
+ </sly-iw-download-button>
14
+
15
+ {% if resources.apps.online_training.module_id %}
16
+ <!-- Finetune --->
17
+ <sly-iw-launch-button
18
+ style=""
19
+ :disabled="false"
20
+ :autoRun="false"
21
+ :openInNewWindow="true"
22
+ :selectContext="true"
23
+ :state="{ 'checkpointMode': 'finetune', 'selectedExperimentTaskId': {{ session.task_id }}}"
24
+ :moduleId="{{ resources.apps.online_training.module_id }}"
25
+ :command="command">
26
+ <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAAAsTAAALEwEAmpwYAAACeElEQVR4nO2Yy2oVQRCGv+AhUXyBqDFqHiEighIXgpHcFH0EF3GnWfgICaJuzEbNwn127oIuYrbeLyAuIiQcycWdRkFNEEZKaqBoZsY5mdMzc6B/aA4zPaf6q+6q6p6BoKCgoJzqAUaAOeA1sAH8Ab4C74GHwGWgm5qpAVxV4ChH2wTGqYn6gTc5wSPTZEUq1wngiwO2CswAp4ADGi7i5JLz3N2q4fsd+J/AVEJ8dwGzDvy8hl1lajhhs6mrQSfAowlrZ74IfEPD6QMwQUml0labqYLw885Kei+xo07CJg14ZxfwkbZLvh2YM4NNJ/RPFICPdLPzqldmsNMJ/Yum/1FOeFti3/l2wMa/1HlX303/wRzwkitHzPU33w5sm8EkoV1tpTjQSIHvUjvxvZ0yV+DQf0JoAegDDms4JcGjjsb313078NwMNpTQP57jHDRr4FE7cd9L3w7YEnkr5ZnpDPjbDrzopum/59uBa2awtxnPjQFPgR/aFnUPcbUXaBqb5z2y/6vxNomftMHmDWNvzedOLG9av81gyylJ3IqO61kqtnmFkmb+UxvgTzrHcSkOeygJXkrjbtWjYfPL2NwoaLMt8LIijzWxpTqd0XvdWueHtNrYhI3hB+sAv5yj/kdOe9GGUCycsL3AxxbB14BJXzF/ocDMy/+u62b1TMNjW48HMtv3geEyS2UWvDvzAnqRCjUS4CvSWAsx36f9NmxK+ZKQpgE9aHUkvPuCvtJp8KLPBuosHQaPUzL3kQ9e9onaqJmxArWHFz0wgOLMOWC//q7UHV50zPmOk9RqCx9rOMOJrZT32NrpqB60mjrjTb2WL2ZBQUFBFNJfCnaIn00BSHcAAAAASUVORK5CYII=" alt="support">
27
+ <span>Finetune</span>
28
+ </sly-iw-launch-button>
29
+
30
+ <!-- Continue --->
31
+ <sly-iw-launch-button
32
+ style=""
33
+ :disabled="false"
34
+ :autoRun="false"
35
+ :openInNewWindow="true"
36
+ :selectContext="false"
37
+ :state="{ 'checkpointMode': 'continue', 'selectedExperimentTaskId': {{ session.task_id }}, 'slyProjectId': {{ session.project.id }} }"
38
+ :moduleId="{{ resources.apps.online_training.module_id }}"
39
+ :command="command">
40
+ <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAACXBIWXMAAAsTAAALEwEAmpwYAAAFcklEQVR4nO2da4hVVRTHf42Zjjg1RUwmSWX0GqlMe9sDUokKv0RUFvVBoje9vkT6oaDI3mVR9KAPFUUY5IfACS2bqKAHOVMRKFpN1JSNWc1ILytPbPgPXS5z7z1733vOvufe9YMNcuc81l7rnL3/55y1tmAYhmEYhmEYhmEYhmEYzccewBnASuAtYBgYUxvWbyu1jdvWaBDTgOuBzUCSsm3WPm5fI5C9gZuA7z0cX962A3cC+1kU0nOAnPZrHY4vbzuBVcAsC0RlDpOT/mig48vbLuAFoNcC8T/Hyyn/ZOj48rYbeB04tV0D4VTKuUB/gPMGgVt1FXeq9eq3wYDj9cuWtlBOHcAS4KMAR72nfWs56nRd3bs9j/8ZcAWwJy3IFHXOR0omwL9y5skB55yroe1vz3N+LfU1rZWk5LCnE/6S845qgA2zNbn/7mnDSJEl7LiU/MWz02Ny1kEZ2NQjm35uZQkbKiV/lHP2zcHGLt2V3wXelb2tJCW/kjOcksmbvTQvbQqcl5pCwo4rjsSzDTaR4uiQuvowQ2VWOClZtAvq0zwuqHql5CkUh7mBQ2omErarTil5NMVldkwJGyold2YoJWPRk6cvnDp4VFewz8m2AbcD3eRDJ/AUMKr2bIMe3KrRrT5uCxgNHtMwXpOHPQ++FbgGmEq+PF1hvlmTw3wzVX3e6ukrd2HX5KeUB9sIXAxMIg6/1bDvHeD8jBXXJPlgY0qfuafwlghAh15bpLHzc+ByYHITBMB9Xq3JQwUZgh73tPMb4GZgesQh6N60k/AjBZiEp8jOPz3t3AHcJWWT1yTsbLzP9y6cCTzgcauPt1Gd7EDyYSZwv87rY6fT9k9I69fCPeHeE3COUdnmbAzGRX15YNSfAQ4nH/YBbgtIY3FPu68A82oc/zi9cog2GjjdfS3wpWcHnTR8FTiB/IamKwNembi2DlhU463Ax7HnQzfzXwIMBHTwTWAx+SmlC4APAuz8BLiogsI7eIJXE9EU4TnAhgZ3MAvOAtYGfKh3V/SyCY63Sn/fIB9E5yTgNQ03Ph3cAlyV9hG9ARwLvKgELR87XcpLKUeoz03HkQFZCAnwgyZQN5FmjTvHk572uTfBhSGpo43qYWVGBnbN0LF9pWSiO7stApBkkJZyaOA7/fJWGCp14Dp9hPfV6KuB+QF2zNe+vvNSywZg/IlyaWAO53pgYYrzL9S2vscflG0tHYBGJOcOSJXMKUnOnaPfBhqQnNsWAWjm9PSk3QLQbAUabRuAZilRavsAxC7SswBUKFP1yeHcVEeZqgWgAk6lLADulswcKklJGdKrZPe30+r8EG8BiIwFIDIWgMhYACJjAYiMBSAyFoDIWAAiYwGIjAUgMhaAyFgAImMBiIwFIDIWgMgUPgCVvunmVTlDuwfg2wodOJNikBQ9AJUWu3BFGs3O8ioBWEFBuLFKJ1yFTbOyOMW35mrVM01DT43cnpdyWFIghDdSBMBtUwgeTJGZ1q9czLyKM2oxknJptULQpeqXNCkkIwrYgpxKllzt2IkTFNK1VAAcx3gse5CUFFG/DFwWWEhdLe3xUuB5OTGZoCy1r5WGoNKaLN+y1qSsNGidlk9YpmK7eSqu3l9V/ZO12uIhyvl0C3TcoH36qlwE5YLg7BT2uG0KR7fWyvEtjEsybu9OYOuKKts7iVpo3KpRd1R5UEsitEUVCjz6lFe6Xf9OUxhSGDrU8dWBFZWNbEMaytqWWUqiXduAIjqftkv/6c8tGVVkFpJO4DytYPJFA4vrEj0Yvq/l2C7MqR658EzXC7yrtWzOGjlxi5b+Gispad0hteVqxN4GntOEulSLhGSxWpZhGIZhGIZhGIZhGIZh4MN/hN4K9eVoLMsAAAAASUVORK5CYII=" alt="graduation-cap">
41
+ <span>Continue</span>
42
+ </sly-iw-launch-button>
43
+ {% else %}
44
+ <!-- Module not found - buttons disabled -->
45
+ {% endif %}
46
+ </div>
47
+ </div>
48
+ <div class="experiment-info-subheader-body">
49
+ <div class="experiment-info-subheader-block">
50
+ <div class="experiment-info-subheader-mini-title">
51
+ <h2>Training Info</h2>
52
+ {% if training.session_url %}
53
+ <a href="{{ training.session_url }}" target="_blank">Session <i class="zmdi zmdi-arrow-right-top" /></a>
54
+ {% endif %}
55
+ {% if training.logs.url %}
56
+ <a href="{{ training.logs.url }}" target="_blank">Logs <i class="zmdi zmdi-arrow-right-top" /></a>
57
+ {% endif %}
58
+ </div>
59
+ <ul>
60
+ <li><strong>Session ID:</strong> {{ session.id }}</li>
61
+ <li><strong>Date:</strong> {{ session.start_time }}</li>
62
+ <li><strong>Duration:</strong> {{ session.duration or "N/A" }}</li>
63
+ <li><strong>Device:</strong> {{ training.device or "N/A" }}</li>
64
+ <li><strong>Total Iterations:</strong> {{ training.total_iterations }}</li>
65
+ </ul>
66
+ </div>
67
+ <div class="experiment-info-subheader-block">
68
+ <div class="experiment-info-subheader-mini-title">
69
+ <h2>Model</h2>
70
+ </div>
71
+ <ul>
72
+ <li><strong>Architecture:</strong> {{ model.name }}</li>
73
+ <li><strong>Backbone:</strong> {{ model.backbone }}</li>
74
+ <li><strong>Task:</strong> {{ model.task_type or "Live Learning" }}</li>
75
+ <li><strong>Classes:</strong> ({{ model.num_classes }}) {% for class_name in model.classes_short %}<span class="class-tag">{{ class_name }}</span> {% endfor %}</li> </ul>
76
+ </div>
77
+ <div class="experiment-info-subheader-block">
78
+ <div class="experiment-info-subheader-mini-title">
79
+ <h2>Training Data</h2>
80
+ <a href="{{ session.project.url }}" target="_blank">Project <i class="zmdi zmdi-arrow-right-top" /></a>
81
+ <a href="{{ session.artifacts_url }}" target="_blank">Artifacts <i class="zmdi zmdi-arrow-right-top" /></a>
82
+ </div>
83
+ <ul>
84
+ <li><strong>Project:</strong> {{ session.project.name }}</li>
85
+ <li><strong>Final Size:</strong> {{ dataset.current_size }} samples</li>
86
+ <li><strong>Initial Samples:</strong> {{ dataset.initial_samples }}</li>
87
+ </ul>
88
+ </div>
89
+ </div>
90
+ <div class="experiment-info-subheader-footer-menu">
91
+ <a :href="`${location.pathname}#about-live-training`" class="active">About Live Training</a>
92
+ <a :href="`${location.pathname}#training-results`">Training Results</a>
93
+ <a :href="`${location.pathname}#checkpoints`">Checkpoints</a>
94
+ <a :href="`${location.pathname}#classes`">Classes</a>
95
+ </div>
96
+ </div>
@@ -0,0 +1,51 @@
1
+ ## About Live Training
2
+
3
+ Live Training is a novel data annotation paradigm where the model trains in parallel with the annotation process, rather than after it. Each newly labeled sample is immediately added to the training set, and the model adapts in real-time, providing progressively more accurate predictions for subsequent images.
4
+ This creates a synergistic human-AI collaboration: the growing dataset improves the model → the improved model accelerates annotation → faster annotation expands the dataset. Unlike traditional workflows where annotators wait for training to complete and GPUs sit idle during labeling, Live Training utilizes resources continuously and efficiently.
5
+
6
+ ---
7
+ ## Training Results
8
+
9
+ {{ widgets.training_plot | safe }}
10
+
11
+ ## Checkpoints
12
+
13
+ [📂 Open in Team Files]({{ session.artifacts_url }}){:target="_blank"}
14
+
15
+ <details>
16
+ <summary>📋 Checkpoints</summary>
17
+
18
+ {% if widgets.tables.checkpoints %}
19
+ {{ widgets.tables.checkpoints | safe }}
20
+ {% else %}
21
+ No checkpoints available.
22
+ {% endif %}
23
+
24
+ </details>
25
+
26
+ ## Classes
27
+
28
+ The model can predict {{ model.num_classes }} classes. Here is the full list of classes:
29
+
30
+ <details>
31
+ <summary>Classes</summary>
32
+ {{ widgets.tables.classes }}
33
+
34
+ </details>
35
+
36
+
37
+ {# ## Hyperparameters
38
+
39
+ {% if hyperparameters %}
40
+ | Parameter | Value |
41
+ |-----------|-------|
42
+ {% for key, value in hyperparameters.items() %}
43
+ | {{ key }} | {{ value }} |
44
+ {% endfor %}
45
+ {% else %}
46
+ No hyperparameters available.
47
+ {% endif %}
48
+
49
+ ## Configuration
50
+
51
+ **Config file:** `{{ model.config_file }}` #}