nedo-vision-worker-core 0.3.8__tar.gz → 0.3.9__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 nedo-vision-worker-core might be problematic. Click here for more details.

Files changed (113) hide show
  1. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/PKG-INFO +4 -4
  2. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/__init__.py +1 -1
  3. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/ai/VideoDebugger.py +9 -0
  4. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/pipeline/PipelineProcessor.py +26 -16
  5. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core.egg-info/PKG-INFO +4 -4
  6. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core.egg-info/requires.txt +2 -2
  7. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/pyproject.toml +4 -5
  8. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/requirements.txt +0 -1
  9. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/MANIFEST.in +0 -0
  10. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/README.md +0 -0
  11. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/ai/FrameDrawer.py +0 -0
  12. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/ai/ImageDebugger.py +0 -0
  13. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/ai/__init__.py +0 -0
  14. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/callbacks/DetectionCallbackManager.py +0 -0
  15. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/callbacks/DetectionCallbackTypes.py +0 -0
  16. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/callbacks/__init__.py +0 -0
  17. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/cli.py +0 -0
  18. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/config/ConfigurationManager.py +0 -0
  19. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/config/__init__.py +0 -0
  20. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/core_service.py +0 -0
  21. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/database/DatabaseManager.py +0 -0
  22. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/database/__init__.py +0 -0
  23. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/detection/BaseDetector.py +0 -0
  24. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/detection/RFDETRDetector.py +0 -0
  25. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/detection/YOLODetector.py +0 -0
  26. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/detection/__init__.py +0 -0
  27. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/detection/detection_processing/DetectionProcessor.py +0 -0
  28. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/detection/detection_processing/HumanDetectionProcessor.py +0 -0
  29. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/detection/detection_processing/PPEDetectionProcessor.py +0 -0
  30. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/detection/detection_processing/__init__.py +0 -0
  31. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/doctor.py +0 -0
  32. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/drawing_assets/blue/inner_corner.png +0 -0
  33. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/drawing_assets/blue/inner_frame.png +0 -0
  34. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/drawing_assets/blue/line.png +0 -0
  35. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/drawing_assets/blue/top_left.png +0 -0
  36. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/drawing_assets/blue/top_right.png +0 -0
  37. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/drawing_assets/red/inner_corner.png +0 -0
  38. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/drawing_assets/red/inner_frame.png +0 -0
  39. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/drawing_assets/red/line.png +0 -0
  40. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/drawing_assets/red/top_left.png +0 -0
  41. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/drawing_assets/red/top_right.png +0 -0
  42. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/icons/boots-green.png +0 -0
  43. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/icons/boots-red.png +0 -0
  44. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/icons/gloves-green.png +0 -0
  45. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/icons/gloves-red.png +0 -0
  46. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/icons/goggles-green.png +0 -0
  47. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/icons/goggles-red.png +0 -0
  48. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/icons/helmet-green.png +0 -0
  49. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/icons/helmet-red.png +0 -0
  50. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/icons/mask-red.png +0 -0
  51. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/icons/vest-green.png +0 -0
  52. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/icons/vest-red.png +0 -0
  53. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/models/__init__.py +0 -0
  54. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/models/ai_model.py +0 -0
  55. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/models/auth.py +0 -0
  56. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/models/config.py +0 -0
  57. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/models/dataset_source.py +0 -0
  58. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/models/logs.py +0 -0
  59. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/models/ppe_detection.py +0 -0
  60. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/models/ppe_detection_label.py +0 -0
  61. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/models/restricted_area_violation.py +0 -0
  62. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/models/user.py +0 -0
  63. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/models/worker_source.py +0 -0
  64. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/models/worker_source_pipeline.py +0 -0
  65. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/models/worker_source_pipeline_config.py +0 -0
  66. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/models/worker_source_pipeline_debug.py +0 -0
  67. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/models/worker_source_pipeline_detection.py +0 -0
  68. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/pipeline/ModelManager.py +0 -0
  69. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/pipeline/PipelineConfigManager.py +0 -0
  70. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/pipeline/PipelineManager.py +0 -0
  71. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/pipeline/PipelinePrepocessor.py +0 -0
  72. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/pipeline/PipelineSyncThread.py +0 -0
  73. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/pipeline/__init__.py +0 -0
  74. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/preprocessing/ImageResizer.py +0 -0
  75. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/preprocessing/ImageRoi.py +0 -0
  76. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/preprocessing/Preprocessor.py +0 -0
  77. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/preprocessing/__init__.py +0 -0
  78. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/repositories/AIModelRepository.py +0 -0
  79. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/repositories/BaseRepository.py +0 -0
  80. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/repositories/PPEDetectionRepository.py +0 -0
  81. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/repositories/RestrictedAreaRepository.py +0 -0
  82. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/repositories/WorkerSourcePipelineDebugRepository.py +0 -0
  83. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/repositories/WorkerSourcePipelineDetectionRepository.py +0 -0
  84. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/repositories/WorkerSourcePipelineRepository.py +0 -0
  85. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/repositories/WorkerSourceRepository.py +0 -0
  86. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/repositories/__init__.py +0 -0
  87. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/services/SharedVideoStreamServer.py +0 -0
  88. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/services/VideoSharingDaemon.py +0 -0
  89. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/services/VideoSharingDaemonManager.py +0 -0
  90. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/streams/RTMPStreamer.py +0 -0
  91. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/streams/SharedVideoDeviceManager.py +0 -0
  92. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/streams/StreamSyncThread.py +0 -0
  93. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/streams/VideoStream.py +0 -0
  94. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/streams/VideoStreamManager.py +0 -0
  95. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/streams/__init__.py +0 -0
  96. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/tracker/SFSORT.py +0 -0
  97. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/tracker/TrackerManager.py +0 -0
  98. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/tracker/__init__.py +0 -0
  99. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/util/BoundingBoxMetrics.py +0 -0
  100. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/util/DrawingUtils.py +0 -0
  101. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/util/ModelReadinessChecker.py +0 -0
  102. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/util/PersonAttributeMatcher.py +0 -0
  103. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/util/PersonRestrictedAreaMatcher.py +0 -0
  104. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/util/PipelinePreviewChecker.py +0 -0
  105. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/util/PlatformDetector.py +0 -0
  106. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/util/TablePrinter.py +0 -0
  107. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core/util/__init__.py +0 -0
  108. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core.egg-info/SOURCES.txt +0 -0
  109. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core.egg-info/dependency_links.txt +0 -0
  110. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core.egg-info/entry_points.txt +0 -0
  111. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/nedo_vision_worker_core.egg-info/top_level.txt +0 -0
  112. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/setup.cfg +0 -0
  113. {nedo_vision_worker_core-0.3.8 → nedo_vision_worker_core-0.3.9}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nedo-vision-worker-core
3
- Version: 0.3.8
3
+ Version: 0.3.9
4
4
  Summary: Nedo Vision Worker Core Library for AI Vision Processing
5
5
  Author-email: Willy Achmat Fauzi <willy.achmat@gmail.com>
6
6
  Maintainer-email: Willy Achmat Fauzi <willy.achmat@gmail.com>
@@ -30,7 +30,7 @@ Classifier: Environment :: No Input/Output (Daemon)
30
30
  Requires-Python: >=3.8
31
31
  Description-Content-Type: text/markdown
32
32
  Requires-Dist: alembic>=1.8.0
33
- Requires-Dist: numpy>=1.21.0
33
+ Requires-Dist: numpy<2.0.0,>=1.21.0
34
34
  Requires-Dist: pillow>=8.0.0
35
35
  Requires-Dist: psutil>=5.9.0
36
36
  Requires-Dist: scipy>=1.9.0
@@ -40,8 +40,6 @@ Requires-Dist: torch>=1.9.0
40
40
  Requires-Dist: torchvision>=0.10.0
41
41
  Requires-Dist: ultralytics>=8.0.0
42
42
  Requires-Dist: rfdetr<2.0.0,>=1.2.0
43
- Provides-Extra: opencv
44
- Requires-Dist: opencv-python>=4.6.0; extra == "opencv"
45
43
  Provides-Extra: dev
46
44
  Requires-Dist: pytest>=7.0.0; extra == "dev"
47
45
  Requires-Dist: black>=22.0.0; extra == "dev"
@@ -49,6 +47,8 @@ Requires-Dist: isort>=5.10.0; extra == "dev"
49
47
  Requires-Dist: mypy>=0.950; extra == "dev"
50
48
  Requires-Dist: flake8>=4.0.0; extra == "dev"
51
49
  Requires-Dist: pre-commit>=2.17.0; extra == "dev"
50
+ Provides-Extra: opencv
51
+ Requires-Dist: opencv-python<5.0.0,>=4.6.0; extra == "opencv"
52
52
 
53
53
  # Nedo Vision Worker Core
54
54
 
@@ -7,7 +7,7 @@ A library for running AI vision processing and detection in the Nedo Vision plat
7
7
  from .core_service import CoreService
8
8
  from .callbacks import DetectionType, CallbackTrigger, DetectionData, IntervalMetadata
9
9
 
10
- __version__ = "0.3.8"
10
+ __version__ = "0.3.9"
11
11
  __all__ = [
12
12
  "CoreService",
13
13
  "DetectionType",
@@ -59,6 +59,15 @@ class VideoDebugger:
59
59
  except Exception as e:
60
60
  logging.error(f"Error closing window {window_name}: {e}")
61
61
  del self.windows[window_name]
62
+
63
+ def is_window_open(self, pipeline_id):
64
+ """Check if a window is open for a given pipeline."""
65
+ with self.lock:
66
+ # Check if any window exists for this pipeline
67
+ for window_name in self.windows.keys():
68
+ if f"Pipeline {pipeline_id}" in window_name:
69
+ return True
70
+ return False
62
71
 
63
72
  def close_all(self):
64
73
  """Close all windows."""
@@ -45,7 +45,7 @@ class PipelineProcessor:
45
45
  self.rtmp_streamer = None
46
46
  self.rtmp_streaming_active = False
47
47
  self.last_preview_check_time = 0
48
- self.preview_check_interval = 5.0 # Check every 5 seconds
48
+ self.preview_check_interval = 10.0 # Check every 10 seconds (reduced from 5s to save CPU)
49
49
  self.pipeline_repo = WorkerSourcePipelineRepository()
50
50
 
51
51
  self.detection_processor_codes = [
@@ -174,14 +174,20 @@ class PipelineProcessor:
174
174
  )
175
175
  self.detection_thread.start()
176
176
 
177
+ target_render_fps = 25.0
178
+ target_frame_time = 1.0 / target_render_fps
179
+
177
180
  try:
178
181
  while self.running:
182
+ loop_start = time.time()
183
+
179
184
  frame = video_manager.get_frame(worker_source_id)
180
185
 
181
186
  if frame is None:
182
187
  if not self._handle_frame_failure(video_manager, worker_source_id):
183
188
  break
184
189
  # no frame this tick—just continue (the streamer will repeat last good frame)
190
+ time.sleep(0.04)
185
191
  continue
186
192
 
187
193
  # successful frame
@@ -189,18 +195,23 @@ class PipelineProcessor:
189
195
  self.last_successful_frame_time = time.time()
190
196
  self.frame_counter += 1
191
197
 
192
- # draw annotations
193
- try:
194
- self.frame_drawer.draw_polygons(frame)
195
- frame_to_draw = frame.copy() if self.debug_flag else frame
196
- drawn_frame = self.frame_drawer.draw_frame(
197
- frame_to_draw,
198
- self.tracked_objects_render,
199
- with_trails=True,
200
- trail_length=int(max(1, 2 / self.detection_interval))
201
- )
202
- except Exception as e:
203
- logging.error(f"❌ Draw failed, using raw frame: {e}")
198
+ should_draw = self.rtmp_streaming_active or self.debug_flag or self.video_debugger.is_window_open(pipeline_id)
199
+
200
+ if should_draw:
201
+ # draw annotations
202
+ try:
203
+ self.frame_drawer.draw_polygons(frame)
204
+ frame_to_draw = frame.copy() if self.debug_flag else frame
205
+ drawn_frame = self.frame_drawer.draw_frame(
206
+ frame_to_draw,
207
+ self.tracked_objects_render,
208
+ with_trails=True,
209
+ trail_length=int(max(1, 2 / self.detection_interval))
210
+ )
211
+ except Exception as e:
212
+ logging.error(f"❌ Draw failed, using raw frame: {e}")
213
+ drawn_frame = frame
214
+ else:
204
215
  drawn_frame = frame
205
216
 
206
217
  # debug snapshot if requested
@@ -268,14 +279,13 @@ class PipelineProcessor:
268
279
  except queue.Full:
269
280
  pass
270
281
 
271
- # visualize
272
282
  try:
273
283
  self.video_debugger.show_frame(pipeline_id, worker_source_id, drawn_frame)
274
284
  except Exception as e:
275
285
  logging.error(f"⚠️ Failed to render frame for pipeline {pipeline_id}: {e}")
276
286
 
277
- # Dynamic sleep based on detection interval to reduce CPU
278
- sleep_time = min(0.01, self.detection_interval / 10)
287
+ loop_elapsed = time.time() - loop_start
288
+ sleep_time = max(0.001, target_frame_time - loop_elapsed)
279
289
  time.sleep(sleep_time)
280
290
 
281
291
  except Exception as e:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nedo-vision-worker-core
3
- Version: 0.3.8
3
+ Version: 0.3.9
4
4
  Summary: Nedo Vision Worker Core Library for AI Vision Processing
5
5
  Author-email: Willy Achmat Fauzi <willy.achmat@gmail.com>
6
6
  Maintainer-email: Willy Achmat Fauzi <willy.achmat@gmail.com>
@@ -30,7 +30,7 @@ Classifier: Environment :: No Input/Output (Daemon)
30
30
  Requires-Python: >=3.8
31
31
  Description-Content-Type: text/markdown
32
32
  Requires-Dist: alembic>=1.8.0
33
- Requires-Dist: numpy>=1.21.0
33
+ Requires-Dist: numpy<2.0.0,>=1.21.0
34
34
  Requires-Dist: pillow>=8.0.0
35
35
  Requires-Dist: psutil>=5.9.0
36
36
  Requires-Dist: scipy>=1.9.0
@@ -40,8 +40,6 @@ Requires-Dist: torch>=1.9.0
40
40
  Requires-Dist: torchvision>=0.10.0
41
41
  Requires-Dist: ultralytics>=8.0.0
42
42
  Requires-Dist: rfdetr<2.0.0,>=1.2.0
43
- Provides-Extra: opencv
44
- Requires-Dist: opencv-python>=4.6.0; extra == "opencv"
45
43
  Provides-Extra: dev
46
44
  Requires-Dist: pytest>=7.0.0; extra == "dev"
47
45
  Requires-Dist: black>=22.0.0; extra == "dev"
@@ -49,6 +47,8 @@ Requires-Dist: isort>=5.10.0; extra == "dev"
49
47
  Requires-Dist: mypy>=0.950; extra == "dev"
50
48
  Requires-Dist: flake8>=4.0.0; extra == "dev"
51
49
  Requires-Dist: pre-commit>=2.17.0; extra == "dev"
50
+ Provides-Extra: opencv
51
+ Requires-Dist: opencv-python<5.0.0,>=4.6.0; extra == "opencv"
52
52
 
53
53
  # Nedo Vision Worker Core
54
54
 
@@ -1,5 +1,5 @@
1
1
  alembic>=1.8.0
2
- numpy>=1.21.0
2
+ numpy<2.0.0,>=1.21.0
3
3
  pillow>=8.0.0
4
4
  psutil>=5.9.0
5
5
  scipy>=1.9.0
@@ -19,4 +19,4 @@ flake8>=4.0.0
19
19
  pre-commit>=2.17.0
20
20
 
21
21
  [opencv]
22
- opencv-python>=4.6.0
22
+ opencv-python<5.0.0,>=4.6.0
@@ -48,7 +48,7 @@ classifiers = [
48
48
  requires-python = ">=3.8"
49
49
  dependencies = [
50
50
  "alembic>=1.8.0",
51
- "numpy>=1.21.0",
51
+ "numpy>=1.21.0,<2.0.0",
52
52
  "pillow>=8.0.0",
53
53
  "psutil>=5.9.0",
54
54
  "scipy>=1.9.0",
@@ -61,10 +61,6 @@ dependencies = [
61
61
  ]
62
62
 
63
63
  [project.optional-dependencies]
64
- # OpenCV dependencies - use this if not using system packages or custom build
65
- opencv = [
66
- "opencv-python>=4.6.0",
67
- ]
68
64
  dev = [
69
65
  "pytest>=7.0.0",
70
66
  "black>=22.0.0",
@@ -73,6 +69,9 @@ dev = [
73
69
  "flake8>=4.0.0",
74
70
  "pre-commit>=2.17.0",
75
71
  ]
72
+ opencv = [
73
+ "opencv-python>=4.6.0,<5.0.0",
74
+ ]
76
75
 
77
76
  [project.urls]
78
77
  Homepage = "https://gitlab.com/sindika/research/nedo-vision/nedo-vision-worker-core-v2"
@@ -1,6 +1,5 @@
1
1
  alembic>=1.8.0
2
2
  numpy>=1.21.0
3
- opencv-python>=4.6.0
4
3
  pillow>=8.0.0
5
4
  psutil>=5.9.0
6
5
  scipy>=1.9.0