NAAP turns any phone into a fitness assessor for the Sports Authority of India's ten Battery Tests. Computer vision runs entirely on the device — offline, private, and honest by construction. No athlete video ever leaves the phone.
Every AI measurement travels the same path — and it never ends in a bare number. Two independent estimators must agree, or the app asks for a re-record.
The SAI Battery — height, weight, sit & reach, vertical jump, broad jump, medicine-ball throw, 30 m sprint, 4×10 m shuttle, sit-ups and the endurance run — is administered to millions of school children across India, most far from reliable connectivity, on the cheapest hardware available.
Manual measurement is slow, inconsistent between assessors, and hard to audit. Cloud video analysis is a non-starter: it needs bandwidth that isn't there, and it sends children's video to servers it shouldn't.
Distance and timing tests are scaled to real-world units by geometry, not guesswork; the rest are captured with an evidence photo and the assessor's reading. Nothing is a bare number — every result carries its method, confidence and evidence.
| # | Test | How NAAP measures it | Method |
|---|---|---|---|
| 1 | Height | Head-vertex to floor, scaled by a wall marker; reported as an interval — the crown & floor allowances are honest uncertainty | AI · CV |
| 2 | Weight | Scale reading via OCR, confirmed by the assessor, with a photo of the display | OCR + assessor |
| 3 | Sit & Reach | Assessor reading of the box scale, with an evidence photo | Assessor |
| 4 | Vertical Jump | Touch minus reach on the wall plane (homography), cross-checked by a ballistic parabola fit of the flight arc | AI · CV |
| 5 | Standing Broad Jump | Rearmost landing contact to the take-off line on the ground plane; a toe over the line is detected as a foul | AI · CV |
| 6 | Medicine Ball Throw | Landing-mark photo and assessor reading (AI tracking is experimental) | Assessor |
| 7 | 30 m Sprint | Start at first movement, finish at the line crossing on the ground plane; sub-frame interpolated timing | AI · CV |
| 8 | 4×10 m Shuttle | Assessor timing with bib-bound identity for multi-athlete capture | Assessor |
| 9 | Sit-Ups | Trunk-angle state machine over the pose track; fouls (incomplete rise, no return, hands unclasped) nullify a rep | AI · CV |
| 10 | Endurance Run | Auto start/finish detection with assessor lap confirmation | Auto + assessor |
A human-body pose model marks the athlete's joints on the phone. iOS uses Apple Vision today; the cross-platform path is ONNX Runtime with RTMPose. The measurement never learns which model produced the joints — it only sees the track.
Printed markers of known size, placed in the plane of the movement, let a planar homography convert pixels into real-world centimetres. Pure geometry — so 30 fps and 120 fps give the same answer.
Real grounds are noisy. So the pipeline cleans what it sees before it measures.
Low-confidence joints are dropped, single-frame keypoint “teleports” are removed with a Hampel filter, and short drop-outs are interpolated — while long gaps are left honestly absent so a bad capture is caught, not hidden. Subject selection picks the athlete under test out of a crowd rather than tracking a bystander.
A capture cannot be created for an athlete without a valid, current guardian consent — enforced by the database, not merely the UI. Consent, registration and every override are written to an append-only audit log.
Large touch targets, a maximum-contrast “sunlight” theme for a dim screen at noon, and Hindi + English throughout — the operator is a PE teacher managing thirty children on a dusty ground, not admiring a dashboard.
Clips are encrypted with AES-256-GCM under a per-device key in the platform keystore; the plaintext is deleted the instant it is encrypted. Files sync as ciphertext the server cannot decrypt.
The whole flow — register, consent, capture, measure, report — works in aeroplane mode. Sync drains automatically when a connection returns: results first, video last.
Runs on devices with no Google Play Services and no ML Kit. Every dependency is a permissive licence (Apache / MIT / BSD); disqualifying ones are banned in our own build rules.
A deliberately simple flow — a modern interface that stays legible outdoors. The session runner, on-device capture, and the result screen with its confidence and provenance.
Interface rendered from the application's own design system — WCAG-tested contrast, Hindi + English. बैटरी फ़िटनेस मूल्यांकन
A pnpm + Turborepo monorepo. Shared pure-TypeScript packages feed two apps and lockstep Kotlin + Swift native modules. The measurement mathematics is proven on synthetic pose tracks with seeded noise — accuracy verifiable in CI with no device.
Until calibration ships, the distance and height tests honestly ask the operator to add the markers rather than return an unverified number — the same discipline that runs through the whole system.
Two engineers building for the field, not the demo.