Rajadhurai commited on
Commit
39dc633
·
1 Parent(s): 829be18

Initial commit for hand detection space

Browse files
Files changed (2) hide show
  1. test.py → app.py +106 -106
  2. requirement.text → requirements.txt +215 -215
test.py → app.py RENAMED
@@ -1,106 +1,106 @@
1
- import cv2
2
- import mediapipe as mp
3
- import numpy as np
4
- import gradio as gr
5
- import tempfile
6
-
7
- # Load model
8
- MODEL_PATH = "hand_landmarker.task"
9
-
10
- BaseOptions = mp.tasks.BaseOptions
11
- HandLandmarker = mp.tasks.vision.HandLandmarker
12
- HandLandmarkerOptions = mp.tasks.vision.HandLandmarkerOptions
13
- VisionRunningMode = mp.tasks.vision.RunningMode
14
- mp_image = mp.Image
15
- mp_format = mp.ImageFormat
16
-
17
- # Finger connections and colors
18
- HAND_CONNECTIONS = [
19
- (0, 1), (1, 2), (2, 3), (3, 4),
20
- (0, 5), (5, 6), (6, 7), (7, 8),
21
- (0, 9), (9,10), (10,11), (11,12),
22
- (0,13), (13,14), (14,15), (15,16),
23
- (0,17), (17,18), (18,19), (19,20)
24
- ]
25
-
26
- FINGER_COLORS = {
27
- 'thumb': (245, 245, 245),
28
- 'index': (128, 0, 128),
29
- 'middle': (0, 255, 0),
30
- 'ring': (0, 165, 255),
31
- 'pinky': (255, 0, 0),
32
- 'palm': (100, 100, 100)
33
- }
34
-
35
- def get_finger_color(start_idx):
36
- if start_idx in range(0, 5):
37
- return FINGER_COLORS['thumb']
38
- elif start_idx in range(5, 9):
39
- return FINGER_COLORS['index']
40
- elif start_idx in range(9, 13):
41
- return FINGER_COLORS['middle']
42
- elif start_idx in range(13, 17):
43
- return FINGER_COLORS['ring']
44
- elif start_idx in range(17, 21):
45
- return FINGER_COLORS['pinky']
46
- else:
47
- return FINGER_COLORS['palm']
48
-
49
- def process_video(video_path):
50
- cap = cv2.VideoCapture(video_path)
51
-
52
- fourcc = cv2.VideoWriter_fourcc(*'mp4v')
53
- tmp_out = tempfile.NamedTemporaryFile(suffix=".mp4", delete=False)
54
- out_path = tmp_out.name
55
-
56
- fps = cap.get(cv2.CAP_PROP_FPS)
57
- w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
58
- h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
59
- out = cv2.VideoWriter(out_path, fourcc, fps, (w, h))
60
-
61
- options = HandLandmarkerOptions(
62
- base_options=BaseOptions(model_asset_path=MODEL_PATH),
63
- running_mode=VisionRunningMode.IMAGE,
64
- num_hands=2,
65
- min_hand_detection_confidence=0.5,
66
- min_hand_presence_confidence=0.5,
67
- min_tracking_confidence=0.5
68
- )
69
-
70
- with HandLandmarker.create_from_options(options) as landmarker:
71
- while cap.isOpened():
72
- ret, frame = cap.read()
73
- if not ret:
74
- break
75
-
76
- rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
77
- mp_img = mp_image(image_format=mp_format.SRGB, data=rgb_frame)
78
- results = landmarker.detect(mp_img)
79
-
80
- if results.hand_landmarks:
81
- for hand_landmarks in results.hand_landmarks:
82
- points = [(int(lm.x * w), int(lm.y * h)) for lm in hand_landmarks]
83
-
84
- for start, end in HAND_CONNECTIONS:
85
- color = get_finger_color(start)
86
- cv2.line(frame, points[start], points[end], color, 2)
87
-
88
- for i, (x, y) in enumerate(points):
89
- cv2.circle(frame, (x, y), 4, (0, 255, 255), -1)
90
-
91
- out.write(frame)
92
-
93
- cap.release()
94
- out.release()
95
- return out_path
96
-
97
- # Gradio interface
98
- demo = gr.Interface(
99
- fn=process_video,
100
- inputs=gr.Video(label="Upload Video or Use Webcam"),
101
- outputs=gr.Video(label="Hand Landmark Annotated Video"),
102
- title="Hand Detection ",
103
- description="Upload a video or use webcam to detect hands."
104
- )
105
-
106
- demo.launch()
 
1
+ import cv2
2
+ import mediapipe as mp
3
+ import numpy as np
4
+ import gradio as gr
5
+ import tempfile
6
+
7
+ # Load model
8
+ MODEL_PATH = "hand_landmarker.task"
9
+
10
+ BaseOptions = mp.tasks.BaseOptions
11
+ HandLandmarker = mp.tasks.vision.HandLandmarker
12
+ HandLandmarkerOptions = mp.tasks.vision.HandLandmarkerOptions
13
+ VisionRunningMode = mp.tasks.vision.RunningMode
14
+ mp_image = mp.Image
15
+ mp_format = mp.ImageFormat
16
+
17
+ # Finger connections and colors
18
+ HAND_CONNECTIONS = [
19
+ (0, 1), (1, 2), (2, 3), (3, 4),
20
+ (0, 5), (5, 6), (6, 7), (7, 8),
21
+ (0, 9), (9,10), (10,11), (11,12),
22
+ (0,13), (13,14), (14,15), (15,16),
23
+ (0,17), (17,18), (18,19), (19,20)
24
+ ]
25
+
26
+ FINGER_COLORS = {
27
+ 'thumb': (245, 245, 245),
28
+ 'index': (128, 0, 128),
29
+ 'middle': (0, 255, 0),
30
+ 'ring': (0, 165, 255),
31
+ 'pinky': (255, 0, 0),
32
+ 'palm': (100, 100, 100)
33
+ }
34
+
35
+ def get_finger_color(start_idx):
36
+ if start_idx in range(0, 5):
37
+ return FINGER_COLORS['thumb']
38
+ elif start_idx in range(5, 9):
39
+ return FINGER_COLORS['index']
40
+ elif start_idx in range(9, 13):
41
+ return FINGER_COLORS['middle']
42
+ elif start_idx in range(13, 17):
43
+ return FINGER_COLORS['ring']
44
+ elif start_idx in range(17, 21):
45
+ return FINGER_COLORS['pinky']
46
+ else:
47
+ return FINGER_COLORS['palm']
48
+
49
+ def process_video(video_path):
50
+ cap = cv2.VideoCapture(video_path)
51
+
52
+ fourcc = cv2.VideoWriter_fourcc(*'mp4v')
53
+ tmp_out = tempfile.NamedTemporaryFile(suffix=".mp4", delete=False)
54
+ out_path = tmp_out.name
55
+
56
+ fps = cap.get(cv2.CAP_PROP_FPS)
57
+ w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
58
+ h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
59
+ out = cv2.VideoWriter(out_path, fourcc, fps, (w, h))
60
+
61
+ options = HandLandmarkerOptions(
62
+ base_options=BaseOptions(model_asset_path=MODEL_PATH),
63
+ running_mode=VisionRunningMode.IMAGE,
64
+ num_hands=2,
65
+ min_hand_detection_confidence=0.5,
66
+ min_hand_presence_confidence=0.5,
67
+ min_tracking_confidence=0.5
68
+ )
69
+
70
+ with HandLandmarker.create_from_options(options) as landmarker:
71
+ while cap.isOpened():
72
+ ret, frame = cap.read()
73
+ if not ret:
74
+ break
75
+
76
+ rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
77
+ mp_img = mp_image(image_format=mp_format.SRGB, data=rgb_frame)
78
+ results = landmarker.detect(mp_img)
79
+
80
+ if results.hand_landmarks:
81
+ for hand_landmarks in results.hand_landmarks:
82
+ points = [(int(lm.x * w), int(lm.y * h)) for lm in hand_landmarks]
83
+
84
+ for start, end in HAND_CONNECTIONS:
85
+ color = get_finger_color(start)
86
+ cv2.line(frame, points[start], points[end], color, 2)
87
+
88
+ for i, (x, y) in enumerate(points):
89
+ cv2.circle(frame, (x, y), 4, (0, 255, 255), -1)
90
+
91
+ out.write(frame)
92
+
93
+ cap.release()
94
+ out.release()
95
+ return out_path
96
+
97
+ # Gradio interface
98
+ demo = gr.Interface(
99
+ fn=process_video,
100
+ inputs=gr.Video(label="Upload Video or Use Webcam"),
101
+ outputs=gr.Video(label="Hand Landmark Annotated Video"),
102
+ title="Hand Detection ",
103
+ description="Upload a video or use webcam to detect hands."
104
+ )
105
+
106
+ demo.launch()
requirement.text → requirements.txt RENAMED
@@ -1,216 +1,216 @@
1
- absl-py==2.2.2
2
- aiofiles==24.1.0
3
- aiohappyeyeballs==2.4.6
4
- annotated-types==0.7.0
5
- antlr4-python3-runtime==4.9.3
6
- anyio==4.9.0
7
- appdirs==1.4.4
8
- asgiref==3.8.1
9
- asttokens==3.0.0
10
- astunparse==1.6.3
11
- attrs==25.1.0
12
- backcall==0.2.0
13
- backoff==2.2.1
14
- bcrypt==4.2.1
15
- blinker==1.9.0
16
- cachetools==5.5.2
17
- certifi==2025.1.31
18
- cffi==1.17.1
19
- charset-normalizer==3.4.1
20
- click==8.1.8
21
- colorama==0.4.6
22
- comtypes==1.4.10
23
- contourpy==1.3.1
24
- cycler==0.12.1
25
- decorator==5.2.1
26
- distro==1.9.0
27
- Django==5.1.7
28
- docopt==0.6.2
29
- docstring_parser==0.16
30
- durationpy==0.9
31
- et_xmlfile==2.0.0
32
- executing==2.2.0
33
- fastapi==0.115.12
34
- fastjsonschema==2.21.1
35
- ffmpy==0.5.0
36
- filelock==3.17.0
37
- filetype==1.2.0
38
- flatbuffers==25.2.10
39
- fonttools==4.57.0
40
- frozenlist==1.5.0
41
- fsspec==2025.2.0
42
- gast==0.6.0
43
- google-api-core==2.24.2
44
- google-auth==2.38.0
45
- google-auth-oauthlib==1.2.1
46
- google-cloud-aiplatform==1.85.0
47
- google-cloud-bigquery==3.30.0
48
- google-cloud-core==2.4.3
49
- google-cloud-resource-manager==1.14.2
50
- google-cloud-storage==2.19.0
51
- google-crc32c==1.7.0
52
- google-pasta==0.2.0
53
- google-resumable-media==2.7.2
54
- googleapis-common-protos==1.69.2
55
- gradio==5.24.0
56
- gradio_client==1.8.0
57
- groovy==0.1.2
58
- grpc-google-iam-v1==0.14.2
59
- grpcio==1.71.0
60
- grpcio-status==1.71.0
61
- h11==0.14.0
62
- h5py==3.13.0
63
- httpcore==1.0.7
64
- httptools==0.6.4
65
- httpx==0.28.1
66
- huggingface-hub==0.30.2
67
- idna==3.10
68
- importlib_resources==6.5.2
69
- jax==0.5.3
70
- jaxlib==0.5.3
71
- Jinja2==3.1.5
72
- jiter==0.8.2
73
- jmespath==1.0.1
74
- joblib==1.4.2
75
- json5==0.10.0
76
- json_repair==0.39.1
77
- jsonpath-python==1.0.6
78
- jsonpickle==4.0.2
79
- jsonref==1.1.0
80
- junitparser==3.2.0
81
- jupyterlab_pygments==0.3.0
82
- keras==2.15.0
83
- kiwisolver==1.4.8
84
- langdetect==1.0.9
85
- libclang==18.1.1
86
- lxml==5.3.1
87
- Markdown==3.7
88
- markdown-it-py==3.0.0
89
- MarkupSafe==3.0.2
90
- marshmallow==3.26.1
91
- matplotlib==3.10.1
92
- matplotlib-inline==0.1.7
93
- mdurl==0.1.2
94
- mediapipe==0.10.21
95
- mistune==3.1.3
96
- ml_dtypes==0.5.1
97
- mmh3==5.1.0
98
- monotonic==1.6
99
- mpmath==1.3.0
100
- multidict==6.1.0
101
- mypy-extensions==1.0.0
102
- namex==0.0.8
103
- nest-asyncio==1.6.0
104
- networkx==3.4.2
105
- numpy==1.26.4
106
- oauthlib==3.2.2
107
- olefile==0.47
108
- omegaconf==2.3.0
109
- opencv-contrib-python==4.11.0.86
110
- opencv-python==4.11.0.86
111
- openpyxl==3.1.5
112
- opentelemetry-proto==1.31.0
113
- opentelemetry-util-http==0.52b0
114
- opt_einsum==3.4.0
115
- optree==0.15.0
116
- orjson==3.10.15
117
- overrides==7.7.0
118
- packaging==24.2
119
- pandas==2.2.3
120
- pandocfilters==1.5.1
121
- parso==0.8.4
122
- pickleshare==0.7.5
123
- pillow==10.4.0
124
- platformdirs==4.3.7
125
- prompt_toolkit==3.0.50
126
- propcache==0.3.0
127
- proto-plus==1.26.1
128
- protobuf==4.25.6
129
- psutil==7.0.0
130
- pure_eval==0.2.3
131
- pyasn1==0.6.1
132
- pyasn1_modules==0.4.1
133
- pycparser==2.22
134
- pydantic==2.10.6
135
- pydantic_core==2.27.2
136
- pydub==0.25.1
137
- pyee==12.0.0
138
- Pygments==2.19.1
139
- PyJWT==2.10.1
140
- pypandoc==1.15
141
- pyparsing==3.2.1
142
- pypdf==5.4.0
143
- pypdfium2==4.30.1
144
- PyPika==0.48.9
145
- pypiwin32==223
146
- pyproject_hooks==1.2.0
147
- pyreadline3==3.5.4
148
- python-dateutil==2.9.0.post0
149
- python-dotenv==1.0.1
150
- python-iso639==2025.2.18
151
- python-json-logger==2.0.7
152
- python-magic==0.4.27
153
- python-multipart==0.0.20
154
- pyttsx3==2.98
155
- pytz==2025.1
156
- pywin32==310
157
- PyYAML==6.0.2
158
- pyzmq==26.4.0
159
- RapidFuzz==3.12.2
160
- referencing==0.36.2
161
- regex==2024.11.6
162
- requests==2.32.3
163
- requests-oauthlib==2.0.0
164
- rich==14.0.0
165
- rpds-py==0.23.1
166
- rsa==4.9
167
- ruff==0.11.4
168
- safehttpx==0.1.6
169
- safetensors==0.5.3
170
- scipy==1.15.2
171
- semantic-version==2.10.0
172
- sentencepiece==0.2.0
173
- sentry-sdk==2.23.1
174
- shapely==2.0.7
175
- shellingham==1.5.4
176
- six==1.17.0
177
- sniffio==1.3.1
178
- sounddevice==0.5.1
179
- soupsieve==2.6
180
- sqlparse==0.5.3
181
- stack-data==0.6.3
182
- starlette==0.46.1
183
- sympy==1.13.1
184
- tenacity==8.3.0
185
- tensorboard==2.15.2
186
- tensorboard-data-server==0.7.2
187
- tensorboardX==1.5
188
- tensorflow-estimator==2.15.0
189
- tensorflow-io-gcs-filesystem==0.31.0
190
- termcolor==2.5.0
191
- threadpoolctl==3.6.0
192
- tinycss2==1.4.0
193
- tomli==2.2.1
194
- tomli_w==1.2.0
195
- tomlkit==0.13.2
196
- torch==2.6.0
197
- tornado==6.4.2
198
- tqdm==4.67.1
199
- traitlets==5.14.3
200
- typer==0.15.2
201
- typing-inspection==0.4.0
202
- typing_extensions==4.12.2
203
- tzdata==2025.1
204
- urllib3==2.3.0
205
- uv==0.6.3
206
- uvicorn==0.34.0
207
- wcwidth==0.2.13
208
- webencodings==0.5.1
209
- websocket-client==1.8.0
210
- websockets==15.0
211
- Werkzeug==3.1.3
212
- wrapt==1.14.1
213
- xlrd==2.0.1
214
- XlsxWriter==3.2.2
215
- yarl==1.18.3
216
  zipp==3.21.0
 
1
+ absl-py==2.2.2
2
+ aiofiles==24.1.0
3
+ aiohappyeyeballs==2.4.6
4
+ annotated-types==0.7.0
5
+ antlr4-python3-runtime==4.9.3
6
+ anyio==4.9.0
7
+ appdirs==1.4.4
8
+ asgiref==3.8.1
9
+ asttokens==3.0.0
10
+ astunparse==1.6.3
11
+ attrs==25.1.0
12
+ backcall==0.2.0
13
+ backoff==2.2.1
14
+ bcrypt==4.2.1
15
+ blinker==1.9.0
16
+ cachetools==5.5.2
17
+ certifi==2025.1.31
18
+ cffi==1.17.1
19
+ charset-normalizer==3.4.1
20
+ click==8.1.8
21
+ colorama==0.4.6
22
+ comtypes==1.4.10
23
+ contourpy==1.3.1
24
+ cycler==0.12.1
25
+ decorator==5.2.1
26
+ distro==1.9.0
27
+ Django==5.1.7
28
+ docopt==0.6.2
29
+ docstring_parser==0.16
30
+ durationpy==0.9
31
+ et_xmlfile==2.0.0
32
+ executing==2.2.0
33
+ fastapi==0.115.12
34
+ fastjsonschema==2.21.1
35
+ ffmpy==0.5.0
36
+ filelock==3.17.0
37
+ filetype==1.2.0
38
+ flatbuffers==25.2.10
39
+ fonttools==4.57.0
40
+ frozenlist==1.5.0
41
+ fsspec==2025.2.0
42
+ gast==0.6.0
43
+ google-api-core==2.24.2
44
+ google-auth==2.38.0
45
+ google-auth-oauthlib==1.2.1
46
+ google-cloud-aiplatform==1.85.0
47
+ google-cloud-bigquery==3.30.0
48
+ google-cloud-core==2.4.3
49
+ google-cloud-resource-manager==1.14.2
50
+ google-cloud-storage==2.19.0
51
+ google-crc32c==1.7.0
52
+ google-pasta==0.2.0
53
+ google-resumable-media==2.7.2
54
+ googleapis-common-protos==1.69.2
55
+ gradio==5.24.0
56
+ gradio_client==1.8.0
57
+ groovy==0.1.2
58
+ grpc-google-iam-v1==0.14.2
59
+ grpcio==1.71.0
60
+ grpcio-status==1.71.0
61
+ h11==0.14.0
62
+ h5py==3.13.0
63
+ httpcore==1.0.7
64
+ httptools==0.6.4
65
+ httpx==0.28.1
66
+ huggingface-hub==0.30.2
67
+ idna==3.10
68
+ importlib_resources==6.5.2
69
+ jax==0.5.3
70
+ jaxlib==0.5.3
71
+ Jinja2==3.1.5
72
+ jiter==0.8.2
73
+ jmespath==1.0.1
74
+ joblib==1.4.2
75
+ json5==0.10.0
76
+ json_repair==0.39.1
77
+ jsonpath-python==1.0.6
78
+ jsonpickle==4.0.2
79
+ jsonref==1.1.0
80
+ junitparser==3.2.0
81
+ jupyterlab_pygments==0.3.0
82
+ keras==2.15.0
83
+ kiwisolver==1.4.8
84
+ langdetect==1.0.9
85
+ libclang==18.1.1
86
+ lxml==5.3.1
87
+ Markdown==3.7
88
+ markdown-it-py==3.0.0
89
+ MarkupSafe==3.0.2
90
+ marshmallow==3.26.1
91
+ matplotlib==3.10.1
92
+ matplotlib-inline==0.1.7
93
+ mdurl==0.1.2
94
+ mediapipe==0.10.21
95
+ mistune==3.1.3
96
+ ml_dtypes==0.5.1
97
+ mmh3==5.1.0
98
+ monotonic==1.6
99
+ mpmath==1.3.0
100
+ multidict==6.1.0
101
+ mypy-extensions==1.0.0
102
+ namex==0.0.8
103
+ nest-asyncio==1.6.0
104
+ networkx==3.4.2
105
+ numpy==1.26.4
106
+ oauthlib==3.2.2
107
+ olefile==0.47
108
+ omegaconf==2.3.0
109
+ opencv-contrib-python==4.11.0.86
110
+ opencv-python==4.11.0.86
111
+ openpyxl==3.1.5
112
+ opentelemetry-proto==1.31.0
113
+ opentelemetry-util-http==0.52b0
114
+ opt_einsum==3.4.0
115
+ optree==0.15.0
116
+ orjson==3.10.15
117
+ overrides==7.7.0
118
+ packaging==24.2
119
+ pandas==2.2.3
120
+ pandocfilters==1.5.1
121
+ parso==0.8.4
122
+ pickleshare==0.7.5
123
+ pillow==10.4.0
124
+ platformdirs==4.3.7
125
+ prompt_toolkit==3.0.50
126
+ propcache==0.3.0
127
+ proto-plus==1.26.1
128
+ protobuf==4.25.6
129
+ psutil==7.0.0
130
+ pure_eval==0.2.3
131
+ pyasn1==0.6.1
132
+ pyasn1_modules==0.4.1
133
+ pycparser==2.22
134
+ pydantic==2.10.6
135
+ pydantic_core==2.27.2
136
+ pydub==0.25.1
137
+ pyee==12.0.0
138
+ Pygments==2.19.1
139
+ PyJWT==2.10.1
140
+ pypandoc==1.15
141
+ pyparsing==3.2.1
142
+ pypdf==5.4.0
143
+ pypdfium2==4.30.1
144
+ PyPika==0.48.9
145
+ pypiwin32==223
146
+ pyproject_hooks==1.2.0
147
+ pyreadline3==3.5.4
148
+ python-dateutil==2.9.0.post0
149
+ python-dotenv==1.0.1
150
+ python-iso639==2025.2.18
151
+ python-json-logger==2.0.7
152
+ python-magic==0.4.27
153
+ python-multipart==0.0.20
154
+ pyttsx3==2.98
155
+ pytz==2025.1
156
+ pywin32==310
157
+ PyYAML==6.0.2
158
+ pyzmq==26.4.0
159
+ RapidFuzz==3.12.2
160
+ referencing==0.36.2
161
+ regex==2024.11.6
162
+ requests==2.32.3
163
+ requests-oauthlib==2.0.0
164
+ rich==14.0.0
165
+ rpds-py==0.23.1
166
+ rsa==4.9
167
+ ruff==0.11.4
168
+ safehttpx==0.1.6
169
+ safetensors==0.5.3
170
+ scipy==1.15.2
171
+ semantic-version==2.10.0
172
+ sentencepiece==0.2.0
173
+ sentry-sdk==2.23.1
174
+ shapely==2.0.7
175
+ shellingham==1.5.4
176
+ six==1.17.0
177
+ sniffio==1.3.1
178
+ sounddevice==0.5.1
179
+ soupsieve==2.6
180
+ sqlparse==0.5.3
181
+ stack-data==0.6.3
182
+ starlette==0.46.1
183
+ sympy==1.13.1
184
+ tenacity==8.3.0
185
+ tensorboard==2.15.2
186
+ tensorboard-data-server==0.7.2
187
+ tensorboardX==1.5
188
+ tensorflow-estimator==2.15.0
189
+ tensorflow-io-gcs-filesystem==0.31.0
190
+ termcolor==2.5.0
191
+ threadpoolctl==3.6.0
192
+ tinycss2==1.4.0
193
+ tomli==2.2.1
194
+ tomli_w==1.2.0
195
+ tomlkit==0.13.2
196
+ torch==2.6.0
197
+ tornado==6.4.2
198
+ tqdm==4.67.1
199
+ traitlets==5.14.3
200
+ typer==0.15.2
201
+ typing-inspection==0.4.0
202
+ typing_extensions==4.12.2
203
+ tzdata==2025.1
204
+ urllib3==2.3.0
205
+ uv==0.6.3
206
+ uvicorn==0.34.0
207
+ wcwidth==0.2.13
208
+ webencodings==0.5.1
209
+ websocket-client==1.8.0
210
+ websockets==15.0
211
+ Werkzeug==3.1.3
212
+ wrapt==1.14.1
213
+ xlrd==2.0.1
214
+ XlsxWriter==3.2.2
215
+ yarl==1.18.3
216
  zipp==3.21.0