marcosavoia commited on
Commit
90c19de
·
verified ·
1 Parent(s): 87932a0

Upload 5 files

Browse files
Files changed (5) hide show
  1. README.md +58 -37
  2. pyproject.toml +28 -0
  3. requirements.txt +332 -0
  4. start_server.sh +10 -0
  5. uv.lock +0 -0
README.md CHANGED
@@ -1,62 +1,83 @@
1
- ---
2
- title: StrokeSense
3
- emoji: 🎾
4
- colorFrom: green
5
- colorTo: gray
6
- sdk: gradio
7
- app_file: app.py
8
- pinned: false
9
- tags:
10
- - best-minicpm-build
11
- - llama-cpp
12
- - backyard-ai
13
- ---
14
-
15
- # StrokeSense
16
-
17
- A tennis stroke analyser that detects shots from video and scores mechanics using a local vision-language model — no cloud API required. Designed to analyse close-up shots from a drill, it identifies each groundstroke (forehand or backhand), then generates scores and notes using vision capabilities.
18
-
19
- Built for the **Build Small Hackathon** · Track: **Backyard AI**
20
-
21
-
22
- ![Demo](images/ai_tennis_coach_picture.png)
23
 
 
24
 
25
  ## How it works
26
 
27
- 1. **Shot detection** — MoveNet (TFLite) extracts pose keypoints per frame. A sliding-window RNN classifies each window as forehand, backhand, serve, or neutral.
28
- 2. **Clip extraction** — A short clip is cut around each detected shot.
29
- 3. **Stroke analysis** — Clip frames are sent to a local **MiniCPM-V-4.6** server (running via **llama.cpp**). The model scores four mechanics dimensions (preparation, contact point, swing/follow-through, and balance/stance) and returns structured JSON.
30
- 4. **Coach recommendation** — Chat with a coach agent powered by **MiniCPM-V-4.6** to get recommendations and discuss your stroke analysis further.
31
 
32
  ## Setup
33
 
34
  Requires [uv](https://github.com/astral-sh/uv) and Python 3.12+.
35
 
36
  ```bash
37
- uv sync
 
38
  ```
39
 
40
- **Model files needed** (not included):
41
 
42
- | File | Purpose |
43
  |---|---|
44
  | `models/movenet.tflite` | Shot detection |
45
- | MiniCPM-V-4.6-GGUF | VLM stroke analysis |
 
46
 
47
- Download MiniCPM-V-4.6-GGUF from [Hugging Face](https://huggingface.co/ggml-org/MiniCPM-V-4.6-GGUF) and set the path in `start_server.sh`.
48
 
49
  ## Usage
50
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
51
  ```bash
52
- # Start the local VLM server (llama.cpp)
 
 
 
 
 
53
  ./start_server.sh
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
54
  ```
55
 
 
 
 
 
56
  ```python
57
- # Programmatic shot detection
58
- from ai_tennis_coach import classify_shots
59
 
60
- results = classify_shots("match.mp4", "tennis_rnn.h5")
61
- # [{"FrameID": 131, "Shot": "forehand"}, ...]
62
- ```
 
 
 
 
1
+ # Tennis Stroke Analyser
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
 
3
+ A two-stage computer vision pipeline that detects tennis shots from video and scores stroke mechanics using a local vision-language model.
4
 
5
  ## How it works
6
 
7
+ 1. **Shot detection** — MoveNet (TFLite) extracts 17-keypoint pose estimates per frame. A 30-frame sliding window feeds an RNN that classifies each window as forehand, backhand, serve, or neutral (threshold 0.98). Detected shots are returned as `[{"FrameID": int, "Shot": str}]`.
8
+ 2. **Clip extraction** — A short video clip is cut around each detected frame ID (configurable padding before/after).
9
+ 3. **Stroke analysis** — Clip frames are sampled and sent as images to a local MiniCPM-V-4.6 server. The model scores four mechanics dimensions (preparation, contact point, swing/follow-through, balance/stance) and returns structured JSON via the OpenAI-compatible API.
 
10
 
11
  ## Setup
12
 
13
  Requires [uv](https://github.com/astral-sh/uv) and Python 3.12+.
14
 
15
  ```bash
16
+ uv sync # runtime dependencies
17
+ uv sync --dev # include marimo notebook runner
18
  ```
19
 
20
+ ### Required model files (not included)
21
 
22
+ | File | Used by |
23
  |---|---|
24
  | `models/movenet.tflite` | Shot detection |
25
+ | `models/pose_landmarker_lite.task` | Pose annotation video |
26
+ | MiniCPM-V-4.6-GGUF weights | VLM stroke analysis |
27
 
28
+ Download MiniCPM-V-4.6-GGUF from [Hugging Face](https://huggingface.co/ggml-org/MiniCPM-V-4.6-GGUF) and update the path in `start_server.sh`.
29
 
30
  ## Usage
31
 
32
+ **Detect shots programmatically:**
33
+ ```python
34
+ from ai_tennis_coach import classify_shots
35
+
36
+ results = classify_shots("data/match.mp4", "tennis_rnn.h5")
37
+ # [{"FrameID": 131, "Shot": "forehand"}, {"FrameID": 350, "Shot": "forehand"}, ...]
38
+ ```
39
+
40
+ **Real-time shot detection with overlay:**
41
+ ```bash
42
+ uv run python src/ai_tennis_coach/track_and_classify.py <video> <model.h5> [--left-handed]
43
+ ```
44
+
45
+ **Annotate video with MediaPipe pose landmarks:**
46
  ```bash
47
+ uv run python pose_estimation_video.py -v data/match.mp4 -o data/annotated.mp4
48
+ ```
49
+
50
+ **Stroke quality analysis (marimo notebook):**
51
+ ```bash
52
+ # 1. Start the local VLM server
53
  ./start_server.sh
54
+
55
+ # 2. Open the notebook
56
+ uv run marimo edit stroke_analysis.py
57
+ ```
58
+
59
+ ## Package structure
60
+
61
+ ```
62
+ src/ai_tennis_coach/
63
+ ├── extract_pose.py # HumanPoseExtractor + RoI tracker (MoveNet)
64
+ ├── track_and_classify.py # ShotCounter, real-time rendering script
65
+ ├── analysis.py # classify_shots(), StrokeAnalysis Pydantic model
66
+ ├── config.py # Config + Prompts dataclasses, module-level singletons
67
+ ├── utils.py # encode_video(), image_to_base64()
68
+ └── prompt.yaml # VLM scoring prompts
69
  ```
70
 
71
+ ## Configuration
72
+
73
+ All tunable settings live in `src/ai_tennis_coach/config.py`:
74
+
75
  ```python
76
+ from ai_tennis_coach.config import config, prompts
 
77
 
78
+ config.api_base_url # "http://localhost:8080/v1"
79
+ config.model_name # "MiniCPM-V-4.6-Instruct"
80
+ config.clips_dir # "clips"
81
+ config.target_fps # 3
82
+ prompts.forehand # full forehand scoring rubric
83
+ ```
pyproject.toml ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [project]
2
+ name = "build-small-tennis-stroke"
3
+ version = "0.1.0"
4
+ description = "Add your description here"
5
+ readme = "README.md"
6
+ requires-python = ">=3.12"
7
+ dependencies = [
8
+ "aiohttp>=3.14.1",
9
+ "gradio>=6.18.0",
10
+ "imageio[ffmpeg]>=2.37.3",
11
+ "instructor>=1.15.1",
12
+ "mediapipe>=0.10.35",
13
+ "pandas>=3.0.3",
14
+ "python-dotenv>=1.0.0",
15
+ "tensorflow>=2.21.0",
16
+ ]
17
+
18
+ [dependency-groups]
19
+ dev = [
20
+ "marimo>=0.23.6",
21
+ ]
22
+
23
+ [build-system]
24
+ requires = ["hatchling"]
25
+ build-backend = "hatchling.build"
26
+
27
+ [tool.hatch.build.targets.wheel]
28
+ packages=["src/ai_tennis_coach"]
requirements.txt ADDED
@@ -0,0 +1,332 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ agent-framework==1.0.0b251120
2
+ agent-framework-anthropic==1.0.0b260130
3
+ agent-framework-core==1.0.0b251001
4
+ aiofiles==24.1.0
5
+ aiohappyeyeballs==2.6.1
6
+ aiohttp==3.11.18
7
+ aiosignal==1.3.2
8
+ amqp==5.3.1
9
+ aniso8601==10.0.0
10
+ annotated-types==0.7.0
11
+ anthropic==0.79.0
12
+ anyio==4.12.1
13
+ -e file:///Users/ilhamfadhil/Downloads/cli_project
14
+ appnope==0.1.4
15
+ archspec @ file:///croot/archspec_1709217642129/work
16
+ argcomplete==3.6.0
17
+ argon2-cffi==23.1.0
18
+ argon2-cffi-bindings==21.2.0
19
+ arrow==1.3.0
20
+ asgiref==3.11.1
21
+ asttokens==3.0.0
22
+ async-lru==2.0.5
23
+ async-timeout==5.0.1
24
+ attrs==25.4.0
25
+ azure-core==1.38.0
26
+ azure-core-tracing-opentelemetry==1.0.0b12
27
+ azure-identity==1.25.1
28
+ azure-monitor-opentelemetry==1.8.2
29
+ azure-monitor-opentelemetry-exporter==1.0.0b45
30
+ babel==2.17.0
31
+ beautifulsoup4==4.13.4
32
+ billiard==4.2.2
33
+ bleach==6.2.0
34
+ blinker==1.9.0
35
+ boltons @ file:///private/var/folders/nz/j6p8yfhx1mv_0grj5xl4650h0000gp/T/abs_f63n9uulmp/croot/boltons_1677628710094/work
36
+ bottleneck @ file:///private/var/folders/nz/j6p8yfhx1mv_0grj5xl4650h0000gp/T/abs_55txi4fy1u/croot/bottleneck_1731058642212/work
37
+ brotli @ file:///private/var/folders/k1/30mswbxs7r1g6zwn8y4fyt500000gp/T/abs_27zk0eqdh0/croot/brotli-split_1714483157007/work
38
+ celery==5.5.3
39
+ certifi==2026.1.4
40
+ cffi==2.0.0
41
+ charset-normalizer==3.4.4
42
+ click==8.3.1
43
+ click-didyoumean==0.3.1
44
+ click-plugins==1.1.1.2
45
+ click-repl==0.3.0
46
+ colorama==0.4.6
47
+ comm==0.2.2
48
+ conda @ file:///private/var/folders/nz/j6p8yfhx1mv_0grj5xl4650h0000gp/T/abs_f1fq2yjc1q/croot/conda_1749171256613/work/conda-src
49
+ conda-content-trust @ file:///private/var/folders/nz/j6p8yfhx1mv_0grj5xl4650h0000gp/T/abs_11146a2b-93c2-444c-a378-ad4fac363e991s0r1hnp/croots/recipe/conda-content-trust_1658126383571/work
50
+ conda-libmamba-solver @ file:///croot/conda-libmamba-solver_1745607008911/work/src
51
+ conda-package-handling @ file:///private/var/folders/nz/j6p8yfhx1mv_0grj5xl4650h0000gp/T/abs_ef9phnqphe/croot/conda-package-handling_1718138279942/work
52
+ conda-package-streaming @ file:///private/var/folders/k1/30mswbxs7r1g6zwn8y4fyt500000gp/T/abs_6dgq200203/croot/conda-package-streaming_1718136087190/work
53
+ contourpy @ file:///private/var/folders/k1/30mswbxs7r1g6zwn8y4fyt500000gp/T/abs_2cvjf0v4ux/croot/contourpy_1732540055997/work
54
+ cryptography==46.0.4
55
+ cycler @ file:///tmp/build/80754af9/cycler_1637851556182/work
56
+ databricks-cli==0.17.7
57
+ datasets==4.0.0
58
+ debugpy==1.8.13
59
+ decorator @ file:///opt/conda/conda-bld/decorator_1643638310831/work
60
+ defusedxml==0.7.1
61
+ deprecated==1.2.18
62
+ deprecation==2.1.0
63
+ dill==0.3.8
64
+ distlib @ file:///private/var/folders/k1/30mswbxs7r1g6zwn8y4fyt500000gp/T/abs_601vai9os4/croot/distlib_1714716995800/work
65
+ distro @ file:///private/var/folders/nz/j6p8yfhx1mv_0grj5xl4650h0000gp/T/abs_ddkyz0575y/croot/distro_1714488254309/work
66
+ docstring-parser==0.17.0
67
+ docutils==0.22.3
68
+ exceptiongroup==1.3.1
69
+ executing==2.2.0
70
+ fastapi==0.115.11
71
+ fastjsonschema==2.21.1
72
+ ffmpy==0.6.0
73
+ filelock @ file:///private/var/folders/nz/j6p8yfhx1mv_0grj5xl4650h0000gp/T/abs_d3quwmvouf/croot/filelock_1700591194006/work
74
+ filetype==1.2.0
75
+ fixedint==0.1.6
76
+ flask==3.1.0
77
+ flask-cors==5.0.1
78
+ flask-restx==1.3.0
79
+ flower==2.0.1
80
+ fonttools @ file:///private/var/folders/nz/j6p8yfhx1mv_0grj5xl4650h0000gp/T/abs_ce1jt_55vl/croot/fonttools_1737039388732/work
81
+ fqdn==1.5.1
82
+ frozendict @ file:///private/var/folders/k1/30mswbxs7r1g6zwn8y4fyt500000gp/T/abs_8b0cest_id/croot/frozendict_1713194839836/work
83
+ frozenlist==1.6.0
84
+ fsspec==2025.3.0
85
+ geoarrow-c==0.1.2
86
+ geoarrow-pandas==0.1.1
87
+ geoarrow-pyarrow==0.1.2
88
+ geopandas==1.0.1
89
+ gitdb==4.0.12
90
+ gitpython==3.1.44
91
+ googleapis-common-protos==1.69.2
92
+ gradio==5.35.0
93
+ gradio-client==1.10.4
94
+ groovy==0.1.2
95
+ grpcio==1.78.0
96
+ h11==0.16.0
97
+ hf-xet==1.1.5
98
+ httpcore==1.0.9
99
+ httpx==0.28.1
100
+ httpx-sse==0.4.3
101
+ huggingface-hub==0.34.3
102
+ humanize==4.14.0
103
+ idna==3.11
104
+ importlib-metadata==8.7.1
105
+ importlib-resources==6.5.2
106
+ inquirerpy==0.3.4
107
+ ipykernel==6.29.5
108
+ ipython @ file:///private/var/folders/k1/30mswbxs7r1g6zwn8y4fyt500000gp/T/abs_31k34m3e25/croot/ipython_1726064238879/work
109
+ ipywidgets==8.1.6
110
+ isodate==0.7.2
111
+ isoduration==20.11.0
112
+ itsdangerous==2.2.0
113
+ jaraco-classes==3.4.0
114
+ jedi==0.19.2
115
+ jinja2==3.1.6
116
+ jiter==0.13.0
117
+ json5==0.12.0
118
+ jsonpatch @ file:///private/var/folders/k1/30mswbxs7r1g6zwn8y4fyt500000gp/T/abs_3ajyoz8zoj/croot/jsonpatch_1714483362270/work
119
+ jsonpointer==2.1
120
+ jsonschema==4.26.0
121
+ jsonschema-specifications==2025.9.1
122
+ jupyter==1.1.1
123
+ jupyter-client==8.6.3
124
+ jupyter-console==6.6.3
125
+ jupyter-core==5.7.2
126
+ jupyter-events==0.12.0
127
+ jupyter-lsp==2.2.5
128
+ jupyter-packaging==0.12.3
129
+ jupyter-server==2.15.0
130
+ jupyter-server-terminals==0.5.3
131
+ jupyterlab==4.4.1
132
+ jupyterlab-pygments==0.3.0
133
+ jupyterlab-server==2.27.3
134
+ jupyterlab-widgets==3.0.14
135
+ kaleido==0.2.1
136
+ keplergl==0.3.7
137
+ keyring==24.3.1
138
+ kiwisolver @ file:///private/var/folders/nz/j6p8yfhx1mv_0grj5xl4650h0000gp/T/abs_cc2l_z_0ri/croot/kiwisolver_1737039586949/work
139
+ kombu==5.5.4
140
+ libmambapy @ file:///private/var/folders/nz/j6p8yfhx1mv_0grj5xl4650h0000gp/T/abs_8fxbc14zt9/croot/mamba-split_1734469521691/work/libmambapy
141
+ litellm==1.68.1
142
+ markdown==3.10
143
+ markdown-it-py==3.0.0
144
+ markupsafe==3.0.2
145
+ marshmallow==3.26.1
146
+ matplotlib==3.10.0
147
+ matplotlib-inline @ file:///private/var/folders/nz/j6p8yfhx1mv_0grj5xl4650h0000gp/T/abs_f6fdc0hldi/croots/recipe/matplotlib-inline_1662014472341/work
148
+ mcp==1.26.0
149
+ mdurl==0.1.2
150
+ menuinst @ file:///private/var/folders/k1/30mswbxs7r1g6zwn8y4fyt500000gp/T/abs_ad321a45td/croot/menuinst_1723567614652/work
151
+ mistune==3.1.3
152
+ mlx==0.27.1
153
+ mlx-embeddings==0.0.3
154
+ mlx-lm==0.26.2
155
+ mlx-metal==0.27.1
156
+ mlx-vlm==0.3.2
157
+ more-itertools==10.6.0
158
+ mpmath==1.3.0
159
+ msal==1.34.0
160
+ msal-extensions==1.3.1
161
+ msgspec-m==0.19.2
162
+ msrest==0.7.1
163
+ multidict==6.4.3
164
+ multiprocess==0.70.16
165
+ narwhals==2.11.0
166
+ nbclient==0.10.2
167
+ nbconvert==7.16.6
168
+ nbformat==5.10.4
169
+ nest-asyncio==1.6.0
170
+ networkx==3.1
171
+ notebook==7.4.1
172
+ notebook-shim==0.2.4
173
+ numexpr @ file:///private/var/folders/nz/j6p8yfhx1mv_0grj5xl4650h0000gp/T/abs_b3kvvt6tc6/croot/numexpr_1730215947700/work
174
+ numpy==1.26.4
175
+ oauthlib==3.2.2
176
+ omz-tools @ file:///Users/ilhamfadhil/Documents/Work/beesar/nai-face-recognition/open_model_zoo/tools/model_tools
177
+ openai==2.18.0
178
+ opencv-python==4.12.0.88
179
+ opencv-python-headless==4.12.0.88
180
+ opentelemetry-api==1.39.1
181
+ opentelemetry-exporter-otlp-proto-common==1.39.1
182
+ opentelemetry-exporter-otlp-proto-grpc==1.39.1
183
+ opentelemetry-exporter-otlp-proto-http==1.31.0
184
+ opentelemetry-instrumentation==0.60b1
185
+ opentelemetry-instrumentation-asgi==0.60b1
186
+ opentelemetry-instrumentation-dbapi==0.60b1
187
+ opentelemetry-instrumentation-django==0.60b1
188
+ opentelemetry-instrumentation-fastapi==0.60b1
189
+ opentelemetry-instrumentation-flask==0.60b1
190
+ opentelemetry-instrumentation-psycopg2==0.60b1
191
+ opentelemetry-instrumentation-requests==0.60b1
192
+ opentelemetry-instrumentation-urllib==0.60b1
193
+ opentelemetry-instrumentation-urllib3==0.60b1
194
+ opentelemetry-instrumentation-wsgi==0.60b1
195
+ opentelemetry-proto==1.39.1
196
+ opentelemetry-resource-detector-azure==0.1.5
197
+ opentelemetry-sdk==1.39.1
198
+ opentelemetry-semantic-conventions==0.60b1
199
+ opentelemetry-semantic-conventions-ai==0.4.13
200
+ opentelemetry-util-http==0.60b1
201
+ openvino==2024.6.0
202
+ openvino-dev==2024.6.0
203
+ openvino-telemetry==2025.2.0
204
+ orjson==3.10.18
205
+ overrides==7.7.0
206
+ packaging==26.0
207
+ pandas @ file:///private/var/folders/nz/j6p8yfhx1mv_0grj5xl4650h0000gp/T/abs_4aifrweohv/croot/pandas_1732735109535/work/dist/pandas-2.2.3-cp310-cp310-macosx_11_0_arm64.whl
208
+ pandocfilters==1.5.1
209
+ parso==0.8.4
210
+ pdf2image==1.17.0
211
+ pexpect @ file:///tmp/build/80754af9/pexpect_1605563209008/work
212
+ pfzy==0.3.4
213
+ pickleshare==0.7.5
214
+ pika==1.3.2
215
+ pillow==11.3.0
216
+ pip==23.0.1
217
+ platformdirs @ file:///private/var/folders/k1/30mswbxs7r1g6zwn8y4fyt500000gp/T/abs_a8u4fy8k9o/croot/platformdirs_1692205661656/work
218
+ plotly==6.0.1
219
+ pluggy @ file:///private/var/folders/nz/j6p8yfhx1mv_0grj5xl4650h0000gp/T/abs_croot-w6jyveby/pluggy_1648109277227/work
220
+ polars==1.34.0
221
+ polars-runtime-32==1.34.0
222
+ prometheus-client==0.21.1
223
+ prompt-toolkit==3.0.52
224
+ promptflow==1.17.2
225
+ promptflow-core==1.17.2
226
+ promptflow-devkit==1.17.2
227
+ promptflow-tracing==1.17.2
228
+ propcache==0.3.1
229
+ protobuf==5.29.3
230
+ psutil==7.0.0
231
+ psycopg==3.2.11
232
+ psycopg-binary==3.2.11
233
+ ptyprocess @ file:///tmp/build/80754af9/ptyprocess_1609355006118/work/dist/ptyprocess-0.7.0-py2.py3-none-any.whl
234
+ pure-eval @ file:///opt/conda/conda-bld/pure_eval_1646925070566/work
235
+ pyarrow==20.0.0
236
+ pyarrow-hotfix==0.7
237
+ pycosat @ file:///private/var/folders/nz/j6p8yfhx1mv_0grj5xl4650h0000gp/T/abs_19qelmdbl6/croot/pycosat_1714510743067/work
238
+ pycparser==3.0
239
+ pydantic==2.12.5
240
+ pydantic-core==2.41.5
241
+ pydantic-settings==2.12.0
242
+ pydash==7.0.7
243
+ pydub==0.25.1
244
+ pygments==2.19.1
245
+ pyjwt==2.11.0
246
+ pymdown-extensions==10.16.1
247
+ pyogrio==0.10.0
248
+ pyparsing @ file:///private/var/folders/nz/j6p8yfhx1mv_0grj5xl4650h0000gp/T/abs_65qfw6vkxg/croot/pyparsing_1731445528142/work
249
+ pyproj==3.7.1
250
+ pysocks @ file:///Users/ktietz/ci_310/pysocks_1643961536721/work
251
+ python-dateutil @ file:///private/var/folders/k1/30mswbxs7r1g6zwn8y4fyt500000gp/T/abs_66ud1l42_h/croot/python-dateutil_1716495741162/work
252
+ python-dotenv==1.2.1
253
+ python-json-logger==3.3.0
254
+ python-multipart==0.0.22
255
+ pytz==2025.2
256
+ pyyaml==6.0.2
257
+ pyzmq==26.3.0
258
+ referencing==0.37.0
259
+ regex==2024.11.6
260
+ requests==2.32.5
261
+ requests-oauthlib==2.0.0
262
+ rfc3339-validator==0.1.4
263
+ rfc3986-validator==0.1.1
264
+ rich==14.0.0
265
+ rpds-py==0.30.0
266
+ ruamel-yaml @ file:///private/var/folders/nz/j6p8yfhx1mv_0grj5xl4650h0000gp/T/abs_35yvtl3p84/croot/ruamel.yaml_1727980165481/work
267
+ ruamel-yaml-clib @ file:///private/var/folders/nz/j6p8yfhx1mv_0grj5xl4650h0000gp/T/abs_70l_orv46q/croot/ruamel.yaml.clib_1727769819918/work
268
+ ruff==0.12.1
269
+ safehttpx==0.1.6
270
+ safetensors==0.5.3
271
+ scipy==1.15.3
272
+ seaborn @ file:///private/var/folders/nz/j6p8yfhx1mv_0grj5xl4650h0000gp/T/abs_74n8m1zz4r/croot/seaborn_1749110344248/work
273
+ semantic-version==2.10.0
274
+ send2trash==1.8.3
275
+ sentencepiece==0.2.0
276
+ setuptools==65.6.3
277
+ shapely==2.1.0
278
+ shellingham==1.5.4
279
+ six @ file:///tmp/build/80754af9/six_1644875935023/work
280
+ smmap==5.0.2
281
+ smolagents==1.15.0
282
+ sniffio==1.3.1
283
+ soundfile==0.13.1
284
+ soupsieve==2.7
285
+ sqlalchemy==2.0.39
286
+ sse-starlette==3.2.0
287
+ stack-data==0.6.3
288
+ starlette==0.52.1
289
+ strictyaml==1.7.3
290
+ sympy==1.14.0
291
+ tabulate==0.9.0
292
+ terminado==0.18.1
293
+ tiktoken==0.9.0
294
+ tinycss2==1.4.0
295
+ tokenizers==0.21.1
296
+ tomli==2.2.1
297
+ tomlkit==0.13.2
298
+ torch==2.9.0
299
+ torchvision==0.24.0
300
+ tornado @ file:///private/var/folders/k1/30mswbxs7r1g6zwn8y4fyt500000gp/T/abs_a4w03z48br/croot/tornado_1718740114858/work
301
+ tqdm==4.67.3
302
+ traitlets==5.14.3
303
+ traittypes==0.2.1
304
+ transformers==4.54.1
305
+ truststore @ file:///private/var/folders/k1/30mswbxs7r1g6zwn8y4fyt500000gp/T/abs_42mm7e6j06/croot/truststore_1695244298716/work
306
+ typer==0.16.0
307
+ types-python-dateutil==2.9.0.20241206
308
+ typing-extensions==4.15.0
309
+ typing-inspection==0.4.2
310
+ tzdata==2025.2
311
+ ultralytics==8.3.221
312
+ ultralytics-thop==2.0.17
313
+ unicodedata2 @ file:///private/var/folders/k1/30mswbxs7r1g6zwn8y4fyt500000gp/T/abs_b99hn8t9lq/croot/unicodedata2_1736541774279/work
314
+ uri-template==1.3.0
315
+ urllib3==2.6.3
316
+ uvicorn==0.40.0
317
+ vine==5.1.0
318
+ virtualenv @ file:///private/var/folders/k1/30mswbxs7r1g6zwn8y4fyt500000gp/T/abs_5cp3cbuzh_/croot/virtualenv_1714719505426/work
319
+ waitress==3.0.2
320
+ wcwidth==0.2.13
321
+ webcolors==24.11.1
322
+ webencodings==0.5.1
323
+ websocket-client==1.8.0
324
+ websockets==16.0
325
+ werkzeug==3.1.3
326
+ wheel==0.38.4
327
+ widgetsnbextension==4.0.14
328
+ wrapt==1.17.2
329
+ xxhash==3.5.0
330
+ yarl==1.20.0
331
+ zipp==3.23.0
332
+ zstandard @ file:///private/var/folders/k1/30mswbxs7r1g6zwn8y4fyt500000gp/T/abs_054juzz3it/croot/zstandard_1714677666952/work
start_server.sh ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ llama-server \
2
+ -m ~/.cache/huggingface/hub/models--ggml-org--MiniCPM-V-4.6-GGUF/snapshots/1d73353fab60fe6040ab73eb1e457e2aab210100/MiniCPM-V-4.6-Q4_K_M.gguf \
3
+ --mmproj ~/.cache/huggingface/hub/models--ggml-org--MiniCPM-V-4.6-GGUF/snapshots/1d73353fab60fe6040ab73eb1e457e2aab210100/mmproj-MiniCPM-V-4.6-bf16.gguf \
4
+ --host 0.0.0.0 \
5
+ --port 8080 \
6
+ --media-path /Users/ilhamfadhil/Documents/Work/build-small-tennis-stroke/data \
7
+ -ngl 99 \
8
+ -n 1024 \
9
+ -c 65536
10
+ - verbosity 0
uv.lock ADDED
The diff for this file is too large to render. See raw diff