learning-loop-node 0.10.3__tar.gz → 0.10.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of learning-loop-node might be problematic. Click here for more details.

Files changed (85) hide show
  1. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/PKG-INFO +1 -1
  2. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/detector/detector_node.py +4 -1
  3. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/trainer/io_helpers.py +9 -10
  4. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/trainer/tests/states/test_state_upload_detections.py +13 -12
  5. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/pyproject.toml +1 -1
  6. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/README.md +0 -0
  7. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/__init__.py +0 -0
  8. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/annotation/__init__.py +0 -0
  9. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/annotation/annotator_logic.py +0 -0
  10. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/annotation/annotator_node.py +0 -0
  11. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/annotation/tests/test_annotator_node.py +0 -0
  12. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/conftest.py +0 -0
  13. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/data_classes/__init__.py +0 -0
  14. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/data_classes/annotations.py +0 -0
  15. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/data_classes/detections.py +0 -0
  16. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/data_classes/general.py +0 -0
  17. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/data_classes/socket_response.py +0 -0
  18. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/data_classes/training.py +0 -0
  19. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/data_exchanger.py +0 -0
  20. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/detector/__init__.py +0 -0
  21. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/detector/detector_logic.py +0 -0
  22. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/detector/inbox_filter/__init__.py +0 -0
  23. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/detector/inbox_filter/cam_observation_history.py +0 -0
  24. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/detector/inbox_filter/relevance_filter.py +0 -0
  25. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/detector/inbox_filter/tests/test_observation.py +0 -0
  26. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/detector/inbox_filter/tests/test_relevance_group.py +0 -0
  27. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/detector/inbox_filter/tests/test_unexpected_observations_count.py +0 -0
  28. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/detector/outbox.py +0 -0
  29. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/detector/rest/__init__.py +0 -0
  30. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/detector/rest/about.py +0 -0
  31. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/detector/rest/backdoor_controls.py +0 -0
  32. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/detector/rest/detect.py +0 -0
  33. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/detector/rest/operation_mode.py +0 -0
  34. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/detector/rest/upload.py +0 -0
  35. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/detector/tests/__init__.py +0 -0
  36. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/detector/tests/conftest.py +0 -0
  37. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/detector/tests/test.jpg +0 -0
  38. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/detector/tests/test_client_communication.py +0 -0
  39. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/detector/tests/test_outbox.py +0 -0
  40. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/detector/tests/test_relevance_filter.py +0 -0
  41. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/detector/tests/testing_detector.py +0 -0
  42. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/examples/novelty_score_updater.py +0 -0
  43. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/globals.py +0 -0
  44. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/helpers/__init__.py +0 -0
  45. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/helpers/environment_reader.py +0 -0
  46. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/helpers/gdrive_downloader.py +0 -0
  47. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/helpers/log_conf.py +0 -0
  48. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/helpers/misc.py +0 -0
  49. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/loop_communication.py +0 -0
  50. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/node.py +0 -0
  51. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/py.typed +0 -0
  52. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/pytest.ini +0 -0
  53. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/tests/__init__.py +0 -0
  54. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/tests/conftest.py +0 -0
  55. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/tests/test_data/file_1.txt +0 -0
  56. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/tests/test_data/file_2.txt +0 -0
  57. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/tests/test_data/model.json +0 -0
  58. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/tests/test_data_classes.py +0 -0
  59. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/tests/test_downloader.py +0 -0
  60. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/tests/test_executor.py +0 -0
  61. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/tests/test_helper.py +0 -0
  62. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/tests/test_learning_loop_node.py +0 -0
  63. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/trainer/__init__.py +0 -0
  64. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/trainer/downloader.py +0 -0
  65. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/trainer/executor.py +0 -0
  66. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/trainer/rest/__init__.py +0 -0
  67. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/trainer/rest/backdoor_controls.py +0 -0
  68. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/trainer/rest/controls.py +0 -0
  69. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/trainer/tests/__init__.py +0 -0
  70. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/trainer/tests/conftest.py +0 -0
  71. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/trainer/tests/state_helper.py +0 -0
  72. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/trainer/tests/states/__init__.py +0 -0
  73. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/trainer/tests/states/test_state_cleanup.py +0 -0
  74. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/trainer/tests/states/test_state_detecting.py +0 -0
  75. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/trainer/tests/states/test_state_download_train_model.py +0 -0
  76. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/trainer/tests/states/test_state_prepare.py +0 -0
  77. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/trainer/tests/states/test_state_sync_confusion_matrix.py +0 -0
  78. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/trainer/tests/states/test_state_train.py +0 -0
  79. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/trainer/tests/states/test_state_upload_model.py +0 -0
  80. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/trainer/tests/test_errors.py +0 -0
  81. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/trainer/tests/test_trainer_states.py +0 -0
  82. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/trainer/tests/testing_trainer_logic.py +0 -0
  83. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/trainer/trainer_logic.py +0 -0
  84. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/trainer/trainer_logic_generic.py +0 -0
  85. {learning_loop_node-0.10.3 → learning_loop_node-0.10.5}/learning_loop_node/trainer/trainer_node.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: learning-loop-node
3
- Version: 0.10.3
3
+ Version: 0.10.5
4
4
  Summary: Python Library for Nodes which connect to the Zauberzeug Learning Loop
5
5
  Home-page: https://github.com/zauberzeug/learning_loop_node
6
6
  License: MIT
@@ -43,6 +43,8 @@ class DetectorNode(Node):
43
43
  self.operation_mode: OperationMode = OperationMode.Startup
44
44
  self.connected_clients: List[str] = []
45
45
 
46
+ self.detection_lock = asyncio.Lock()
47
+
46
48
  self.outbox: Outbox = Outbox()
47
49
  self.data_exchanger = DataExchanger(
48
50
  Context(organization=self.organization, project=self.project),
@@ -300,8 +302,9 @@ class DetectorNode(Node):
300
302
  """Note: raw_image is a numpy array of type uint8, but not in the correrct shape!
301
303
  It can be converted e.g. using cv2.imdecode(raw_image, cv2.IMREAD_COLOR)"""
302
304
  loop = asyncio.get_event_loop()
305
+ await self.detection_lock.acquire()
303
306
  detections: Detections = await loop.run_in_executor(None, self.detector_logic.evaluate, raw_image)
304
-
307
+ self.detection_lock.release()
305
308
  for seg_detection in detections.segmentation_detections:
306
309
  if isinstance(seg_detection.shape, Shape):
307
310
  shapes = ','.join([str(value) for p in seg_detection.shape.points for _,
@@ -159,18 +159,20 @@ class ActiveTrainingIO:
159
159
  async def _upload_detections_batched(self, context: Context, detections: List[Detections]):
160
160
  batch_size = 100
161
161
  skip_detections = self.load_detection_upload_progress()
162
- up_count = 0
163
162
  for i in range(skip_detections, len(detections), batch_size):
164
- up_count += 1
165
- up_progress = i+batch_size
166
- batch_detections = detections[i:up_progress]
167
- await self._upload_detections(context, batch_detections, up_progress)
163
+ up_progress = i + batch_size if i + batch_size < len(detections) else 0
164
+ batch_detections = detections[i:i + batch_size]
165
+ await self._upload_detections_and_save_progress(context, batch_detections, up_progress)
168
166
  skip_detections = up_progress
169
167
 
170
168
  logging.info('uploaded %d detections', len(detections))
171
169
 
172
- async def _upload_detections(self, context: Context, batch_detections: List[Detections], up_progress: int):
170
+ async def _upload_detections_and_save_progress(self, context: Context, batch_detections: List[Detections], up_progress: int):
171
+ if len(batch_detections) == 0:
172
+ print('skipping empty batch', flush=True)
173
+ return
173
174
  detections_json = [jsonable_encoder(asdict(detections)) for detections in batch_detections]
175
+ print(f'uploading {len(detections_json)} detections', flush=True)
174
176
  response = await self.loop_communicator.post(
175
177
  f'/{context.organization}/projects/{context.project}/detections', json=detections_json)
176
178
  if response.status_code != 200:
@@ -179,7 +181,4 @@ class ActiveTrainingIO:
179
181
  raise Exception(msg)
180
182
 
181
183
  logging.info('successfully uploaded detections')
182
- if up_progress >= len(batch_detections):
183
- self.save_detection_upload_progress(0)
184
- else:
185
- self.save_detection_upload_progress(up_progress)
184
+ self.save_detection_upload_progress(up_progress)
@@ -37,7 +37,7 @@ async def create_valid_detection_file(trainer: TrainerLogic, number_of_entries:
37
37
  'point_detections': [], 'segmentation_detections': []})
38
38
  detections = [detection_entry] * number_of_entries
39
39
 
40
- assert trainer.active_training_io is not None # pylint: disable=protected-access
40
+ assert trainer.active_training_io is not None
41
41
  trainer.active_training_io.save_detections(detections, file_index)
42
42
 
43
43
 
@@ -80,21 +80,21 @@ async def test_ensure_all_detections_are_uploaded(test_initialized_trainer: Test
80
80
  create_active_training_file(trainer, training_state=TrainerState.Detected)
81
81
  trainer._init_from_last_training()
82
82
 
83
- await create_valid_detection_file(trainer, 2, 0)
84
- await create_valid_detection_file(trainer, 2, 1)
83
+ await create_valid_detection_file(trainer, 4, 0)
84
+ await create_valid_detection_file(trainer, 4, 1)
85
85
 
86
86
  assert trainer.active_training_io.load_detections_upload_file_index() == 0
87
87
  detections = trainer.active_training_io.load_detections(0)
88
- assert len(detections) == 2
88
+ assert len(detections) == 4
89
89
 
90
- batch_size = 1
90
+ batch_size = 2
91
91
  skip_detections = trainer.active_training_io.load_detection_upload_progress()
92
92
  for i in range(skip_detections, len(detections), batch_size):
93
93
  batch_detections = detections[i:i+batch_size]
94
- # pylint: disable=protected-access
95
- await trainer.active_training_io._upload_detections(trainer.training.context, batch_detections, i + batch_size)
94
+ progress = i + batch_size if i + batch_size < len(detections) else 0
95
+ await trainer.active_training_io._upload_detections_and_save_progress(trainer.training.context, batch_detections, progress)
96
96
 
97
- expected_value = i + batch_size if i + batch_size < len(detections) else 0 # Progress is reset for every file
97
+ expected_value = progress # Progress is reset for every file
98
98
  assert trainer.active_training_io.load_detection_upload_progress() == expected_value
99
99
 
100
100
  assert trainer.active_training_io.load_detections_upload_file_index() == 0
@@ -107,10 +107,11 @@ async def test_ensure_all_detections_are_uploaded(test_initialized_trainer: Test
107
107
  skip_detections = trainer.active_training_io.load_detection_upload_progress()
108
108
  for i in range(skip_detections, len(detections), batch_size):
109
109
  batch_detections = detections[i:i+batch_size]
110
- # pylint: disable=protected-access
111
- await trainer.active_training_io._upload_detections(trainer.training.context, batch_detections, i + batch_size)
112
110
 
113
- expected_value = i + batch_size if i + batch_size < len(detections) else 0 # Progress is reset for every file
111
+ progress = i + batch_size if i + batch_size < len(detections) else 0
112
+ await trainer.active_training_io._upload_detections_and_save_progress(trainer.training.context, batch_detections, progress)
113
+
114
+ expected_value = progress # Progress is reset for every file
114
115
  assert trainer.active_training_io.load_detection_upload_progress() == expected_value
115
116
  assert trainer.active_training_io.load_detections_upload_file_index() == 1
116
117
 
@@ -160,5 +161,5 @@ async def test_abort_uploading(test_initialized_trainer: TestingTrainerLogic):
160
161
  await trainer.stop()
161
162
  await asyncio.sleep(0.1)
162
163
 
163
- assert trainer._training is None # pylint: disable=protected-access
164
+ assert trainer._training is None
164
165
  assert trainer.node.last_training_io.exists() is False
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "learning_loop_node"
3
- version = "v0.10.3"
3
+ version = "v0.10.5"
4
4
  description = "Python Library for Nodes which connect to the Zauberzeug Learning Loop"
5
5
  authors = ["Zauberzeug GmbH <info@zauberzeug.com>"]
6
6
  license = "MIT"