Exercises Dataset:一个可直接用于健身应用开发的 1324 条运动数据库
如果你正在开发健身 App、训练计划工具、运动教学网站,或者想做一个基于运动数据的推荐系统,那么大概率都会遇到同一个问题:运动数据从哪里来?
hasaneyldrm/exercises-dataset 就是一个为此准备的开源数据项目。它提供了一个结构化的健身运动数据集,包含 1,324 个健身动作,每个动作都带有分类、器械、目标肌群、辅助肌群、教学说明、缩略图和动画 GIF。
更重要的是,它的数据结构已经整理得比较工程化,可以直接作为健身类应用的基础数据层使用。
一、项目简介
项目地址:
https://github.com/hasaneyldrm/exercises-dataset
项目定位:
这是一个面向开发者、研究者、健身产品原型和教育场景的健身动作数据集。项目描述中提到,它是 LogPress 应用的运动数据层。
截至本文写作时,仓库的主要数据为:
它的核心价值在于:你不需要先爬取、清洗、翻译、整理运动数据,可以直接从一个已经结构化的 JSON 数据文件开始。
二、这个项目包含什么
仓库结构大致如下:
exercises-dataset/
├── data/
│ ├── exercises.json
│ └── exercises.schema.json
├── images/
├── videos/
├── index.html
├── setup.html
├── LICENSE
├── NOTICE.md
└── README.md1. data/exercises.json
这是项目最核心的文件,是一个 JSON 数组,包含 1,324 条运动记录。
每条记录包含:
动作 ID
动作名称
身体部位分类
主要目标肌群
辅助肌群
所需器械
10 种语言的教学说明
分步骤教学说明
缩略图路径
动画 GIF 路径
媒体版权署名
创建时间
例如一条记录中会有类似这样的字段:
{
"id": "0001",
"name": "3/4 sit-up",
"category": "waist",
"body_part": "waist",
"equipment": "body weight",
"instructions": {
"en": "...",
"zh": "..."
},
"instruction_steps": {
"en": ["...", "..."],
"zh": ["...", "..."]
},
"muscle_group": "hip flexors",
"secondary_muscles": ["hip flexors", "lower back"],
"target": "abs",
"image": "images/0001-2gPfomN.jpg",
"gif_url": "videos/0001-2gPfomN.gif",
"attribution": "© Gym visual — https://gymvisual.com/"
}2. data/exercises.schema.json
这是一个 JSON Schema 文件,用来描述 exercises.json 的数据结构。
它的作用是:
校验数据格式是否正确
帮助你理解每个字段的类型和含义
在自己扩展数据时保持结构一致
在后端或前端生成类型定义时提供参考
对于正式项目来说,这一点很有价值。因为一个数据集如果只有数据而没有 schema,后续维护和二次开发都容易出问题。
3. images/ 和 videos/
每个动作都有对应的媒体资源:
images/:180×180 缩略图videos/:180×180 动画 GIF
这些媒体资源并不是 MIT 许可,而是来自 Gym visual,并且有单独的授权条款。后面许可证部分会详细说明。
4. index.html
index.html 是一个完全在浏览器中运行的运动数据浏览器。
它支持:
全量动作搜索
按身体部位筛选
按器械筛选
按目标肌群筛选
无限滚动列表
查看动作详情
查看多语言教学说明
它不需要启动后端服务,直接用浏览器打开即可。
5. setup.html
setup.html 是一个开发者集成向导。
它主要提供:
多数据库建表 SQL
1,324 条数据的 INSERT 语句生成
多语言后端 API 调用示例
不同技术栈的集成代码示例
可用于让 LLM 生成后端服务的结构化提示词
支持的数据库包括:
SQL Server
PostgreSQL
MySQL
SQLite
对于想快速把数据导入数据库的人来说,这个页面很实用。
三、数据规模与分布
根据项目 README 中的统计,数据覆盖了多个身体部位和器械类型。
按身体部位分布
按器械分布
其中比较值得关注的是:有 325 个徒手动作。
这意味着它不仅适合商业健身房应用,也适合家庭训练、无器械训练、HIIT 类产品或轻量级训练工具。
四、支持 10 种语言
每条运动记录都提供多语言教学说明。
支持的语言包括:
英语
en西班牙语
es意大利语
it土耳其语
tr俄语
ru中文
zh印地语
hi波兰语
pl韩语
ko法语
fr
而且说明有两种形式:
instructions这是完整的一段教学说明。
instruction_steps这是拆分后的分步骤说明,例如:
{
"instruction_steps": {
"zh": [
"平躺在地面,双腿弯曲。",
"双手放在头部两侧。",
"收紧腹部,抬起上身。",
"缓慢回到起始位置。"
]
}
}对于前端展示来说,instruction_steps 通常比长段落更适合做步骤列表、卡片式教学或语音播报。
五、如何获取项目
方式一:完整克隆
git clone https://github.com/hasaneyldrm/exercises-dataset.git
cd exercises-dataset注意:仓库中包含 1,324 张图片和 1,324 个 GIF,整体体积较大。如果你只是想使用 JSON 数据,完整克隆可能没有必要。
方式二:只下载 JSON 数据文件
可以直接下载:
https://raw.githubusercontent.com/hasaneyldrm/exercises-dataset/main/data/exercises.json命令示例:
curl -L -o exercises.json \
https://raw.githubusercontent.com/hasaneyldrm/exercises-dataset/main/data/exercises.json这种方式适合:
数据分析
本地原型
后端导入脚本
机器学习实验
方式三:使用 Git 稀疏检出
如果你只需要 data/ 目录,可以使用 Git sparse-checkout:
git clone --filter=blob:none --sparse \
https://github.com/hasaneyldrm/exercises-dataset.git
cd exercises-dataset
git sparse-checkout set data README.md LICENSE NOTICE.md这样可以避免下载全部图片和 GIF。
六、Python 使用示例
1. 读取数据
import json
with open("data/exercises.json", "r", encoding="utf-8") as f:
exercises = json.load(f)
print(f"Total exercises: {len(exercises)}")输出:
Total exercises: 13242. 按身体部位筛选
chest_exercises = [
exercise for exercise in exercises
if exercise["category"] == "chest"
]
print(f"Chest exercises: {len(chest_exercises)}")输出:
Chest exercises: 1633. 按器械筛选
bodyweight_exercises = [
exercise for exercise in exercises
if exercise["equipment"] == "body weight"
]
print(f"Bodyweight exercises: {len(bodyweight_exercises)}")输出:
Bodyweight exercises: 3254. 获取中文教学步骤
exercise = exercises[0]
for index, step in enumerate(exercise["instruction_steps"]["zh"], start=1):
print(f"{index}. {step}")5. 使用 Pandas 分析
import json
import pandas as pd
with open("data/exercises.json", "r", encoding="utf-8") as f:
data = json.load(f)
df = pd.DataFrame(data)
print(df["category"].value_counts())
print(df["equipment"].value_counts())如果你想查看某个器械下的动作:
barbell_upper_legs = df[
(df["equipment"] == "barbell") &
(df["category"] == "upper legs")
]
print(barbell_upper_legs[["name", "target", "equipment"]])七、Node.js 使用示例
在 Node.js 中可以直接 require JSON 文件:
const exercises = require("./data/exercises.json");
console.log(`Total exercises: ${exercises.length}`);
const bodyweight = exercises.filter(
exercise => exercise.equipment === "body weight"
);
console.log(`Bodyweight exercises: ${bodyweight.length}`);按分类分组:
const byCategory = exercises.reduce((accumulator, exercise) => {
if (!accumulator[exercise.category]) {
accumulator[exercise.category] = [];
}
accumulator[exercise.category].push(exercise);
return accumulator;
}, {});
console.log(Object.keys(byCategory));获取中文说明:
const exercise = exercises[0];
console.log(exercise.instructions.zh);
console.log(exercise.instruction_steps.zh);八、TypeScript 类型定义
在正式项目中,建议先定义类型:
type LanguageCode =
| "en"
| "es"
| "it"
| "tr"
| "ru"
| "zh"
| "hi"
| "pl"
| "ko"
| "fr";
type LanguageText = Record<LanguageCode, string>;
type LanguageSteps = Record<LanguageCode, string[]>;
interface Exercise {
id: string;
name: string;
category: string;
body_part: string;
equipment: string;
instructions: LanguageText;
instruction_steps: LanguageSteps;
muscle_group: string;
secondary_muscles: string[];
target: string;
media_id: string;
image: string;
gif_url: string;
attribution: string;
created_at: string;
}然后即可安全使用:
import exercises from "./data/exercises.json";
const data = exercises as Exercise[];
const chestExercises = data.filter(
exercise => exercise.category === "chest"
);
console.log(chestExercises.length);如果 TypeScript 提示无法解析 JSON,需要在 tsconfig.json 中开启:
{
"compilerOptions": {
"resolveJsonModule": true
}
}九、如何校验数据
项目提供了 JSON Schema,可以用 jsonschema 校验数据。
安装:
pip install jsonschema示例:
import json
from jsonschema import validate
with open("data/exercises.json", "r", encoding="utf-8") as f:
exercises = json.load(f)
with open("data/exercises.schema.json", "r", encoding="utf-8") as f:
schema = json.load(f)
validate(instance=exercises, schema=schema)
print("Dataset is valid.")这在以下场景很有用:
你修改了原始数据
你想向数据集中新增动作
你要把数据导入数据库前做检查
你在 CI 中维护一个自己的扩展数据集
十、如何导入数据库
项目自带的 setup.html 提供了数据库导入向导。
打开方式:
setup.html直接用浏览器打开即可,不需要启动服务。
它支持生成:
SQL Server 建表语句
PostgreSQL 建表语句
MySQL 建表语句
SQLite 建表语句
同时可以生成包含 1,324 条记录的 INSERT 语句。
一个推荐的导入思路是:
使用
setup.html生成目标数据库的 SQL在本地数据库中执行建表语句
导入数据
检查
id、name、category、equipment是否正确将
image和gif_url保留为路径字段在应用层根据域名或 CDN 地址拼接完整 URL
不建议把图片或 GIF 转成 Base64 存进数据库。更合理的做法是:
数据库保存相对路径
文件保存在对象存储或静态目录
前端根据环境变量拼接完整地址例如:
数据库:
images/0001-2gPfomN.jpg
生产环境:
https://cdn.example.com/images/0001-2gPfomN.jpg十一、适合的使用场景
1. 健身 App
这是最直接的场景。
可以用它构建:
动作库
训练计划生成器
训练详情页
动作搜索
肌肉部位筛选
器械筛选
多语言动作教学
2. 个人训练助手
如果你在做个人项目,可以基于这个数据集快速实现:
今日训练推荐
按身体部位选动作
按器械选动作
徒手训练计划
训练记录
3. 教练或健身内容网站
可以用它做一个运动教学站:
按肌群浏览动作
查看动画演示
阅读分步骤说明
按器械组合训练内容
4. 原型和课程设计
对前端、后端、全栈学习者来说,这也是一个很好的数据源:
前端可以练筛选、搜索、分页、虚拟列表
后端可以练数据库设计、API、缓存
数据分析可以练 Pandas
AI 应用可以练 RAG 或推荐系统
5. 研究与实验
可以用于:
运动推荐实验
健身文本分类
多语言文本处理
运动知识图谱构建
健身问答系统原型
十二、许可证与使用限制
这一点非常重要。
这个项目不是所有内容都在同一个 MIT 许可下。
1. 代码和数据结构:MIT
以下内容使用 MIT License:
代码
工具
数据结构
教学文本
翻译内容
2. 图片和 GIF:Gym visual 版权
images/ 和 videos/ 中的媒体资源属于 Gym visual。
许可证要求:
媒体资源必须保留署名:
© Gym visual — https://gymvisual.com/只能以 180×180 分辨率使用
重新使用受 Gym visual 条款约束
克隆这个仓库并不代表你自动获得媒体的完整商用权利
如果要扩大使用范围,应自行向 Gym visual 获取授权
3. 实际建议
如果你的项目只是个人学习、研究或原型,可以按照项目要求保留署名。
如果你的项目准备商用,建议:
单独评估 Gym visual 的媒体授权条款
不要直接把 GIF 当作可自由商用的素材
保留
attribution字段必要时联系 Gym visual 获取正式授权
或者只使用 MIT 覆盖的数据部分,替换媒体资源
总结一句:
数据结构和文本可以按 MIT 使用,但图片和 GIF 需要额外注意版权。
十三、优点与不足
优点
数据量大,包含 1,324 个动作
结构清晰,字段完整
提供 JSON Schema
提供 10 种语言说明
提供分步骤教学说明
提供浏览器和数据库导入工具
覆盖常见身体部位和器械
徒手动作数量较多
适合快速开发健身类原型
不足
媒体资源版权有额外限制
仓库体积较大
GIF 性能不如现代视频格式
180×180 分辨率对高精度展示可能偏低
运动安全性和医疗适用性仍需人工审核
不建议直接作为专业医学或康复建议来源
十四、推荐的项目集成方式
如果你要把它用在一个正式项目中,推荐这样设计:
1. 不要直接暴露 JSON 文件
小型原型可以直接读 JSON,但正式项目建议导入数据库。
好处是:
支持索引
支持搜索
支持后台管理
支持后续扩展字段
支持权限控制
2. 建议的数据表结构
可以按原始字段设计:
exercises
├── id
├── name
├── category
├── body_part
├── equipment
├── muscle_group
├── target
├── secondary_muscles
├── image_path
├── gif_path
├── attribution
└── created_at多语言说明可以另建表:
exercise_translations
├── exercise_id
├── language
├── instructions
└── instruction_steps这样后续增加语言时更灵活。
3. 媒体文件放在 CDN 或对象存储
不要把 1,324 个 GIF 放在应用服务器本地目录。
更好的方案是:
静态资源服务器
CDN
S3 / OSS / COS / R2 等对象存储
数据库中只保存相对路径。
4. 提供搜索和筛选 API
例如:
GET /api/exercises
GET /api/exercises?category=chest
GET /api/exercises?equipment=body-weight
GET /api/exercises?search=bench
GET /api/exercises/:id5. 做好安全提示
健身动作存在个体差异。建议在页面中加入免责声明,例如:
本内容仅用于运动参考,不构成医疗建议。如有伤病或特殊健康状况,请先咨询专业医生或教练。十五、总结
exercises-dataset 是一个完成度很高的健身动作数据集。
它最大的价值不是“有很多图片”,而是提供了一个已经整理好的运动数据结构:
动作名称
身体部位
目标肌群
辅助肌群
所需器械
多语言说明
分步骤说明
媒体路径
版权署名对于开发者来说,它可以大幅缩短健身类项目从 0 到 1 的时间。你可以直接用它完成动作库、搜索筛选、训练计划、教学页面和数据分析原型。
但在实际使用时,一定要分清两部分版权:
数据与文本:MIT
图片与 GIF:Gym visual 单独条款如果你的项目准备公开上线或商用,建议优先使用数据和文本结构,并为媒体资源单独确认授权。