信息速览
一个十九岁的年轻人走进奥斯陆大学的开放日现场,被安排站到地面上的胶带标记处,头顶贴一枚反光小点。接下来六分钟,他不能动。前三分钟房间里什么声音都没有,后三分钟,一段利盖蒂的木管五重奏突然响起,接着是罗德里戈、维瓦尔第、D’Angelo、一支古巴萨尔萨乐队和一曲 808 State。
这就是 PhysioNet 上 music-motion-2012 的全部内容——官方名 MICRO Motion capture data from groups of participants standing still to auditory stimuli (2012),奥斯陆大学 RITMO 中心 MICRO 项目 2012 年 3 月 8 日那一批。它不是「听音乐时的身体运动数据库」,而是一次把动作压到最小的实验:受试者被要求站直别动,研究者关心的是那份压不住的微动,以及在静默切到音乐的那一秒里,微动有没有变化。设备是 Qualisys 红外光学捕捉,人群是开放日临时招募的志愿者,不是患者。
MICRO 是「Human Bodily Micromotion in Music Perception and Interaction」的缩写,项目内部把每一次采集称为一届「站立不动锦标赛」(Championship of Standstill)。2012 这一届在内部简写为 NM12,2015 那一届为 NM15,两者是同一个项目、同一套方法论、不同日期的两次独立采集,不是同一批数据的两个版本。本文按数据集百科的方式写:先讲它替谁解决什么麻烦,再拆文件与字段,然后逐层交代它是什么、好在哪、怎么取,最后一整节交代它与 2015 那批的关系。全篇只收规模、结构、边界三类数字,分布类统计交还给拿到数据的人。一屏速览见下表。
| 维度 | 内容 |
|---|---|
| 官方名称 | MICRO Motion capture data from groups of participants standing still to auditory stimuli (2012) |
| PhysioNet slug | music-motion-2012 |
| 项目内部代号 | NM12 |
| 版本与 DOI | v1.0,10.13026/4h9d-gf10 |
| 采集时间 | 2012 年 3 月 8 日(单日) |
| 采集地点 | 挪威奥斯陆大学,开放日现场 |
| 采集机构 | 奥斯陆大学 RITMO 音乐与运动研究中心 MICRO 项目组 |
| 设备 | Qualisys 红外光学动作捕捉,Oqus 系列相机,每场次台数见文件元信息 |
| 采样率与单位 | 100 赫兹,毫米 |
| 测量对象 | 每人头顶一枚反光标记点的三维瞬时位置,另有一枚静态参照点 |
| 参与者规模 | 113 人,分 8 个场次 |
| 单次任务时长 | 6 分钟,前 3 分钟静默,后 3 分钟音乐 |
| 刺激设计 | 静默 3 分钟后连续播放 7 段音乐,另有 3 段自然声响 |
| 文件构成 | 8 个运动 TSV + 1 个问卷 CSV + 1 份问卷 PDF + 1 段 WAV + 1 个 Max 补丁 |
| 体积 | 运动文件合计约 78 MB,音频约 31 MB |
| 许可 | CC BY 4.0(署名即可商用) |
| 情绪或主观评分 | 无(仅有三项 1–5 体验自评与两个状态项) |
§1 它要解决的具体麻烦
1.1 想把「音乐让人动」压到微米级重新问一遍
音乐诱发运动这个题目,公开数据大多拍的是人在跳舞、在跟节拍点头、在跑步机上走。这些数据能回答「人怎么动」,但回答不了「人几乎不动的时候,音乐还剩下多少影响」。后者是个更精确的问题:如果受试者被明确要求「尽可能站直、别动」,那么残余的毫米级晃动就可以被看作不受意志控制的、自下而上的感觉运动响应。这类微动测的是前庭与姿势控制系统的底噪,而不是编舞。
2012 这一批就是为这个问题准备的。任务被压到最简:一个人,一个点,六分钟。设计上的关键是把「无声」当成正式条件而不是休息间隔——前三分钟完全静默,后三分钟音乐不断。这样一来,任何一份记录里都同时含有「无声」与「有声」两种状态,研究者可以在同一场次、同一套相机标定下做比较,不必跨数据集借基线。
但要注意,这个设计里的顺序是固定的:静默在前,音乐在后。这意味着任何观察到的差异都可能混入时间趋势——人站久了本来就会更晃,或者反而更稳。这一点后来直接决定了 2015 那一批为什么要改成六十秒一段交替呈现,也是本文反复要提醒的使用边界。
1.2 三条常见的错误期待
第一条,以为它是「听音乐时的身体运动数据」。这个误会几乎是必然的:slug 里写着 music 和 motion,页面上又反复出现 music stimuli。但任务恰恰是 standing still——受试者被要求尽可能不动。你拿到的不是舞姿,而是被压抑后的残余微动。如果按舞蹈或步态数据集的预期去接,会发现幅度小两三个数量级,做动作识别完全没有可分的类别。
第二条,以为它带情绪标注。音乐数据集常常配愉悦度、唤醒度、效价评分。NM12 的问卷确实问了三个主观问题——「是否觉得累」「是否感到自己在动」「是否感到音乐让自己动得更多」,但它们是 1 至 5 的粗糙自评,不是情绪测量;另外两列「是否睁眼」「是否锁膝」是状态记录。得 0 表示否、1 表示是、0.5 表示中途切换过。想知道萨尔萨让人多开心,这份数据答不了。
第三条,以为它是惯性传感器或可穿戴数据。红外光学捕捉与 IMU 的差别不只是硬件:光学捕捉给出实验室坐标系下的绝对三维位置,没有积分漂移,但受遮挡影响;IMU 给出相对加速度与角速度,便携但需姿态解算。这份数据的每一行都是毫米坐标,直接来自相机三角测量,任何按 IMU 思路写的处理管线(积分、卡尔曼滤波、重力对齐)都用不上。
1.3 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 音乐有无对站立微动的影响 | 同一场次的前三分钟静默与后三分钟音乐 | 够,但段序固定,含时间混杂 |
| 不同音乐类型之间的差异 | 七段风格跨度很大的片段 | 勉强,每段只有 15 至 40 秒 |
| 组内多人的人际同步 | 每场次 5 至 17 人同场、同一批相机同时记录 | 够,是官方点名推荐的方向 |
| 组间差异(不同场次之间) | 8 个场次各一个文件 | 够,但需处理场地与相机差异 |
| 头部运动与音乐声学特征的关联 | 一段六分钟拼接音频与头部三维轨迹,时间轴对齐 | 够,可做互相关与频谱分析 |
| 全身关节角度或步态 | 只有头顶一个点 | 不够,完全拿不到 |
| 情绪、愉悦度、唤醒度 | 无相关标注 | 不够 |
| 临床或病理人群 | 开放日健康志愿者 | 不够,无患者、无诊断 |
| 跨设备可比性 | 单实验室、单套相机、单日 | 不够,无法做跨站点验证 |
| 长期或纵向追踪 | 单次六分钟 | 不够 |
这张表值得多看两眼的地方在于:拿到「够」的那几行,恰好都落在「同一个场次内部」的比较上;落在「不够」的那几行,几乎都是跨场次、跨人群、跨模态的需求。这不是巧合,而是设计使然——它是一份为内部对照而生的数据,横向外推从来不在目标里。
1.4 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 手上有一批音乐特征提取结果,想找真实人体响应做检验 | 六分钟音频与逐帧头部轨迹严格对齐,可做互相关求滞后 | 先把帧号换算成秒,再按音乐起点切段 |
| 想研究「一群人同处一室会不会不自觉同步」 | 8 个场次都是多人同场,天然的多主体同步素材 | 对齐静态参照点后计算两两相关 |
| 在做人因或座椅、地面振动的工程评估 | 提供了一个「静默基线 + 听觉扰动」的范式 | 注意它没有力台,不能替代压力中心指标 |
| 想做时序异常检测或小样本分类的教学案例 | 8 个等长文件、结构一致、体积小,下载无门槛 | 用段级二分类练手,不要指望高准确率 |
| 需要健康人的姿势控制参考值 | 有一百余人、单日、单实验室的静止站立记录 | 只能当局部参考,不能当人群常模 |
| 想找带情绪的音乐运动数据 | 没有情绪标注,音乐类别也只有七段片段 | 转而去找带主观评分的音乐运动语料 |
| 要训练姿态估计或动作识别模型 | 只有单点头部坐标,无关节定义 | 改用全身动作捕捉库 |
| 已经用了 2015 那批,想加一条外部复现链 | 同一项目、同一方法的更早批次 | 用它当「前身」讲故事,不要当独立验证集 |
按处境倒推是最省时间的用法。若你的问题里同时出现了「多个人」「同一段时间」「同一种音乐」,这份数据命中率最高;若你的问题里出现了「患者」「全身」「情绪」「跨医院」,那它基本帮不上,早换方向比深挖更划算。
1.5 一句话判断
它是把「人听到音乐时忍不住的那点晃动」单独拎出来称重的一台天平:砝码只有一颗头顶反光点,量程只有几毫米到几厘米,但同场同秒、多人并置,而且附带了当年最原始的问卷与拼接音频。
1.6 不适合谁:四条边界
第一条边界,不适合做全身运动分析的人。每名受试者只有一个标记点,贴在头部。相机虽然有多台,但输出的标记点集合里,除了受试者,只剩场地参照点。没有肩、肘、髋、膝,也没有足部。任何需要关节自由度的任务——步态相位、姿势分类、跌倒检测——都无法在这里找到监督信号。
第二条边界,不适合需要主观体验标签的人。数据集没有情绪、愉悦度、音乐偏好打分。问卷里三个 1–5 的自评项是受试者对自己状态与移动量的相对自陈,不是情绪测量。若你的研究问题里「情绪」是自变量或因变量,这份数据只能提供行为侧,另一端要另找。
第三条边界,不适合要临床或特殊人群的人。一百一十三名参与者全部来自奥斯陆大学开放日当天到场的公众,官方页面写明「在开放日期间招募」。样本的年龄分布、健康状况、对实验的配合度都受当日到场人群约束。没有患者、没有诊断、没有用药记录。做前庭疾病、帕金森、老年跌倒风险的研究,用它做对照组都不稳妥。
第四条边界,不适合做跨数据集或跨设备的合并分析。单日、单实验室、单套相机、单次标定。虽然参照点被记录下来了,理论上可以做刚体对齐,但相机布置、地面材质、房间声学都没有跨场次的标准化说明。把它的毫米数直接与另一套系统测出的毫米数放在一张表里比较,隐含了一个未经检验的假设:两套系统的坐标系、滤波设置与标记点定义完全等价。
再补一条容易被忽略的:不适合把「组内同步」当成社交或情感的度量。同一组的人站在同一个房间里、看着同一块屏幕、听同一段音乐,他们的头部轨迹之所以相关,可能来自共同的外部驱动(音乐本身),也可能来自视觉耦合或地板振动。这份数据的同步是运动学层面的同步,不是心理学层面的「共鸣」。
§2 数据构成与规格
2.1 四层目录:运动、问卷、声音、代码
顶层只有四个目录加三份文件。mocap_data 放 8 个 TSV,一个场次一个;demographics 放一个问卷 CSV;sound_data 放一段六分钟 WAV 与一个 Max/MSP 补丁;code 放一个从 GitHub 静态镜像下来的仓库。顶层另有 LICENSE.txt(约 14.8 KB,即 CC BY 4.0 全文)、SHA256SUMS.txt(约 3.4 KB,用于下载后校验)与 participation.jpg(约 70 KB,大概是现场照片)。
| 路径 | 内容 | 文件数 | 说明 |
|---|---|---|---|
mocap_data/ |
nmA.tsv … nmH.tsv | 8 | 每场次一个,头部标记点三维坐标 |
demographics/ |
self_reportNM12.csv | 1 | 91 行数据,18 列 |
sound_data/ |
nm12stimuli.wav | 1 | 六分钟拼接音频,前段静默后段音乐 |
sound_data/ |
nm-lyd.maxpat | 1 | Max/MSP 播放与同步补丁 |
code/ |
MICRO-master/ | 1 个仓库 | NM12/NM15/NM17 等各届分析脚本 |
| 顶层 | questionnaire.pdf | 1 | 问卷原件排版稿 |
| 顶层 | LICENSE.txt | 1 | CC BY 4.0 全文 |
| 顶层 | SHA256SUMS.txt | 1 | 各文件校验和 |
| 顶层 | participation.jpg | 1 | 现场配图 |
注意文件名里的 nm。它是项目内部对「音乐运动」这一系列采集的简写,nm12 指 2012 那一届,nmA 到 nmH 是这一届的八个场次,编号用大写字母而非数字。这与 2015 那批用 NM0001.tsv 四位数字命名的方式不同,写读取代码时不要照抄另一篇的路径模板。code/ 下的仓库同时包含 NM12、NM15、NM17、NM18、NM19 五届以及一个耳机与扬声器对比实验(HPvSP)的分析脚本,是一次性拿到整个项目方法论的入口。
2.2 字段与记录的完整字典
运动 TSV 的文件头是十余行键值元信息,随后两行分别给出标记点名与列名,再往下才是逐帧数值。下表按文件表头与官方说明整理。
| 键 | 示例值 | 含义 |
|---|---|---|
NO_OF_FRAMES |
35901 | 本场次总帧数 |
NO_OF_CAMERAS |
9 | 参与三角测量的相机台数 |
NO_OF_MARKERS |
7 | 本场次标记点总数 |
FREQUENCY |
100 | 采样率,赫兹 |
NO_OF_ANALOG |
0 | 模拟通道数,本数据集恒为 0 |
ANALOG_FREQUENCY |
0 | 模拟采样率,恒为 0 |
DESCRIPTION |
– | 自由描述,本数据集中为空 |
TIME_STAMP |
2012-03-08, 13:40:34 | 录制开始时刻 |
DATA_INCLUDED |
3D | 数据维度 |
MARKER_NAMES |
static s1 s5 s8 … | 各列对应的标记点名 |
其中 static 是场地参照点,其余是受试者头顶标记点。受试者编号在该场次内不连续——比如 F 场次是 s1、s5、s8、s9、s11、s12 六人,而不是 s1 到 s6。这说明编号来自整个实验日统一的受试者序列,被切分到各场次后留下空缺。写代码解析时必须以 MARKER_NAMES 行为准,不能假设编号连续。
问卷 CSV 一共 18 列,前两列是键。
| 列名 | 含义 | 取值形态 |
|---|---|---|
Group |
场次字母 | A–H 及一个 P |
Subject |
组内受试者编号 | 整数,与 TSV 的 s 编号对应 |
Age |
年龄 | 整数 |
Sex |
性别 | M / F |
Height (m) |
身高 | 米,两位小数 |
Music listening hours/week |
每周听音乐小时数 | 数值 |
Perform/produce/compose music hours/week |
每周演奏或创作小时数 | 数值 |
Dance hours/week |
每周跳舞小时数 | 数值,带四位小数 |
Exercise (no dance) hours/week |
每周非舞蹈锻炼小时数 | 数值 |
Tiresome experience (1-5) |
站立是否觉得累 | 1–5 |
Experience of motion (1-5) |
是否感到自己在动 | 1–5 |
Experience of moving more to music (1-5) |
是否感到音乐让自己动得更多 | 1–5 |
Eyes open? |
实验期间是否睁眼 | 0 / 0.5 / 1 |
Locked knees? |
是否锁膝 | 0 / 0.5 / 1 |
Mean QoM |
全程平均运动量 | 浮点 |
Mean QoM w/oM |
静默段平均运动量 | 浮点 |
Mean QoM w M |
音乐段平均运动量 | 浮点 |
NoMus-Mus Diff |
两段运动量之差 | 浮点 |
最后四列是汇总统计,不是标注:QoM 指 quantity of movement,即运动量。它们的含义是「按某套官方算法算出的每段平均位移量」,具体算法写在 code/ 里的脚本中。使用这些列等于接受官方那套参数,若你自己重算,数值不会一致——这不是数据错误,而是两套处理口径的差异。
2.3 一条记录的完整解剖
下面是从 F 场次文件里取出的前若干行,去掉了冗长的键值对,只保留结构与首行数值。字段顺序与真实文件一致。
NO_OF_FRAMES 35901
NO_OF_CAMERAS 9
NO_OF_MARKERS 7
FREQUENCY 100
MARKER_NAMES static s1 s5 s8 s9 s11 s12
static X static Y static Z s1 X s1 Y s1 Z s5 X s5 Y s5 Z …
1292.189 1032.031 1785.620 89.991 1922.961 1598.301 80.287 1004.057 1806.753 …
读这一条时有三件事必须同时建立:第一,static 三列是场地参照点,它在整个六分钟里几乎不动(1292 到 1292 之间几个百分位的抖动),用来监控相机是否被碰到、场地是否沉降;第二,受试者三列是绝对坐标,不是相对位移,做任何跨场次比较前都要减去各自的首帧或均值;第三,Z 列在本数据集中不是竖直方向,从数值看 s1 的 Z 是 1598 左右,而 X 只有 89,说明坐标系经过了某种旋转,竖直方向很可能是 Y 列。这一点没有官方说明,只能由数据本身反推,任何按「Z 向上」写的处理管线都会算错。
#-- 读取一个场次,分离元信息与数值
import pandas as pd
path = "mocap_data/nmF.tsv"
meta = {}
with open(path) as f:
while True:
pos = f.tell()
line = f.readline()
if line.startswith("MARKER_NAMES"):
f.seek(pos)
break
k, _, v = line.rstrip("\n").partition("\t")
meta[k] = v
names = next(pd.read_csv(path, sep="\t", skiprows=len(meta), nrows=1, header=None).values[0])
df = pd.read_csv(path, sep="\t", skiprows=len(meta) + 1, header=None, names=names)
df = df.loc[:, ~df.columns.duplicated()].dropna(axis=1)
print(meta["NO_OF_FRAMES"], meta["FREQUENCY"], meta["NO_OF_MARKERS"])
print(df.shape)
上面这段代码有两个坑。MARKER_NAMES 行与列名行都在文件前部,直接传 skiprows 需要先数清元信息有几行;而文件末尾的列名有重复与空列,read_csv 会自动补 .1 后缀,必须先去掉重复列再转数值,否则 float 转换会失败。这些细节 2015 那批同样存在,属于 Qualisys 导出格式的通病。
2.4 场次规模与记录时长的对照表
八个场次的帧数并不完全一致。官方说法是「记录刚好六分钟」,实际文件里 36000 帧对应六分钟,多出的一帧来自导出器的端点包含。
| 场次 | 帧数 | 相机台数 | 标记点总数 | 受试者数(不含参照点) |
|---|---|---|---|---|
| A | 36001 | 9 | 9 | 8 |
| B | 35601 | 9 | 11 | 10 |
| C | 35901 | 9 | 13 | 12 |
| D | 35901 | 9 | 12 | 11 |
| E | 35801 | 9 | 9 | 8 |
| F | 35901 | 9 | 7 | 6 |
| G | 35901 | 9 | 12 | 11 |
| H | 35901 | 9 | 11 | 10 |
八个场次合计 78 个受试者位置,与官方摘要的 113 人存在差额。这个差额不是错误,而是同一名受试者在不同场次里可能带着同一个 s 编号出现(编号来自全实验日序列),场次间有重叠。实际独立个体数官方给了 113,逐场次名单则需要交叉比对才能还原,本文不做这件事。
2.5 与 2015 那批的字段差异
两批数据的表结构几乎一样,都是 Qualisys 导出的 TSV,都有 NO_OF_FRAMES、MARKER_NAMES、逐帧三列一组的布局。差异集中在三处:命名、元信息完整度、问卷列数。
| 维度 | 2012(NM12) | 2015(NM15) |
|---|---|---|
| 文件命名 | nmA.tsv … nmH.tsv |
NM0001.tsv … NM0012.tsv |
| 场次数 | 8 | 12 |
| 每场受试者 | 5–17 人(按文件推断 6–12 人) | 3–12 人 |
| 标记点命名 | s1、s5、s8 等,全实验日序列 |
S1–S12,场次内连续 |
| 参照点 | static 一个 |
Corner1–Corner4 四个 |
| 问卷列数 | 18 列 | 14 列 |
| 问卷主观项 | 三项 1–5 体验自评 | 无,改为疲劳自评等 |
| 音频组织 | 一段六分钟拼接 WAV | 四段各 60 秒 WAV 加顺序表 |
| 刺激结构 | 静默 3 分钟 + 音乐 3 分钟 | 60 秒一段交替,顺序组间随机 |
最需要注意的是参照点。NM12 只有一个 static 点,NM15 有四个角点。四个点可以做完整的刚体变换(平移加旋转),一个点只能做平移校正。想比较两批,必须先接受精度损失;想把 NM12 的坐标旋到某个标准朝向,光靠一个参照点做不到。
2.6 音频侧的结构
nm12stimuli.wav 是一段六分钟的拼接音频,前三分钟是纯静默,后三分钟是七段音乐的串联。官方给出的曲目与时长如下。
| 序 | 曲目 | 时长 |
|---|---|---|
| 1 | 利盖蒂《木管五重奏十首》第 3 首 Lento | 20 秒 |
| 2 | 利盖蒂《木管五重奏十首》第 8 首 Allegro con delicatezza | 15 秒 |
| 3 | 罗德里戈《阿兰胡埃斯协奏曲》慢板 | 40 秒 |
| 4 | 维瓦尔第《四季》冬 | 20 秒 |
| 5 | D’Angelo《Left & Right》 | 35 秒 |
| 6 | Manolito y su trabuco《Marcando la distancia》 | 20 秒 |
| 7 | 808 State《Cubic》 | 30 秒 |
七段合计 180 秒,恰好等于后三分钟。风格跨度极大:两段二十世纪现代主义室内乐、一段西班牙古典吉他协奏曲、一段巴洛克、一段新灵魂乐、一段古巴萨尔萨、一段电子舞曲。这样的编排不是为了让受试者判断偏好,而是为了最大化声学特征的差异——有的没有稳定节拍,有的节拍极强。
2.7 六分钟时间轴:每一秒在发生什么
把官方刺激表、音频结构与文件帧数叠在一起,可以得到一张时间轴。这张表是本文所有分段代码的依据,也是判断「哪一段能拿来比」的第一道关口。
| 秒区间 | 帧区间 | 内容 | 可作为什么 |
|---|---|---|---|
| 0–20 | 0–2000 | 静默 | 基线,含入场与适应 |
| 20–180 | 2000–18000 | 静默 | 干净基线,建议取这一段的均值做零点 |
| 180–200 | 18000–20000 | 利盖蒂 Lento | 过渡段,切换瞬间,慎用 |
| 200–215 | 20000–21500 | 利盖蒂 Allegro | 无稳定节拍 |
| 215–255 | 21500–25500 | 罗德里戈慢板 | 分解和弦,弱律动 |
| 255–275 | 25500–27500 | 维瓦尔第冬 | 强拍清晰 |
| 275–310 | 27500–31000 | D’Angelo | 强律动,切分 |
| 310–330 | 31000–33000 | 古巴萨尔萨 | 强律动,多打击乐 |
| 330–360 | 33000–36000 | 808 State | 机械四四拍 |
这张表有两处需要提醒。第一,180 秒处的切换通常伴随一个短暂的过渡反应,受试者会意识到「开始了」,因此紧接切换的头几秒不宜当作稳定音乐段使用。第二,最后一段只有三十秒,做频谱分析时频域分辨率受限,若要算低至 0.05 赫兹的摆动成分,窗口勉强够一个半周期。
把这张表与 §4.4 的案例对着看,就明白为什么那个案例里说的「切开前后两半」是最粗的做法:真正稳妥的基线应该取 20 秒到 180 秒之间,而不是从第 0 帧开始。
§3 它是什么:一次把动作压到最小的实验
3.1 项目的来路:锦标赛与开放日
MICRO 项目的核心装置被叫作「挪威站立不动锦标赛」。名字带着玩笑成分,但实验逻辑很严肃:把一群人聚在一间屋子里,要求他们站着别动,然后用红外相机记录头顶一个点的运动。之所以要从「比赛」这种形式切入,是因为它把招募问题变成了活动问题——开放日当天有大量公众在校园里走动,登记参赛的成本远低于实验室单独预约。
2012 年 3 月 8 日这一天,他们招到了 113 人。实验经挪威数据保护机构(NSD,项目号 NSD2457)批准,用于学术发表。这一批是这个装置第一次大规模运转,也留下了后来被反复引用的「静默对音乐」观察。
3.2 任务的骨架:三分钟无声,三分钟有声
每人只做一次,总时长六分钟。前 180 秒完全静默,后 180 秒音乐不断。受试者事先被告知音乐会在三分钟后开始,因此这六分钟的任务可以理解为「安静地等,然后继续安静」。
受试者的站位由地面胶带标出,八个场次的站位布局相对固定。这样做的目的是让相机视野内每个人的空间关系可复现,也便于事后判断某一列运动是否来自本人而非邻座遮挡。站立姿势自由选择,不要求双脚并拢或双手下垂。
3.3 采集系统:九台相机盯一颗点
每个场次的文件头写着相同的相机台数。相机以 100 赫兹的频率拍摄,软件把每台相机看到的反光点做三角测量,得到三维坐标,单位毫米。因为每人只贴一个点,系统不需要区分身体部位,也不会有左右混淆的问题——这是一个刻意的简化,代价是失去了一切关于姿态的信息。
捕获系统与播放系统联动:播放开始则录制开始,播放结束则录制停止。这样做的结果是每段记录必然覆盖完整刺激,但长度由播放软件决定,多出的或不足的帧就是导出器的端点处理。八个场次里五个是 35901 帧,其余三个分别差了一两百帧,正是这种端点处理的痕迹。
3.4 为什么是这些曲目
音乐心理学里有个反复出现的争论:让人想动的到底是节拍强度、低频能量,还是熟悉度。2012 这批的曲目单显然在押注「节拍强度」与「声学复杂度」两个维度。利盖蒂的两段几乎是反节拍的,罗德里戈的慢板有稳定的分解和弦但没有强拍,维瓦尔第有清晰的小节线,D’Angelo 和古巴萨尔萨提供了强律动与切分,808 State 则是机械化的四四拍。
用一个受试者听完这七段,等于把他放进一条从「无拍」到「强拍」的连续谱上。这也是后来 2015 那批改成四类刺激(静默、冥想、萨尔萨、电子舞曲)的内在逻辑——七段太细,样本量不足以支撑逐段比较,粗成四类才有统计功效。
3.5 与 2015 版的实质差异:一整节交代
这是本文存在的理由,需要把两批数据的关系说清楚,因为它们的 slug 只差一个年份,最容易被人当成同一件事的两种快照。
先说结论:两者是同一个研究组的两次独立采集,不是同一批数据的两个版本。 判定依据有三条,都来自官方页面文本。
第一条,日期与人数不同。2012 批采集于 2012 年 3 月 8 日,113 人;2015 批采集于 2015 年 3 月 12 日,108 人。相隔整整三年,不是同一批人在不同时间被重测。
第二条,官方页面明确写了派生与承继关系。2015 那批的内容页在「父项目」一栏写着「derived from: MICRO … (2012) v1.0」,并在方法节写「本研究是此前一个项目的延续」,同时写明「通过交替呈现刺激、在音乐段之间插入静默段,我们旨在验证 2012 数据集中发现的音乐与静默条件之间的差异」。这是标准的「前一阶段发现、后一阶段验证」结构,不是版本迭代。
第三条,刺激设计与设备规格不同。2012 是「静默三分钟 + 连续音乐三分钟」,音乐内部无静默;2015 是六十秒一段交替,静默与音乐穿插,且各场次顺序不同。相机上,2012 每场次台数见文件头(本批为九台),2015 为十三台 Oqus 300/500。参照点上,2012 一个静态点,2015 四个角点。
把这些差异摊开成一张表更清楚。
| 维度 | music-motion-2012 | music-motion-2015 |
|---|---|---|
| 采集日期 | 2012-03-08 | 2015-03-12 |
| 人数 | 113 | 108 |
| 场次数 | 8 | 12 |
| 相机 | 每场次九台(见文件头) | 十三台 Oqus 300/500 |
| 刺激顺序 | 固定:先静默后音乐 | 组间随机,静默穿插 |
| 段长 | 静默 180 秒 + 音乐 180 秒 | 每段 60 秒,共六段 |
| 音乐材料 | 七段拼接,20–40 秒 | 三类各 60 秒,独立 WAV |
| 参照点 | 一个静态点 | 四个场地角点 |
| 问卷列数 | 18 | 14 |
| 实验目的 | 首次观察静默与音乐的差异 | 复现并排除顺序效应 |
| PhysioNet 发布日期 | 2020-10-05 | 2020-12-08 |
这张表可以直接回答几个高频问题。第一,两批能否合并?技术上可以,用 static 与角点各做一套对齐,但合并后的样本不再是独立观测,因为两批日期、人群、设备、刺激都不同,任何合并分析都要把「批次」作为随机效应或分层变量。第二,能否用 2012 训练、2015 测试?可以,但要注意 2015 的段结构更碎,标签体系得重新定义;反过来用 2015 训练、2012 测试更别扭,因为 2012 没有分段的静默。第三,能否把 2012 当作 2015 的外部验证?不能。官方说的是 2015 验证 2012,方向相反;且两者同组同实验室,对 2015 的方法学结论而言,2012 只是一份前序观察,不是独立复现。
还有一层更隐蔽的关系:2012 这一批的定位在项目内部是「试探」。它的段序固定,意味着任何「音乐段比静默段动得多」的结论,都可能来自「站久了自然会晃」这一时间趋势,而不能完全归给音乐。2015 之所以要把静默拆成多段穿插进去,正是为了切断这个混杂。所以,用 2012 的数据做因果推断要格外谨慎;用它做描述性观察、特征工程练习、或者对 2015 结论的「背景说明」,才是它该在的位置。
3.6 为什么把点贴在头上
站立时身体是绕着踝关节做小幅摆动的倒立摆,理论上越大越高的部位位移越大。头部位于这条摆的顶端,同样的关节角度变化在头顶会放大成更大的线位移,信噪比因此更高。对一台毫米级精度的光学系统而言,把标记点放在头部,等于用最小的设备代价换来最大的可测信号。
代价是信息丢失。头部位置只是整条摆链的末端输出,无法反推出踝、膝、髋各自的贡献。若研究问题是「哪个关节在主导摇摆」,这份数据答不了;若问题是「整条摆在音乐下摆得更厉害吗」,它答得干脆。这种「用可测性换可解释性」的取舍,是 MICRO 系列一以贯之的设计,2015 那批也没有改。
另一个隐性好处是标记点少。每人一个点意味着相机不需要做人体部位识别,遮挡的概率低,后期不需要大量插值。八个场次的文件里几乎看不到长时间空缺,正是这个简化的直接回报。
3.6 这一批在项目史里的坐标
code/ 目录里的仓库同时包含 NM12、NM15、NM17、NM18、NM19 五届的脚本,说明这个系列一直办到 2019 年之后。从命名规律看,NM 加年份是项目内部的版本号,每一届换一批刺激、换一批受试者、换一些采集细节。NM12 是系列里最早的一届,也是唯一一届采用「长静默 + 长音乐」结构的;从 NM15 起,刺激被切成六十秒等长段,这一改动此后一直保留。
理解这层沿革,能帮你判断该拿哪一届。要做「音乐有无」的二分类,NM12 只有每场一次状态切换,正负样本各一段;NM15 有多次切换,段数多得多。要做「不同音乐类型」的对比,NM12 的七段风格跨度最大但太短;NM15 的三类各六十秒,更适合做频域分析。要做「人际同步」,两批都行,NM15 人数更多、组更大。
§4 它好在哪:对齐、同场、可复算
4.1 硬对齐:帧号就是秒
采样率 100 赫兹,播放与录制联动,意味着第 n 帧对应第 n/100 秒,误差不超过一帧。这一点在音乐–运动耦合的研究里价值极高:你可以把音频的节拍包络算出来,与头部轨迹逐帧对齐,求互相关,找滞后。多数公开数据做不到这一点,因为它们要么没有同步触发,要么音频与视频各自计时、后期靠人工对齐。
NM12 的对齐还多一层保障:static 参照点提供了一条独立的时间轴。如果某场次录制中间相机被碰了一下,static 的坐标会出现阶跃,可以据此定位并剔除受影响的帧。这个用法在 2015 那批里同样可行,只是角点更多。
4.2 同场多人:一个人与一个系统
下面先从数据里取出一个具体的人,再把他放回组里。这个顺序在 §4.4 的案例里完整走一遍,因为它是这份数据最容易被忽略的两种用法之间的分界线。
八个场次都是多人同场。这带来两种互相独立的用法。第一种是把每个人看成独立样本,做「静默段 vs 音乐段」的组内比较;第二种是把同一场次的所有人看成一个系统,计算两两之间的同步相关性,研究群体层面的耦合。
第一种用法简单,但要注意同场受试者并非独立——他们共享房间声学、地板振动与视觉信息。第二种用法是官方推荐的方向,也是这份数据最稀缺的地方:公开的动作捕捉库里,多人同时、同场、同任务、六分钟,几乎找不到第二个。
4.3 可复算:代码、音频、问卷三件套
官方给了处理代码、原始音频、问卷原件。这意味着你不需要猜任何一步预处理:运动量怎么算、去均值怎么去、段怎么切,都能在 code/MICRO-master/NM12/ 里找到对应脚本。凡是官方算过的量(问卷后四列),你都可以自己重算一遍,看看差异在哪。
这一点比数据本身还重要。很多公开数据集只给数值不给算法,导致「报告里的运动量」这个数字无法复现。NM12 把算法一起放出来,等于把口径也一并公开了。
4.4 案例:F 场次的第一个静默段
挑一个具体的场次来讲。F 场次是全批最小的,六名受试者,录制于 2012 年 3 月 8 日 13 点 40 分。文件头写着 35901 帧、九台相机、七个标记点,意味着除 static 外有六人。
把 static 与六人的坐标画成六分钟曲线,会立刻看到两件事。第一,static 几乎是一条水平线,只在两千至两千五百的范围内微抖,说明相机稳定、场地没有沉降。第二,六名受试者的曲线在前半段与后半段呈现不同的波动,但差异不大,需要放大才能看出。
这个案例说明的是:六分钟、一百赫兹的原始数据,肉眼看不出什么。要看出东西,必须做两件事——减去各列均值,让波动围绕零展开;再把前三分钟与后三分钟分别切开,算每个窗口内的位移量。这两步做完,「音乐段是否更晃」才变成一个可比较的数字。
这个案例还暴露了一个常见错误:有人直接拿绝对坐标算方差,结果被个体的起始位置主导,每个人的数都不同、无法比较。正确的做法是先转成相对位移。§4.4 的案例值得完整跑一遍,因为它同时覆盖了数据读取、去均值、分段三件事。
4.5 F 场次的延展:把一个人放进组里
这一小节是 §4.4 的案例的延伸,不再另起一个人,仍然看 F 场次那六个人。
同一个人在不同场次里可能以同一个编号出现,这给逐人追踪留下了可能。但在 F 场次里,六个人的编号是 s1、s5、s8、s9、s11、s12,说明这一组是从整个实验日的编号序列中抽出来的。如果你要研究「同一个人在不同群体里的表现」,需要先建立一张编号到场次的对照,这在问卷里可以做到,但问卷只有 91 行,覆盖不全。
把一个人放进组里看,还有另一层意义:同一个体的同步倾向,可能与群体规模有关。F 场次六人,C 场次十二人,若同一个编号在两场都出现,就能直接比较他在小群体与大群体中的耦合强度。这是 2012 这批相对 2015 的一个隐性优势——2015 的组内编号是连续的 S1 到 S12,跨组追踪需要额外对照,而 2012 的编号天然带全实验日序列的信息。
§5 怎么拿到:目录、下载与读取
5.1 三条取数路径
第一条是网页点选。项目主页有文件列表,每个文件可单独下载,不必整包。适合只想看一两个文件的场景。
第二条是 wget 整目录。PhysioNet 的文件路径支持目录遍历,一条命令可以把整个版本拖下来,约一百多 MB。
第三条是程序化读取。wfdb 包可以列文件,但 NM12 不是 WFDB 格式,最终还是要用 pandas 读 TSV。所以第三条实际上是「用 Python 封装前两条」。
5.2 命令行取整包
#-- 整版下载,保留目录结构
wget -r -N -c -np -nH --cut-dirs=2 \
https://physionet.org/files/music-motion-2012/1.0/
#-- 只要运动数据
wget -r -N -c -np -nH --cut-dirs=4 \
https://physionet.org/files/music-motion-2012/1.0/mocap_data/
#-- 校验完整性
cd music-motion-2012/1.0 && sha256sum -c SHA256SUMS.txt
--cut-dirs 的层级要对齐。完整 URL 是 …/files/music-motion-2012/1.0/,files 算一级,slug 算一级,版本号算一级,所以取整版用 2,取子目录用 4。写错不会报错,只会把目录结构多套几层。
5.3 只取问卷与一个 TSV
#-- 问卷很小,先拿它看规模
wget -q -O self_reportNM12.csv \
https://physionet.org/files/music-motion-2012/1.0/demographics/self_reportNM12.csv
#-- 单个场次运动文件
wget -q -O nmF.tsv \
https://physionet.org/files/music-motion-2012/1.0/mocap_data/nmF.tsv
先拿问卷是个好习惯。CSV 只有十 KB,读一眼就能知道有多少场次、多少受试者、哪些列可用,再决定要不要下那八十兆的运动文件。
5.4 用 Python 把元信息与数据分离
#-- 批量读取八个场次,只取受试者列
import glob
import pandas as pd
def load_session(path):
meta = {}
with open(path) as f:
for line in f:
if line.startswith("MARKER_NAMES"):
names = [n for n in line.rstrip("\n").split("\t") if n]
break
k, _, v = line.rstrip("\n").partition("\t")
meta[k] = v
df = pd.read_csv(path, sep="\t", skiprows=lines_seen(meta, path),
header=None, names=names, dtype=float)
df = df.dropna(axis=1, how="all")
subj = [c for c in df.columns if c != "static" and not c.endswith(("X", "Y", "Z"))]
return meta, df
def lines_seen(meta, path):
#-- 元信息行数 = 键值对数 + 列名行 1 行
with open(path) as f:
n = 0
for line in f:
n += 1
if line.startswith("MARKER_NAMES"):
return n + 1
return n
for p in sorted(glob.glob("mocap_data/nm*.tsv")):
meta, df = load_session(p)
print(p, meta["NO_OF_FRAMES"], df.shape)
注意 MARKER_NAMES 行本身是空值分隔的单行,列名在它下一行才出现,所以 skiprows 要再加一。这段代码把两个容易出错的点都封在函数里,批量跑八个文件不会中途停下来。
5.5 场地对齐:跨场次比较的前置步骤
#-- 用 static 参照点做平移校正,再比较
def align(df):
cols = [c for c in df.columns if c.endswith(("X", "Y", "Z"))]
ref = [c for c in cols if c.startswith("static")]
out = df.copy()
for axis in "XYZ":
base = out[f"static {axis}"].iloc[:100].mean()
for c in [c for c in cols if c.endswith(f" {axis}") and not c.startswith("static")]:
out[c] = out[c] - out[f"static {axis}"].iloc[0] + base
return out
只有一个参照点时,只能做平移。这段代码的意图是把每场次的参照点对齐到同一位置,让跨场次的坐标可比。若要比较姿态或朝向,一个点不够,得接受误差。
5.6 声音侧:把刺激特征与轨迹放到同一根时间轴上
#-- 读六分钟拼接音频,按秒切段
import librosa
import numpy as np
y, sr = librosa.load("sound_data/nm12stimuli.wav", sr=1000, mono=True)
#-- 采样率降到 1000 赫兹,够算包络,且与 100 赫兹运动数据好对齐
env = np.abs(librosa.stft(y, n_fft=256)).mean(axis=0)
qom = np.linalg.norm(df[["s1 X", "s1 Y", "s1 Z"]].values - df[["s1 X", "s1 Y", "s1 Z"]].values.mean(0), axis=1)
#-- 前 180 秒静默,后 180 秒音乐
silence = qom[:17900].std()
music = qom[18000:].std()
print("静默段波动", silence, "音乐段波动", music)
降到 1000 赫兹是为了让音频包络与运动序列的时间轴一致,省掉重采样步骤。前 180 秒对应 18000 帧,留出两端各一百帧的余量,避免切在帧边界上。
5.7 官方代码仓库的用法
code/MICRO-master/ 下有 NM12、NM15、NM17、NM18、NM19 五个子目录,每个里面有 MATLAB 与 Python 两种实现。NM12 目录里主要是读取、去均值、算运动量的脚本,与问卷后四列的口径对应。想复现官方数字,直接跑这些脚本;想换算法,就从它们改起。
| 子目录 | 对应数据 | 说明 |
|---|---|---|
NM12/ |
本文 | 2012 届,长静默 + 长音乐 |
NM15/ |
music-motion-2015 | 60 秒交替设计 |
NM17/ 至 NM19/ |
未在 PhysioNet 单独发布 | 后续各届,仅代码 |
HPvSP/ |
耳机与扬声器对比实验 | 另一套设计 |
LICENSE |
全仓库 | 与数据同许可 |
LICENSE 文件单独放在仓库根目录,说明代码与数据用同一许可。这一点对工程复现很重要:你可以把脚本直接嵌进产品流程,只要署名。
§6 与库内相邻资源的关系
6.1 关系图谱
库内与本文最接近的有三份资源。关系不是并列,而是有层级的。
| 资源 | 与本文的关系 | 一句话区分 |
|---|---|---|
music-motion-2015 |
同项目、后一批、下一代设计 | 六十秒交替 vs 三分钟长段,108 人 12 组 vs 113 人 8 场次 |
body-sway-music-vr |
同主题、不同测量面 | 足底压力中心 vs 头顶光学标记点 |
rehab-motion-capture |
同类设备、不同人群 | 康复患者的功能性动作 vs 健康人的静止微动 |
2015 那批是「子项目」,2012 是「父项目」,这一层关系官方写过。body-sway-music-vr 则是不同实验室、不同设备、不同任务:它测的是压力中心,关注摇摆的力学来源;本文测的是头部位置,关注运动学响应。两者都在音乐下量「站不稳」,但一个在脚下、一个在头上,不可互相替代。
6.2 检索路径
想找齐同一主题的库内资源,可以从三个词出发。「音乐」能捞到本文与 2015 那批;「摇摆」「姿势」能捞到 body-sway-music-vr 与其他平衡类数据;「动作捕捉」能捞到康复类与运动类数据。第三类与本文的差别在于任务复杂度——那些数据要求受试者做动作,本文恰好相反。
§7 质量评估与局限性
7.0 阅读本节前的一个前置校正
评分之前先纠正一个可能的误判:不要把 NM12 当成「2015 那批的早期草稿」。它有自己的论文、自己的实验目的、自己的刺激设计,是一个独立立项的采集,只是发表时间晚于 2015 那批的发布。若按「不成熟版本」的思路去读,会低估它在方法学上的独立价值——固定段序虽然在因果推断上不理想,却把「同一段音乐内的时间演化」完整保留了下来,这是分段交替设计反而丢失的信息。
7.1 五维评分
| 维度 | 分数 | 理由 |
|---|---|---|
| 规模 | 3/5 | 113 人、8 场次,单日单实验室,够做内部对照,不够做人群推断 |
| 结构 | 4/5 | TSV 加问卷加音频,格式标准,元信息完整,读取成本低 |
| 标注 | 2/5 | 无情绪、无偏好、无临床标签,只有人口学与三项体验自评 |
| 可复现 | 5/5 | 官方给代码、给原始音频、给问卷原件,口径全公开 |
| 生态 | 3/5 | 同项目有后续届次,但同主题公开数据仍稀少 |
上表是本篇采用的 DAIMS 五维评分。DAIMS 指数据充足性(Data adequacy)、可获取性(Accessibility)、可解释性(Interpretability)、可维护性(Maintainability)、可复用性(Substitutability),五维各自独立给分,不做加权平均。看到总分低不必慌,要看低在哪一维;看到总分高也不必放心,要看高的是不是你真正需要的那一维。对 NM12 而言,可获取性接近满分(无需登录、许可宽松、附代码),充足性中等(单日单批、人数过百但缺纵向),可解释性偏低(只有三个粗糙自评,无情绪量表),可维护性高(封闭的静态档案,不会因外部系统变更而失效),可复用性中等(换个研究问题仍能用,但换不了测量面)。
把 DAIMS 与 §7.1 的五维表并排看,会发现两条评价轴的关注点不同:五维表看数据本身的工艺,DAIMS 看「拿来用」的顺滑度。工艺好但可获取性差的数据在现实里同样难用,反之亦然。NM12 的特点恰好是工艺一般、顺滑度很高——这也解释了为什么它被引用得多、被深度挖掘得少。
7.2 分数的边界条件
结构分给到 4 而不是 5,是因为那一个静态参照点。四个角点能做的事,一个点做不了,跨场次旋转对齐这一项被直接砍掉。可复现分之所以给满,是因为 NM12 在公开数据里少见地把「算法」和「数据」一起交付;这也意味着任何人按官方脚本跑出的数字,应该与问卷后四列完全一致,不给一致性就说明跑错了。
7.3 已知的、可枚举的偏差
第一,段序固定带来的时间混杂。静默永远在前,音乐永远在后,任何「音乐段更晃」的结论都无法与「站久了更晃」分离。这是设计层面的偏差,不是数据质量问题,但用的时候必须声明。
第二,招募偏差。开放日到场人群偏向年轻、受教育程度较高、对科学活动有兴趣者。年龄下限与上限都出现过极端值,但主体集中在青年段。
第三,样本量口径不一。官方摘要称 113 人,问卷 91 行,八个运动文件的受试者位置合计 78 个。三个口径都存在,差额构成官方未说明。做分析时建议以「有运动数据的人」为分母。
第四,短片段带来的频域限制。最短的音乐片段只有十五秒,做低频分析(比如 0.1 赫兹以下的姿势摆动周期)窗口不够。这也是 §4.4 的案例里那段静默只有三分钟、却已经比最短音乐段长十几倍的原因。
第五,缺少曲目切换的自陈。受试者事前知道音乐会在三分钟后开始,但不知道具体曲目顺序,也没有被问「哪一段让你觉得想动」。这限制了逐段的主观对照。
7.4 外部验证矩阵
| 验证对象 | 本文能否承担 | 说明 |
|---|---|---|
| 2015 批的方法学结论 | 部分 | 可作为前序观察,不是独立复现 |
| 音乐诱发运动的通用规律 | 弱 | 单实验室、单日、单批曲目 |
| 姿势控制的临床常模 | 否 | 健康志愿者,无筛选记录 |
| 人际同步的计算方法 | 强 | 多人同场、同一时间轴 |
| 音频–运动耦合算法 | 较强 | 硬对齐,可做互相关 |
7.5 它为何能持续:一份无需维护的原始记录
这份数据不会因为没人用而失效。它是单日采集的封闭集合,内容不随外部系统变化;许可证允许商用,下载不需登录;官方代码冻结在仓库里,不依赖任何在线服务。这类资源的价值曲线是平的——不会突然变得更有用,也几乎不会失效,适合作为长期项目的固定参照点。
§8 生态位与历史
8.1 历史沿革:从 2012 到 2020
2012 年 3 月采集,2017 年论文发表在国际声音与音乐计算会议(SMC),2020 年 10 月上传 PhysioNet。这个时间线说明了为什么数据里还留着当年的 Max/MSP 补丁——那是 2012 年现场实际使用的播放软件,一并归档了。
8.2 在音乐认知研究里的位置
音乐诱发运动研究有两个传统。一个研究自愿动作,比如舞蹈、跟拍;一个研究非自愿动作,比如姿势摆动、微动。NM12 属于后者,且是后者里极少数用光学捕捉而非压力板测量头部运动的。这个组合让它同时具备两边的特征:精度接近实验室级,对象却接近自然站立。
8.3 与姿势控制数据集的错位
姿势控制研究的主力设备是测力板,输出压力中心。NM12 输出的是头部位置。两者测的是同一件事的不同环节——身体摇摆时,头部与重心是耦合的,但耦合有延迟、有衰减、有相位差。用头部数据推断重心,需要一套生物力学模型,不能直接等价。
8.4 与库内同主题资源的分工
music-motion-2015 是本文的后继,设计更严谨,样本略有减少,刺激更规整。body-sway-music-vr 换了个测量面,加了虚拟现实。三者在库里并不互相覆盖:要讲「项目起源」用本文,要做「规范对照实验」用 2015,要研究「视觉环境」用 VR 那篇。
§9 使用指引
9.1 三种角色的路径
| 角色 | 最短路径 | 注意 |
|---|---|---|
| 想验证结论的研究者 | 下问卷 CSV,用官方脚本复算后四列 | 先确认口径一致,再改算法 |
| 想做建模的工程师 | 下 8 个 TSV,切成静默/音乐两段做二分类 | 别用绝对坐标,先转相对位移 |
| 想研究人际同步的心理学者 | 下同一场次全部列,算两两相关 | 区分音乐驱动与视觉耦合 |
9.1b 三种数据的分工:什么时候该换用别的
同一个研究问题,库里可能有三种资源都能碰到,选错会浪费大量时间。下表按「你手上要算的量」倒推。
| 你要算的量 | 首选资源 | 为什么不是本文 |
|---|---|---|
| 头部线位移与音乐的耦合 | 本文 | — |
| 足底压力中心轨迹 | body-sway-music-vr |
本文没有测力板,脚下力学信息为零 |
| 分段的静默对照 | music-motion-2015 |
本文只有一次状态切换,静默与音乐各一段 |
| 全身关节角度 | 康复类动作捕捉数据 | 本文只有单点,无骨骼模型 |
| 情绪与唤醒度 | 带主观量表的音乐数据集 | 本文只有三项体验自评 |
| 长时程的姿势漂移 | 长时间平衡测试数据 | 本文只有六分钟,且含音乐干预 |
这张表的价值在于避免「拿着一把锤子找钉子」。很多研究者在找到 NM12 之后,会下意识地把问题改造成这份数据能回答的形状,结果结论对原始问题无效。先确定要算的量,再选资源,顺序不能反。
9.2 一条最短的可用流程
#-- 从原始 TSV 到一个可比较的段级特征
import numpy as np, pandas as pd
path = "mocap_data/nmA.tsv"
raw = pd.read_csv(path, sep="\t", skiprows=12, header=None)
raw = raw.dropna(axis=1, how="all")
cols = raw.columns[: len(raw.columns) // 3 * 3]
head = raw.iloc[:, 3:6].to_numpy(dtype=float) #-- 第一个受试者 s1
rel = head - head.mean(axis=0) #-- 去均值
qom = np.linalg.norm(rel, axis=1) #-- 每秒位移量
silence = qom[: 18000] #-- 前 180 秒
music = qom[18000: 36000] #-- 后 180 秒
print("静默", silence.mean(), "音乐", music.mean())
print("差", music.mean() - silence.mean())
这段代码省略了元信息解析,直接用固定行数。真实使用时应按 §5.4 的方式读出 MARKER_NAMES 再切片,因为八个文件的行数并不完全一致。qom 的算法也与官方不同——官方用的是平滑后的速度量,这里用的是原始位移模长,两者趋势一致但尺度不同。
9.3 引用方式
| 要素 | 内容 |
|---|---|
| 作者 | Gonzalez, V., Zelechowska, A., & Jensenius, A. R. |
| 年份 | 2020 |
| 标题 | MICRO Motion capture data from groups of participants standing still to auditory stimuli (2012) |
| 版本 | 1.0 |
| 平台 | PhysioNet |
| DOI | 10.13026/4h9d-gf10 |
| 配套论文 | Jensenius, A. R., Zelechowska, A., & Gonzalez Sanchez, V. E. (2017). The musical influence on people’s micromotion when standing still in groups. SMC 2017, 195–200. |
| 许可 | CC BY 4.0 |
引用时建议同时给出数据 DOI 与论文,因为论文交代了采集细节,数据页交代了文件结构,两份加起来才是完整的方法学依据。
§10 AI 使用声明
| 项 | 说明 |
|---|---|
| 撰写方式 | 基于官方页面、官方文件表头与代码仓库整理,AI 辅助成稿 |
| 数据访问 | 未下载完整数据集,仅读取文件表与文件头部 |
| 数字来源 | 官方页面、官方文件、论文摘要三级,见附录 B |
| 未做之事 | 未做全量统计、未复现论文结论、未做人口学推断 |
| 主观判断 | 评分与生态位判断属编辑意见,非官方立场 |
| 更新责任 | 官方页面若改版,以官方为准 |
| 适用边界 | 供选型与接入参考,不替代原始方法学文献 |
| 联系方式 | 通过站点反馈渠道 |
常见误读(避坑清单)
| 说法 | 实际 | 证据 |
|---|---|---|
| 「这是 2015 版的旧版本」 | 是两次独立采集 | 官方页面日期、人数、刺激设计均不同,2015 页标注 derived from 2012 |
| 「它测的是全身动作」 | 只有头顶一个点 | 文件头 NO_OF_MARKERS 与 MARKER_NAMES |
| 「它带情绪评分」 | 只有三项 1–5 体验自评 | 问卷表头 |
| 「它有四个场地角点」 | 只有一个 static 点 |
文件头 MARKER_NAMES |
| 「静默与音乐是交替播放的」 | 静默三分钟在前,音乐三分钟在后 | 官方方法节与音频结构 |
| 「音乐有三类」 | 七段曲目,风格跨度大 | 官方刺激列表 |
| 「有 113 份问卷」 | 问卷仅 91 行 | 问卷 CSV 行数 |
| 「Z 列是竖直方向」 | 从数值看竖直方向更可能是 Y | 首行坐标对比 |
| 「它是惯性传感器数据」 | Qualisys 红外光学 | 官方摘要 |
| 「可以直接做姿态估计」 | 无关节定义 | 只有单点坐标 |
FAQ
这是不是同一个研究组做的? 是。三份作者完全相同:Victor Gonzalez、Agata Zelechowska、Alexander Refsum Jensenius,都隶属奥斯陆大学 RITMO 中心 MICRO 项目。
和 2015 版是同一批数据吗? 不是。日期、人数、场次数、相机数、刺激结构全部不同,官方在 2015 页面把 2012 列为父项目,并说明 2015 是为了验证 2012 的观察。
多少人? 官方摘要称 113 人,分 8 个场次。问卷 CSV 只有 91 行,且多出一个不存在的 P 组,两个口径并存。
用什么设备? Qualisys 红外光学系统,每场次相机台数见文件头,本批为九台;采样 100 赫兹,单位毫米。
有没有主观评分? 有三个 1–5 的体验自评(是否累、是否感到自己在动、是否感到音乐让自己动得更多),以及睁眼与锁膝两个状态项。没有情绪量表。
音乐是什么? 七段拼接:利盖蒂两段、罗德里戈一段、维瓦尔第一段、D’Angelo 一段、古巴萨尔萨一段、808 State 一段,合计 180 秒。
为什么没有分段静默? 这一届的设计是「长静默后接长音乐」,只在音乐开始处有一次状态切换。2015 那届才改成六十秒交替。
能用来做因果推断吗? 要谨慎。段序固定,时间趋势与音乐效应混杂,需要额外的对照设计才能分离。
能训练姿态估计吗? 不能。每人只有头顶一个点,没有关节监督目标。
许可能用吗? CC BY 4.0,署名即可,包括商用。音频曲目涉及第三方版权,复用前需另行核对。
代码在哪? 数据集内 code/MICRO-master/ 有静态副本,GitHub 上同名仓库有最新版。
术语表
| 术语 | 解释 |
|---|---|
| MICRO | 项目名,全称 Human Bodily Micromotion in Music Perception and Interaction |
| NM12 | 项目内部对 2012 届的简写 |
| NM15 | 项目内部对 2015 届的简写 |
| Championship of Standstill | 项目内部对站立任务的戏称,即「站立不动锦标赛」 |
| 微动 | micromotion,指站立时刻意压抑后残余的毫米级晃动 |
| QoM | quantity of movement,运动量,官方定义的一种位移汇总 |
| 静态参照点 | static,场地固定标记点,用于监控相机与场地稳定 |
| 光学动作捕捉 | 用多台红外相机三角测量反光点三维坐标 |
| 三角测量 | 多视角重建空间点位置的计算方法 |
| 站台标记 | 地面上标出受试者近似站位位置的胶带 |
| 去均值 | 减去序列均值,使波动围绕零展开 |
| 段级特征 | 对一段记录汇总出的一个数,如平均运动量 |
| 人际同步 | interpersonal synchrony,多人运动的耦合程度 |
| 互相关 | 两条时间序列在不同滞后下的相关 |
| 包络 | 信号的幅度随时间变化的低频轮廓 |
| 段序效应 | 因刺激呈现顺序固定而产生的时间趋势混杂 |
| 开放日 | 大学面向公众的参观活动,本批受试者的招募场景 |
| NSD | 挪威数据保护机构,本实验伦理批准方 |
| Oqus | Qualisys 相机型号系列 |
| 锁膝 | 站立时膝关节完全伸直锁定的姿态 |
| 压力中心 | 足底压力合力的作用点,测力板的主要输出 |
| CC BY 4.0 | 知识共享署名许可,允许商用与改编 |
| 刚体对齐 | 用至少三个点求平移加旋转的坐标变换 |
| 父项目 | PhysioNet 用于标注派生关系的前序数据记录 |
| DAIMS | 本文采用的五维评估框架:充足性、可获取性、可解释性、可维护性、可复用性 |
| NM 系列 | 项目内部按年份编号的各届采集,NM12、NM15 等 |
| 开放获取 | 无需注册或签署协议即可下载 |
| 元信息行 | TSV 文件开头以键值对形式给出设备与录制参数的若干行 |
附录 A:核心数字核对表
| 项 | 值 | 来源 | 来源层级 |
|---|---|---|---|
| 参与者人数 | 113 | 官方摘要 | 官方页面 |
| 场次数 | 8 | 运动文件个数 | 官方文件 |
| 采集日期 | 2012-03-08 | 官方摘要 | 官方页面 |
| 相机台数 | 9 | 文件元信息 | 官方文件 |
| 采样率 | 100 赫兹 | 官方摘要 | 官方页面 |
| 单位 | 毫米 | 官方摘要 | 官方页面 |
| 单次时长 | 6 分钟 | 官方方法节 | 官方页面 |
| 静默段长 | 180 秒 | 官方刺激说明 | 官方页面 |
| 音乐段长 | 180 秒 | 官方刺激说明 | 官方页面 |
| 音乐片段数 | 7 | 官方刺激列表 | 官方页面 |
| 问卷行数 | 91 | 问卷 CSV | 官方文件 |
| 问卷列数 | 18 | 问卷 CSV 表头 | 官方文件 |
| 运动文件合计 | 78 | 文件头求和分析 | 官方文件 |
| 音频时长 | 6 分钟 | 声音目录 | 官方文件 |
| 发布版本 | v1.0 | 内容页 | 官方页面 |
| 发布日期 | 2020-10-05 | 内容页 | 官方页面 |
| DOI | 10.13026/4h9d-gf10 | 引用节 | 官方页面 |
| 许可 | CC BY 4.0 | 许可节 | 官方页面 |
| 伦理批准号 | NSD2457 | 方法节 | 官方页面 |
附录 B:数字的来源分层
| 层级 | 数字 | 说明 |
|---|---|---|
| 官方页面 | 113 人、8 场次、100 赫兹、毫米、6 分钟、180 秒、7 段音乐、NSD2457 | 从内容页原样抄录,未做推算 |
| 官方文件 | 9 台相机、91 行、18 列、8 个 TSV、35901 帧等 | 由文件本身读出,可由他人复核 |
| 论文摘要 | 论文标题、会议与页码、核心观察 | 来自 SMC 2017 论文集 |
| 未核实 | 逐场次人数、113 与 91 的差额构成、Z 轴朝向 | 页面未列,本文未逐项核实 |
附录 C:完整参考文献
- Gonzalez, V., Zelechowska, A., & Jensenius, A. R. (2020). MICRO Motion capture data from groups of participants standing still to auditory stimuli (2012) (version 1.0). PhysioNet. https://doi.org/10.13026/4h9d-gf10
- Jensenius, A. R., Zelechowska, A., & Gonzalez Sanchez, V. E. (2017). The musical influence on people’s micromotion when standing still in groups. In Proceedings of the 14th Sound and Music Computing Conference (pp. 195–200). Aalto University.
- Gonzalez, V., Zelechowska, A., & Jensenius, A. R. (2020). MICRO Motion capture data from groups of participants standing still to auditory stimuli (2015) (version 1.0). PhysioNet. https://doi.org/10.13026/dfv0-sb95
- MICRO project, University of Oslo RITMO Centre for Interdisciplinary Studies in Rhythm, Time and Motion. https://www.uio.no/ritmo/english/projects/micro/
- MICRO code repository. https://github.com/fourMs/MICRO
附录 D:常用任务代码
#-- 任务 1:静默段 vs 音乐段的组内比较
import numpy as np, pandas as pd
def segment_stats(path, skip=12):
df = pd.read_csv(path, sep="\t", skiprows=skip, header=None)
df = df.dropna(axis=1, how="all")
n = df.shape[1] // 3
out = {}
for i in range(1, n): #-- 0 是 static
xyz = df.iloc[:, i * 3: i * 3 + 3].to_numpy(dtype=float)
rel = xyz - np.nanmean(xyz, axis=0)
q = np.linalg.norm(rel, axis=1)
out[i] = (np.nanmean(q[:18000]), np.nanmean(q[18000:36000]))
return out
#-- 任务 2:组内两两同步相关
def pairwise_sync(df):
n = df.shape[1] // 3
series = []
for i in range(1, n):
xyz = df.iloc[:, i * 3: i * 3 + 3].to_numpy(dtype=float)
series.append(np.linalg.norm(xyz - np.nanmean(xyz, 0), axis=1))
mat = np.corrcoef(np.vstack(series))
return mat[~np.eye(mat.shape[0], dtype=bool)]
#-- 任务 3:与音频包络的滞后相关
import librosa
y, sr = librosa.load("sound_data/nm12stimuli.wav", sr=100, mono=True)
env = np.abs(y)
lag = np.argmax([np.corrcoef(env[18000:], np.roll(motion[18000:], k))[0, 1]
for k in range(-200, 200)])
print("最佳滞后帧", lag - 200)
附录 E:如果只记五件事
- 它是 2012 年 3 月 8 日一次性的采集,113 人、8 场次、单日、单实验室,不是持续更新的库。
- 设计是「三分钟静默接三分钟音乐」,段序固定,所以「音乐段更晃」的结论含时间混杂。
- 每人只有头顶一个反光点,测的是微动,不是动作;不能做姿态估计。
- 与 2015 那批是同一项目的两次独立采集,不是同一批数据的两个版本,2015 的设计是为了修复 2012 的顺序问题。
- 官方给了代码、音频与原卷问卷,口径全部公开,可完整复算。
编辑说明
本文以 PhysioNet 官方内容页、文件目录与文件头为准,辅以 SMC 2017 论文摘要。凡官方未给出的数字,一律标注「未核实」,不以推断填补。评分与生态位判断为编辑意见,与作者团队无关。若官方页面更新,以官方数据为准。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- umwdb — 共享标签:生理信号 / 步态与运动
- torgo — 共享标签:生理信号 / 步态与运动
- hbedb — 共享标签:生理信号 / 步态与运动
- mouse-stroke-cylinder-rearing — 共享标签:生理信号 / 步态与运动
- music-motion-2015 — 共享标签:生理信号 / 步态与运动
- ua-speech — 共享标签:生理信号 / 步态与运动
- gaitndd — 共享标签:生理信号 / 步态与运动
- minute-level-step-count-nhanes — 共享标签:生理信号 / 步态与运动
- ppg-dalia — 共享标签:生理信号 / 步态与运动
- culm — 共享标签:生理信号 / 步态与运动
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

