Skip to content
DENGYUFAN0Public

About

On-device balance & strength coach for older adults — camera-quantified 30s Chair Stand, zero video upload

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

稳行 steady

稳行 steady

银发防跌倒 / 健身 AI 教练 · On-device balance & strength coach for older adults

端侧姿态估计,实时指导循证的平衡与力量训练,并把国际通用的功能自测(首发:30 秒起坐测试)变成可追踪的数字。 画面只在本机处理,绝不上传。

CI license MIT on-device PWA offline

在线体验 Demo · English


⚠️ 边界声明(先读这个)

稳行是健身与自我测试工具(consumer wellness),不是医疗器械。 它不诊断疾病、不判定"跌倒风险等级"、不提供治疗建议。所有结果仅供日常参考与自我比较; 如有不适或疑虑,请咨询医生或康复师。运动时请始终在身边有可扶稳的椅子或台面的环境下进行。


这是什么

打开摄像头,稳行在你的设备上实时识别 33 个人体关键点,然后:

  • 🪑 测一测 · 30 秒起坐(30CST):自动计数完整的"坐→站→坐",对照 Rikli & Jones 同龄常模给出"高于 / 在 / 低于常见范围",并保存趋势。协议细节也复刻了:双臂抱胸提示、迟滞防抖计数、"结束时过半即记一次"规则。
  • ⚖️ 测一测 · 站立平衡:四种站姿(并拢 / 半串联 / 串联 / 单腿扶稳),量化重心摆动(路径长 / 95% 置信椭圆面积 / 摆动指数)或单腿维持秒数——只与你自己的过去比较,不下临床结论。
  • 💪 练一练 · Otago 子集 + 太极起势:坐站、提踵、扶椅半蹲、侧向抬腿、单腿站、脚跟脚尖走。每个动作有目标关节角的纠错规则("站直一点""慢一点")、语音 + 大字幕双通道反馈、按完成训练次数渐进解锁的安全分级。
  • 📈 看进展:手绘 SVG 趋势图(含同龄常模带)、连续天数、CSV 导出、打印/PDF 报告(可带给医生)。

适老化 UX:正文 ≥22px(可再放大两档)、超大点击区、一屏一件事、语音引导 + 大字幕、运动前 PAR-Q 式就绪自查、镜头摆放引导("我能看到你了!")。

循证依据(为什么这是"真健康"而不是玄学)

主张 来源
跌倒是 65+ 老年人的重大健康威胁,每年约 28–35% 发生跌倒 WHO Falls Fact Sheet
以平衡 + 功能性训练为主的运动可使老年人跌倒率约降 23% Sherrington et al., 2019, Cochrane Review CD012424
训练动作取自经过 RCT 验证的方案 Otago Exercise Programme (Campbell & Robertson); 太极 (Li et al.)
30 秒起坐测试协议与同龄常模(60–94 岁,按性别) Rikli & Jones, Senior Fitness Test, 1999/2013
起立行走测试(TUG,路线图 M4) Podsiadlo & Richardson, 1991

原则:只复刻已验证的量表与方案,不自创"跌倒风险分"。 常模为美国社区老年人数据,跨人群参考时仅作区间提示,文案永远不输出诊断式结论。

隐私(可验证,而非口号)

  • 视频帧只在内存中经过姿态模型,任何画面都不落盘、不上传;存进 IndexedDB 的只有次数、秒数、角度等数字。
  • 姿态运行时与模型已 vendor 进仓库(vendor/ + assets/models/)——应用可在完全断网下安装运行,零外部网络请求。
  • 验证方法:打开浏览器开发者工具 Network 面板做一次完整测试,或直接断网使用。

快速开始

Windows:双击文件夹里的 启动稳行.bat,浏览器会自动打开(需装 Node.js)。

# 其他平台 / 命令行(零依赖小服务器,自动开浏览器)
node tools/serve.js
# 或任何静态服务器:npx http-server -p 8080 -c-1 .
# 没有摄像头?体验回放演示:加 ?demo=1

注意:不能直接双击 index.html(file://)打开——浏览器对本地文件的安全限制会拦截模块加载与摄像头;页面会显示同样的提示。摄像头需要 localhost 或 HTTPS。

平板/电视上:浏览器菜单 → "添加到主屏幕",即可像 App 一样全屏离线使用(PWA)。

架构

摄像头帧 ──▶ Pose Landmarker (33 点, WASM/GPU, 全端侧)
              │ assets/pose.js
              ▼
        特征层 extractFeatures()             ← 纯函数
        关节角 / 髋高 / 躯干倾角 / 时序        assets/assess.js
              │
   ┌──────────┴──────────┐
   ▼                     ▼
评估引擎(状态机)        训练引擎(动作库+纠错规则)
30CST·平衡·单腿计时      Otago 子集 form rules
assets/assess.js        assets/exercises.js
   │                     │
   └────────┬────────────┘
            ▼
语音+大字幕 (coach.js) · IndexedDB 仅存派生指标 (store.js) · 趋势/报告 (ui.js/app.js)

30CST 计数为什么可信

  • 双信号门控:膝角 ≥160° 且 髋部上升 ≥ 0.45×坐姿大腿长才算站起(防"半蹲计数");单信号被遮挡时自动降级到另一信号。
  • 迟滞 + 驻留:进入/退出双阈值(160°/110°),状态需持续 250ms 才提交(防阈值附近抖动重复计数)。
  • 协议细节:结束瞬间"已过半程"(膝角 ≥135°)记一次,与 Rikli & Jones 原始协议一致;从站姿开始会被标记提示。
  • 躯干安全监测:自然起身本来就有 30–45° 前倾,所以警告阈值设在 55°——不会每次起身都误报。
  • 全部由"录制关键点夹具"锁定:合成的干净序列(10 次整 + 终场半起)与刁钻序列(半蹲、阈值抖动、1.2s 遮挡、过度前倾)以 JSON 形式提交在仓库里,node --test 断言精确计数。改动算法跑不过测试就合不进来。

测试

node --test            # 44 个测试:几何/特征/状态机/夹具集成/常模/动作库/i18n 键齐全性
node tools/gen-fixtures.js   # 重新生成关键点夹具(确定性,含种子噪声)
node tools/vendor.mjs        # 重新下载端侧运行时+模型(npmmirror/GCS/HF 多级回退)

已知限制(诚实清单)

  • 姿态精度受侧光、强遮挡、过于宽松衣物影响——镜头引导与置信度门限可缓解,无法消除;画面不稳的测试会被标记"仅供参考,建议重测"。
  • 计数验收目标为 ±1 次(对真实视频);合成夹具内为精确断言。真人多机位实测仍在路线图上(见 M 里程碑)。
  • 常模来自美国人群;中文人群常模发表数据有限,结果文案已按"常见范围"弱化表述。
  • TUG 起立行走需要距离标定,按路线图放在 M4,当前版本不提供。

路线图

  • ✅ M0 摄像头+姿态管线+镜头引导 · M1 30CST · M2 训练引擎(Otago 子集) · M3 站立平衡
  • ⏳ M4 TUG(半定量计时)、韩语、报告打磨 · M5 开源内核稳定接口(供机构端仪表盘对接)

开源(MIT)= 单用户端侧 App + 评估引擎 + 动作库 schema;机构端多用户管理/队列分析为独立闭源层,经稳定接口对接,互不混淆。


steady (English)

On-device fall-prevention & fitness AI coach for older adults. Webcam → 33-point pose estimation (all on-device) → real-time coaching for evidence-based balance/strength exercises, plus camera-quantified standard functional self-tests, starting with the 30-Second Chair Stand (30CST). Video never leaves the device.

Boundary: steady is a consumer wellness tool, not a medical device — it does not diagnose, treat, or classify fall risk. Results are for self-reference; talk to your doctor when in doubt, and always exercise with sturdy support within reach.

Evidence base: falls affect ~28–35% of adults 65+ yearly (WHO); balance-and-function focused exercise reduces fall rate by ~23% (Sherrington 2019, Cochrane CD012424); exercises follow the Otago Exercise Programme and tai chi; assessments replicate published instruments — Rikli & Jones' 30s Chair Stand with age/sex normative ranges (1999/2013), TUG (Podsiadlo & Richardson 1991) on the roadmap. steady invents no scores and ships no diagnosis.

Why the rep counting is trustworthy: dual-signal gating (knee extension ≥160° AND hip rise ≥0.45× seated thigh length), enter/exit hysteresis with a 250ms dwell, the official "more-than-halfway-at-the-buzzer counts" rule, and a 55° trunk-lean warning threshold (natural sit-to-stand flexes the trunk 30–45°, so anything lower would false-alarm every rep). The whole pipeline is pinned by recorded-keypoint JSON fixtures asserted exactly under node --test (clean 10-rep sequence, half-stands that must not count, threshold bounce, occlusion dropout, excessive-lean burst).

Privacy, verifiable: the pose runtime and model are vendored into the repo, so the app makes zero external network requests — verify with DevTools or by going offline. Only derived numbers (counts, seconds, angles) are stored, locally, in IndexedDB.

Quick start: npx http-server -p 8080 -c-1 . → http://localhost:8080 (camera needs localhost/HTTPS) · no camera? try the replay demo at /?demo=1 · install as a PWA for offline use. Tests: node --test.

License: MIT © 2026 DENG YUFAN


稳行 steady 不能替代医生。如出现胸痛、头晕、明显气短,请立即停止并就医。

About

On-device balance & strength coach for older adults — camera-quantified 30s Chair Stand, zero video upload

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages