pegasama commited on
Commit
a20494c
·
verified ·
1 Parent(s): b26156a

Update README.md

Browse files
Files changed (1) hide show
  1. README.md +201 -1
README.md CHANGED
@@ -8,4 +8,204 @@ tags:
8
  - yoga
9
  - human
10
  - mediapipe
11
- ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  - yoga
9
  - human
10
  - mediapipe
11
+ language:
12
+ - en
13
+ ---
14
+
15
+
16
+ # Yoga Pose Classification Toolkit
17
+
18
+ This repository contains a small, script-first pipeline to prepare data, extract pose landmarks with MediaPipe, train machine‑learning pose classifiers, and run a real‑time webcam demo.
19
+
20
+ The sections below explain what each Python script in the project root does and how to use it on macOS (zsh). For dependencies, see `requirements.txt`.
21
+
22
+ ## Prerequisites
23
+
24
+ - Python 3.x
25
+ - Install Python packages:
26
+
27
+ ```bash
28
+ pip install -r requirements.txt
29
+ ```
30
+
31
+ Optional but recommended: create and activate a virtual environment before installing.
32
+
33
+ ## Typical end‑to‑end workflow
34
+
35
+ 1) (Optional) Extract raw images from the included Parquet dataset into train/test folders using `extract_images.py`.
36
+ 2) Run `pose_detection.py` to generate per‑image pose landmark JSON files under `PoseData/label_*`.
37
+ 3) Train and evaluate a classifier with `ml_pose_classifier.py`. Optionally export to ONNX or TFLite.
38
+ 4) Run the webcam demo with `realtime_pose_classifier.py` using your saved model.
39
+
40
+ ---
41
+
42
+ ## Script: extract_images.py
43
+
44
+ Purpose
45
+ - Extract images and labels from the provided Parquet files (in `YogaDataSet/data/`) and save them into folders by label for training and testing.
46
+
47
+ Inputs/Outputs
48
+ - Input: `YogaDataSet/data/train-00000-of-00001.parquet`, `YogaDataSet/data/test-00000-of-00001.parquet`
49
+ - Output: Images under `TrainData/train/label_*` and/or `TrainData/test/label_*`
50
+
51
+ Usage
52
+
53
+ ```bash
54
+ # Process both train and test (default behavior)
55
+ python extract_images.py
56
+
57
+ # Train only
58
+ python extract_images.py --train --output TrainData
59
+
60
+ # Test only to a custom folder
61
+ python extract_images.py --test --output MyOutputDir
62
+ ```
63
+
64
+ Notes
65
+ - The script creates `label_0`, `label_1`, … subfolders and writes image files with their original extensions.
66
+
67
+ ---
68
+
69
+ ## Script: pose_detection.py
70
+
71
+ Purpose
72
+ - Run MediaPipe Pose on your labeled image folders and save normalized landmark coordinates to JSON files for training.
73
+
74
+ Preprocessing
75
+ - Uses the nose as the head reference point and applies: position = (pos − headPos) × 100, rounded to 2 decimals. This matches the training pipeline.
76
+
77
+ Inputs/Outputs
78
+ - Input: An images root (default `TrainData/train`) organized as `label_*/*.jpg|png|…`
79
+ - Output: JSON files under `PoseData/label_*/<image_name>.json`
80
+
81
+ Usage
82
+
83
+ ```bash
84
+ # Process images from default input into PoseData
85
+ python pose_detection.py
86
+
87
+ # Custom input and output
88
+ python pose_detection.py --input TrainData/train --output PoseData --batch-size 100
89
+ ```
90
+
91
+ Tips
92
+ - Supported image extensions: .jpg, .jpeg, .png, .bmp, .tiff
93
+ - Requires a working OpenCV + MediaPipe install (see `requirements.txt`).
94
+
95
+ ---
96
+
97
+ ## Script: ml_pose_classifier.py
98
+
99
+ Purpose
100
+ - Train, evaluate, and export pose classifiers from landmark JSONs. Supports Random Forest, SVM, Gradient Boosting, Logistic Regression, and a knowledge‑distilled RF→MLP variant.
101
+
102
+ Data expectation
103
+ - Directory structure like:
104
+ - `PoseData/label_0/*.json`
105
+ - `PoseData/label_1/*.json`
106
+ - …
107
+
108
+ Common options
109
+ - `--data/-d` Pose JSON root (default: `PoseData`)
110
+ - `--model/-m` Model type: `random_forest` (default), `svm`, `gradient_boost`, `logistic`, `distilled_rf`
111
+ - `--test-size/-t` Test split ratio (default: 0.2)
112
+ - `--save-model/-s` Path to save the trained model (`.pkl` via joblib)
113
+ - `--load-model/-l` Path to load an existing model
114
+ - `--predict/-p` Predict a single JSON file
115
+ - `--evaluate/-e` Evaluate a folder of JSON files
116
+ - `--export-onnx` Export the trained model to ONNX (tree models or distilled MLP)
117
+ - `--export-model-type` Controls which model flavor to export
118
+ - `--export-tflite` Export distilled student MLP to TFLite (requires extra deps)
119
+
120
+ Typical commands
121
+
122
+ ```bash
123
+ # 1) Train a Random Forest and save it
124
+ python ml_pose_classifier.py \
125
+ --data PoseData \
126
+ --model random_forest \
127
+ --test-size 0.2 \
128
+ --save-model models/pose_classifier_random_forest.pkl
129
+
130
+ # 2) Evaluate a saved model on a held‑out folder (e.g., TestData)
131
+ python ml_pose_classifier.py \
132
+ --model random_forest \
133
+ --load-model models/pose_classifier_random_forest.pkl \
134
+ --evaluate TestData
135
+
136
+ # 3) Export to ONNX (Random Forest or distilled MLP)
137
+ python ml_pose_classifier.py \
138
+ --model random_forest \
139
+ --load-model models/pose_classifier_random_forest.pkl \
140
+ --export-onnx models/pose_classifier_random_forest.onnx
141
+
142
+ # 4) Knowledge distillation: train RF teacher + MLP student
143
+ python ml_pose_classifier.py \
144
+ --data PoseData \
145
+ --model distilled_rf \
146
+ --save-model models/pose_classifier_distilled_rf.pkl
147
+
148
+ # 5) Export the student MLP to TFLite (extra packages required)
149
+ python ml_pose_classifier.py \
150
+ --model distilled_rf \
151
+ --load-model models/pose_classifier_distilled_rf.pkl \
152
+ --export-tflite models/pose_classifier_distilled_mlp.tflite
153
+ ```
154
+
155
+ Notes
156
+ - ONNX export depends on `skl2onnx` and `onnx`. TFLite export additionally needs `onnx-tf` and `tensorflow`.
157
+ - Linear classifiers (`svm`, `logistic`) are not supported by Unity Barracuda. Prefer `random_forest` or the distilled MLP for deployment.
158
+
159
+ ---
160
+
161
+ ## Script: realtime_pose_classifier.py
162
+
163
+ Purpose
164
+ - Run live pose classification from your webcam using a previously trained model. Draws the skeleton, highlights the used joints, and overlays prediction + confidence.
165
+
166
+ Model loading
167
+ - If `--model` is not provided, the script auto‑searches common filenames in the project root:
168
+ - `pose_classifier_random_forest.pkl`
169
+ - `pose_classifier_logistic.pkl`
170
+ - `pose_classifier_distilled_rf.pkl`
171
+
172
+ Usage
173
+
174
+ ```bash
175
+ # Auto‑detect a model and open the default camera (0)
176
+ python realtime_pose_classifier.py
177
+
178
+ # Specify a model file and camera index
179
+ python realtime_pose_classifier.py \
180
+ --model models/pose_classifier_random_forest.pkl \
181
+ --camera 0
182
+ ```
183
+
184
+ Keyboard controls
185
+ - Q: Quit
186
+ - L: Toggle landmark keypoints
187
+ - C: Toggle pose connections
188
+ - R: Reset prediction history (smoothing window)
189
+
190
+ Notes
191
+ - Uses the same preprocessing as training (nose‑relative coordinates ×100, 2‑decimal rounding, StandardScaler).
192
+ - For smoother predictions, a small history window is used to compute a stable label and average confidence.
193
+
194
+ ---
195
+
196
+ ## Useful folders and artifacts
197
+
198
+ - `YogaDataSet/data/` — Parquet files used by `extract_images.py`.
199
+ - `TrainData/train|test/label_*/` — Image folders produced by extraction.
200
+ - `PoseData/label_*/` — Landmark JSONs generated by `pose_detection.py`.
201
+ - `models/` — Example trained/exported models and label mappings.
202
+ - `confusion_matrix_*.png` — Saved confusion matrix plots (when enabled in training script).
203
+
204
+ ## Troubleshooting
205
+
206
+ - MediaPipe install issues on macOS: ensure you’re using a supported Python version and the latest pip; try reinstalling `mediapipe` and `opencv-python`.
207
+ - Camera cannot open: try a different `--camera` index, close other apps using the camera, or allow camera permissions for Python in macOS Privacy settings.
208
+ - Model not found in real‑time script: pass `--model` with an explicit path to your `.pkl` file.
209
+
210
+
211
+