matrice-analytics 0.1.38__py3-none-any.whl → 0.1.40__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.
Potentially problematic release.
This version of matrice-analytics might be problematic. Click here for more details.
- matrice_analytics/post_processing/usecases/age_gender_detection.py +49 -7
- matrice_analytics/post_processing/usecases/color/clip.py +102 -82
- {matrice_analytics-0.1.38.dist-info → matrice_analytics-0.1.40.dist-info}/METADATA +1 -1
- {matrice_analytics-0.1.38.dist-info → matrice_analytics-0.1.40.dist-info}/RECORD +7 -7
- {matrice_analytics-0.1.38.dist-info → matrice_analytics-0.1.40.dist-info}/WHEEL +0 -0
- {matrice_analytics-0.1.38.dist-info → matrice_analytics-0.1.40.dist-info}/licenses/LICENSE.txt +0 -0
- {matrice_analytics-0.1.38.dist-info → matrice_analytics-0.1.40.dist-info}/top_level.txt +0 -0
|
@@ -31,11 +31,31 @@ import numpy as np
|
|
|
31
31
|
#import torch
|
|
32
32
|
import re
|
|
33
33
|
from matrice_analytics.post_processing.core.config import BaseConfig, AlertConfig, ZoneConfig
|
|
34
|
+
|
|
35
|
+
# Try to import optional age/gender dependencies (fail gracefully if missing)
|
|
36
|
+
ort = None
|
|
37
|
+
Image = None
|
|
38
|
+
|
|
34
39
|
try:
|
|
35
|
-
from PIL import Image
|
|
36
40
|
import onnxruntime as ort
|
|
37
|
-
|
|
38
|
-
print("
|
|
41
|
+
from PIL import Image
|
|
42
|
+
print("✓ Age/Gender dependencies available (onnxruntime, PIL)")
|
|
43
|
+
except ImportError as e:
|
|
44
|
+
error_msg = str(e)
|
|
45
|
+
print(f"⚠ Age/Gender dependencies not available: {e}")
|
|
46
|
+
|
|
47
|
+
# Check if it's a NumPy version mismatch issue and provide helpful message
|
|
48
|
+
if "NumPy" in error_msg and ("1.x" in error_msg or "2." in error_msg):
|
|
49
|
+
print("→ DETECTED: NumPy version mismatch!")
|
|
50
|
+
print(" onnxruntime was compiled with NumPy 1.x but NumPy 2.x is installed")
|
|
51
|
+
print(" To fix manually: pip install 'numpy<2' --force-reinstall")
|
|
52
|
+
else:
|
|
53
|
+
print(" To enable manually: pip install onnxruntime-gpu pillow")
|
|
54
|
+
|
|
55
|
+
print("→ Age/Gender detection will be disabled")
|
|
56
|
+
except Exception as e:
|
|
57
|
+
print(f"⚠ Error importing Age/Gender dependencies: {e}")
|
|
58
|
+
print("→ Age/Gender detection will be disabled")
|
|
39
59
|
|
|
40
60
|
|
|
41
61
|
def apply_category_mapping(results: Any, index_to_category: Dict[str, str]) -> Any:
|
|
@@ -89,9 +109,16 @@ def load_model_from_checkpoint(checkpoint_path,local_path):
|
|
|
89
109
|
"""
|
|
90
110
|
Load a model from checkpoint URL
|
|
91
111
|
"""
|
|
112
|
+
if ort is None:
|
|
113
|
+
raise RuntimeError(
|
|
114
|
+
"onnxruntime is not available. Cannot load age/gender detection models.\n"
|
|
115
|
+
"Please install: pip install onnxruntime-gpu\n"
|
|
116
|
+
"Or downgrade numpy: pip install 'numpy<2'"
|
|
117
|
+
)
|
|
118
|
+
|
|
92
119
|
try:
|
|
93
120
|
print(f"Loading model from checkpoint: {checkpoint_path}")
|
|
94
|
-
|
|
121
|
+
|
|
95
122
|
# Check if checkpoint is a URL
|
|
96
123
|
if checkpoint_path.startswith(('http://', 'https://')):
|
|
97
124
|
# Download checkpoint from URL
|
|
@@ -153,10 +180,25 @@ class AgeGenderConfig(BaseConfig):
|
|
|
153
180
|
|
|
154
181
|
def __post_init__(self):
|
|
155
182
|
if self.gender_url and self.age_url:
|
|
156
|
-
|
|
157
|
-
|
|
183
|
+
try:
|
|
184
|
+
self.age_url = load_model_from_checkpoint(self.age_url, "age_detection_prod_model.onnx")
|
|
185
|
+
self.gender_url = load_model_from_checkpoint(self.gender_url, "gender_detection_prod_model.onnx")
|
|
186
|
+
print("✓ Age and Gender models loaded successfully")
|
|
187
|
+
except RuntimeError as e:
|
|
188
|
+
print(f"✗ Failed to load Age/Gender models: {e}")
|
|
189
|
+
print("→ Age/Gender detection will be disabled")
|
|
190
|
+
self.age_url = None
|
|
191
|
+
self.gender_url = None
|
|
192
|
+
except Exception as e:
|
|
193
|
+
print(f"✗ Unexpected error loading Age/Gender models: {e}")
|
|
194
|
+
import traceback
|
|
195
|
+
traceback.print_exc()
|
|
196
|
+
self.age_url = None
|
|
197
|
+
self.gender_url = None
|
|
158
198
|
else:
|
|
159
|
-
|
|
199
|
+
print("⚠ Age and Gender model URLs not provided - detection will be disabled")
|
|
200
|
+
self.age_url = None
|
|
201
|
+
self.gender_url = None
|
|
160
202
|
|
|
161
203
|
|
|
162
204
|
class AgeGenderUseCase(BaseProcessor):
|
|
@@ -29,89 +29,103 @@ import cv2
|
|
|
29
29
|
import io
|
|
30
30
|
import threading
|
|
31
31
|
|
|
32
|
-
#
|
|
33
|
-
|
|
32
|
+
# Try to import optional CLIP dependencies (fail gracefully if missing)
|
|
33
|
+
# These will be None if not available, and auto-install will be attempted on first use
|
|
34
|
+
ort = None
|
|
35
|
+
Image = None
|
|
36
|
+
CLIPProcessor = None
|
|
37
|
+
ir_files = None
|
|
38
|
+
ir_as_file = None
|
|
39
|
+
|
|
40
|
+
try:
|
|
41
|
+
import onnxruntime as ort
|
|
42
|
+
from PIL import Image
|
|
43
|
+
from transformers import CLIPProcessor
|
|
44
|
+
from importlib.resources import files as ir_files, as_file as ir_as_file
|
|
45
|
+
print("✓ CLIP dependencies available (onnxruntime, PIL, transformers)")
|
|
46
|
+
except ImportError as e:
|
|
47
|
+
print(f"⚠ CLIP dependencies not available at import time: {e}")
|
|
48
|
+
print("→ Will attempt auto-installation when color detection is first used")
|
|
49
|
+
except Exception as e:
|
|
50
|
+
print(f"⚠ Error importing CLIP dependencies: {e}")
|
|
51
|
+
print("→ Color detection may be disabled")
|
|
52
|
+
|
|
53
|
+
def try_install_clip_dependencies():
|
|
34
54
|
"""
|
|
35
|
-
|
|
36
|
-
|
|
55
|
+
Attempt to install missing CLIP dependencies.
|
|
56
|
+
Only called when ClipProcessor is actually instantiated (lazy installation).
|
|
57
|
+
Returns True if successful, False otherwise.
|
|
37
58
|
"""
|
|
38
|
-
|
|
59
|
+
global ort, Image, CLIPProcessor, ir_files, ir_as_file
|
|
60
|
+
|
|
61
|
+
print("→ Color detection is being used but dependencies are missing")
|
|
62
|
+
print("→ Attempting auto-installation of missing packages...")
|
|
63
|
+
|
|
64
|
+
packages_to_install = []
|
|
65
|
+
|
|
66
|
+
# Check which packages are missing
|
|
39
67
|
try:
|
|
40
|
-
import onnxruntime
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
from importlib.resources import files as ir_files, as_file as ir_as_file
|
|
44
|
-
print("✓ CLIP dependencies imported successfully (onnxruntime, PIL, transformers)")
|
|
45
|
-
return ort, Image, CLIPProcessor, ir_files, ir_as_file
|
|
46
|
-
except ImportError as e:
|
|
47
|
-
print(f"⚠ Import failed on first attempt: {e}")
|
|
48
|
-
print("→ Attempting auto-installation of missing packages...")
|
|
68
|
+
import onnxruntime
|
|
69
|
+
except ImportError:
|
|
70
|
+
packages_to_install.append("onnxruntime-gpu")
|
|
49
71
|
|
|
50
|
-
|
|
51
|
-
|
|
72
|
+
try:
|
|
73
|
+
from PIL import Image as PILImage
|
|
74
|
+
except ImportError:
|
|
75
|
+
packages_to_install.append("pillow")
|
|
52
76
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
packages_to_install.append("onnxruntime-gpu")
|
|
77
|
+
try:
|
|
78
|
+
from transformers import CLIPProcessor as CLIP
|
|
79
|
+
except ImportError:
|
|
80
|
+
packages_to_install.append("transformers")
|
|
58
81
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
82
|
+
if not packages_to_install:
|
|
83
|
+
print("→ All packages are available, retrying import...")
|
|
84
|
+
else:
|
|
85
|
+
print(f"→ Installing: {', '.join(packages_to_install)}")
|
|
63
86
|
|
|
87
|
+
import subprocess
|
|
64
88
|
try:
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
89
|
+
for package in packages_to_install:
|
|
90
|
+
print(f" Installing {package}...")
|
|
91
|
+
result = subprocess.run(
|
|
92
|
+
[sys.executable, "-m", "pip", "install", package, "--no-warn-script-location"],
|
|
93
|
+
capture_output=True,
|
|
94
|
+
text=True,
|
|
95
|
+
timeout=300
|
|
96
|
+
)
|
|
97
|
+
if result.returncode == 0:
|
|
98
|
+
print(f" ✓ {package} installed successfully")
|
|
99
|
+
else:
|
|
100
|
+
print(f" ✗ Failed to install {package}: {result.stderr}")
|
|
101
|
+
return False
|
|
102
|
+
except Exception as install_error:
|
|
103
|
+
print(f"✗ Installation failed: {install_error}")
|
|
104
|
+
return False
|
|
68
105
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
import onnxruntime as ort
|
|
90
|
-
from PIL import Image
|
|
91
|
-
from transformers import CLIPProcessor
|
|
92
|
-
from importlib.resources import files as ir_files, as_file as ir_as_file
|
|
93
|
-
print("✓ CLIP dependencies imported successfully after auto-installation!")
|
|
94
|
-
return ort, Image, CLIPProcessor, ir_files, ir_as_file
|
|
95
|
-
except ImportError as e2:
|
|
96
|
-
print(f"✗ Import still failed after installation: {e2}")
|
|
97
|
-
print("→ Color detection will be disabled")
|
|
98
|
-
return None, None, None, None, None
|
|
99
|
-
|
|
100
|
-
except subprocess.TimeoutExpired:
|
|
101
|
-
print("✗ Installation timeout - packages took too long to install")
|
|
102
|
-
return None, None, None, None, None
|
|
103
|
-
except Exception as install_error:
|
|
104
|
-
print(f"✗ Installation error: {install_error}")
|
|
105
|
-
return None, None, None, None, None
|
|
106
|
-
else:
|
|
107
|
-
print("✗ Unable to determine which packages are missing")
|
|
108
|
-
return None, None, None, None, None
|
|
106
|
+
# Retry imports after installation
|
|
107
|
+
try:
|
|
108
|
+
print("→ Retrying imports after installation...")
|
|
109
|
+
import onnxruntime as ort_module
|
|
110
|
+
from PIL import Image as PILImage
|
|
111
|
+
from transformers import CLIPProcessor as CLIPProc
|
|
112
|
+
from importlib.resources import files as ir_files_module, as_file as ir_as_file_module
|
|
113
|
+
|
|
114
|
+
# Update global variables
|
|
115
|
+
ort = ort_module
|
|
116
|
+
Image = PILImage
|
|
117
|
+
CLIPProcessor = CLIPProc
|
|
118
|
+
ir_files = ir_files_module
|
|
119
|
+
ir_as_file = ir_as_file_module
|
|
120
|
+
|
|
121
|
+
print("✓ CLIP dependencies imported successfully after installation!")
|
|
122
|
+
return True
|
|
123
|
+
except ImportError as e:
|
|
124
|
+
print(f"✗ Import still failed after installation: {e}")
|
|
125
|
+
return False
|
|
109
126
|
except Exception as e:
|
|
110
|
-
print(f"✗ Unexpected error
|
|
111
|
-
return
|
|
112
|
-
|
|
113
|
-
# Execute the auto-install import
|
|
114
|
-
ort, Image, CLIPProcessor, ir_files, ir_as_file = try_import_with_auto_install()
|
|
127
|
+
print(f"✗ Unexpected error: {e}")
|
|
128
|
+
return False
|
|
115
129
|
|
|
116
130
|
def load_model_from_checkpoint(checkpoint_url: str, providers: Optional[List] = None):
|
|
117
131
|
"""
|
|
@@ -186,16 +200,22 @@ class ClipProcessor:
|
|
|
186
200
|
processor_dir: Optional[str] = None,
|
|
187
201
|
providers: Optional[List[str]] = None):
|
|
188
202
|
|
|
189
|
-
# Check if required dependencies are available
|
|
203
|
+
# Check if required dependencies are available, try auto-install if not
|
|
190
204
|
if ort is None or CLIPProcessor is None or Image is None:
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
205
|
+
print("⚠ Color detection dependencies missing, attempting auto-installation...")
|
|
206
|
+
|
|
207
|
+
# Try to auto-install missing dependencies (lazy installation)
|
|
208
|
+
if not try_install_clip_dependencies():
|
|
209
|
+
raise RuntimeError(
|
|
210
|
+
"Required dependencies for ClipProcessor are not available.\n"
|
|
211
|
+
"Auto-installation failed. Missing: " +
|
|
212
|
+
(("onnxruntime " if ort is None else "") +
|
|
213
|
+
("transformers(CLIPProcessor) " if CLIPProcessor is None else "") +
|
|
214
|
+
("PIL(Image) " if Image is None else "")).strip() + "\n"
|
|
215
|
+
"Please install manually: pip install transformers onnxruntime-gpu pillow"
|
|
216
|
+
)
|
|
217
|
+
|
|
218
|
+
print("✓ Auto-installation successful, continuing with ClipProcessor initialization")
|
|
199
219
|
|
|
200
220
|
self.color_category: List[str] = ["black", "white", "yellow", "gray", "red", "blue", "light blue",
|
|
201
221
|
"green", "brown"]
|
|
@@ -87,7 +87,7 @@ matrice_analytics/post_processing/usecases/__init__.py,sha256=tsu51e2q2gbr5UcALe
|
|
|
87
87
|
matrice_analytics/post_processing/usecases/abandoned_object_detection.py,sha256=zVrqlvgsjc5F2JHd-Zav6d-poVIpTJBpPKZ3CC71lQk,40332
|
|
88
88
|
matrice_analytics/post_processing/usecases/advanced_customer_service.py,sha256=ELt5euxr6P4X2s8-YGngmj27QscOHefjOsx3774sNFk,75914
|
|
89
89
|
matrice_analytics/post_processing/usecases/age_detection.py,sha256=yn1LXOgbnOWSMDnsCds6-uN6W-I1Hy4_-AMrjbT5PtY,41318
|
|
90
|
-
matrice_analytics/post_processing/usecases/age_gender_detection.py,sha256=
|
|
90
|
+
matrice_analytics/post_processing/usecases/age_gender_detection.py,sha256=ok8uCG8pHKqouTSOQyUANou29k6OOohxnhFsTwayOL0,52533
|
|
91
91
|
matrice_analytics/post_processing/usecases/anti_spoofing_detection.py,sha256=XdtDdXGzZMLQdWcoOoiE5t4LPYHhgOtJ7tZCNlq1A2E,31329
|
|
92
92
|
matrice_analytics/post_processing/usecases/assembly_line_detection.py,sha256=I_oeuec84KJnGMg_A8Wgs9U6h_IiopkDz9FbM1JG110,40410
|
|
93
93
|
matrice_analytics/post_processing/usecases/banana_defect_detection.py,sha256=uKvB550Xve3iWfdWeOU3VhgORxD-M_UzsQDQKkYcFBc,30338
|
|
@@ -166,7 +166,7 @@ matrice_analytics/post_processing/usecases/weld_defect_detection.py,sha256=b0dAJ
|
|
|
166
166
|
matrice_analytics/post_processing/usecases/wildlife_monitoring.py,sha256=TMVHJ5GLezmqG7DywmqbLggqNXgpsb63MD7IR6kvDkk,43446
|
|
167
167
|
matrice_analytics/post_processing/usecases/windmill_maintenance.py,sha256=G1eqo3Z-HYmGJ6oeZYrpZwhpvqQ9Lc_T-6S7BLBXHeA,40498
|
|
168
168
|
matrice_analytics/post_processing/usecases/wound_segmentation.py,sha256=ehNX6VuWMB3xAnCySO3ra3Tf_5FUNg5LCSdq_91h374,38342
|
|
169
|
-
matrice_analytics/post_processing/usecases/color/clip.py,sha256=
|
|
169
|
+
matrice_analytics/post_processing/usecases/color/clip.py,sha256=12ir0RkJCb4FJErn_e_9UbjtbBki5PMH2hWJLzyV75Q,21471
|
|
170
170
|
matrice_analytics/post_processing/usecases/color/color_map_utils.py,sha256=SP-AEVcjLmL8rxblu-ixqUJC2fqlcr7ab4hWo4Fcr_k,2677
|
|
171
171
|
matrice_analytics/post_processing/usecases/color/color_mapper.py,sha256=nKPc28mJLlrl2HPua5EUUMweRRSI6WrrUBkeitTm7ms,17459
|
|
172
172
|
matrice_analytics/post_processing/usecases/color/clip_processor/merges.txt,sha256=n9aR98gDkhDg_O0VhlRmxlgg0JtjmIsBdL_iXeKZBRo,524619
|
|
@@ -188,8 +188,8 @@ matrice_analytics/post_processing/utils/format_utils.py,sha256=UTF7A5h9j0_S12xH9
|
|
|
188
188
|
matrice_analytics/post_processing/utils/geometry_utils.py,sha256=BWfdM6RsdJTTLR1GqkWfdwpjMEjTCJyuBxA4zVGKdfk,9623
|
|
189
189
|
matrice_analytics/post_processing/utils/smoothing_utils.py,sha256=78U-yucAcjUiZ0NIAc9NOUSIT0PWP1cqyIPA_Fdrjp0,14699
|
|
190
190
|
matrice_analytics/post_processing/utils/tracking_utils.py,sha256=rWxuotnJ3VLMHIBOud2KLcu4yZfDp7hVPWUtNAq_2xw,8288
|
|
191
|
-
matrice_analytics-0.1.
|
|
192
|
-
matrice_analytics-0.1.
|
|
193
|
-
matrice_analytics-0.1.
|
|
194
|
-
matrice_analytics-0.1.
|
|
195
|
-
matrice_analytics-0.1.
|
|
191
|
+
matrice_analytics-0.1.40.dist-info/licenses/LICENSE.txt,sha256=_uQUZpgO0mRYL5-fPoEvLSbNnLPv6OmbeEDCHXhK6Qc,1066
|
|
192
|
+
matrice_analytics-0.1.40.dist-info/METADATA,sha256=tROotN2KHqbTIpf18BknZQ8Z4zO8VHNMcf7f1q4svas,14378
|
|
193
|
+
matrice_analytics-0.1.40.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
194
|
+
matrice_analytics-0.1.40.dist-info/top_level.txt,sha256=STAPEU-e-rWTerXaspdi76T_eVRSrEfFpURSP7_Dt8E,18
|
|
195
|
+
matrice_analytics-0.1.40.dist-info/RECORD,,
|
|
File without changes
|
{matrice_analytics-0.1.38.dist-info → matrice_analytics-0.1.40.dist-info}/licenses/LICENSE.txt
RENAMED
|
File without changes
|
|
File without changes
|