Skip to main content

gesto

Train and run gesture recognition models from Gesto Labeller datasets.

Point it at a project folder, pick a mode and a region, and it handles the rest — loading, training, versioned model storage, and live detection that matches how the data was captured.

pip install gesto

Two modes

mode the gesture is… model example
static a held shape or posture Dense network thumbs up, alphabet letters, a stance
sequence a motion over time stacked LSTM waving, clapping, jogging

Static needs far less data (every captured frame is a training sample) and predicts instantly with no warm-up. Reach for sequence only when two gestures share the same shape and differ by movement.

Five regions

region dim tracks
hands_one 63 one hand, 21 joints
hands_two 126 both hands
pose 132 full body, 33 points
legs 32 lower body, 8 points
full 258 body + both hands

The region must match how the project was captured — gesto checks the feature dimension and tells you if it doesn't.

Command line

# what's in this dataset?
gesto inspect ./gesto_projects/signs

# train
gesto train static hands_one ./gesto_projects/signs
gesto train sequence pose ./gesto_projects/jogging --seq-len 30

# detect (newest model by default)
gesto detect static hands_one
gesto detect sequence pose --source clip.mp4
gesto detect static hands_one --version 2

# what have I trained?
gesto list

Python

import gesto

run = gesto.train("./gesto_projects/signs", region="hands_one", mode="static")
gesto.detect("static", "hands_one")

Or drive a model yourself:

from gesto.detect import Predictor

predictor = Predictor.load("static", "hands_one")
vector = predictor.features(holistic_result)   # extract + normalize
probs = predictor.predict(vector)

Where models go

Everything lands under one artifacts/ folder, split by mode then region. Training never overwrites an earlier run — it versions:

artifacts/
    static/
        hands_one/          model.keras, labels.json
        hands_one_2/        the next run
        pose/
    sequence/
        pose/
        pose_2/

gesto detect static pose picks the newest version; --version 1 picks a specific one.

Matching your capture

Predictions are only correct when detection feeds the model the same kind of vector it trained on. gesto mirrors Gesto Labeller exactly:

  • the same engine — MediaPipe Holistic, same confidence settings
  • the same landmark order — including one-hand mode preferring the right hand and falling back to the left
  • the same normalization — translation/scale-invariant, verified identical
  • the same mirroring — webcam frames are flipped, video files are not

If you captured with Gesto's Normalise unchecked, pass --raw when training so detection knows to skip it.

Getting good results

  • Balance your classes. Similar sample counts per class; gesto applies class weights but balanced data is better.
  • Enough samples. ~20–30 static frames per class, or ~15–30 sequences. Small datasets automatically get a lighter model, since an oversized network on little data overfits and collapses to predicting one class.
  • Consistent clip length for sequence mode — set "Max frames" in Gesto Labeller so every capture is the same length.

Run gesto inspect <project> to check all of this before training.

Requirements

Python 3.9+, TensorFlow, OpenCV, MediaPipe, NumPy — all installed with the package.

License

MIT

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

gesto-0.1.0.tar.gz (19.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

gesto-0.1.0-py3-none-any.whl (18.5 kB view details)

Uploaded Python 3

File details

Details for the file gesto-0.1.0.tar.gz.

File metadata

  • Download URL: gesto-0.1.0.tar.gz
  • Upload date:
  • Size: 19.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.4

File hashes

Hashes for gesto-0.1.0.tar.gz
Algorithm Hash digest
SHA256 ff79688e0499e5505883c9a6b9f75576feb2da110a1c5ff8ef7cb683b19cc900
MD5 693e2120b02991edb3527112a7acaf6a
BLAKE2b-256 f144e7ce6749f35a5e30c230ca6bb03cb54375b4fa09e7139c650c365257f11b

See more details on using hashes here.

File details

Details for the file gesto-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: gesto-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 18.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.4

File hashes

Hashes for gesto-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 836c9e8f0c8b14e02f2ac55072873d66b1a735002f386b2ab1566249da271084
MD5 4bbfb6141da49fa24555a57736cfc755
BLAKE2b-256 2849e20274cb74c1d98c8146cc2ef0cd6fad0794d9400efd1e1d4f8b86551974

See more details on using hashes here.

Release history Release notifications | RSS feed

0.2.6

2 files

0.2.5

2 files

0.2.4

2 files

0.2.2

2 files

0.2.1

2 files

0.2.0

2 files

0.1.1

2 files

This release

0.1.0 This release

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page