learning-loop-node 0.10.2__tar.gz → 0.10.4__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.2 → learning_loop_node-0.10.4}/PKG-INFO +2 -1
  2. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/README.md +1 -0
  3. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/detector/detector_node.py +4 -1
  4. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/loop_communication.py +6 -5
  5. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/node.py +15 -2
  6. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/pyproject.toml +1 -1
  7. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/__init__.py +0 -0
  8. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/annotation/__init__.py +0 -0
  9. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/annotation/annotator_logic.py +0 -0
  10. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/annotation/annotator_node.py +0 -0
  11. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/annotation/tests/test_annotator_node.py +0 -0
  12. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/conftest.py +0 -0
  13. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/data_classes/__init__.py +0 -0
  14. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/data_classes/annotations.py +0 -0
  15. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/data_classes/detections.py +0 -0
  16. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/data_classes/general.py +0 -0
  17. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/data_classes/socket_response.py +0 -0
  18. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/data_classes/training.py +0 -0
  19. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/data_exchanger.py +0 -0
  20. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/detector/__init__.py +0 -0
  21. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/detector/detector_logic.py +0 -0
  22. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/detector/inbox_filter/__init__.py +0 -0
  23. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/detector/inbox_filter/cam_observation_history.py +0 -0
  24. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/detector/inbox_filter/relevance_filter.py +0 -0
  25. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/detector/inbox_filter/tests/test_observation.py +0 -0
  26. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/detector/inbox_filter/tests/test_relevance_group.py +0 -0
  27. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/detector/inbox_filter/tests/test_unexpected_observations_count.py +0 -0
  28. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/detector/outbox.py +0 -0
  29. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/detector/rest/__init__.py +0 -0
  30. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/detector/rest/about.py +0 -0
  31. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/detector/rest/backdoor_controls.py +0 -0
  32. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/detector/rest/detect.py +0 -0
  33. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/detector/rest/operation_mode.py +0 -0
  34. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/detector/rest/upload.py +0 -0
  35. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/detector/tests/__init__.py +0 -0
  36. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/detector/tests/conftest.py +0 -0
  37. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/detector/tests/test.jpg +0 -0
  38. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/detector/tests/test_client_communication.py +0 -0
  39. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/detector/tests/test_outbox.py +0 -0
  40. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/detector/tests/test_relevance_filter.py +0 -0
  41. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/detector/tests/testing_detector.py +0 -0
  42. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/examples/novelty_score_updater.py +0 -0
  43. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/globals.py +0 -0
  44. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/helpers/__init__.py +0 -0
  45. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/helpers/environment_reader.py +0 -0
  46. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/helpers/gdrive_downloader.py +0 -0
  47. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/helpers/log_conf.py +0 -0
  48. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/helpers/misc.py +0 -0
  49. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/py.typed +0 -0
  50. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/pytest.ini +0 -0
  51. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/tests/__init__.py +0 -0
  52. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/tests/conftest.py +0 -0
  53. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/tests/test_data/file_1.txt +0 -0
  54. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/tests/test_data/file_2.txt +0 -0
  55. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/tests/test_data/model.json +0 -0
  56. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/tests/test_data_classes.py +0 -0
  57. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/tests/test_downloader.py +0 -0
  58. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/tests/test_executor.py +0 -0
  59. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/tests/test_helper.py +0 -0
  60. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/tests/test_learning_loop_node.py +0 -0
  61. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/trainer/__init__.py +0 -0
  62. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/trainer/downloader.py +0 -0
  63. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/trainer/executor.py +0 -0
  64. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/trainer/io_helpers.py +0 -0
  65. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/trainer/rest/__init__.py +0 -0
  66. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/trainer/rest/backdoor_controls.py +0 -0
  67. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/trainer/rest/controls.py +0 -0
  68. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/trainer/tests/__init__.py +0 -0
  69. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/trainer/tests/conftest.py +0 -0
  70. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/trainer/tests/state_helper.py +0 -0
  71. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/trainer/tests/states/__init__.py +0 -0
  72. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/trainer/tests/states/test_state_cleanup.py +0 -0
  73. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/trainer/tests/states/test_state_detecting.py +0 -0
  74. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/trainer/tests/states/test_state_download_train_model.py +0 -0
  75. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/trainer/tests/states/test_state_prepare.py +0 -0
  76. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/trainer/tests/states/test_state_sync_confusion_matrix.py +0 -0
  77. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/trainer/tests/states/test_state_train.py +0 -0
  78. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/trainer/tests/states/test_state_upload_detections.py +0 -0
  79. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/trainer/tests/states/test_state_upload_model.py +0 -0
  80. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/trainer/tests/test_errors.py +0 -0
  81. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/trainer/tests/test_trainer_states.py +0 -0
  82. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/trainer/tests/testing_trainer_logic.py +0 -0
  83. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/trainer/trainer_logic.py +0 -0
  84. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/learning_loop_node/trainer/trainer_logic_generic.py +0 -0
  85. {learning_loop_node-0.10.2 → learning_loop_node-0.10.4}/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.2
3
+ Version: 0.10.4
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
@@ -62,6 +62,7 @@ You can configure connection to our Learning Loop by specifying the following en
62
62
  | LOOP_HOST | HOST | Learning Loop address (e.g. learning-loop.ai) | all |
63
63
  | LOOP_USERNAME | USERNAME | Learning Loop user name | all besides Detector |
64
64
  | LOOP_PASSWORD | PASSWORD | Learning Loop password | all besides Detector |
65
+ | LOOP_SSL_CERT_PATH | - | Path to the SSL certificate | all (opt.) |
65
66
  | LOOP_ORGANIZATION | ORGANIZATION | Organization name | Detector |
66
67
  | LOOP_PROJECT | PROJECT | Project name | Detector |
67
68
  | MIN_UNCERTAIN_THRESHOLD | PROJECT | smallest confidence (float) at which auto-upload will happen | Detector |
@@ -22,6 +22,7 @@ You can configure connection to our Learning Loop by specifying the following en
22
22
  | LOOP_HOST | HOST | Learning Loop address (e.g. learning-loop.ai) | all |
23
23
  | LOOP_USERNAME | USERNAME | Learning Loop user name | all besides Detector |
24
24
  | LOOP_PASSWORD | PASSWORD | Learning Loop password | all besides Detector |
25
+ | LOOP_SSL_CERT_PATH | - | Path to the SSL certificate | all (opt.) |
25
26
  | LOOP_ORGANIZATION | ORGANIZATION | Organization name | Detector |
26
27
  | LOOP_PROJECT | PROJECT | Project name | Detector |
27
28
  | MIN_UNCERTAIN_THRESHOLD | PROJECT | smallest confidence (float) at which auto-upload will happen | Detector |
@@ -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 _,
@@ -17,9 +17,9 @@ class LoopCommunicationException(Exception):
17
17
  class LoopCommunicator():
18
18
  def __init__(self) -> None:
19
19
  host: str = environment_reader.host(default='learning-loop.ai')
20
- ssl_cert_path = environment_reader.ssl_certificate_path()
21
- if ssl_cert_path:
22
- logging.info('Using SSL certificate at %s', ssl_cert_path)
20
+ self.ssl_cert_path = environment_reader.ssl_certificate_path()
21
+ if self.ssl_cert_path:
22
+ logging.info('Using SSL certificate at %s', self.ssl_cert_path)
23
23
  else:
24
24
  logging.info('No SSL certificate path set')
25
25
  self.host: str = host
@@ -28,8 +28,9 @@ class LoopCommunicator():
28
28
  self.organization: str = environment_reader.organization() # used by mock_detector
29
29
  self.project: str = environment_reader.project() # used by mock_detector
30
30
  self.base_url: str = f'http{"s" if "learning-loop.ai" in host else ""}://' + host
31
- if ssl_cert_path:
32
- self.async_client = httpx.AsyncClient(base_url=self.base_url, timeout=Timeout(60.0), verify=ssl_cert_path)
31
+ if self.ssl_cert_path:
32
+ self.async_client = httpx.AsyncClient(
33
+ base_url=self.base_url, timeout=Timeout(60.0), verify=self.ssl_cert_path)
33
34
  else:
34
35
  self.async_client = httpx.AsyncClient(base_url=self.base_url, timeout=Timeout(60.0))
35
36
  self.async_client.cookies.clear()
@@ -1,5 +1,6 @@
1
1
  import asyncio
2
2
  import logging
3
+ import ssl
3
4
  import sys
4
5
  from abc import abstractmethod
5
6
  from contextlib import asynccontextmanager
@@ -8,6 +9,7 @@ from typing import Any, Optional
8
9
 
9
10
  import aiohttp
10
11
  import socketio
12
+ from aiohttp import TCPConnector
11
13
  from fastapi import FastAPI
12
14
  from socketio import AsyncClient
13
15
 
@@ -122,8 +124,19 @@ class Node(FastAPI):
122
124
  """Create a socket.io client that communicates with the learning loop and register the events.
123
125
  Note: The method is called in startup and soft restart of detector, so the _sio_client should always be available."""
124
126
 
125
- self._sio_client = AsyncClient(request_timeout=20,
126
- http_session=aiohttp.ClientSession(cookies=self.loop_communicator.get_cookies()))
127
+ if self.loop_communicator.ssl_cert_path:
128
+ logging.info(f'SIO using SSL certificate path: {self.loop_communicator.ssl_cert_path}')
129
+ ssl_context = ssl.create_default_context(cafile=self.loop_communicator.ssl_cert_path)
130
+ ssl_context.check_hostname = False
131
+ ssl_context.verify_mode = ssl.CERT_REQUIRED
132
+ connector = TCPConnector(ssl=ssl_context)
133
+ self._sio_client = AsyncClient(request_timeout=20,
134
+ http_session=aiohttp.ClientSession(cookies=self.loop_communicator.get_cookies(),
135
+ connector=connector))
136
+
137
+ else:
138
+ self._sio_client = AsyncClient(request_timeout=20,
139
+ http_session=aiohttp.ClientSession(cookies=self.loop_communicator.get_cookies()))
127
140
 
128
141
  # pylint: disable=protected-access
129
142
  self.sio_client._trigger_event = ensure_socket_response(self.sio_client._trigger_event)
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "learning_loop_node"
3
- version = "v0.10.2"
3
+ version = "v0.10.4"
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"