深林照梦 深林照梦

Exercises Dataset:一个可直接用于健身应用开发的 1324 条运动数据库

如果你正在开发健身 App、训练计划工具、运动教学网站,或者想做一个基于运动数据的推荐系统,那么大概率都会遇到同一个问题:运动数据从哪里来?

hasaneyldrm/exercises-dataset 就是一个为此准备的开源数据项目。它提供了一个结构化的健身运动数据集,包含 1,324 个健身动作,每个动作都带有分类、器械、目标肌群、辅助肌群、教学说明、缩略图和动画 GIF。

更重要的是,它的数据结构已经整理得比较工程化,可以直接作为健身类应用的基础数据层使用。


一、项目简介

项目地址:

https://github.com/hasaneyldrm/exercises-dataset

项目定位:

这是一个面向开发者、研究者、健身产品原型和教育场景的健身动作数据集。项目描述中提到,它是 LogPress 应用的运动数据层。

截至本文写作时,仓库的主要数据为:

项目

数据

运动数量

1,324

教学语言

10 种

动画 GIF

1,324

缩略图

1,324

主要数据文件

data/exercises.json

数据校验文件

data/exercises.schema.json

开发者工具

index.htmlsetup.html

它的核心价值在于:你不需要先爬取、清洗、翻译、整理运动数据,可以直接从一个已经结构化的 JSON 数据文件开始。


二、这个项目包含什么

仓库结构大致如下:

exercises-dataset/
├── data/
│   ├── exercises.json
│   └── exercises.schema.json
├── images/
├── videos/
├── index.html
├── setup.html
├── LICENSE
├── NOTICE.md
└── README.md

1. 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 中的统计,数据覆盖了多个身体部位和器械类型。

按身体部位分布

身体部位

数量

Upper Arms

292

Upper Legs

227

Back

203

Waist

169

Chest

163

Shoulders

143

Lower Legs

59

Lower Arms

37

Cardio

29

Neck

2

按器械分布

器械

数量

Body Weight

325

Dumbbell

294

Cable

157

Barbell

154

Leverage Machine

81

Band

54

Smith Machine

48

Kettlebell

41

Weighted

36

Stability Ball

28

EZ Barbell

23

Other

83

其中比较值得关注的是:有 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: 1324

2. 按身体部位筛选

chest_exercises = [
    exercise for exercise in exercises
    if exercise["category"] == "chest"
]

print(f"Chest exercises: {len(chest_exercises)}")

输出:

Chest exercises: 163

3. 按器械筛选

bodyweight_exercises = [
    exercise for exercise in exercises
    if exercise["equipment"] == "body weight"
]

print(f"Bodyweight exercises: {len(bodyweight_exercises)}")

输出:

Bodyweight exercises: 325

4. 获取中文教学步骤

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 语句。

一个推荐的导入思路是:

  1. 使用 setup.html 生成目标数据库的 SQL

  2. 在本地数据库中执行建表语句

  3. 导入数据

  4. 检查 idnamecategoryequipment 是否正确

  5. imagegif_url 保留为路径字段

  6. 在应用层根据域名或 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. 实际建议

如果你的项目只是个人学习、研究或原型,可以按照项目要求保留署名。

如果你的项目准备商用,建议:

  1. 单独评估 Gym visual 的媒体授权条款

  2. 不要直接把 GIF 当作可自由商用的素材

  3. 保留 attribution 字段

  4. 必要时联系 Gym visual 获取正式授权

  5. 或者只使用 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/:id

5. 做好安全提示

健身动作存在个体差异。建议在页面中加入免责声明,例如:

本内容仅用于运动参考,不构成医疗建议。如有伤病或特殊健康状况,请先咨询专业医生或教练。

十五、总结

exercises-dataset 是一个完成度很高的健身动作数据集。

它最大的价值不是“有很多图片”,而是提供了一个已经整理好的运动数据结构:

动作名称
身体部位
目标肌群
辅助肌群
所需器械
多语言说明
分步骤说明
媒体路径
版权署名

对于开发者来说,它可以大幅缩短健身类项目从 0 到 1 的时间。你可以直接用它完成动作库、搜索筛选、训练计划、教学页面和数据分析原型。

但在实际使用时,一定要分清两部分版权:

数据与文本:MIT
图片与 GIF:Gym visual 单独条款

如果你的项目准备公开上线或商用,建议优先使用数据和文本结构,并为媒体资源单独确认授权。