Companion to
tools/labeler.htmlv0.2. One record per shot + point segments. Timestamps (t_contact_s) are the single source of truth — no frame numbers, no fps in exports.
Two hotkeys mark point boundaries while watching:
A — point start: the moment the server begins the service motion.E — point end: the moment the ball is dead (double bounce, ball out, into net, out of cage).Everything outside [t_start, t_end] intervals is between points (walking back,
picking up balls, discussing). Shots must lie inside a point — the labeler flags
violations with ⚠. These segments later train the rally/no-rally detector and gate
the score engine (Layer 4).
serve? ──yes──▶ (only player + outcome; rest auto-filled)
│no
side: forehand | backhand
volley? (ball taken before ANY bounce)
├─ yes ──▶ overhead?
│ ├─ yes ──▶ overhead_type: bandeja | vibora | smash | gancho | rulo | hybrid
│ └─ no ──▶ volley_type: block | drive | slice | drop
│ + direction: cross | middle | line
│ + depth: short | deep
└─ no ──▶ groundstroke_type: normal | lob | chiquita | dejada | bajada
+ spin (only for "normal"): flat_topspin | slice
+ after_glass: no | back | side | double
outcome: winner | error | in_play
Consistency rules the hierarchy enforces:
groundstroke_type. The export still sets
overhead: true for bajadas so downstream code has one flag.after_glass only exists for non-volleys (a volley by definition happens
before any bounce).Label from the CAMERA's point of view, referring to the target half: - left / middle / right = as seen on screen (the camera is fixed, so this is unambiguous; never mirror mentally into the hitter's perspective) - short = near the net of the target half, deep = near the back glass - Example: P4 (far right) plays a short cross volley → ball lands in the NEAR half, on the LEFT side of the image → label short_left.
Hitter-relative direction (cross / longline) is computed later in code from hitter identity + target half + side-switch events — never by the labeler.
Intercepted shots (opponent volleys the ball): placement = where the
flight ended, i.e. the court position at which the opponent contacted the
ball — NOT the hypothetical landing spot ("would have been deep"). Rationale:
the contact position is objective and visible in the video; a hypothetical
landing is a guess and produces label noise. The fact that a shot was
intercepted is NOT labeled — it is derivable: the next shot in the same point
has volley: true. The hypothetical landing point becomes a derived quantity
once ball tracking exists (trajectory extrapolation, Phase 3).
| Type | Definition | Cue |
|---|---|---|
| bandeja | Controlled slice overhead at shoulder height; goal is keeping net position, ball lands deep | sideways stance, contact next to body, no jump |
| vibora | Aggressive overhead with sidespin; unpredictable rebound off the glass | contact more in front, whipping arm, ball skids low |
| smash | Full-power finishing overhead; ideally exits the court | jump, contact above head, maximal speed |
| gancho | Hook-shaped overhead for lobs high over the shoulder when no other overhead is possible; often to fence/glass | hooking arm path, defensive-neutral |
| rulo | Around-the-head overhead with top/sidespin producing a sharp angle off the back wall | racket path around head |
| hybrid | Unclear between bandeja/vibora — use sparingly, better than guessing |
| Type | Definition | When |
|---|---|---|
| block | Minimal swing, firm wrist, opponent's pace does the work; redirect | under pressure, fast incoming ball |
| drive | Punch volley: short forward punch, flat contact, aimed deep (back third) | maintaining/building pressure |
| slice | Cut volley with underspin; keeps bounce low, hard to play off the glass | attacking, forcing weak lifts |
| drop | Drop volley (dejada de volea): soft hands, kills pace, lands short behind net | opponents pinned at the back |
| Type | Definition |
|---|---|
| normal | Standard groundstroke after the bounce (spin labeled separately) |
| lob | Globo — high defensive/neutralizing ball over the net players |
| chiquita | Short, low ball from defense onto the net players' feet |
| dejada | Drop shot: soft with backspin, dies just behind the net |
| bajada | Ball taken off the back glass (after bounce) and hit overhead with forward pressure |
hybrid.dejada
(groundstroke), out of the air = drop (volley_type).after_glass != no on a normal groundstroke,
not a separate type.outcome (needs careful definition first)