§ 00 — Overview
Why darts, and what we're building
Darts is a precision sport where the entire outcome depends
on a single, repeatable upper-limb motion. Unlike team
sports, there's no scene complexity — just one player, one
throw, one outcome. That makes it an unusually clean testbed
for
pose analysis, action quality assessment, and sports
coaching AI.
No public dataset exists for dart throw biomechanics at the
keypoint level. We're building one from scratch in 4 weeks,
with the infrastructure to support coaching model training
on top of it.
Phase 01
Dataset
Collection
Weeks 1–2
Camera rigs, filming sessions, per-throw metadata
logging. Targeting 5+ players across skill levels.
Phase 02
Pose
Extraction
Weeks 3–4
MediaPipe Pose on all footage. Extract 33 keypoints
per frame, detect release frame, compute kinematic
features.
Phase 03
Coaching
Model
Month 2–3
Train fault-detection classifier. Build
natural-language feedback layer via LLM. Deploy as
real-time assistant.
What we have already: Camera equipment,
programming skills, and access to players for filming. What
we need are collaborators with pose estimation experience,
sports biomechanics interest, or help recruiting more
players.
§ 01 — Week 1
Equipment setup & environment prep
Everything in week 1 is physical setup. The goal is to have
a reproducible, consistent filming environment ready before
a single player arrives.
Camera setup
-
Camera A — lateral view
Mount on rigid tripod, 2–3m from player,
shoulder height, exactly 90° to the throwing
line. This is your primary biomechanics
angle.
-
Camera B — frontal view
Position beside or just behind the board,
facing the player head-on. Captures body
sway, shoulder tilt, and head position.
-
Settings
Set both cameras to 1080p / 60 fps. Lock
focus and exposure manually — auto-adjust
mid-session breaks pose estimation. Turn off
any digital stabilisation.
-
Sync method
At the start of each session, clap hands
clearly in frame of both cameras
simultaneously. This gives you a sync
reference frame for alignment in post.
Environment & markers
-
Lighting
Set up a bright, diffuse LED panel (e.g.
Godox SL60 or Elgato Key Light). Aim for
even, shadow-free illumination on the
player. No windows behind the player —
backlighting destroys pose estimation.
-
Floor marking
Tape the regulation oche at exactly 2.37m
from the board. Also tape the exact tripod
foot positions — this ensures spatial
consistency across every session.
-
Body markers
Stick small neon-coloured adhesive dots on
each player's wrist, elbow, and fingertips
before filming. This dramatically improves
MediaPipe keypoint accuracy at the joints
that matter most.
-
Test recording
Do a full dry-run session before week 2.
Check: both cameras capture the full throw
arc, lighting is even, markers are visible,
sync clap is in frame.
Equipment shopping list
| Item |
Spec / model |
Notes |
| Cameras ×2 |
Sony ZV-E10 / GoPro Hero 12 / iPhone 14 Pro+
|
1080p @ 60fps minimum. iPhone Pro is genuinely
sufficient to start.
|
| Tripods ×2 |
Manfrotto 290 Xtra or equivalent |
Ball-head, centre column lock. Adjust height
80–170cm.
|
| LED lighting panel |
Godox SL60 / Elgato Key Light |
Bi-colour 5600K. Aim for flat, even coverage on
player.
|
| SD cards ×4 |
UHS-I V30 or better, 64GB each |
2 per camera. Swap between sessions; back up
same day.
|
| External hard drive |
Samsung T7 2TB USB-C |
~4 GB/hour at 1080p60. Budget 2TB for the full
month.
|
| Neon body markers |
Adhesive neon tape / stickers |
Apply to wrist, elbow, fingertips per player per
session.
|
| Floor tape |
Coloured gaffer tape |
Mark oche position + tripod feet. Do not move
between sessions.
|
Camera placement diagram
Bird's-eye view: player stands at oche (2.37m mark).
Camera A is directly to their right or left at 90°, 2–3m
away. Camera B is directly in front, just behind the
board line, at face height.
Common mistake to avoid
Do not film near windows or with mixed lighting colour
temperatures. Even a slight shadow across the throwing
arm will cause MediaPipe to lose the elbow keypoint
intermittently.
§ 02 — Week 2
First filming sessions
Week 2 is about collecting your first 150+ throws. Aim for 3
players minimum, different skill levels. The metadata you
record here is just as important as the video.
Session structure (per player)
-
Warm-up (10 throws, unlabeled)
Let the player throw freely to warm up. Do
not record metadata for these — they are not
part of the dataset.
-
Recording batches (5 × 10
throws)
Record 50 throws in batches of 10. After
each batch, pause, note the scores, and give
the player a 5-minute rest. This prevents
fatigue-confounded data.
-
Target instruction
Tell the player which segment to aim for at
the start of each batch (e.g. "aim for
triple 20 for this set"). Log the target in
your spreadsheet.
-
Log immediately
Record each throw's outcome in a spreadsheet
row in real time — not from memory after the
session. Use the throw ID format:
P01-S01-T001 (player-session-throw).
What to log per throw
-
throw_id
Format: P[player]-S[session]-T[throw
number]. e.g. P02-S01-T034
-
target_segment
What the player was aiming at. e.g. "T20",
"D16", "Bull"
-
scored_segment + score_value
What they actually hit and the numeric score
(0–60).
-
Player metadata
Player ID, self-rated skill level (1–5),
dart weight in grams, grip style (pencil /
barrel / front).
-
Session context
Session number, batch number, any fatigue
notes (e.g. "complained of tired arm after
batch 4").
Skill level recruitment target
Beginner (level 1–2)Never played
seriously or plays casually. Inconsistent stance and
release. High variance throws. Essential for the
fault-detection training set.
Intermediate (level 3)Club player or
regular pub darter. Has a consistent stance but
identifiable mechanical habits. Most accessible to
recruit.
Advanced (level 4–5)Competitive league
or semi-pro player. Very consistent mechanics — provides
the "correct form" baseline for comparison. Worth the
extra effort to recruit.
Aim for diversityDifferent grip styles,
arm lengths, throwing stances (angled vs. square-on).
Diversity in the dataset makes downstream models more
robust.
§ 03 — Week 3
Pose extraction + more filming
While week 2 footage processes overnight, you continue
filming 2 more players in week 3. Pose extraction runs in
the background.
Pose extraction pipeline
-
Run MediaPipe Pose on all week 2
video
Python script processes each throw clip and
outputs a CSV: one row per frame, 33
landmarks × (x, y, z, visibility) = 133
columns per row. Can batch-process
overnight.
-
Release frame detection
Write a simple peak-detection function on
wrist velocity (computed from wrist landmark
position over time). The release frame is
the first local maximum in wrist velocity
during the throw.
-
Extract kinematic features at release
frame
Elbow angle = angle between shoulder, elbow,
and wrist landmarks. Wrist velocity =
Euclidean distance of wrist landmark between
release frame and previous frame.
Follow-through = number of frames until
wrist landmark decelerates below threshold.
-
Quality check
Visually inspect 20 random throws. Flag any
throw where >30% of frames have landmark
visibility below 0.5 for the elbow or wrist.
Mark flagged throws as excluded.
Continue filming
-
Add 2 new players
Target different grip styles from week 2
players. Ideally one left-handed player if
possible — adds valuable variation.
-
Same session protocol
10 warm-up, 5 × 10 batches, 5-min rest
between each. Log metadata in real time.
-
Marker check before each
session
Confirm neon markers are fresh and
well-adhered. Replace any that have faded or
peeled.
-
Camera position re-verification
Use the tape marks from week 1 to confirm
tripods are in identical positions. Even a
10cm shift changes the geometry.
Python stack for extraction
# dependencies
pip install mediapipe opencv-python
pandas numpy scipy
# core extraction loop (pseudocode)
import mediapipe
as mp
import cv2, pandas
as pd pose = mp.solutions.pose.Pose(
model_complexity=2,
# highest accuracy
min_detection_confidence=0.7,
min_tracking_confidence=0.7
)
for throw_clip
in throw_videos: cap =
cv2.VideoCapture(throw_clip) rows = []
while cap.isOpened(): ret, frame =
cap.read() result = pose.process(cv2.cvtColor(frame,
cv2.COLOR_BGR2RGB))
if result.pose_landmarks: row =
{f"lm_{i}_{ax}": getattr(lm, ax)
for i, lm
in
enumerate(result.pose_landmarks.landmark)
for ax
in ["x","y","z","visibility"]} rows.append(row) pd.DataFrame(rows).to_csv(f"keypoints/{throw_clip}.csv")
§ 04 — Week 4
Dataset finalization & write-up
Dataset assembly
-
Merge pose CSVs with metadata
spreadsheet
Join on throw_id. Each throw row gets: all
per-throw metadata columns + computed
kinematic features + path to keypoints CSV
and video clips.
-
Quality filter
Remove throws with >30% occluded keypoints,
failed release frame detection, or camera
desync artifacts. Document the exclusion
reason for each removed throw.
-
Derived feature computation
Compute for every included throw:
elbow_angle_deg, wrist_vel_px_s,
followthrough_frames, body_sway_px. These
become the baseline feature vector.
-
Cross-validate annotation
Have a second person spot-check 30 random
throws against the video to verify score
labels and target segment annotations are
correct.
Analysis + write-up
-
Baseline correlation analysis
Plot elbow angle vs. accuracy, wrist
velocity vs. accuracy, grouped by skill
level. This becomes the core "dataset
analysis" section of any paper.
-
Throw repeatability metric
Compute standard deviation of
elbow_angle_deg and body_sway_px per player.
Repeatability σ often correlates more
strongly with skill than any single-throw
metric.
-
Start paper outline
Introduction → Related work → Dataset
construction → Annotation schema → Baseline
analysis → Limitations → Conclusion. One
paragraph per section as a skeleton.
-
GitHub repo setup
Push extraction code, feature computation
scripts, and analysis notebooks. This is
required for any dataset publication.
§ 05 — Full pipeline
End-to-end data flow
This is how a raw throw becomes a training sample — from
filming through to coaching model input.
🎥
Film
2-view 60fps
🗂
Log metadata
spreadsheet
🦴
MediaPipe
33 keypoints/frame
📍
Release frame
wrist vel peak
📐
Features
elbow, vel, sway
🤖
Model
fault classifier
💬
Coaching cue
LLM feedback
Annotation schema
# DartMotion-300 — per-throw CSV schema
# Identifiers
throw_id str
# e.g. "P02-S03-T047"
player_id str
# anonymised, e.g. "P02"
skill_level
int
# 1–5 self-rated
session_num
int
# index for that player
dart_weight_g
float
# e.g. 21.0, 23.0, 26.0
grip_style str
# "pencil" | "barrel" | "front"
# Outcome labels
target_segment
str
# e.g. "T20", "D16", "Bull"
scored_segment
str
# actual landing region
score_value
int # 0–60
hit_target
bool
# True if scored == target
# Kinematic features (computed from keypoints)
elbow_angle_deg
float
# at release frame
wrist_vel_px_s
float
# peak wrist velocity
followthrough_fr
int
# frames after release
body_sway_px
float
# lateral hip displacement
throw_sigma
float
# repeatability (per-player σ)
# File references
video_lateral
str
# path to side-view clip
video_frontal
str
# path to frontal clip
keypoints_csv
str
# path to MediaPipe output
release_frame
int
# frame index of dart release
qc_passed bool
# False if excluded from final set
§ 06 — Publishing
How to release and publish this dataset
The target venue is
ACCV 2026 under
the Datasets and Performance Analysis track — a
natural fit since this is the first dart throw biomechanics
dataset at keypoint level. Submission deadline: check the
ACCV 2026 site for exact date.
01
Consent forms — do this in week 1
Every player must sign a written consent form
covering: use of their footage for research,
publication of anonymized keypoint data, and use of
short video clips in the paper. If your institution
requires IRB / ethics board approval for human
subjects research, submit the application in week 1
— it can take 2–4 weeks to clear.
02
Choose a license
Use
CC BY 4.0
for the keypoint CSVs and metadata — maximum
research usability, attribution only. For video
clips use
CC BY-NC 4.0
(non-commercial) given privacy considerations.
Document both in a LICENSE.txt at the dataset root.
03
Host on Zenodo + GitHub
Upload the CSV data and metadata to
Zenodo
(free, DOI-minted, 50GB limit — sufficient for
CSVs). Host video files separately on Google Drive
or an institutional server. Push all code to GitHub,
then archive a GitHub release to Zenodo to get a
citable DOI for the codebase too.
zenodo.org
github.com
Google Drive (video)
04
Write a dataset datasheet
ACCV increasingly expects a Gebru et al.-style
datasheet covering: motivation, composition,
collection process, preprocessing pipeline, intended
uses, distribution terms, and maintenance plan. This
doubles as the README on Zenodo and supplementary
material for the submission.
05
Release code alongside data
Publish the MediaPipe extraction pipeline, feature
computation scripts, and baseline analysis notebooks
on GitHub. Link the repo in the paper. Strong
reproducibility significantly improves review scores
for dataset papers.
06
Post to arXiv after submission
Once submitted to ACCV, immediately post to arXiv
under cs.CV. Add the arXiv link to the Zenodo
record. This creates a bidirectional citation chain
and boosts discoverability before conference
proceedings are published.
§ 07 — Join the project
Looking for collaborators
The project is self-funded and camera-equipped. What it
needs is people. Time commitment is fully flexible — even
occasional input on annotation design or model architecture
is valuable.
Pose / CV engineer
MediaPipe, OpenPose, or similar. Help refine the
extraction pipeline, release frame detection, and
feature computation scripts.
5–10 hrs/week · weeks 3–4
Biomechanics advisor
Knowledge of upper-limb throw mechanics, joint angle
analysis, or sports science background. Help
validate which features actually matter.
Flexible · advisory role
Player recruiter
Know any regular darts players? We need 5+ players
across skill levels in the Takasaki / Gunma area.
Even one introduction helps.
One-off · any week
ML / coaching model
Interested in action quality assessment or
fault-detection classifiers? Phase 2 (months 2–3)
needs this. Strong paper contribution angle.
Month 2–3 · flexible
Paper writing
Help with the dataset paper for ACCV 2026. Sections:
related work, baseline analysis, dataset datasheet.
Co-authorship credited.
Week 4 onward
Open role
Interested but don't fit the above? Bring your own
angle. This is early-stage enough that the right
person shapes the direction.
DM to discuss
Interested?
Drop a reply in the thread or DM me directly. Happy to share
the full technical plan, discuss authorship structure, or
just answer questions. The filming starts week 1 — the
sooner you're in, the more you shape the dataset design.