信息速览
一段十秒钟的门诊心电图,记录的是人躺着不动的状态;一段二十四小时的 Holter,记录的是人照常生活的状态。真实驾驶介于两者之间:身体被固定在座椅上,手脚却在持续做精细操作,环境噪声、光照、坐姿、情绪同时变化。要把"压力"这件事从生理信号里读出来,最理想的语料就是这种半约束、半自然的真实场景,而公开可得的那一批里,DriveDB 是最早的一份。
它的来历不复杂。MIT 情感计算组的 Jennifer Healey 在 2000 年前后做了一套车载生理采集装置,请健康志愿者在波士顿市区街道与高速公路上按规定路线开车,一路记录心电、右斜方肌肌电、手部与足部皮肤电和呼吸。这批数据后来写成博士论文与一篇 IEEE 会议期刊论文,2008 年 5 月由作者本人贡献给 PhysioNet,编为 1.0.0 版,此后十八年没有再改动过。
它最容易被误解的地方不在技术细节,而在名字:库名 drivedb 与眼底影像领域那个著名的 DRIVE 挑战赛数据集只差几个字母,含义却南辕北辙。它是驾驶,不是眼底。另一个必须提前说清的事实是,官方页面在数据描述里明确写着原始研究中的压力评分不可得——这是一份只有信号、没有标签的语料。一屏速览见下表。
| 维度 | 内容 |
|---|---|
| 全名 | Stress Recognition in Automobile Drivers |
| PhysioNet 库名 | drivedb |
| 贡献者 | Jennifer Healey(MIT Media Lab 情感计算组) |
| 发布方 | PhysioNet,现由 MIT 计算生理学实验室维护 |
| 首次发布 | 2008 年 5 月 15 日,1.0.0 版 |
| 后续改版 | 无,1.0.0 为唯一版本 |
| 数字对象标识 | 10.13026/C2SG6B |
| 记录文件数 | 18 个(drive01 至 drive16、drive17a、drive17b) |
| 实验段数 | 17 段(第 17 号拆为 a、b 两段) |
| 采集场景 | 美国波士顿市区街道与高速公路,规定路线 |
| 受试者 | 健康志愿者,人数与人口学构成官方未公布 |
| 通道 | 心电、右斜方肌肌电、手部皮肤电、足部皮肤电、呼吸、心率、事件标记(逐记录 4–7 路) |
| 时长 | 16 段完整实验 65–93 分钟;drive17a 29 分钟、drive17b 25 分钟 |
| 采样方式 | 记录级帧率 15.5 Hz 为主,逐通道按每帧 1–128 次复用 |
| 标签 | 无。官方明示压力评分不可得 |
| 体积 | 108.7 MB(未压缩) |
| 文件格式 | WFDB:.hea 头文件 + .dat 二进制信号 |
| 许可 | ODC Attribution License v1.0 |
| 典型用途 | 自监督预训练、信号质量研究、通道对齐、应激表征的无监督探索 |
§1 它要解决的具体麻烦
1.1 压力是个体感词,信号是公共量
临床上有明确判据的状态,比如心肌梗死、房颤、视网膜出血,都能落成一份可复核的标注:哪一段、哪一帧、属于哪一类。应激不是这样。同一个急刹车,对一位开了二十年出租车的人和一个刚拿驾照三个月的人,生理反应可以差出数倍;同一个人在同一条路上开两遍,第二遍的皮肤电反应也会明显低于第一遍,因为他已经熟悉了这条路。压力既依赖情境,又依赖个体,还依赖时间上的新鲜度。
这件事直接决定了应激数据集的形态。要做有监督学习,必须有人对每一段时间窗打一个分数;而打分的依据往往是回顾性的主观报告,与当时真实的生理状态之间存在天然错位。实验室里可以靠刻意设计的任务(心算、公开演讲、冷加压)制造相对干净的应激段与静息段,代价是场景失真。真实道路上采集,场景真了,代价是标注几乎做不干净。
DriveDB 站在后一种取舍上,而且站得很彻底:它连尝试过的那些主观评分都没有公开。官方页面在数据描述段的末尾用一句话交代了这件事,没有解释原因,也没有提供替代标签。这句短话决定了整份语料的定位——它不是训练集,是原料。
| 面向 | 实验室应激范式 | 真实道路采集 | DriveDB 的位置 |
|---|---|---|---|
| 场景真实性 | 低,任务高度简化 | 高,含真实交通流 | 高,市区与高速混合 |
| 标注可控性 | 高,可精确控制起止 | 低,事件边界模糊 | 无标注,连主观评分也未公开 |
| 个体差异 | 可配对设计部分抵消 | 难以抵消 | 无法处理,缺人口学字段 |
| 信号伪迹 | 少,受试者静止 | 多,体动与振动 | 多,需自行做质量筛查 |
| 样本量 | 通常几十人 | 通常十几人 | 17 段,人数未公布 |
1.2 三条常见的错误期待
第一条,期待它带应激标签。这是最高频的误判,而且往往在下载完之后才发现。目录里只有 .hea 与 .dat 两种后缀,没有任何 .atr、.csv、.txt 形式的标注,也没有说明文档列出每一段对应哪一类压力水平。官方那句话是唯一的口径,且是明确的否定句。
第二条,期待它是眼底那个 DRIVE。搜索 DRIVE dataset 得到的绝大多数结果指向荷兰的视网膜血管分割基准,那套数据是四十张眼底彩照配双人血管掩膜,被引数千次;而本库是十七段驾驶生理记录,两者连数据类型都不同。混淆一旦发生,后面所有的阅读都会跑偏,所以 §3.1 专门用一节拆解这三个名字。
第三条,期待它是一个平衡的应激二分类基准。即便有人拿第三方加工过的标签版本使用,也要注意原始设计的偏向:路线里包含市区拥挤路段与高速畅通路段,两者在操纵负荷上差异明显,但在"主观压力"上并不等价——有人在高速上更紧张,有人在市区更紧张。把路况直接当压力标签,是把情境当成了状态。
| 错误期待 | 实际情况 | 后果 |
|---|---|---|
| 下载后即有标签可训练 | 无任何标注文件 | 监督流程无法启动,需自建协议 |
| 与眼底 DRIVE 同源 | 完全不同的数据集 | 检索、引用、评审全错 |
| 路况即压力等级 | 官方未给路段级标签 | 模型学到的是路段而非应激 |
| 通道齐整、字段统一 | 逐记录通道数 4–7 不等 | 批量读取会失败或静默错位 |
| 采样率统一 | 帧率有 15、15.5、31 三种 | 时间轴换算错误 |
1.3 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 真实道路下的多路外周生理波形 | 心电、肌电、双部位皮肤电、呼吸同步 | 够,这是它最核心的价值 |
| 有监督的应激分类训练 | 无标签 | 不够,必须自建标注 |
| 受试者无关的泛化评估 | 人数未公布,段数只有 17 | 不够,统计功效极低 |
| 自监督或对比学习的预训练语料 | 十余小时真实道路多通道波形 | 勉强,量小但场景稀缺 |
| 信号质量与伪迹检测方法验证 | 含体动、振动、电极接触变化的真实噪声 | 够,且比合成噪声更有说服力 |
| 通道对齐与重采样工程验证 | 三种帧率、七种复用因子的异构样本 | 够,堪称小型试验床 |
| 临床应激评估或诊断 | 健康志愿者,无临床结局 | 不够,也不应这样用 |
| 车载座舱量产算法的训练集 | 传感器与当代量产硬件差异大 | 不够,只能做早期探索 |
1.4 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 你在做座舱应激感知,手上只有实验室数据,想找一个真实道路的对照 | 提供市区与高速混合的真实驾驶波形,可作为外部场景检验 | 先做通道语义映射(§5.3),再只看相对变化,不看绝对幅值 |
| 你要预训练一个多通道生理编码器,缺真实场景语料 | 十余小时、多通道、长连续记录,适合做掩码重建类预训练 | 与实验室库混合采样,避免预训练分布过度偏向驾驶场景 |
| 你在写综述,需要梳理应激计算的数据 lineage | 它是这条线上最早被公开托管的一份,且版本从未变动,引用稳定 | 以 §8.1 的时间线为骨架,注意 2000 年博士论文与 2005 年期刊论文的分工 |
| 你在做信号质量研究,需要真实体动伪迹 | 驾驶过程中的加减速、路面颠簸、转向都会进入信号 | 用 §5.6 的质检脚本先建立伪迹清单,再设计检测器 |
| 你要复现某篇早期情感计算论文 | 论文与数据同源,引用链清晰 | 先确认论文用的是哪几段记录,官方未给划分,需按描述反推 |
| 你在评审一份投稿,怀疑作者把路段当成了应激标签 | 官方页面可作直接证据:评分不可得 | 引用 §7.3 的偏差清单,要求作者说明标签来源 |
1.5 一句话判断
它不是一份能直接喂给分类器的数据集,而是一份把"真实道路"这个稀缺条件固定下来的原始语料;用它的正确姿势是先承认没有标签,再决定自己要不要付代价去造标签。
1.6 不适合谁:四条边界
不适合把它当监督学习的数据源。 没有标签就没有监督信号,任何声称在此库上直接训练应激分类器的工作,都必须先交代标签从哪来。若标签来自路况推断,那训练出来的是路况分类器。
不适合做人群层面的结论。 受试者人数、年龄、性别、驾龄全部未公布,样本又只有十七段。任何"人类在驾驶中如何反应"的普适结论,都不该建立在这样一份语料上。
不适合做临床或安全认证。 志愿者是健康人群,没有病史、没有用药、没有事故记录,也没有任何临床结局变量。它不能支撑与疾病、药物、事故风险相关的判断。
不适合直接对接现代车载硬件。 采集发生在 2000 年前后,传感器形态、采样链路、电极位置都与今天的量产座舱不同。跨硬件迁移必须重新做标定,不能假设幅值可比。
§2 数据构成与规格
2.1 一段记录由两个文件组成
数据库采用 WFDB 格式,这是 PhysioNet 沿用数十年的生理信号存储规范。与常见的心电库不同,这里没有注释文件:每一段记录只有同名的 .hea 与 .dat。头文件是纯文本,第一行声明记录名、通道数、帧率与总帧数,其后每行描述一个通道;.dat 是二进制本体,多个通道按帧交错存放。
两个文件之外,根目录只有 RECORDS 与 SHA256SUMS.txt 两个清单。没有 ANNOTATORS,没有 record-descriptions.txt,也没有任何患者信息汇总表。这一点与多数 PhysioNet 数据库不同,意味着除了头文件,没有第二处可以交叉核对元信息。
| 文件 | 作用 | 是否必需 | 本库是否存在 |
|---|---|---|---|
.hea |
纯文本头文件,声明通道、帧率、增益 | 必需 | 有,18 个 |
.dat |
二进制信号本体,按帧交错 | 必需 | 有,18 个 |
.atr |
二进制注释,存放事件与标签 | 可选 | 无 |
RECORDS |
记录名清单,一行一个 | 可选 | 有 |
SHA256SUMS.txt |
文件校验和,用于完整性核对 | 可选 | 有 |
| 说明文档 | 字段解释、采集协议 | 可选 | 无,只有网页正文 |
没有注释文件这件事,比它听起来更重要。它意味着不存在"官方认可的事件时刻表":刹车的时刻、进入高速的时刻、遇到拥堵的时刻,都没有权威标注。想要事件级分析,只能靠信号本身反推,或者靠作者论文里描述的实验流程去对照,而后者的颗粒度是分钟级而非秒级。
2.2 字段与记录的完整字典
本库的"字段"分两层:头文件里的声明字段,和通道本身的语义。下表先列声明字段。
| 字段 | 位置 | 取值形态 | 含义 | 使用注意 |
|---|---|---|---|---|
| 记录名 | .hea 首行第 1 字段 |
如 drive05 |
记录标识 | 与文件名前缀一致 |
| 通道数 | .hea 首行第 2 字段 |
4 至 7 | 该记录的信号路数 | 逐记录不同,不可硬编码 |
| 帧率 | .hea 首行第 3 字段 |
15、15.5、31 | 每秒帧数 | 不是每通道采样率 |
| 总帧数 | .hea 首行第 4 字段 |
如 78367 |
记录长度(帧) | 除以帧率得秒数 |
| 存储格式 | 通道行第 2 字段 | 16 或 16xN |
16 位整型,N 为每帧采样次数 | 16x128 表示每帧采 128 次 |
| 增益 | 通道行第 3 字段 | 如 1000、1/bpm |
ADC 单位与物理量的比值 | 斜杠后为物理单位,多数通道省略 |
| ADC 分辨率 | 通道行第 4 字段 | 恒为 16 |
模数转换位数 | 全库一致 |
| ADC 零值 | 通道行第 5 字段 | 多为 0 |
零电平对应的整数值 | 换算物理量时先减 |
| 初值 | 通道行第 6 字段 | 有符号整数 | 首采样点值 | 用于快速预览 |
| 校验和 | 通道行第 7 字段 | 有符号整数 | 采样点累加和 | 用于检测文件损坏 |
| 块大小 | 通道行第 8 字段 | 多为 0 |
分块存储参数 | 读取工具自动处理 |
| 通道名 | 通道行第 9 字段 | ECG、EMG、foot GSR 等 |
信号类型标识 | 拼写不完全统一,见 §4.3 的案例 |
通道语义这一层,官方页面在摘要里列了五类,头文件里还能看到心率与标记两类。把两处合起来,全库出现过的通道共有七种。
| 通道名 | 中文 | 官方描述中的角色 | 生理含义 | 常见问题 |
|---|---|---|---|---|
ECG |
心电 | 有,摘要列为首项 | 心脏电活动,可导出心率与心率变异性 | 体动与电极摩擦引入基线漂移 |
EMG |
肌电 | 有,注明为右斜方肌 | 肩颈肌肉紧张度,与握持、转向相关 | 采样配置差异极大,部分记录仅低速率 |
hand GSR |
手部皮肤电 | 有 | 手掌汗腺活动,对应交感兴奋 | drive07 拼作 hand GSr,字符串匹配会漏 |
foot GSR |
足部皮肤电 | 有 | 足底汗腺活动,与手部形成对照 | 鞋袜与踏板接触带来额外压力变化 |
RESP |
呼吸 | 有,摘要单列 | 呼吸节律与深度 | 采样配置两种,需分别处理 |
HR |
心率 | 无,仅见于头文件 | 由心电导出的瞬时心率 | 单位声明为 bpm,是少数带单位的通道 |
marker |
事件标记 | 无,仅见于头文件 | 由实验者按下的事件时刻 | 稀疏、含义未文档化,drive01 与 drive03 缺失 |
七种通道里,只有呼吸在官方摘要中被单独列为一个主题词,皮肤电、心电、肌电则合并在多参数的说法下。这不是遗漏,而是因为页面本身极短:摘要一段、数据描述两段、参考文献两行,全部正文加起来不足两百词。真正可用的结构信息,大部分只能从头文件读出来。
2.3 一条记录的完整解剖
以 drive05 为例,头文件共八行,逐行读下来就是这份语料的全部结构。
#-- 取头部文件
curl -sL https://physionet.org/files/drivedb/1.0.0/drive05.hea
#-- 输出形状如下(逐行对照 §2.2 的字段表)
#-- drive05 7 15.5 78367
#-- drive05.dat 16x32 1000 16 0 -49 -19117 0 ECG
#-- drive05.dat 16 1000 16 0 373 14481 0 EMG
#-- drive05.dat 16x2 1000 16 0 6252 -29034 0 foot GSR
#-- drive05.dat 16x2 1000 16 0 10955 5828 0 hand GSR
#-- drive05.dat 16 1/bpm 16 0 89 30902 0 HR
#-- drive05.dat 16 100 16 0 1248 -21170 0 marker
#-- drive05.dat 16x2 100 16 0 3378 -13640 0 RESP
首行 drive05 7 15.5 78367 的四个数字依次是:七路通道、每秒十五点五帧、共七万八千三百六十七帧。用总帧数除以帧率,得到约五千零五十六秒,也就是八十四分钟,落在官方所说六十五到九十三分钟的区间里。
真正的采样率不在首行,而在各通道行的 16xN 里。心电是每帧三十二次,乘帧率得到每秒四百九十六次;足部与手部皮肤电是每帧两次,得到每秒三十一次;呼吸同样是三十一次;心率与标记则每帧一次。这种"帧率乘复用因子"的设计,是老一代采集设备节省存储的常用手法,代价是读取端必须显式展开。
import wfdb
#-- 只读头文件,不动二进制,先确认结构
h = wfdb.rdheader('drive05', pn_dir='drivedb')
print(h.fs, h.sig_len, h.n_sig) #-- 15.5 78367 7
for name in h.sig_name:
print(name)
#-- 关键:smooth_frames 默认 True,会把多采样通道压回帧率
rec_raw = wfdb.rdrecord('drive05', pn_dir='drivedb', smooth_frames=False)
print(rec_raw.d_signal.shape)
第二段代码里的 smooth_frames=False 不是可选项,而是必需项。默认值 True 会按帧把多采样通道平滑成单点,肌电与皮肤电的高频细节会被直接抹掉。很多人第一次读这个库时得到的肌电"只有十几赫兹",原因就在这里。
2.4 逐记录的通道与采样清单
十八个记录不是同一套模板刻出来的。下表逐条列出每段有哪些通道,空位表示该记录没有这一路。
| 记录 | 通道数 | 帧率 | ECG | EMG | 足部 GSR | 手部 GSR | RESP | HR | marker |
|---|---|---|---|---|---|---|---|---|---|
| drive01 | 6 | 15.5 | 有 | 有 | 有 | 有 | 有 | 有 | 无 |
| drive02 | 5 | 15.5 | 有 | 无 | 有 | 无 | 有 | 有 | 有 |
| drive03 | 4 | 31 | 有 | 无 | 有 | 有 | 有 | 无 | 无 |
| drive04 | 6 | 15.5 | 有 | 无 | 有 | 有 | 有 | 有 | 有 |
| drive05 | 7 | 15.5 | 有 | 有 | 有 | 有 | 有 | 有 | 有 |
| drive06 | 7 | 15.5 | 有 | 有 | 有 | 有 | 有 | 有 | 有 |
| drive07 | 7 | 15.5 | 有 | 有 | 有 | 有 | 有 | 有 | 有 |
| drive08 | 7 | 15.5 | 有 | 有 | 有 | 有 | 有 | 有 | 有 |
| drive09 | 7 | 15.5 | 有 | 有 | 有 | 有 | 有 | 有 | 有 |
| drive10 | 7 | 15.5 | 有 | 有 | 有 | 有 | 有 | 有 | 有 |
| drive11 | 7 | 15.5 | 有 | 有 | 有 | 有 | 有 | 有 | 有 |
| drive12 | 7 | 15.5 | 有 | 有 | 有 | 有 | 有 | 有 | 有 |
| drive13 | 6 | 15.5 | 有 | 有 | 有 | 无 | 有 | 有 | 有 |
| drive14 | 7 | 15.5 | 有 | 有 | 有 | 有 | 有 | 有 | 有 |
| drive15 | 7 | 15.5 | 有 | 有 | 有 | 有 | 有 | 有 | 有 |
| drive16 | 7 | 15.5 | 有 | 有 | 有 | 有 | 有 | 有 | 有 |
| drive17a | 7 | 15 | 有 | 有 | 有 | 有 | 有 | 有 | 有 |
| drive17b | 7 | 15.5 | 有 | 有 | 有 | 有 | 有 | 有 | 有 |
把这套表按帧率与复用因子换算成每秒点数,差异更直观。下表左半边是头文件原文,右半边是按原文乘积得到的每秒点数,用于工程上规划内存与滤波设计。
| 记录 | 通道 | 复用因子 | 换算每秒点数 | 备注 |
|---|---|---|---|---|
| drive01 | ECG | 32 | 496 | 全库心电的常见配置 |
| drive01 | EMG | 128 | 1984 | 全库唯一的高采样肌电 |
| drive03 | ECG | 16 | 496 | 帧率翻倍而因子减半,结果一致 |
| drive05 | ECG | 32 | 496 | 与 drive01 相同 |
| drive05 | EMG | 1 | 15.5 | 多数记录的肌电只有帧率量级 |
| drive12 | ECG | 23 | 356.5 | 复用因子非二次幂,全库仅此一例 |
| drive15 | ECG | 31 | 480.5 | 同上,属异常配置 |
| drive05 | GSR、RESP | 2 | 31 | 双部位皮肤电与呼吸通常同速 |
| drive05 | HR | 1 | 15.5 | 心率序列本身是导出量,无需高采样 |
| drive03 | ECG、GSR、RESP | 1、1、1 | 31 | 该记录无复用,全部通道同速 |
这张表暴露了一个容易被忽略的事实:全库只有心电的采样率相对稳定在每秒四百九十六点附近,其余通道的采样配置相当随意。想做多通道对齐,必须逐记录、逐通道读取复用因子,不能假设一个全局采样率。
2.5 与同类资源的字段差异
把本库和三类最常被拿来比较的资源并排放,字段层面的差异比规模差异更影响接入手感。
| 维度 | DriveDB | 眼底 DRIVE | 实验室应激库(如 WESAD 一类) | 常规心电库 |
|---|---|---|---|---|
| 模态 | 多通道外周生理 | 彩色眼底图像 | 多通道外周生理 | 心电 |
| 记录单位 | 一段连续驾驶 | 一张图像 | 一段实验协议 | 一段导联记录 |
| 标签 | 无 | 有,双人血管掩膜 | 有,四类情境 | 有,逐搏注释 |
| 通道一致性 | 逐记录 4–7 路,不齐 | 图像尺寸统一 | 协议固定,通道统一 | 导联数固定 |
| 采样一致性 | 三种帧率、七种复用因子 | 不适用 | 通常统一 | 通常统一 |
| 元信息 | 无人口学字段 | 有图像级分组 | 有受试者编号与问卷 | 有患者信息 |
| 接入成本 | 高,需逐记录适配 | 低,读图即可 | 中,读协议即可 | 低,读注释即可 |
§3 它的真实身份
3.1 三个名字,三样东西
混淆几乎全部来自缩写。把三个名字摊开写,问题就消失了。
| 名称 | 全称 | 领域 | 内容 | 发布方 |
|---|---|---|---|---|
| DriveDB | Stress Recognition in Automobile Drivers | 情感计算、生理信号 | 17 段实车驾驶多通道生理记录 | MIT 情感计算组,PhysioNet 托管 |
| DRIVE | Digital Retinal Images for Vessel Extraction | 医学影像、眼底 | 四十张眼底彩照与血管掩膜 | 荷兰 Utrecht,2004 年 |
| drivedb | PhysioNet 的库名,即上表第一行 | 同第一行 | 同第一行 | 同第一行 |
第二行那个数据集在中文语境里通常直接叫"DRIVE 数据集"或"DRIVE 挑战赛",是视网膜血管分割事实上的起点:四十张四十五度免散瞳眼底彩照,训练与测试各二十张,配两名标注者的像素级血管掩膜,另有视盘掩膜与视野掩膜。它的名字来自项目全称的首字母,与驾驶毫无关系。
第三行只是第一行在 PhysioNet 上的目录名。访问 physionet.org/content/drivedb/ 得到的页面标题是 Stress Recognition in Automobile Drivers,页面摘要第一句写的是健康志愿者在波士顿开车。这就是判定实体身份最直接的证据:看页面标题,不看目录名。
3.2 它在应激计算史上的坐标
把时间轴拉直,这份数据的位置相当靠前。2000 年前后,可穿戴生理采集还处在自制硬件的阶段,能连续记录多路信号并保持数小时稳定的设备,基本只存在于少数实验室。Healey 的工作正是在这个条件下完成的:自己搭采集装置,自己设计路线,自己招募志愿者,把车变成一个移动的记录舱。
它的学术输出有两条线。一条是 2000 年的博士论文,题为关于从生理信号做可穿戴与车载情感识别,把方法、硬件与实验设计写得最完整;另一条是 2005 年发表在 IEEE 智能交通系统汇刊上的期刊论文,卷六第二期,页码一百五十六到一百六十六,是这份数据被引用时最常挂的那一篇。两条线共用同一批数据,但侧重不同:论文讲结论,学位论文讲过程。
| 时间 | 事件 | 意义 |
|---|---|---|
| 2000 年 | 博士论文完成 | 采集方法、装置与实验设计的最完整记录 |
| 2005 年 | 期刊论文发表 | 数据被引用的主要入口 |
| 2008 年 5 月 15 日 | 上传 PhysioNet,编为 1.0.0 | 从实验室资产变成公共语料 |
| 2008 年至今 | 未再改版 | 单一版本,引用稳定,但也停止了维护 |
3.3 谁做了它,为什么公开
官方页面用一句话交代了来源:这份数据库由其创建者 Jennifer Healey 贡献给 PhysioNet。没有致谢名单,没有资助编号,没有伦理审批说明。这三项缺失在今天看来是合规上的空白,但在 2008 年的开放数据实践里并不罕见。
公开的动机,页面没有写。能确认的只有结果:原始的压力评分没有随数据一起发布。这是本文必须反复强调的边界——不是评分在别处可得,而是官方明确说不可得。任何声称拥有"官方标签"的版本,都需要被追问来源。
| 身份要素 | 官方是否给出 | 具体内容 |
|---|---|---|
| 采集者 | 给出 | Jennifer Healey |
| 所属机构 | 未直接给出,可由论文推知 | MIT 媒体实验室情感计算组 |
| 资助来源 | 未给出 | 无 |
| 伦理审批 | 未给出 | 无 |
| 受试者人数 | 未给出 | 只有 17 段实验 |
| 压力评分 | 明确否定 | 不可得 |
3.4 身份层面的四个易错点
第一,把库名当全名。drivedb 是目录名,正式名称是 Stress Recognition in Automobile Drivers,引用时应写全名加版本号。
第二,把论文年份当数据年份。论文发表于 2005 年,数据采集在更早,上传 PhysioNet 在 2008 年。三个时间点各有各的用途:引用用 2005,取数用 2008,理解设计背景要回到 2000 年的学位论文。
第三,把"公开"理解为"完整"。公开的是信号,不是研究资料。评分、问卷、路线图、设备参数、受试者信息都没有随之开放。
第四,把"没有标签"理解为"数据质量差"。这两件事无关。信号本身是完整的,缺的是监督信号,原因很可能是当年没有形成可复用的评分体系,而非采集失败。
§4 质量与特色
4.1 唯一不可替代的东西:真实道路
如果只看规模,这份语料几乎没有竞争力:十七段、一百多兆、没有标签。它真正的稀缺性在于条件——同一个驾驶员的同一段行程里,同时存在市区拥堵、路口转弯、匝道汇入、高速巡航这几种负荷截然不同的情境,而生理信号是连续不断的。
实验室范式很难复制这一点。心算任务可以把难度调高,但它不涉及持续的手眼协调;公开演讲能诱发强烈的交感反应,但它没有方向盘和踏板。驾驶是少数同时要求认知负荷、感觉运动控制与风险预期的日常活动,而这种组合恰好是座舱感知最想捕捉的对象。
| 特色 | 具体表现 | 为什么稀缺 |
|---|---|---|
| 连续真实驾驶 | 单段最长九十三分钟,全程不断 | 实验室范式通常只有几分钟到十几分钟 |
| 情境自然切换 | 市区与高速在同一段行程内交替 | 可控实验很少把两种路况串在一次记录里 |
| 多部位皮肤电 | 手部与足部同时记录 | 多数库只测一处,无法做部位对照 |
| 双模态肌肉活动 | 右斜方肌肌电与驾驶操作直接相关 | 与握持、转向的力学负荷挂钩 |
| 早期硬件样本 | 2000 年前后的传感器与采集链路 | 今天无法复现,属于历史标本 |
4.2 三条硬约束
第一条是通道不齐。全库七种通道,没有任何一段同时具备全部七种。drive03 只有四路,drive01 与 drive03 缺事件标记,drive02 与 drive04 缺肌电。批量处理时若按固定通道列表读取,程序会在个别记录上抛错,或者更糟——静默按位置对齐,把呼吸读成心率。
第二条是单位缺失。头文件里只有心率通道声明了 bpm,其余通道的增益后面没有斜杠单位。这意味着心电的一千、肌电的一千到一万、标记通道的一百,都只能当作相对比例的换算系数,不能直接声称"这是毫伏"。跨记录比较绝对幅值是不安全的。
第三条是元信息为零。头文件没有注释行,没有受试者编号,没有年龄性别,没有设备型号。所有关于"谁在开、开什么车、走哪条路"的信息,都只能来自论文描述,而论文描述是概括性的,无法落到单条记录。
| 约束 | 受影响的用法 | 规避办法 |
|---|---|---|
| 通道不齐 | 批量读取、固定输入维度的模型 | 先建通道存在性矩阵,缺失通道补零并加掩码 |
| 单位缺失 | 绝对幅值比较、跨库拼接 | 只用相对变化或做逐记录 z 分数 |
| 元信息为零 | 分层分析、公平性评估、受试者划分 | 以记录为最小单位,不做人群推断 |
| 无注释文件 | 事件级分析 | 用标记通道或信号突变点自建事件表 |
| 版本冻结 | 依赖官方修复的期望 | 自行维护勘误清单 |
4.3 案例:drive03 的四通道残本
drive03 是理解这份语料异构性的最好样本。它的头文件首行是 drive03 4 31 172447——只有四路通道,帧率却是每秒三十一次,几乎是其他记录的两倍,总帧数十七万余,除以帧率得到约五千五百六十二秒,也就是九十三分钟,恰好是官方所述时长的上限。
四路通道分别是心电、足部皮肤电、手部皮肤电和呼吸。没有肌电,没有事件标记,也没有独立的心率序列。心电的复用因子是十六而不是常见的三十二,乘上翻倍的帧率,每秒仍是四百九十六点,与全库保持一致。这说明采集端在帧率与复用因子之间做过权衡,而权衡的规则没有文档。
import wfdb
import numpy as np
h = wfdb.rdheader('drive03', pn_dir='drivedb')
print(h.fs, h.sig_len, h.n_sig) #-- 31 172447 4
print(h.sig_name) #-- 四路,无 EMG、无 marker
#-- 缺通道的记录必须单独走一条分支,不能与其他记录共用同一份通道表
need = ['ECG', 'EMG', 'foot GSR', 'hand GSR', 'RESP', 'HR', 'marker']
missing = [c for c in need if c not in h.sig_name]
print(missing) #-- ['EMG', 'HR', 'marker']
这个案例的价值在于它同时否定了三种想当然。第一,不能假设所有记录都有同一套通道;第二,不能假设帧率统一,三十一赫兹的记录混在十五点五赫兹的记录里;第三,不能假设时长一致,九十三分钟与二十九分钟同处一库。§2.4 的清单表之所以必要,理由就在这里。
同样的异构性还出现在记录内部。drive07 的手部皮肤电通道名写作 hand GSr,末尾的字母是小写;其余记录都是 hand GSR。用字符串精确匹配的代码会在这一条记录上静默丢失整路通道,而不会报错。drive12 的心电复用因子是二十三,drive15 是三十一,都不是二的幂,说明这两段记录的采集配置与其他记录不同源。§4.3 的案例因此不只是一个异常记录,而是整份语料"逐记录适配"这一要求的缩影。
4.4 与合成与实验室范式的对照
| 对照项 | 真实驾驶(本库) | 实验室诱发范式 | 合成或仿真信号 |
|---|---|---|---|
| 生态效度 | 高 | 低到中 | 无 |
| 标注可得性 | 无 | 高 | 完全可控 |
| 伪迹来源 | 真实且多样 | 少 | 人为设定 |
| 可复现性 | 低,路线与交通不可复现 | 高 | 最高 |
| 适合的任务 | 表征学习、质量研究 | 分类、检测 | 算法单元测试 |
| 主要风险 | 无标签、样本少 | 场景失真 | 与真实分布脱节 |
§5 怎么拿到与怎么读
5.1 三个入口
官方提供三条取数入口,按使用场景选择即可。第一种是整包下载,适合一次拿全;第二种是逐文件目录,适合只取几段;第三种是对象存储同步,适合在服务器上批量拉取。此外,wfdb 工具箱支持不落盘的流式读取,适合边读边算。
| 入口 | 地址形态 | 适用场景 | 注意 |
|---|---|---|---|
| 项目页 ZIP | 项目页上的下载按钮 | 本地一次性取全 | 一百多兆,解压后同名目录 |
| 逐文件目录 | files/drivedb/1.0.0/ |
只取少数记录 | 需自行拼接 URL |
| AWS 开放桶 | s3://physionet-open/drivedb/1.0.0/ |
服务器批量同步 | 免签名,需 AWS 命令行工具 |
| wfdb 流式 | pn_dir='drivedb' |
边读边算,不落盘 | 每次调用都会发起网络请求 |
5.2 逐文件下载与完整性核对
#-- 建目录并取清单
mkdir -p drivedb && cd drivedb
curl -sL https://physionet.org/files/drivedb/1.0.0/RECORDS -o RECORDS
#-- 按清单逐个取头文件与信号文件
while read -r r; do
curl -sL "https://physionet.org/files/drivedb/1.0.0/${r}.hea" -o "${r}.hea"
curl -sL "https://physionet.org/files/drivedb/1.0.0/${r}.dat" -o "${r}.dat"
done < RECORDS
#-- 官方提供 SHA256SUMS.txt,可逐条比对
curl -sL https://physionet.org/files/drivedb/1.0.0/SHA256SUMS.txt -o SHA256SUMS.txt
sha256sum -c SHA256SUMS.txt 2>/dev/null | tail -5
清单共十八行,最后一行是 drive17b。这个文件的行为很规整,每行以换行结束,用行计数不会出错;但与某些心电库不同,它没有表头,也没有注释行,直接逐行读即可。
5.3 读取与帧平滑的陷阱
import wfdb
import numpy as np
def load_native(name):
"""按原始复用因子读取,不做帧平滑。"""
rec = wfdb.rdrecord(name, pn_dir='drivedb', smooth_frames=False)
hdr = wfdb.rdheader(name, pn_dir='drivedb')
#-- 每个通道的每秒点数 = 帧率 x 复用因子
rates = {}
for i, nm in enumerate(rec.sig_name):
spf = rec.samps_per_frame[i] if hasattr(rec, 'samps_per_frame') else 1
rates[nm] = hdr.fs * spf
return rec, rates
rec, rates = load_native('drive01')
print(rates)
这段代码的关键在两处。smooth_frames=False 保住原始采样;samps_per_frame 用来还原每通道的真实速率。如果所用版本的工具箱没有暴露这个属性,就退回读头文件的 16xN 字段自己解析,解析规则在 §2.2 的字段表里。
另一处陷阱是帧数与点数的区别。sig_len 是帧数,不是某一路通道的采样点数。对心电而言,总点数等于帧数乘三十二;对心率而言,总点数等于帧数。混用这两个概念,做时间轴对齐时会整体偏移。§4.3 的案例里那条帧率翻倍的记录,正是最容易在这里出错的对象:帧率三十一而心电因子十六,若直接把帧数当点数,整段信号的时间长度会被算短一半。
5.4 通道对齐与重采样
import numpy as np
from scipy.signal import resample_poly
def align(rec, rates, target=64):
"""把各通道重采样到统一速率,返回 (时间轴, 通道字典)。"""
out = {}
for i, nm in enumerate(rec.sig_name):
src = rates[nm]
x = rec.d_signal[:, i].astype('float64')
if abs(src - target) < 1e-6:
out[nm] = x
continue
ratio = target / src
up, down = int(round(ratio * 1000)), 1000
out[nm] = resample_poly(x, up, down)
n = min(len(v) for v in out.values())
t = np.arange(n) / target
return t, {k: v[:n] for k, v in out.items()}
把目标速率定在六十四赫兹是一个工程折中:高于多数通道的原始速率,低于心电的四百九十六赫兹,既能保留皮肤电与呼吸的慢变成分,又不会让心电的存储膨胀。若研究重点是心率变异性,应保留心电原始速率单独处理,不要把 QRS 细节一起压掉。
5.5 标记通道能做什么
十六段记录里含 marker 通道,drive01 与 drive03 没有。标记通道的增益是一百,每帧一点,物理含义是实验者在特定时刻按下按钮留下的脉冲。官方页面没有说明每个脉冲对应什么事件,也没有给出编码表。
这意味着标记只能当作"事件发生了"的粗线索,不能当作语义标签。可行的用法有两种:一是用脉冲位置切分行程阶段,再人工对照论文里描述的路段顺序;二是用脉冲密度作为"操作繁忙程度"的粗糙代理,但必须明确这是代理而非真值。
| 用法 | 可行性 | 前提 | 风险 |
|---|---|---|---|
| 切分行程阶段 | 可行 | 需人工对照路段顺序 | 阶段边界不精确 |
| 作为操作负荷代理 | 谨慎可行 | 需在方法里说明代理性质 | 标记密度与负荷未必同向 |
| 当作应激真值 | 不可行 | 无编码表、无语义说明 | 结论无法成立 |
| 跨记录统一解析 | 不可行 | 两段记录根本无此通道 | 代码需分支处理 |
5.6 先做质检,再谈建模
import numpy as np
import wfdb
def qc(name):
rec = wfdb.rdrecord(name, pn_dir='drivedb', smooth_frames=False)
rows = []
for i, nm in enumerate(rec.sig_name):
x = rec.d_signal[:, i].astype('float64')
rows.append({
'ch': nm,
'n': len(x),
'flat': float(np.mean(np.abs(np.diff(x)) < 1e-9)),
'p99': float(np.percentile(np.abs(x), 99)),
})
return rows
for r in ['drive03', 'drive07', 'drive13', 'drive14']:
print(r)
for row in qc(r):
print(' ', row)
这段质检脚本只报三个量:长度、相邻点完全相等的比例、绝对值的九十九分位。第一个量用来发现通道长度不一致,第二个用来发现电极脱落导致的平直段,第三个用来发现幅值异常。三者都不涉及标签,也不涉及分布推断,纯粹是接数前的必要体检。
§6 与库内其他词条的关系
6.1 关系图谱
站内与这份语料有关联的条目分三类:同名混淆类、场景相近类、模态相近类。三类的关系强度差别很大,混在一起看容易误判。
| 库内词条 | 关系类型 | 关系强度 | 差异要点 |
|---|---|---|---|
| DRIVE 视网膜血管分割金标准 | 同名混淆 | 无实质关系 | 眼底彩照与血管掩膜,与本库无任何交集 |
| 楼梯与驾驶路况原始加速度 | 场景相近 | 中 | 同为驾驶场景,但只记加速度,无生理通道 |
| WESAD 穿戴式压力与情感 | 模态相近 | 强 | 同为多通道应激生理,但有四类情境标签 |
| 真实考场可穿戴生理 | 模态相近 | 中 | 同为真实场景应激,但有考试分段与成绩 |
| 66 名成人应激与自评量表 | 模态相近 | 中 | 同为应激,但有量表标签与 Fitbit 设备 |
| INCART 十二导联心律失常库 | 模态相近 | 弱 | 同为 WFDB 与心电,但目标任务是心律失常 |
| DEAP 多模态情绪 | 模态相近 | 弱 | 同为情感计算语料,但有自评维度标签 |
| PPG-DaLiA 日常活动可穿戴 | 模态相近 | 弱 | 同为日常场景多模态,但任务是心率估计 |
6.2 检索路径
若从站内找这份语料,走"生理信号 → 可穿戴传感"这条标签链最快;若从"驾驶"这个场景切入,走加速度那条线会先撞上楼梯与驾驶路况那份数据;若从"应激"切入,会先撞上 WESAD 与考场应激两份,它们都有标签,容易被误认为更合适。
| 你的起点 | 会先遇到 | 是否该停 | 建议 |
|---|---|---|---|
| 搜 DRIVE 数据集 | 眼底血管分割词条 | 不该 | 那是另一个数据集,见 §3.1 |
| 搜驾驶场景 | 驾驶路况加速度 | 可停 | 若只需运动信息,那份更轻 |
| 搜应激生理 | WESAD、考场应激 | 可停 | 若有监督需求,那两份更合适 |
| 搜无标签真实语料 | 本词条 | 该停 | 这是它不可替代的位置 |
| 搜 WFDB 多通道 | INCART、本词条 | 视任务 | 心律失常选前者,驾驶应激选后者 |
6.3 与眼底 DRIVE 的区隔必须写清楚
这两个数据集在中文检索里几乎必然相遇,所以区隔不能只写一句"不是同一个"。下表把可能被混淆的每一个维度都摆出来。
| 维度 | 本库(drivedb) | 眼底 DRIVE |
|---|---|---|
| 全称 | Stress Recognition in Automobile Drivers | Digital Retinal Images for Vessel Extraction |
| 数据类型 | 多通道时间序列 | 二维彩色图像 |
| 采集对象 | 健康志愿者的驾驶过程 | 糖尿病患者的视网膜 |
| 采集地点 | 美国波士顿 | 荷兰 Utrecht |
| 发布年份 | 2008 年上传 | 2004 年发布 |
| 样本单位 | 一段驾驶记录 | 一张眼底照片 |
| 标签 | 无 | 双人像素级血管掩膜 |
| 主任务 | 应激表征、信号质量 | 血管分割 |
| 许可 | ODC-BY 1.0 | 研究用途,需申请或按原始条款 |
| 站内词条 | 本词条 | DRIVE 视网膜血管分割金标准 |
真正需要警惕的场景是文献综述。有些综述在列举"DRIVE 数据集"时会把两个都列进去,因为它们共享同一个缩写词根。看到一篇讲视网膜血管的论文引用 drivedb,基本可以判定引用错误;反过来,看到一篇讲驾驶应激的论文引用 Utrecht 的眼底数据,同样荒谬。
§7 质量评估与局限性
7.0 阅读本节前的一个前置校正
在给这份语料打分之前,需要先把评价标尺换掉。多数数据集评估的默认假设是"这份数据能不能直接训练模型",按这个标尺,本库几乎在所有维度都不及格:没有标签、样本极少、通道不齐、单位缺失。但这不是它的设计目标。
它的设计目标是把真实道路这个条件固定下来,并让它可被公开复现地访问。按这个标尺,它的完成度相当高:真实驾驶、连续多小时、多部位生理同步、开放许可、版本冻结。误判的来源正是把两种标尺混用——用监督学习的标准去衡量一份原料型语料,得到的结论必然是"不可用",而这个结论对使用者没有任何帮助。
下面的评分同时给出两个视角,第一个是作为监督学习数据源,第二个是作为真实场景原料。两个视角的分数差距本身就是这份语料的性格说明。
7.1 五维评分
| 维度 | 作为监督数据源 | 作为真实场景原料 | 理由 |
|---|---|---|---|
| 数据规模 | 1 | 2 | 十七段、一百多兆,任何视角下都偏小 |
| 标注质量 | 1 | 1 | 无标签,两个视角同分 |
| 任务适配 | 2 | 5 | 监督任务几乎不可用,原料价值极高 |
| 文档完整 | 2 | 2 | 页面极短,无设备、无协议细节、无人口学 |
| 可获取性 | 5 | 5 | 免注册、许可宽松、体量小、链接稳定 |
按 DAIMS 的常用维度看,作为监督数据源合计十一分,作为真实场景原料合计十五分,满分均为二十五。分差的来源只有一个:任务适配。这也解释了为什么它在文献里的出现方式往往是"用了它的信号",而不是"在它上面刷了指标"。
7.2 分数的具体依据
规模一项给低分,理由不是绝对体积,而是统计单元太少。十七段记录意味着任何受试者层面的分析都只有十几个样本,置信区间宽到无法支撑比较。一百多兆的体积在今天的存储条件下不算什么,但它对应的独立观测数极少。
文档一项给低分,理由更直接。官方页面正文不足两百词,没有设备型号、没有电极位置、没有采样链路、没有受试者信息、没有协议时间表。想还原采集条件,只能回到 2000 年的学位论文,而那篇论文描述的是当年那一批实验的整体设计,未必与公开的每一条记录严格对应。
可获取性给满分没有争议。免注册、直链、开放许可、体量小、十八个文件、清单规范、还有校验和文件。这在一众需要申请的数据集里属于最省事的一档。
| 评分项 | 扣分点 | 可缓解方式 |
|---|---|---|
| 数据规模 | 独立观测只有十七段 | 与实验室库混合使用,只把它当域外样本 |
| 标注质量 | 完全无标签 | 自建弱标签,并在论文里声明构造方式 |
| 文档完整 | 缺设备与协议细节 | 回溯 2000 年的学位论文补背景 |
| 任务适配 | 仅对表征与质量研究友好 | 明确研究问题后再决定是否使用 |
7.3 已知的、可枚举的偏差
选择偏差。 志愿者是健康成年人,愿意参与一项需要装戴多路传感器并驾驶数小时的实验。这类人群在风险偏好、驾驶经验、对监测的耐受度上都不同于一般驾驶员。官方没有公布招募标准,无法判断筛选强度。
地理偏差。 全部采集在波士顿及周边完成。道路几何、交通密度、驾驶习惯、天气条件都属于美国东北部的城市形态。把在此训练的模型直接用于其他地区,需要额外验证。
时间偏差。 采集发生在 2000 年前后,车辆、传感器、交通环境都是那个年代的。今天的车辆在隔音、悬架、辅助驾驶上的差异,会改变驾驶员的生理负荷结构。
设备偏差。 肌电通道的增益在一千到一万之间变动,皮肤电的测量部位分手脚两处,呼吸通道的复用因子有两种。这些差异不一定是错误,但会让跨记录的绝对幅值不可比。
重复风险。 drive13 与 drive14 除手部皮肤电外,其余六路的初值、校验和、总帧数完全一致。这强烈提示两条记录来自同一次采集的两次导出,drive13 缺了手部皮肤电那一路。若把十八条记录当作十八个独立样本,会引入重复计数。
| 偏差类型 | 表现 | 影响 | 处理建议 |
|---|---|---|---|
| 选择偏差 | 健康、自愿、能耐受长时佩戴 | 不代表一般驾驶员 | 只做方法验证,不做人群推断 |
| 地理偏差 | 单一城市、单一国家 | 跨地区迁移需重验 | 作为域外测试而非训练主力 |
| 时间偏差 | 2000 年前后的车辆与设备 | 与当代硬件脱节 | 明确标注为历史样本 |
| 设备偏差 | 增益与部位不一致 | 绝对幅值不可比 | 逐记录归一化后用相对量 |
| 重复风险 | drive13 与 drive14 高度重合 | 独立样本数被高估 | 二者只取其一,或明确合并 |
7.4 外部验证矩阵
这份语料能被哪些外部证据支撑,逐项列清比笼统说"有文献支持"更有用。
| 验证项 | 是否有外部证据 | 证据形态 | 可信度 |
|---|---|---|---|
| 数据确为实车驾驶采集 | 有 | 官方摘要与论文标题 | 高 |
| 通道类型与数量 | 有 | 头文件可逐条核对 | 高 |
| 时长区间 | 有 | 官方描述与帧数换算互证 | 高 |
| 受试者人数 | 无 | 官方未公布 | 低 |
| 压力评分存在性 | 有,且为否定 | 官方明确写不可得 | 高 |
| 采集设备型号 | 无 | 官方未公布 | 低 |
| 标注一致性 | 不适用 | 无标注 | 不适用 |
| 训练测试划分 | 无 | 官方未提供划分 | 低 |
7.5 它为何能持续:稀缺条件的独占
一份没有标签、十七段、十八年未更新的数据集,按理早该被遗忘。它没有,原因不在数据本身有多好,而在于它占住了一个别人不愿重复的位置:真实道路、连续多小时、多部位外周生理、完全开放。
复制这个条件的成本极高。要重新做一遍,需要伦理审批、车辆改装、多路同步采集设备、愿意开几小时车的志愿者,以及一套能保证信号质量的流程。做出来之后,还得愿意无偿公开。愿意付这笔成本的人本来就少,愿意在付完之后放弃标签的就更少。于是这份语料成了事实上的一手史料:新方法要证明自己在真实驾驶场景下站得住,绕不开它。
§8 生态位与历史
8.1 一条从实验室走向道路的线索
情感计算这个领域在九十年代末的一段核心争论是:实验室里诱发的情绪,能不能代表真实生活中的情绪。这场争论推动了整整一代"走出实验室"的采集尝试,驾驶是其中最受欢迎的场景之一,因为它同时具备生态效度与可操作性——受试者被固定在座位上,动作范围可控,而环境又足够复杂。
本库是这批尝试里最早被公开托管的一份。它的出现时间点很关键:2008 年,PhysioNet 已经在心电、脑电、重症监护几个方向积累了成熟的托管经验,但对"多参数外周生理 + 日常场景"这类语料还几乎没有收录。它算是开了个口子。
| 阶段 | 时间 | 特征 | 代表产物 |
|---|---|---|---|
| 装置自制期 | 1998–2001 | 采集硬件靠实验室自研 | 博士论文中的采集系统 |
| 结论输出期 | 2001–2005 | 方法定型,论文发表 | 智能交通系统汇刊论文 |
| 公共化期 | 2005–2008 | 数据整理上传,进入公共目录 | PhysioNet 1.0.0 |
| 冻结期 | 2008 至今 | 不再更新,成为稳定引用源 | 单一版本 |
8.2 与后续数据集的分工
后来的应激数据集大多走了另一条路:把协议标准化,把标签做扎实,把样本量做大。这条路解决了可训练性的问题,代价是场景被重新收进实验室或者半受控的日常。两者不是替代关系,而是分工。
| 代际 | 典型形态 | 强项 | 弱项 |
|---|---|---|---|
| 第一代(本库) | 真实场景、无标签、样本少 | 生态效度 | 不可直接训练 |
| 第二代 | 半受控协议、四类情境标签 | 可训练、可复现 | 场景简化 |
| 第三代 | 可穿戴长时监测、自评量表 | 标签丰富、周期长 | 设备与依从性干扰 |
按这个分代看,本库的位置很清楚:它是第一代的实物证据,不是被淘汰的旧版本。研究者在讨论"实验室范式是否失真"时,需要它作为对照;在做域外泛化时,需要它作为真实分布的一个取样点。
8.3 生态位:原料而不是产品
把站内相关词条按"原料—产品"排一排,本库在最靠原料的一端。它提供的是未经标注的原始波形,中间没有任何加工层。往右走一步是带弱标签的版本,再往右是带完整协议标签的实验室库,最右端是已经切好窗、分好折、配好基线的基准集。
| 位置 | 特征 | 站内对应 | 适合谁 |
|---|---|---|---|
| 原料端 | 原始波形,无标签 | 本词条 | 做表征、做质量、做方法学 |
| 弱标签端 | 由路况或信号推断的粗标签 | 无 | 做探索性分析 |
| 协议标签端 | 有明确情境分段的应激库 | WESAD 一类 | 做分类、做对比 |
| 基准端 | 固定划分与评测脚本 | 各类挑战赛数据集 | 做排行、做复现 |
8.4 它不会被替代的部分
有三件事,后来的数据集基本不会去做。第一,用 2000 年前后的硬件采一遍真实驾驶,这在物理上已经不可能。第二,把原始评分剔除后仍然公开信号,这种"只给原料"的做法在今天的数据治理环境下越来越少见。第三,保持十八年不改版,让引用永远指向同一份字节。
这三点合起来,构成了它的不可替代性。不是因为好,而是因为独特且不可复制。
§9 使用指引
9.1 三种角色的路径
| 角色 | 第一天 | 第一周 | 注意事项 |
|---|---|---|---|
| 生理信号研究者 | 读 §2.4 的通道清单,跑通 §5.3 的原生读取 | 建立逐记录的通道矩阵与速率表,做质检 | 不要用默认参数读,帧平滑会毁掉高频 |
| 座舱算法工程师 | 抽一段市区与一段高速做对照 | 量化两种路况下的生理差异,做域外检验 | 结论只能是相对的,幅值不可跨设备比较 |
| 教学与人因研究 | 用 §4.3 的案例讲异构性 | 让学生手工对齐一条记录的七路通道 | 强调无标签这一事实,避免误当分类作业 |
9.2 一条最短的可用流程
#-- 1. 取清单与前三条记录
cd /tmp && mkdir -p drive_demo && cd drive_demo
curl -sL https://physionet.org/files/drivedb/1.0.0/RECORDS -o RECORDS
head -3 RECORDS | while read -r r; do
curl -sL "https://physionet.org/files/drivedb/1.0.0/${r}.hea" -o "${r}.hea"
curl -sL "https://physionet.org/files/drivedb/1.0.0/${r}.dat" -o "${r}.dat"
done
ls -lh
import wfdb
import numpy as np
#-- 2. 读原生信号,确认每路速率
rec = wfdb.rdrecord('drive05', pn_dir='drivedb', smooth_frames=False)
hdr = wfdb.rdheader('drive05', pn_dir='drivedb')
print('帧率', hdr.fs, '帧数', hdr.sig_len, '通道', rec.n_sig)
for i, nm in enumerate(rec.sig_name):
print(i, nm, rec.d_signal[:5, i])
#-- 3. 取一段十分钟的皮肤电,做简单去趋势
x = rec.d_signal[:, rec.sig_name.index('hand GSR')].astype('float64')
seg = x[:int(hdr.fs * 600)]
detrended = seg - np.convolve(seg, np.ones(31) / 31, mode='same')
print(detrended.shape, float(np.std(detrended)))
这段流程刻意跳过了重采样与对齐,因为第一步要看的是"数据长什么样",不是"模型能不能跑"。把通道数、帧率、幅值范围三个量打印出来,比任何文档都直观。
9.3 引用方式
| 引用对象 | 内容 | 用途 |
|---|---|---|
| 数据集 | Stress Recognition in Automobile Drivers, version 1.0.0. PhysioNet. 2008. | 数据出处 |
| 原始论文 | Healey J A, Picard R W. Detecting stress during real-world driving tasks using physiological sensors. IEEE Transactions on Intelligent Transportation Systems, 2005, 6(2): 156–166. | 方法与结论出处 |
| 学位论文 | Healey J A. Wearable and automotive systems for affect recognition from physiology. MIT, 2000. | 采集细节出处 |
| 平台 | PhysioNet 平台综述,按官方页面引用按钮生成 | 托管平台出处 |
写论文时建议注明三点:使用的版本号(全库只有 1.0.0)、是否关闭了帧平滑、以及通道换算的方式。这三点决定了结果能不能被别人复现。
§10 AI 使用声明
| 项目 | 声明 |
|---|---|
| 文本生成 | 本文由 AI 辅助撰写,结构与事实由编辑把关 |
| 数字来源 | 规模、结构、边界三类数字来自 PhysioNet 官方页面与文件目录 |
| 文件核验 | RECORDS、十八个头文件、SHA256SUMS.txt 经直接访问确认 |
| 实体判定 | 以官方页面标题与摘要为准,判定为驾驶应激库而非眼底影像库 |
| 论文信息 | 仅核对 Crossref 的书目元数据与官方页面引用,未读全文 |
| 换算数字 | 每秒点数由帧率乘复用因子得出,非官方页面直接给出 |
| 未核验内容 | 受试者人数、设备型号、电极位置、标记通道的编码含义 |
| 图像 | 无配图;封面为生成式提示词,不含真实照片或波形截图 |
| 免责 | 本文不构成临床或安全建议;使用须遵守 ODC-BY 1.0 署名要求 |
常见误读(避坑清单)
| 说法 | 实际 | 证据 |
|---|---|---|
| 「drivedb 就是眼底 DRIVE」 | 完全不同的数据集 | 官方页面标题为 Stress Recognition in Automobile Drivers |
| 「它带压力评分」 | 官方明确说评分不可得 | 数据描述段末句原文否定 |
| 「它有十七名受试者」 | 官方只给十七段实验,人数未公布 | 页面无人口学字段,头文件无注释行 |
| 「它是十八个独立样本」 | drive13 与 drive14 高度重合 | 两段除手部皮肤电外校验和与帧数一致 |
| 「所有记录都有七路通道」 | 最少四路,最多七路 | drive03 头文件只声明四路 |
| 「采样率是 15.5 赫兹」 | 那是帧率,逐通道还要乘复用因子 | 头文件 16x32、16x128 等字段 |
| 「它没有注释文件所以数据不全」 | 信号完整,缺的是标签 | 十八个 .dat 与 .hea 齐全,无 .atr |
| 「通道名可以精确匹配」 | drive07 的手部皮肤电拼作 hand GSr |
该记录头文件第 5 行 |
| 「它可以直接做应激分类」 | 无标签,必须先自建标注协议 | 全库无任何标签文件 |
| 「它是健康人的正常基线」 | 健康志愿者在驾驶,不是静息基线 | 官方摘要描述的是驾驶过程 |
FAQ
Q1:PhysioNet 的 drivedb 是不是眼底血管分割那个 DRIVE?
不是。两者只是缩写撞车。本库全名是 Stress Recognition in Automobile Drivers,内容是实车驾驶时的心电、肌电、皮肤电与呼吸;眼底 DRIVE 的全名是 Digital Retinal Images for Vessel Extraction,四十张眼底彩照配血管掩膜,2004 年由荷兰 Utrecht 发布。数据模态、场景、机构都没有交集。
Q2:它带压力评分或应激等级标签吗?
不带。官方页面在数据描述段末尾写明原始研究的压力评分不可得。目录里只有 .hea 与 .dat,没有注释文件。任何带标签的版本都是第三方二次加工,使用时必须交代标签的构造方式。
Q3:一共多少受试者?
官方没有公布。页面只说有十七段实验,其中十六段完整,第十七号拆成 a、b 两段。这十七个编号是否对应十七个人,官方没有说明,头文件里也没有受试者编号。
Q4:为什么读出来的肌电只有十几赫兹?
因为多路信号按帧复用存储,读取工具的默认帧平滑会把每帧多采样的通道压回记录帧率。drive01 的肌电每帧采一百二十八次,默认读取后高频细节会被抹掉。要拿原始速率,必须关闭帧平滑,再按帧率乘复用因子换算。
Q5:没有标签还能做什么?
三类用法最实在:无监督的生理状态表征与聚类、自监督预训练的真实道路语料、信号质量与通道对齐的方法学试验床。要做有监督的应激识别,必须自建标注协议,并接受只有十七段样本这一事实。
Q6:能和 WESAD 这类实验室应激库混用吗?
可以对照,不能直接拼接训练。两者在场景、设备、皮肤电测量部位、标签定义上都不同,混用前要做通道语义映射与幅值归一化,否则模型学到的是设备差异而不是应激差异。
Q7:为什么有的记录没有事件标记?
官方没有解释。从数据本身看,drive01 与 drive03 的头文件里没有 marker 通道,其余十六段都有。做统一流程时必须为这两段写分支,否则会因通道缺失而报错或错位。
Q8:标记通道的每个脉冲代表什么?
官方没有给出编码表。能确认的只是它是实验者手动按下的脉冲,用于标记特定时刻。可用作切分行程阶段的粗线索,但不能当作语义标签,更不能当作应激真值。
Q9:通道的物理单位是什么?
只有心率通道在增益字段里声明了 bpm,其余通道没有单位。这意味着心电、肌电、皮肤电、呼吸的增益只能当相对换算系数,不能直接当作毫伏或其他物理量。跨记录比较绝对幅值不安全。
Q10:为什么 drive13 和 drive14 看起来一样?
两条记录除手部皮肤电外,其余六路的初值、校验和、总帧数完全一致,drive13 缺了手部皮肤电那一路。这提示是同一次采集的两次导出。把十八条当十八个独立样本会引入重复计数,实际独立单元更少。
Q11:许可允许商业使用吗?
ODC-BY 1.0 允许,包括商业用途,条件是署名。引用时写清数据集名称、版本与来源,具体条款以官方许可全文为准。
Q12:它还会更新吗?
从 2008 年 5 月发布 1.0.0 至今没有改版,官方也没有给出更新计划。采集已完成、论文已发表、数据已冻结,继续维护的动力很小。可以按"永久冻结"来规划依赖。
术语表
| 术语 | 解释 |
|---|---|
| WFDB | PhysioNet 使用的波形数据库格式,含头文件与信号文件 |
.hea |
纯文本头文件,声明通道、帧率、增益与校验和 |
.dat |
二进制信号文件,多通道按帧交错存放 |
| 帧率 | 每秒的帧数,不是每通道的采样率 |
| 复用因子 | 每帧内每个通道采样的次数,写作 16xN 的 N |
| 帧平滑 | 读取工具把多采样通道压回帧率的默认行为 |
| 增益 | ADC 整数与物理量之间的换算系数 |
| ADC 零值 | 零电平对应的整数值,换算前先减 |
| 校验和 | 采样点累加和,用于检测文件损坏 |
| 皮肤电反应 | 汗腺活动导致皮肤电导变化,反映交感兴奋 |
| GSR | Galvanic Skin Response,皮肤电反应的旧称 |
| EDA | Electrodermal Activity,皮肤电活动,与 GSR 同源 |
| 肌电 | 肌肉电活动,本库采集右斜方肌 |
| 斜方肌 | 颈肩部肌肉,与握持、转向的紧张度相关 |
| 呼吸带 | 记录胸腹起伏的传感装置,输出呼吸波形 |
| 心率变异性 | 相邻心搏间期的波动,反映自主神经调节 |
| 事件标记 | 实验者手动按下的脉冲,用于标记时刻 |
| 生态效度 | 实验条件与真实生活情境的接近程度 |
| 域外泛化 | 模型在训练分布之外的数据上的表现 |
| 自监督学习 | 用数据自身构造监督信号,无需人工标签 |
| 表征学习 | 学习数据的低维表示,供下游任务使用 |
| 情感计算 | 让机器识别与响应人类情绪状态的研究方向 |
| ODC-BY | 开放数据共享署名许可,允许商用需署名 |
| PhysioNet | 由 MIT 等机构维护的生物医学数据平台 |
附录 A:核心数字核对表
| 项 | 值 | 来源 | 来源层级 |
|---|---|---|---|
| 记录文件数 | 18 | 官方文件目录;RECORDS 逐行 | 官方文件 |
| 实验段数 | 17 | 官方页面数据描述段 | 官方页面 |
| 完整实验时长区间 | 65–93 分钟 | 官方页面数据描述段 | 官方页面 |
| drive17a 时长 | 29 分钟 | 官方页面数据描述段 | 官方页面 |
| drive17b 时长 | 25 分钟 | 官方页面数据描述段 | 官方页面 |
| 通道种类 | 7 | 十八个头文件汇总 | 官方文件 |
| 单记录通道数区间 | 4–7 | 十八个头文件汇总 | 官方文件 |
| 帧率取值 | 15、15.5、31 | 头文件首行第 3 字段 | 官方文件 |
| 未压缩体积 | 108.7 MB | 官方页面文件区 | 官方页面 |
| 版本号 | 1.0.0 | 官方页面版本栏 | 官方页面 |
| 发布日期 | 2008-05-15 | 官方页面 | 官方页面 |
| 数字对象标识 | 10.13026/C2SG6B | 官方页面 | 官方页面 |
| 许可 | ODC-BY 1.0 | 官方页面 | 官方页面 |
| 压力评分 | 不可得 | 官方页面数据描述段 | 官方页面 |
| 受试者人数 | 未公布 | 官方页面无此字段 | 未核实 |
| 采集设备型号 | 未公布 | 官方页面无此字段 | 未核实 |
附录 B:数字的来源分层
第一层:官方页面。 实验段数、时长区间、通道种类、体积、版本、日期、标识、许可、压力评分不可得。这些数字来自项目页的摘要段与数据描述段,是整个词条最硬的支撑。
第二层:官方文件。 记录清单的十八行、逐记录的通道数与通道名、帧率、复用因子、增益、帧数、校验和。这些来自 RECORDS 与十八个头文件的直接读取,可以逐字节复核。其中每秒点数不是文件里直接写的,而是帧率与复用因子的乘积,属换算值,已在 §2.4 标注。
第三层:论文与外部书目。 论文的期刊、卷期、页码来自官方页面给出的引用条目,并由 Crossref 的书目元数据交叉确认。论文的具体实验设计、受试者规模、设备参数没有进入本文的断言,因为未读全文。
第四层:未核实。 受试者人数、年龄性别构成、设备型号、电极位置、标记通道的编码含义、drive13 与 drive14 是否确为同一次采集。这些在正文里一律以"官方未公布"或"疑为"表述,不给确定结论。
附录 C:完整参考文献
| 编号 | 文献或资源 | 链接 | 用途 |
|---|---|---|---|
| 1 | Stress Recognition in Automobile Drivers v1.0.0 | https://physionet.org/content/drivedb/1.0.0/ | 全部规模、结构、边界数据的来源 |
| 2 | 该库文件目录 | https://physionet.org/files/drivedb/1.0.0/ | RECORDS、头文件、校验和文件 |
| 3 | Healey 与 Picard,2005,IEEE 智能交通系统汇刊 | https://doi.org/10.1109/TITS.2005.848368 | 方法与结论出处 |
| 4 | Healey 博士论文,MIT,2000 | 官方页面参考文献栏 | 采集装置与实验设计背景 |
| 5 | PhysioNet 平台综述 | https://doi.org/10.1038/s44360-026-00096-z | 托管模式与引用规范 |
| 6 | WFDB 格式规范 | https://physionet.org/physiotools/wfdb.shtml | 头文件字段语义 |
| 7 | 眼底 DRIVE 数据集(区隔对照) | 站内 DRIVE 词条 | §3.1 与 §6.3 的对比 |
| 8 | 楼梯与驾驶路况加速度(场景对照) | 站内对应词条 | §6.1 的驾驶场景对照 |
附录 D:任务代码
任务一:全库通道矩阵与速率表
import wfdb
import pandas as pd
rows = []
for r in wfdb.get_record_list('drivedb'):
h = wfdb.rdheader(r, pn_dir='drivedb')
for nm in h.sig_name:
rows.append({'record': r, 'channel': nm, 'frame_rate': h.fs})
df = pd.DataFrame(rows)
matrix = df.pivot_table(index='record', columns='channel',
values='frame_rate', aggfunc='first')
print(matrix.notna().sum())
print(matrix.shape)
matrix.to_csv('drivedb_channel_matrix.csv')
任务二:把一段记录转成规范长表
import wfdb
import numpy as np
import pandas as pd
def to_long(name, target=64):
rec = wfdb.rdrecord(name, pn_dir='drivedb', smooth_frames=False)
hdr = wfdb.rdheader(name, pn_dir='drivedb')
frames = []
for i, nm in enumerate(rec.sig_name):
spf = rec.samps_per_frame[i] if hasattr(rec, 'samps_per_frame') else 1
rate = hdr.fs * spf
x = rec.d_signal[:, i].astype('float64')
#-- 先按原始速率展开时间轴,再线性插值到目标速率
src_t = np.arange(len(x)) / rate
n = int(src_t[-1] * target) + 1
dst_t = np.arange(n) / target
frames.append(pd.DataFrame({
'record': name, 'channel': nm,
't': dst_t, 'v': np.interp(dst_t, src_t, x),
}))
return pd.concat(frames, ignore_index=True)
out = to_long('drive16')
print(out.groupby('channel')['v'].agg(['count', 'min', 'max']))
out.to_parquet('drive16_long.parquet', index=False)
第二段代码的插值是有损的,仅用于构造统一下游接口。若研究重点是心电形态或肌电频谱,应保留原始速率,在建模侧按通道分组处理,而不是在数据侧压到同一网格。
附录 E:如果只记五件事
| 序号 | 记住什么 | 为什么 |
|---|---|---|
| 1 | 它是驾驶应激生理库,不是眼底 DRIVE | 名字撞车,认错一次后面全错 |
| 2 | 十七段实验、十八个文件、无标签 | 这三个数字决定了它能做什么 |
| 3 | 帧率不是采样率,要乘复用因子 | 默认读取会丢掉高频肌电 |
| 4 | 通道不齐、单位缺失、元信息为零 | 批量处理前必须先建通道矩阵 |
| 5 | 它的价值在真实道路这个稀缺条件 | 当原料用,别当训练集用 |
编辑说明
核验时间为 2026 年 10 月 28 日。核对方式为直接访问 PhysioNet 项目页,逐条读取 RECORDS 与十八个头文件,并比对 SHA256SUMS.txt 是否存在;论文侧只核对 Crossref 的书目元数据与官方页面给出的引用条目,未读全文。实体判定依据是页面标题与摘要首段,而非目录名,因此可以确定它不是眼底影像数据集。文中所有"每秒点数"均为帧率与复用因子的乘积,属换算值而非官方直接给出的数字,已在 §2.4 与附录 B 分别标注。未覆盖的内容包括受试者人数与构成、设备型号与电极位置、标记通道的编码含义、以及 drive13 与 drive14 是否确为同一次采集——这些官方均未公布,文中只作"未公布"或"疑为"的表述,不做推断。规整性方面,RECORDS 每行以换行结束,不存在行计数偏差;头文件无注释行,故不存在可解析的患者字段。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- butqdb — 共享标签:生理信号 / 心电信号 / 可穿戴传感
- wearable-exercise-frailty — 共享标签:生理信号 / 心电信号 / 可穿戴传感
- ephnogram — 共享标签:生理信号 / 心电信号 / 可穿戴传感
- ecgiddb — 共享标签:生理信号 / 心电信号 / 可穿戴传感
- macecgdb — 共享标签:生理信号 / 心电信号 / 可穿戴传感
- ecg-spider-clip — 共享标签:生理信号 / 心电信号 / 可穿戴传感
- wrist — 共享标签:生理信号 / 心电信号 / 可穿戴传感
- argo — 共享标签:生理信号 / 心电信号
- icehg-ds — 共享标签:生理信号 / 心电信号
- unicaprop — 共享标签:生理信号 / 可穿戴传感
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

