Upload 5 files
Browse files- README.md +58 -37
- pyproject.toml +28 -0
- requirements.txt +332 -0
- start_server.sh +10 -0
- 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 |
-

|
| 23 |
|
|
|
|
| 24 |
|
| 25 |
## How it works
|
| 26 |
|
| 27 |
-
1. **Shot detection** — MoveNet (TFLite) extracts pose
|
| 28 |
-
2. **Clip extraction** — A short clip is cut around each detected
|
| 29 |
-
3. **Stroke analysis** — Clip frames are sent to a local
|
| 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 |
-
|
| 41 |
|
| 42 |
-
| File |
|
| 43 |
|---|---|
|
| 44 |
| `models/movenet.tflite` | Shot detection |
|
| 45 |
-
|
|
|
|
|
| 46 |
|
| 47 |
-
Download MiniCPM-V-4.6-GGUF from [Hugging Face](https://huggingface.co/ggml-org/MiniCPM-V-4.6-GGUF) and
|
| 48 |
|
| 49 |
## Usage
|
| 50 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 51 |
```bash
|
| 52 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 53 |
./start_server.sh
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 54 |
```
|
| 55 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 56 |
```python
|
| 57 |
-
|
| 58 |
-
from ai_tennis_coach import classify_shots
|
| 59 |
|
| 60 |
-
|
| 61 |
-
#
|
| 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
|
|
|