ImagePRO-Python 1.3.0__tar.gz → 1.4.0__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.
- {imagepro_python-1.3.0/src/ImagePRO_Python.egg-info → imagepro_python-1.4.0}/PKG-INFO +27 -1
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/pyproject.toml +1 -1
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/readme.md +26 -0
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/src/ImagePRO/__init__.py +5 -2
- imagepro_python-1.4.0/src/ImagePRO/human_analysis/body_analysis/__init__.py +11 -0
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/src/ImagePRO/human_analysis/body_analysis/body_pose_estimation.py +23 -3
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/src/ImagePRO/human_analysis/body_analysis/hand_tracking.py +23 -3
- imagepro_python-1.4.0/src/ImagePRO/human_analysis/face_analysis/__init__.py +20 -0
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/src/ImagePRO/human_analysis/face_analysis/eye_status_analysis.py +22 -4
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/src/ImagePRO/human_analysis/face_analysis/face_comparison.py +13 -1
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/src/ImagePRO/human_analysis/face_analysis/face_detection.py +4 -1
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/src/ImagePRO/human_analysis/face_analysis/face_mesh_analysis.py +25 -6
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/src/ImagePRO/human_analysis/face_analysis/head_pose_estimation.py +13 -3
- imagepro_python-1.4.0/src/ImagePRO/object_analysis/__init__.py +9 -0
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/src/ImagePRO/object_analysis/object_detection.py +19 -8
- imagepro_python-1.4.0/src/ImagePRO/pipeline/__init__.py +9 -0
- imagepro_python-1.4.0/src/ImagePRO/pipeline/pipeline.py +362 -0
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/src/ImagePRO/pre_processing/__init__.py +4 -5
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/src/ImagePRO/pre_processing/dataset_generator.py +8 -1
- {imagepro_python-1.3.0 → imagepro_python-1.4.0/src/ImagePRO_Python.egg-info}/PKG-INFO +27 -1
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/src/ImagePRO_Python.egg-info/SOURCES.txt +3 -0
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/tests/test_face_mesh_analysis.py +5 -4
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/tests/test_object_detection.py +1 -3
- imagepro_python-1.4.0/tests/test_pipeline.py +357 -0
- imagepro_python-1.3.0/src/ImagePRO/human_analysis/body_analysis/__init__.py +0 -17
- imagepro_python-1.3.0/src/ImagePRO/human_analysis/face_analysis/__init__.py +0 -39
- imagepro_python-1.3.0/src/ImagePRO/object_analysis/__init__.py +0 -9
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/LICENSE +0 -0
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/setup.cfg +0 -0
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/src/ImagePRO/human_analysis/__init__.py +0 -0
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/src/ImagePRO/pre_processing/blur.py +0 -0
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/src/ImagePRO/pre_processing/contrast.py +0 -0
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/src/ImagePRO/pre_processing/crop.py +0 -0
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/src/ImagePRO/pre_processing/grayscale.py +0 -0
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/src/ImagePRO/pre_processing/histogram.py +0 -0
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/src/ImagePRO/pre_processing/resize.py +0 -0
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/src/ImagePRO/pre_processing/rotate.py +0 -0
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/src/ImagePRO/pre_processing/sharpen.py +0 -0
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/src/ImagePRO/utils/__init__.py +0 -0
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/src/ImagePRO/utils/image.py +0 -0
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/src/ImagePRO/utils/result.py +0 -0
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/src/ImagePRO_Python.egg-info/dependency_links.txt +0 -0
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/src/ImagePRO_Python.egg-info/requires.txt +0 -0
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/src/ImagePRO_Python.egg-info/top_level.txt +0 -0
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/tests/test_blur.py +0 -0
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/tests/test_body_pose_estimation.py +0 -0
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/tests/test_contrast.py +0 -0
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/tests/test_crop.py +0 -0
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/tests/test_dataset_generator.py +0 -0
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/tests/test_eye_status_analysis.py +0 -0
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/tests/test_face_comparison.py +0 -0
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/tests/test_face_detection.py +0 -0
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/tests/test_grayscale.py +0 -0
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/tests/test_hand_tracking.py +0 -0
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/tests/test_head_pose_estimation.py +0 -0
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/tests/test_histogram.py +0 -0
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/tests/test_image.py +0 -0
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/tests/test_integration.py +0 -0
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/tests/test_resize.py +0 -0
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/tests/test_result.py +0 -0
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/tests/test_rotate.py +0 -0
- {imagepro_python-1.3.0 → imagepro_python-1.4.0}/tests/test_sharpen.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ImagePRO-Python
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.4.0
|
|
4
4
|
Summary: Professional & modular image processing library with OpenCV, MediaPipe, and YOLO integration.
|
|
5
5
|
Author-email: Parsa Safaie <parsasafaie.2568@proton.me>
|
|
6
6
|
License: MIT
|
|
@@ -76,6 +76,11 @@ Whether you're working on computer vision pipelines, preprocessing images for AI
|
|
|
76
76
|
- **YOLO Integration**: Multiple accuracy levels (nano to extra-large)
|
|
77
77
|
- **Flexible Models**: Pre-trained or custom model support
|
|
78
78
|
|
|
79
|
+
### **Pipelines**
|
|
80
|
+
- **Reusable Operation Chains**: Define a sequence of functions once, then run it on any input (Image, NumPy array, or file path)
|
|
81
|
+
- **Flexible Steps**: Any ImagePRO function or custom callable; per-step keyword arguments via `Step`
|
|
82
|
+
- **Pipeline Metadata**: Every result lists the executed steps and each step's parameters
|
|
83
|
+
|
|
79
84
|
## Installation
|
|
80
85
|
|
|
81
86
|
### From PyPI
|
|
@@ -90,6 +95,8 @@ pip install "ImagePRO-Python[full]" # Everything
|
|
|
90
95
|
pip install "ImagePRO-Python[dev]" # Test tooling (pytest)
|
|
91
96
|
```
|
|
92
97
|
|
|
98
|
+
> **Note**: The base install is lightweight — AI backends (MediaPipe, Ultralytics, InsightFace) are optional and imported lazily, only when you call a function that actually needs them. `import ImagePRO` never loads these dependencies. If a backend is missing, the function you call raises an `ImportError` telling you exactly which extra to install.
|
|
99
|
+
|
|
93
100
|
### From Source
|
|
94
101
|
```bash
|
|
95
102
|
git clone https://github.com/parsasafaie/ImagePRO.git
|
|
@@ -152,6 +159,22 @@ object_detection_result = detect_objects(
|
|
|
152
159
|
)
|
|
153
160
|
print(f"Detected {len(object_detection_result.data)} objects")
|
|
154
161
|
object_detection_result.save_as_img("detections.jpg")
|
|
162
|
+
|
|
163
|
+
# Chain operations into a reusable pipeline
|
|
164
|
+
from ImagePRO.pipeline import Pipeline, Step
|
|
165
|
+
from ImagePRO.pre_processing.grayscale import convert_to_grayscale
|
|
166
|
+
from ImagePRO.pre_processing.resize import resize_image
|
|
167
|
+
|
|
168
|
+
pipeline = Pipeline([
|
|
169
|
+
Step(apply_gaussian_blur, kernel_size=(7, 7)),
|
|
170
|
+
convert_to_grayscale,
|
|
171
|
+
Step(resize_image, new_size=(800, 600)),
|
|
172
|
+
])
|
|
173
|
+
|
|
174
|
+
# Run it on any input: an Image, a NumPy array, or a file path
|
|
175
|
+
pipeline_result = pipeline.run("person_and_objects.jpg")
|
|
176
|
+
pipeline_result.save_as_img("processed_output.jpg")
|
|
177
|
+
print(pipeline_result.meta["steps"]) # Executed step names
|
|
155
178
|
```
|
|
156
179
|
|
|
157
180
|
> **Note**: These are basic examples. Each module contains many more functions with extensive customization options. Explore the module-specific README files for detailed documentation.
|
|
@@ -165,6 +188,7 @@ Each module includes comprehensive documentation with detailed examples:
|
|
|
165
188
|
- [Face Analysis](src/ImagePRO/human_analysis/face_analysis/README.md): Face mesh, pose estimation, eye status, comparison
|
|
166
189
|
- [Body Analysis](src/ImagePRO/human_analysis/body_analysis/README.md): Body pose and hand tracking
|
|
167
190
|
- **[Object Analysis](src/ImagePRO/object_analysis/README.md)**: YOLO-based object detection
|
|
191
|
+
- **[Pipeline](src/ImagePRO/pipeline/README.md)**: Reusable chains of image processing operations
|
|
168
192
|
- **[Utils](src/ImagePRO/utils/README.md)**: Shared utilities and I/O handling
|
|
169
193
|
|
|
170
194
|
For detailed project structure and development guidelines, see [PROJECT_STRUCTURE.md](PROJECT_STRUCTURE.md).
|
|
@@ -176,6 +200,8 @@ ImagePRO is built with a modular architecture designed for extensibility and mai
|
|
|
176
200
|
- **Clean Separation of Concerns**: Each module handles a specific domain
|
|
177
201
|
- **Consistent API Patterns**: All functions follow the same input/output conventions
|
|
178
202
|
- **Shared Utilities**: Common `Image` and `Result` classes for unified I/O
|
|
203
|
+
- **Reusable Pipelines**: Chain any operations into a `Pipeline` and run it on any input
|
|
204
|
+
- **Lazy Optional Imports**: Heavy AI dependencies (MediaPipe, Ultralytics, InsightFace) are only imported inside the functions that use them, keeping `import ImagePRO` fast and independent of installed extras
|
|
179
205
|
- **Professional Error Handling**: Comprehensive validation with clear error messages
|
|
180
206
|
- **Type Safety**: Full type hints throughout the codebase
|
|
181
207
|
- **Documentation**: Google-style docstrings for all functions
|
|
@@ -7,7 +7,7 @@ where = ["src"]
|
|
|
7
7
|
|
|
8
8
|
[project]
|
|
9
9
|
name = "ImagePRO-Python"
|
|
10
|
-
version = "1.
|
|
10
|
+
version = "1.4.0"
|
|
11
11
|
description = "Professional & modular image processing library with OpenCV, MediaPipe, and YOLO integration."
|
|
12
12
|
readme = "readme.md"
|
|
13
13
|
requires-python = ">=3.9,<3.13"
|
|
@@ -27,6 +27,11 @@ Whether you're working on computer vision pipelines, preprocessing images for AI
|
|
|
27
27
|
- **YOLO Integration**: Multiple accuracy levels (nano to extra-large)
|
|
28
28
|
- **Flexible Models**: Pre-trained or custom model support
|
|
29
29
|
|
|
30
|
+
### **Pipelines**
|
|
31
|
+
- **Reusable Operation Chains**: Define a sequence of functions once, then run it on any input (Image, NumPy array, or file path)
|
|
32
|
+
- **Flexible Steps**: Any ImagePRO function or custom callable; per-step keyword arguments via `Step`
|
|
33
|
+
- **Pipeline Metadata**: Every result lists the executed steps and each step's parameters
|
|
34
|
+
|
|
30
35
|
## Installation
|
|
31
36
|
|
|
32
37
|
### From PyPI
|
|
@@ -41,6 +46,8 @@ pip install "ImagePRO-Python[full]" # Everything
|
|
|
41
46
|
pip install "ImagePRO-Python[dev]" # Test tooling (pytest)
|
|
42
47
|
```
|
|
43
48
|
|
|
49
|
+
> **Note**: The base install is lightweight — AI backends (MediaPipe, Ultralytics, InsightFace) are optional and imported lazily, only when you call a function that actually needs them. `import ImagePRO` never loads these dependencies. If a backend is missing, the function you call raises an `ImportError` telling you exactly which extra to install.
|
|
50
|
+
|
|
44
51
|
### From Source
|
|
45
52
|
```bash
|
|
46
53
|
git clone https://github.com/parsasafaie/ImagePRO.git
|
|
@@ -103,6 +110,22 @@ object_detection_result = detect_objects(
|
|
|
103
110
|
)
|
|
104
111
|
print(f"Detected {len(object_detection_result.data)} objects")
|
|
105
112
|
object_detection_result.save_as_img("detections.jpg")
|
|
113
|
+
|
|
114
|
+
# Chain operations into a reusable pipeline
|
|
115
|
+
from ImagePRO.pipeline import Pipeline, Step
|
|
116
|
+
from ImagePRO.pre_processing.grayscale import convert_to_grayscale
|
|
117
|
+
from ImagePRO.pre_processing.resize import resize_image
|
|
118
|
+
|
|
119
|
+
pipeline = Pipeline([
|
|
120
|
+
Step(apply_gaussian_blur, kernel_size=(7, 7)),
|
|
121
|
+
convert_to_grayscale,
|
|
122
|
+
Step(resize_image, new_size=(800, 600)),
|
|
123
|
+
])
|
|
124
|
+
|
|
125
|
+
# Run it on any input: an Image, a NumPy array, or a file path
|
|
126
|
+
pipeline_result = pipeline.run("person_and_objects.jpg")
|
|
127
|
+
pipeline_result.save_as_img("processed_output.jpg")
|
|
128
|
+
print(pipeline_result.meta["steps"]) # Executed step names
|
|
106
129
|
```
|
|
107
130
|
|
|
108
131
|
> **Note**: These are basic examples. Each module contains many more functions with extensive customization options. Explore the module-specific README files for detailed documentation.
|
|
@@ -116,6 +139,7 @@ Each module includes comprehensive documentation with detailed examples:
|
|
|
116
139
|
- [Face Analysis](src/ImagePRO/human_analysis/face_analysis/README.md): Face mesh, pose estimation, eye status, comparison
|
|
117
140
|
- [Body Analysis](src/ImagePRO/human_analysis/body_analysis/README.md): Body pose and hand tracking
|
|
118
141
|
- **[Object Analysis](src/ImagePRO/object_analysis/README.md)**: YOLO-based object detection
|
|
142
|
+
- **[Pipeline](src/ImagePRO/pipeline/README.md)**: Reusable chains of image processing operations
|
|
119
143
|
- **[Utils](src/ImagePRO/utils/README.md)**: Shared utilities and I/O handling
|
|
120
144
|
|
|
121
145
|
For detailed project structure and development guidelines, see [PROJECT_STRUCTURE.md](PROJECT_STRUCTURE.md).
|
|
@@ -127,6 +151,8 @@ ImagePRO is built with a modular architecture designed for extensibility and mai
|
|
|
127
151
|
- **Clean Separation of Concerns**: Each module handles a specific domain
|
|
128
152
|
- **Consistent API Patterns**: All functions follow the same input/output conventions
|
|
129
153
|
- **Shared Utilities**: Common `Image` and `Result` classes for unified I/O
|
|
154
|
+
- **Reusable Pipelines**: Chain any operations into a `Pipeline` and run it on any input
|
|
155
|
+
- **Lazy Optional Imports**: Heavy AI dependencies (MediaPipe, Ultralytics, InsightFace) are only imported inside the functions that use them, keeping `import ImagePRO` fast and independent of installed extras
|
|
130
156
|
- **Professional Error Handling**: Comprehensive validation with clear error messages
|
|
131
157
|
- **Type Safety**: Full type hints throughout the codebase
|
|
132
158
|
- **Documentation**: Google-style docstrings for all functions
|
|
@@ -12,10 +12,11 @@ Features:
|
|
|
12
12
|
- Pre-processing: resize, crop, rotate, blur, sharpen, contrast enhancement
|
|
13
13
|
- Human analysis: face mesh, pose estimation, hand tracking
|
|
14
14
|
- Object detection with YOLO models
|
|
15
|
+
- Reusable pipelines for chaining operations
|
|
15
16
|
- Real-time processing capabilities
|
|
16
17
|
"""
|
|
17
18
|
|
|
18
|
-
__version__ = "1.
|
|
19
|
+
__version__ = "1.4.0"
|
|
19
20
|
__author__ = "Parsa Safaie"
|
|
20
21
|
__email__ = "parsasafaie.2568@proton.me"
|
|
21
22
|
|
|
@@ -24,10 +25,12 @@ from . import utils
|
|
|
24
25
|
from . import pre_processing
|
|
25
26
|
from . import human_analysis
|
|
26
27
|
from . import object_analysis
|
|
28
|
+
from . import pipeline
|
|
27
29
|
|
|
28
30
|
__all__ = [
|
|
29
31
|
"utils",
|
|
30
32
|
"pre_processing",
|
|
31
33
|
"human_analysis",
|
|
32
|
-
"object_analysis"
|
|
34
|
+
"object_analysis",
|
|
35
|
+
"pipeline"
|
|
33
36
|
]
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Body Analysis Module
|
|
2
|
+
# Provides body pose estimation and hand tracking capabilities
|
|
3
|
+
#
|
|
4
|
+
# The mediapipe dependency is optional and imported lazily inside the
|
|
5
|
+
# functions that need it, so both submodules are safe to import without
|
|
6
|
+
# any AI extras installed.
|
|
7
|
+
|
|
8
|
+
from . import body_pose_estimation
|
|
9
|
+
from . import hand_tracking
|
|
10
|
+
|
|
11
|
+
__all__ = ["body_pose_estimation", "hand_tracking"]
|
|
@@ -2,6 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import sys
|
|
4
4
|
from pathlib import Path
|
|
5
|
+
from typing import TYPE_CHECKING
|
|
5
6
|
|
|
6
7
|
# Add src directory to path for absolute imports
|
|
7
8
|
_file_path = Path(__file__).resolve()
|
|
@@ -13,10 +14,11 @@ from ImagePRO.utils.image import Image
|
|
|
13
14
|
from ImagePRO.utils.result import Result
|
|
14
15
|
|
|
15
16
|
import cv2
|
|
16
|
-
|
|
17
|
+
|
|
18
|
+
if TYPE_CHECKING: # mediapipe is imported lazily inside the functions
|
|
19
|
+
import mediapipe as mp
|
|
17
20
|
|
|
18
21
|
# Constants
|
|
19
|
-
mp_pose = mp.solutions.pose
|
|
20
22
|
TOTAL_LANDMARKS = 33
|
|
21
23
|
DEFAULT_CONFIDENCE = 0.7
|
|
22
24
|
LANDMARK_RADIUS = 3
|
|
@@ -69,6 +71,16 @@ def detect_body_pose(
|
|
|
69
71
|
):
|
|
70
72
|
raise TypeError("'landmarks_idx' must be a list of integers")
|
|
71
73
|
|
|
74
|
+
try:
|
|
75
|
+
import mediapipe as mp
|
|
76
|
+
except ImportError as err:
|
|
77
|
+
raise ImportError(
|
|
78
|
+
"The optional 'mediapipe' dependency is required for body pose "
|
|
79
|
+
'detection. Install it with: pip install "ImagePRO-Python[mediapipe]"'
|
|
80
|
+
) from err
|
|
81
|
+
|
|
82
|
+
mp_pose = mp.solutions.pose
|
|
83
|
+
|
|
72
84
|
# Initialize detector if needed
|
|
73
85
|
if pose_obj is None:
|
|
74
86
|
pose_obj = mp_pose.Pose(
|
|
@@ -133,13 +145,21 @@ def detect_body_pose_live() -> None:
|
|
|
133
145
|
Raises:
|
|
134
146
|
RuntimeError: If camera cannot be accessed
|
|
135
147
|
"""
|
|
148
|
+
try:
|
|
149
|
+
import mediapipe as mp
|
|
150
|
+
except ImportError as err:
|
|
151
|
+
raise ImportError(
|
|
152
|
+
"The optional 'mediapipe' dependency is required for body pose "
|
|
153
|
+
'detection. Install it with: pip install "ImagePRO-Python[mediapipe]"'
|
|
154
|
+
) from err
|
|
155
|
+
|
|
136
156
|
# Initialize camera
|
|
137
157
|
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
|
|
138
158
|
if not cap.isOpened():
|
|
139
159
|
raise RuntimeError("Cannot access webcam")
|
|
140
160
|
|
|
141
161
|
# Initialize pose detector in tracking mode
|
|
142
|
-
pose_obj =
|
|
162
|
+
pose_obj = mp.solutions.pose.Pose(
|
|
143
163
|
min_detection_confidence=DEFAULT_CONFIDENCE,
|
|
144
164
|
static_image_mode=False
|
|
145
165
|
)
|
|
@@ -2,6 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import sys
|
|
4
4
|
from pathlib import Path
|
|
5
|
+
from typing import TYPE_CHECKING
|
|
5
6
|
|
|
6
7
|
# Add src directory to path for absolute imports
|
|
7
8
|
_file_path = Path(__file__).resolve()
|
|
@@ -13,10 +14,11 @@ from ImagePRO.utils.image import Image
|
|
|
13
14
|
from ImagePRO.utils.result import Result
|
|
14
15
|
|
|
15
16
|
import cv2
|
|
16
|
-
|
|
17
|
+
|
|
18
|
+
if TYPE_CHECKING: # mediapipe is imported lazily inside the functions
|
|
19
|
+
import mediapipe as mp
|
|
17
20
|
|
|
18
21
|
# Constants
|
|
19
|
-
mp_hands = mp.solutions.hands
|
|
20
22
|
DEFAULT_MAX_HANDS = 2
|
|
21
23
|
DEFAULT_MIN_CONFIDENCE = 0.7
|
|
22
24
|
TOTAL_HAND_LANDMARKS = 21
|
|
@@ -79,6 +81,16 @@ def detect_hands(
|
|
|
79
81
|
):
|
|
80
82
|
raise TypeError("'landmarks_idx' must be a list of integers")
|
|
81
83
|
|
|
84
|
+
try:
|
|
85
|
+
import mediapipe as mp
|
|
86
|
+
except ImportError as err:
|
|
87
|
+
raise ImportError(
|
|
88
|
+
"The optional 'mediapipe' dependency is required for hand "
|
|
89
|
+
'tracking. Install it with: pip install "ImagePRO-Python[mediapipe]"'
|
|
90
|
+
) from err
|
|
91
|
+
|
|
92
|
+
mp_hands = mp.solutions.hands
|
|
93
|
+
|
|
82
94
|
# Initialize detector if needed
|
|
83
95
|
if hands_obj is None:
|
|
84
96
|
hands_obj = mp_hands.Hands(
|
|
@@ -168,13 +180,21 @@ def detect_hands_live(
|
|
|
168
180
|
if not isinstance(min_confidence, (int, float)) or not (0.0 <= min_confidence <= 1.0):
|
|
169
181
|
raise ValueError("'min_confidence' must be between 0.0 and 1.0")
|
|
170
182
|
|
|
183
|
+
try:
|
|
184
|
+
import mediapipe as mp
|
|
185
|
+
except ImportError as err:
|
|
186
|
+
raise ImportError(
|
|
187
|
+
"The optional 'mediapipe' dependency is required for hand "
|
|
188
|
+
'tracking. Install it with: pip install "ImagePRO-Python[mediapipe]"'
|
|
189
|
+
) from err
|
|
190
|
+
|
|
171
191
|
# Initialize camera
|
|
172
192
|
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
|
|
173
193
|
if not cap.isOpened():
|
|
174
194
|
raise RuntimeError("Cannot access webcam")
|
|
175
195
|
|
|
176
196
|
# Initialize hand detector in tracking mode
|
|
177
|
-
hands_obj =
|
|
197
|
+
hands_obj = mp.solutions.hands.Hands(
|
|
178
198
|
min_detection_confidence=min_confidence,
|
|
179
199
|
max_num_hands=max_hands,
|
|
180
200
|
static_image_mode=False
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Face Analysis Module
|
|
2
|
+
# Provides facial landmark detection, pose estimation, and eye status analysis
|
|
3
|
+
#
|
|
4
|
+
# The mediapipe and insightface dependencies are optional and imported
|
|
5
|
+
# lazily inside the functions that need them, so every submodule is safe
|
|
6
|
+
# to import regardless of which extras are installed.
|
|
7
|
+
|
|
8
|
+
from . import eye_status_analysis
|
|
9
|
+
from . import face_comparison
|
|
10
|
+
from . import face_detection
|
|
11
|
+
from . import face_mesh_analysis
|
|
12
|
+
from . import head_pose_estimation
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
"eye_status_analysis",
|
|
16
|
+
"face_comparison",
|
|
17
|
+
"face_detection",
|
|
18
|
+
"face_mesh_analysis",
|
|
19
|
+
"head_pose_estimation"
|
|
20
|
+
]
|
|
@@ -2,6 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import sys
|
|
4
4
|
from pathlib import Path
|
|
5
|
+
from typing import TYPE_CHECKING
|
|
5
6
|
|
|
6
7
|
# Add src directory to path for absolute imports
|
|
7
8
|
_file_path = Path(__file__).resolve()
|
|
@@ -14,10 +15,11 @@ from ImagePRO.utils.image import Image
|
|
|
14
15
|
from ImagePRO.utils.result import Result
|
|
15
16
|
|
|
16
17
|
import cv2
|
|
17
|
-
|
|
18
|
+
|
|
19
|
+
if TYPE_CHECKING: # mediapipe is imported lazily inside the functions
|
|
20
|
+
import mediapipe as mp
|
|
18
21
|
|
|
19
22
|
# Constants
|
|
20
|
-
mp_face_mesh = mp.solutions.face_mesh
|
|
21
23
|
DEFAULT_MIN_CONFIDENCE = 0.7
|
|
22
24
|
DEFAULT_THRESHOLD = 0.2
|
|
23
25
|
RIGHT_EYE_INDICES = [386, 374, 263, 362] # MediaPipe right eye landmarks
|
|
@@ -65,12 +67,20 @@ def analyze_eye_status(
|
|
|
65
67
|
if not 0 <= min_confidence <= 1:
|
|
66
68
|
raise ValueError("'min_confidence' must be between 0 and 1")
|
|
67
69
|
|
|
70
|
+
try:
|
|
71
|
+
import mediapipe as mp
|
|
72
|
+
except ImportError as err:
|
|
73
|
+
raise ImportError(
|
|
74
|
+
"The optional 'mediapipe' dependency is required for eye status "
|
|
75
|
+
'analysis. Install it with: pip install "ImagePRO-Python[mediapipe]"'
|
|
76
|
+
) from err
|
|
77
|
+
|
|
68
78
|
# Get image dimensions
|
|
69
79
|
h, w = image.shape[:2]
|
|
70
80
|
|
|
71
81
|
# Initialize detector if needed
|
|
72
82
|
if face_mesh_obj is None:
|
|
73
|
-
face_mesh_obj =
|
|
83
|
+
face_mesh_obj = mp.solutions.face_mesh.FaceMesh(
|
|
74
84
|
min_detection_confidence=min_confidence,
|
|
75
85
|
refine_landmarks=True,
|
|
76
86
|
static_image_mode=True
|
|
@@ -173,13 +183,21 @@ def analyze_eye_status_live(
|
|
|
173
183
|
if not 0 <= min_confidence <= 1:
|
|
174
184
|
raise ValueError("'min_confidence' must be between 0 and 1")
|
|
175
185
|
|
|
186
|
+
try:
|
|
187
|
+
import mediapipe as mp
|
|
188
|
+
except ImportError as err:
|
|
189
|
+
raise ImportError(
|
|
190
|
+
"The optional 'mediapipe' dependency is required for eye status "
|
|
191
|
+
'analysis. Install it with: pip install "ImagePRO-Python[mediapipe]"'
|
|
192
|
+
) from err
|
|
193
|
+
|
|
176
194
|
# Initialize webcam
|
|
177
195
|
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
|
|
178
196
|
if not cap.isOpened():
|
|
179
197
|
raise RuntimeError("Failed to access webcam")
|
|
180
198
|
|
|
181
199
|
# Initialize face mesh detector for video
|
|
182
|
-
face_mesh =
|
|
200
|
+
face_mesh = mp.solutions.face_mesh.FaceMesh(
|
|
183
201
|
max_num_faces=1,
|
|
184
202
|
min_detection_confidence=min_confidence,
|
|
185
203
|
refine_landmarks=True,
|
|
@@ -2,6 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import sys
|
|
4
4
|
from pathlib import Path
|
|
5
|
+
from typing import TYPE_CHECKING
|
|
5
6
|
|
|
6
7
|
# Add src directory to path for absolute imports
|
|
7
8
|
_file_path = Path(__file__).resolve()
|
|
@@ -13,11 +14,13 @@ import os
|
|
|
13
14
|
|
|
14
15
|
import cv2
|
|
15
16
|
import numpy as np
|
|
16
|
-
from insightface.app import FaceAnalysis
|
|
17
17
|
|
|
18
18
|
from ImagePRO.utils.image import Image
|
|
19
19
|
from ImagePRO.utils.result import Result
|
|
20
20
|
|
|
21
|
+
if TYPE_CHECKING: # insightface is imported lazily inside the function
|
|
22
|
+
from insightface.app import FaceAnalysis
|
|
23
|
+
|
|
21
24
|
# Constants
|
|
22
25
|
DEFAULT_SIMILARITY_THRESHOLD = 0.5
|
|
23
26
|
DEFAULT_MODEL_NAME = "buffalo_l"
|
|
@@ -62,6 +65,15 @@ def compare_faces(
|
|
|
62
65
|
if not isinstance(image_2, Image):
|
|
63
66
|
raise TypeError("'image_2' must be an Image instance")
|
|
64
67
|
|
|
68
|
+
try:
|
|
69
|
+
from insightface.app import FaceAnalysis
|
|
70
|
+
except ImportError as err:
|
|
71
|
+
raise ImportError(
|
|
72
|
+
"The optional 'insightface' dependency is required for face "
|
|
73
|
+
'comparison. Install it with: pip install '
|
|
74
|
+
'"ImagePRO-Python[insightface]"'
|
|
75
|
+
) from err
|
|
76
|
+
|
|
65
77
|
# Initialize model if needed
|
|
66
78
|
if app is None:
|
|
67
79
|
app = FaceAnalysis(
|
|
@@ -2,6 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import sys
|
|
4
4
|
from pathlib import Path
|
|
5
|
+
from typing import TYPE_CHECKING
|
|
5
6
|
|
|
6
7
|
# Add src directory to path for absolute imports
|
|
7
8
|
_file_path = Path(__file__).resolve()
|
|
@@ -10,13 +11,15 @@ if str(_src_path) not in sys.path:
|
|
|
10
11
|
sys.path.insert(0, str(_src_path))
|
|
11
12
|
|
|
12
13
|
import cv2
|
|
13
|
-
import mediapipe as mp
|
|
14
14
|
import numpy as np
|
|
15
15
|
|
|
16
16
|
from ImagePRO.human_analysis.face_analysis.face_mesh_analysis import analyze_face_mesh
|
|
17
17
|
from ImagePRO.utils.image import Image
|
|
18
18
|
from ImagePRO.utils.result import Result
|
|
19
19
|
|
|
20
|
+
if TYPE_CHECKING: # mediapipe is imported lazily inside analyze_face_mesh
|
|
21
|
+
import mediapipe as mp
|
|
22
|
+
|
|
20
23
|
|
|
21
24
|
# Constants
|
|
22
25
|
DEFAULT_MAX_FACES = 1
|
|
@@ -2,6 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import sys
|
|
4
4
|
from pathlib import Path
|
|
5
|
+
from typing import TYPE_CHECKING
|
|
5
6
|
|
|
6
7
|
# Add src directory to path for absolute imports
|
|
7
8
|
_file_path = Path(__file__).resolve()
|
|
@@ -13,12 +14,11 @@ from ImagePRO.utils.image import Image
|
|
|
13
14
|
from ImagePRO.utils.result import Result
|
|
14
15
|
|
|
15
16
|
import cv2
|
|
16
|
-
|
|
17
|
+
|
|
18
|
+
if TYPE_CHECKING: # mediapipe is imported lazily inside the functions
|
|
19
|
+
import mediapipe as mp
|
|
17
20
|
|
|
18
21
|
# Constants
|
|
19
|
-
mp_face_mesh = mp.solutions.face_mesh
|
|
20
|
-
mp_drawing_utils = mp.solutions.drawing_utils
|
|
21
|
-
mp_drawing_styles = mp.solutions.drawing_styles
|
|
22
22
|
DEFAULT_MAX_FACES = 1
|
|
23
23
|
DEFAULT_MIN_CONFIDENCE = 0.7
|
|
24
24
|
TOTAL_FACE_LANDMARKS = 468
|
|
@@ -71,7 +71,6 @@ def analyze_face_mesh(
|
|
|
71
71
|
- Coordinates are normalized [0,1]. Multiply by width/height for pixels
|
|
72
72
|
- Full mesh (468 points) shows tessellation, specific points show dots
|
|
73
73
|
"""
|
|
74
|
-
|
|
75
74
|
# Validate inputs
|
|
76
75
|
if not isinstance(image, Image):
|
|
77
76
|
raise TypeError("'image' must be an Image instance")
|
|
@@ -88,6 +87,18 @@ def analyze_face_mesh(
|
|
|
88
87
|
):
|
|
89
88
|
raise TypeError("'landmarks_idx' must be a list of integers")
|
|
90
89
|
|
|
90
|
+
try:
|
|
91
|
+
import mediapipe as mp
|
|
92
|
+
except ImportError as err:
|
|
93
|
+
raise ImportError(
|
|
94
|
+
"The optional 'mediapipe' dependency is required for face mesh "
|
|
95
|
+
'analysis. Install it with: pip install "ImagePRO-Python[mediapipe]"'
|
|
96
|
+
) from err
|
|
97
|
+
|
|
98
|
+
mp_face_mesh = mp.solutions.face_mesh
|
|
99
|
+
mp_drawing_utils = mp.solutions.drawing_utils
|
|
100
|
+
mp_drawing_styles = mp.solutions.drawing_styles
|
|
101
|
+
|
|
91
102
|
# Initialize detector if needed
|
|
92
103
|
if face_mesh_obj is None:
|
|
93
104
|
face_mesh = mp_face_mesh.FaceMesh(
|
|
@@ -195,13 +206,21 @@ def analyze_face_mesh_live(
|
|
|
195
206
|
if not isinstance(min_confidence, (int, float)) or not (0 <= min_confidence <= 1):
|
|
196
207
|
raise ValueError("'min_confidence' must be between 0 and 1")
|
|
197
208
|
|
|
209
|
+
try:
|
|
210
|
+
import mediapipe as mp
|
|
211
|
+
except ImportError as err:
|
|
212
|
+
raise ImportError(
|
|
213
|
+
"The optional 'mediapipe' dependency is required for face mesh "
|
|
214
|
+
'analysis. Install it with: pip install "ImagePRO-Python[mediapipe]"'
|
|
215
|
+
) from err
|
|
216
|
+
|
|
198
217
|
# Initialize camera
|
|
199
218
|
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
|
|
200
219
|
if not cap.isOpened():
|
|
201
220
|
raise RuntimeError("Cannot access webcam")
|
|
202
221
|
|
|
203
222
|
# Initialize detector in tracking mode for better performance
|
|
204
|
-
face_mesh =
|
|
223
|
+
face_mesh = mp.solutions.face_mesh.FaceMesh(
|
|
205
224
|
max_num_faces=max_faces,
|
|
206
225
|
min_detection_confidence=min_confidence,
|
|
207
226
|
refine_landmarks=True,
|
|
@@ -2,6 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import sys
|
|
4
4
|
from pathlib import Path
|
|
5
|
+
from typing import TYPE_CHECKING
|
|
5
6
|
|
|
6
7
|
# Add src directory to path for absolute imports
|
|
7
8
|
_file_path = Path(__file__).resolve()
|
|
@@ -14,10 +15,11 @@ from ImagePRO.utils.image import Image
|
|
|
14
15
|
from ImagePRO.utils.result import Result
|
|
15
16
|
|
|
16
17
|
import cv2
|
|
17
|
-
|
|
18
|
+
|
|
19
|
+
if TYPE_CHECKING: # mediapipe is imported lazily inside the functions
|
|
20
|
+
import mediapipe as mp
|
|
18
21
|
|
|
19
22
|
# Constants
|
|
20
|
-
mp_face_mesh = mp.solutions.face_mesh
|
|
21
23
|
DEFAULT_MAX_FACES = 1
|
|
22
24
|
DEFAULT_MIN_CONFIDENCE = 0.7
|
|
23
25
|
HEAD_POSE_INDICES = [1, 152, 33, 263, 168] # nose_tip, chin, left_eye, right_eye, nasion
|
|
@@ -169,13 +171,21 @@ def estimate_head_pose_live(
|
|
|
169
171
|
if not 0 <= min_confidence <= 1:
|
|
170
172
|
raise ValueError("'min_confidence' must be between 0 and 1")
|
|
171
173
|
|
|
174
|
+
try:
|
|
175
|
+
import mediapipe as mp
|
|
176
|
+
except ImportError as err:
|
|
177
|
+
raise ImportError(
|
|
178
|
+
"The optional 'mediapipe' dependency is required for head pose "
|
|
179
|
+
'estimation. Install it with: pip install "ImagePRO-Python[mediapipe]"'
|
|
180
|
+
) from err
|
|
181
|
+
|
|
172
182
|
# Initialize webcam
|
|
173
183
|
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
|
|
174
184
|
if not cap.isOpened():
|
|
175
185
|
raise RuntimeError("Failed to access webcam")
|
|
176
186
|
|
|
177
187
|
# Initialize face mesh detector for video
|
|
178
|
-
face_mesh =
|
|
188
|
+
face_mesh = mp.solutions.face_mesh.FaceMesh(
|
|
179
189
|
max_num_faces=max_faces,
|
|
180
190
|
min_detection_confidence=min_confidence,
|
|
181
191
|
refine_landmarks=True,
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Object Analysis Module
|
|
2
|
+
# Provides object detection capabilities using YOLO models
|
|
3
|
+
#
|
|
4
|
+
# The ultralytics dependency is optional and imported lazily inside the
|
|
5
|
+
# functions that need it, so this package imports cleanly without it.
|
|
6
|
+
|
|
7
|
+
from . import object_detection
|
|
8
|
+
|
|
9
|
+
__all__ = ["object_detection"]
|
{imagepro_python-1.3.0 → imagepro_python-1.4.0}/src/ImagePRO/object_analysis/object_detection.py
RENAMED
|
@@ -2,6 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import sys
|
|
4
4
|
from pathlib import Path
|
|
5
|
+
from typing import TYPE_CHECKING
|
|
5
6
|
|
|
6
7
|
# Add src directory to path for absolute imports
|
|
7
8
|
_file_path = Path(__file__).resolve()
|
|
@@ -9,11 +10,12 @@ _src_path = _file_path.parents[2] # Go up to src directory
|
|
|
9
10
|
if str(_src_path) not in sys.path:
|
|
10
11
|
sys.path.insert(0, str(_src_path))
|
|
11
12
|
|
|
12
|
-
from ultralytics import YOLO
|
|
13
|
-
|
|
14
13
|
from ImagePRO.utils.image import Image
|
|
15
14
|
from ImagePRO.utils.result import Result
|
|
16
15
|
|
|
16
|
+
if TYPE_CHECKING: # ultralytics is imported lazily inside the function
|
|
17
|
+
from ultralytics import YOLO
|
|
18
|
+
|
|
17
19
|
# Constants
|
|
18
20
|
DEFAULT_ACCURACY_LEVEL = 1
|
|
19
21
|
MODEL_MAPPING = {
|
|
@@ -65,15 +67,24 @@ def detect_objects(
|
|
|
65
67
|
if not isinstance(image, Image):
|
|
66
68
|
raise TypeError("'image' must be an Image instance")
|
|
67
69
|
|
|
70
|
+
# accuracy_level only applies when no model is given
|
|
71
|
+
if model is None and accuracy_level not in MODEL_MAPPING:
|
|
72
|
+
raise ValueError(
|
|
73
|
+
f"'accuracy_level' must be in {list(MODEL_MAPPING.keys())}, "
|
|
74
|
+
f"got {accuracy_level}"
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
try:
|
|
78
|
+
from ultralytics import YOLO
|
|
79
|
+
except ImportError as err:
|
|
80
|
+
raise ImportError(
|
|
81
|
+
"The optional 'ultralytics' dependency is required for object "
|
|
82
|
+
'detection. Install it with: pip install "ImagePRO-Python[yolo]"'
|
|
83
|
+
) from err
|
|
84
|
+
|
|
68
85
|
# Initialize model
|
|
69
86
|
model_name = None
|
|
70
87
|
if model is None:
|
|
71
|
-
if accuracy_level not in MODEL_MAPPING:
|
|
72
|
-
raise ValueError(
|
|
73
|
-
f"'accuracy_level' must be in {list(MODEL_MAPPING.keys())}, "
|
|
74
|
-
f"got {accuracy_level}"
|
|
75
|
-
)
|
|
76
|
-
|
|
77
88
|
model_name = MODEL_MAPPING[accuracy_level]
|
|
78
89
|
model = YOLO(model=model_name)
|
|
79
90
|
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Pipeline Module
|
|
2
|
+
# Provides a reusable, ordered chain of image processing operations
|
|
3
|
+
#
|
|
4
|
+
# Uses only base dependencies (numpy); all operations handed to a Pipeline
|
|
5
|
+
# may come from any module, including those with optional backends.
|
|
6
|
+
|
|
7
|
+
from .pipeline import Pipeline, Step
|
|
8
|
+
|
|
9
|
+
__all__ = ["Pipeline", "Step"]
|