信息速览
心电图上被研究得最透的是 QRS 波群,被标得最全的也是 QRS 波群。四十多年里,公开心电库几乎把注意力都投给了那个最高最尖的波:MIT-BIH 心律失常库给出十几种心搏类型码,QT 数据库给出 P、QRS、T 的起点、峰点与终点,各类挑战赛的训练标签也大多建立在心搏分类之上。而真正的难点——幅度只有零点几毫伏、宽度不到一百毫秒、在基线漂移与肌电噪声里几乎看不见的 P 波——长期没有一个公开的人工标注集。已发表的 P 波检测算法报告出的灵敏度很高,但那些数字绝大多数来自窦性心律记录;一旦换成有室性早搏、束支阻滞或房室传导异常的记录,同一套算法的表现会明显逊色,而这恰恰是缺少参考标注造成的:没有真值,就无法证明它到底掉了多少。MIT-BIH P 波标注库补的就是这一格——从母库的四十八段里挑出十二段,一段一段把 P 波峰的位置人工标出来。它的规模小得不能再小,只有十二段、十二个人、合计约六小时的波形,但它把「病理记录下的 P 波检测到底有多难」这个此前只能靠定性描述的问题,变成了可以量化的度量。一屏速览见下表。
| 维度 | 内容 |
|---|---|
| 全名 | MIT-BIH Arrhythmia Database P-Wave Annotations |
| 发布方 | PhysioNet;数据由捷克布尔诺理工大学 Andrea Němcová 等人贡献 |
| 首次发布 | 2018 年 1 月 9 日,版本 1.0.0 |
| 最近改动 | 2019 年 2 月 20 日,补入 SHA256SUMS.txt 校验清单 |
| 记录数 | 12 段(编号 100–231,非连续,全部取自 MIT-BIH 心律失常库) |
| 受试者数 | 12 名,每段对应一人 |
| 每段时长 | 约 30 分钟(650000 采样点 ÷ 360 Hz,约 1805.6 秒) |
| 通道数 | 2,上通道均为 MLII,下通道为 V1、V2 或 V5 |
| 采样率与分辨率 | 360 Hz 每通道,11 位分辨率,覆盖 10 mV 量程 |
| 原始来源 | MIT-BIH 心律失常库,1975–1979 年采集,1980 年首次发行 |
| 标注内容 | P 波峰位置,注释文件中类型码统一为 p |
| 标注方式 | 一位专家人工标注,第二位专家复核,疑难片段共同会商 |
| 文件格式 | WFDB:.hea 头文件 / .dat 信号 / .pwave 注释 |
| 全库体积 | 未压缩 22.4 MB |
| 许可 | Open Data Commons Attribution License v1.0(ODC-BY 1.0),开放访问 |
| 典型用途 | P 波检测算法的开发与评价、病理记录下的心房活动识别 |
§1 它要解决的具体麻烦
1.1 心电标注的三个粒度,P 波落在最细的那一层
心电数据的监督信号按粒度可以分成三层,理解这三层是判断任何一个心电库能不能用的前提。
最粗的一层是节律级(rhythm):给一段时间贴一个标签,比如「这段是房颤」「这段是窦性心律」。它回答的是「这段时间整体上发生了什么」,粒度通常是秒到分钟,适合做节律分类与负荷统计。
中间一层是心搏级(beat):给每一次心搏标出位置与类型,比如正常心搏、室性早搏、房性早搏。它回答的是「这一次搏动属于哪一类」,粒度是一次心搏。绝大多数公开心电库停在这一层,因为它是心律失常检测的主流任务,也相对容易标注——QRS 波群幅度大、特征明显,自动初标加人工修正就能得到可用的真值。
最细的一层是波形边界级(delineation):把一个心搏内部的 P 波、QRS 波群、T 波各自的起点、峰点、终点都标出来。它回答的是「这段波的边界在哪里」,粒度是几十毫秒。
三层的差别不只是粗细,而是「谁都能标、机器也能标」与「只有人能标、而且人也会犹豫」之间的差别。
| 粒度 | 标注单位 | 自动初标可行性 | 公开资源丰富度 | 代表任务 |
|---|---|---|---|---|
| 节律级 | 一段时间 | 高 | 丰富 | 房颤检测、负荷统计 |
| 心搏级 | 一次心搏 | 高,加人工修正即可用 | 丰富 | 心搏分类、早搏检测 |
| 波形边界级 | 一个波段的起止点 | 低,人工为主 | 稀少 | P 波检测、QT 间期测量 |
P 波落在第三层,而且是最难标的那一段。它的幅度通常只有零点零几到零点二五毫伏,宽度不到一百毫秒,在存在基线漂移、工频干扰或肌电噪声的记录里,人眼都要反复比对才能确定峰的位置。这直接导致了公开数据的空缺:给一段记录标心搏类型,一个有经验的标注者几小时能做完;给同一段记录逐个标出 P 波峰,工作量与争议量都要高一个数量级。这个空缺的后果是具体的——不是「少了一个数据集」,而是「病理条件下的 P 波检测性能无法被验证」。
1.2 三条常见的错误期待
第一条,把它当成一套自动生成的标注。 它不是。官方页面写明,标注由一位专家人工完成,第二位专家复核,两人对不确定的片段共同会商。它是一份人工真值,不是某个算法的输出。把它当作算法输出来用时(比如用它训练后又在同一批记录上评测),得到的数字不说明任何问题。
第二条,以为它标出了 P 波的起点与终点。 它没有。官方页面说的是 P 波「标注」(annotations),注释文件中的类型码为 p,对应的是 P 波峰的位置。想做 P 波时限、P 波离散度一类需要起点与终点的研究,这份数据给不了——它给的是峰,不是边界。这一点决定了它能做什么任务、不能做什么任务(§4.4)。
第三条,以为十二条记录能代表母库的四十八条。 不能。官方页面明确说,选取记录时有意纳入了会让 P 波检测变难的病理特征。它是一个「故意挑难的」子集,不是一个随机抽样。用它估计一个算法在一般人群上的表现,会系统性低估。
1.3 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| P 波检测算法的评测真值 | 十二段半小时记录的 P 波峰位置 | 够,且这正是它唯一的设计目标 |
| 病理条件下 P 波检测的难度量化 | 记录选取时有意纳入难检病理 | 够,论文给出了含室早与生理节律两组的对照结果 |
| 开发新的 P 波检测器并调参 | 十二段约六小时波形 | 勉强,样本量小,调参极易过拟合 |
| 训练端到端深度模型 | 约六小时、两人标注 | 不够,比主流心电预训练库小几个数量级 |
| P 波起点与终点边界 | — | 不够,只标峰位置 |
| P 波形态学参数(时限、离散度) | — | 不够,需要起止边界 |
| 房颤的阵发时刻与持续时长 | 母库 .atr 中的节律注释 |
可借助母库,本库不额外提供 |
| 多中心泛化验证 | 单一来源(波士顿贝斯以色列医院,1975–1979) | 不够 |
| 用药、随访、结局变量 | — | 完全没有 |
| 十二导联的 P 波电轴研究 | 每段仅两通道 | 不够 |
1.4 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 你写了一个 P 波检测器,只在窦性心律上测过 | 提供含室早、束支阻滞、房室传导异常的记录,让你量出难度落差 | 先跑全十二段,把含室早的四段与其余段分开报告 |
| 你在复现一篇 P 波检测论文,对不上数字 | 论文自述的评测集为九条记录,与库的十二条不一致 | 核对论文用的是哪几条,只在那几条上比(§10) |
| 你要评测可穿戴单导联设备的 P 波能力 | 下通道多为 V1 或 V2,接近单导联场景 | 只用下通道跑,并在方法节写明用了哪一路 |
| 你要给标注质量做交叉验证 | 两位专家标注加复核的流程已公开 | 引用流程说明,但注意官方不保证完备与正确 |
| 你在教心电图判读,缺难例 | 头文件里附有官方对困难片段的文字描述 | 按 §2.4 表挑记录,配合官方描述讲 |
| 你要做大样本统计或人群研究 | — | 换库,这个库回答不了这类问题 |
1.5 一句话判断
它不是一个可以拿来训练模型的数据集,而是一把可以拿来量模型「在难例上掉了多少分」的尺子——六小时波形、十二个人、双人复核,规模上什么都谈不上,但它是公开心电库里极少数把 P 波峰位置逐个人工标出来的资源之一。
1.6 不适合谁:四条边界
不适合拿来做端到端训练。 十二段、合计约六小时、十二名受试者。任何有一定容量的模型都能在几轮之内把这些波形记全。想靠数据量换性能的项目,用它会立刻遇到无法解释的「高指标」。
不适合拿来做 P 波形态学定量研究。 官方给的是峰位置,不是起止边界。P 波时限、P 波面积、P 波离散度这类指标都依赖起止点,这份数据无法支撑。
不适合拿来做人群推断。 记录来自 1975–1979 年波士顿一家医院的心律失常实验室,且是刻意挑出的难例。它既不代表当代人群,也不代表一般心律失常人群。
不适合拿来做独立评测却忽略母库重叠。 官方在使用说明里明确提醒:这些记录与 MIT-BIH 心律失常库重叠,构造训练集与评测集时必须考虑这个重叠。在 MIT-BIH 上预训练过的模型,在这十二段上评测不构成外部验证。
§2 数据构成与规格
2.1 每段记录由三个文件组成,根目录另有三个文件
数据采用 WFDB(Waveform Database)格式存储,这是 PhysioNet 自 1980 年代沿用至今的生理信号存储规范。每一段记录对应同名的三个文件:
| 文件 | 角色 | 说明 |
|---|---|---|
100.dat |
信号本体 | 二进制,两路信号按采样点交错存放,格式 212(每 3 字节打包两个 12 位样本) |
100.hea |
头文件 | 纯文本,声明通道数、采样率、采样点数、增益、ADC 零值、初始值、校验和、导联名,后附患者上下文 |
100.pwave |
注释文件 | 二进制,存放 P 波峰的采样点序号与类型码,用 rdann 以 pwave 为注释器名读取 |
三者缺一不可。只有 .dat 无法还原毫伏值,因为增益写在 .hea 里;只有 .pwave 无法知道这些时刻对应哪段波形,因为时间基准也来自 .hea。
根目录还有三个文件:RECORDS 列出十二个记录名,共十二行;ANNOTATORS 只有一行,内容是 pwave reference P-wave annotations,说明注释文件的角色;SHA256SUMS.txt 是三十八条文件的校验和清单,用于下载后验证完整性。
2.2 信息项的完整字典
本库的「字段」不是表格列,而是 WFDB 头文件的关键字行、注释类型码与附属清单项。下表逐条列出。
| 信息项 | 所在位置 | 取值形态 | 含义 | 使用注意 |
|---|---|---|---|---|
| 记录名 | .hea 第 1 行首字段 |
100–231 |
记录标识 | 与母库记录编号一致,可直接对应 |
| 信号条数 | .hea 第 1 行第 2 字段 |
2 |
通道数 | 全部记录均为 2 |
| 采样率 | .hea 第 1 行第 3 字段 |
360 |
每秒采样点数 | 与母库一致 |
| 采样点数 | .hea 第 1 行第 4 字段 |
650000 |
每段总长度 | 十二段全部相同 |
| 信号文件名 | .hea 信号行第 1 字段 |
100.dat |
数据存放位置 | 两通道共用一个 .dat |
| 存储格式 | .hea 信号行第 2 字段 |
212 |
每 3 字节打包两个 12 位样本 | 不是 16 位,也不是浮点 |
| 增益 | .hea 信号行第 3 字段 |
200 |
ADC 单位/毫伏 | 全部记录均为 200 |
| 位分辨率 | .hea 信号行第 4 字段 |
11 |
ADC 有效位数 | 量程 10 mV |
| ADC 零值 | .hea 信号行第 5 字段 |
1024 |
零电平对应的整数值 | 换算时先减零值 |
| 初始值 | .hea 信号行第 6 字段 |
如 995 |
首采样点的整数值 | 逐记录不同 |
| 校验和 | .hea 信号行第 7 字段 |
如 -22131 |
采样点累加和 | 用于校验 .dat 是否完整 |
| 块大小 | .hea 信号行第 8 字段 |
0 |
每帧字节数 | 由 wfdb 自动计算 |
| 导联名 | .hea 信号行第 9 字段 |
MLII / V1 等 |
解剖位置 | 上通道固定 MLII |
| 年龄 | .hea 注释行第 1 行 |
如 69,缺失为 -1 |
受试者年龄 | 103 号记录未记录年龄 |
| 性别 | .hea 注释行第 1 行 |
M / F |
受试者性别 | 与官方清单一致 |
| 用药 | .hea 注释行第 2 行 |
自由文本或 None |
记录时用药 | 不是完整用药史 |
| 补充说明 | .hea 注释行第 3 行起 |
自由文本 | 官方对该段的定性描述 | 只有部分记录有 |
| P 波峰位置 | .pwave |
采样点序号 | 每个 P 波峰的时刻 | 除以 360 得秒 |
| 标注类型码 | .pwave |
p |
P 波峰 | 注释文件中类型码统一 |
| 注释器角色 | ANNOTATORS |
pwave reference P-wave annotations |
注释文件的语义 | 与母库 .atr 区分 |
| 记录清单 | RECORDS |
12 行记录名 | 全库记录列表 | 按空白切分计数得 12 |
2.3 一条记录的完整解剖
以 100 号记录为例,头文件全文如下:
100 2 360 650000
100.dat 212 200 11 1024 995 -22131 0 MLII
100.dat 212 200 11 1024 1011 20052 0 V5
\# 69 M 1085 1629 x1
\# Aldomet, Inderal
(上面注释行前的反斜杠只是为了避开正文的标题语法,实际文件里是 # 开头。)
第一行 100 2 360 650000 读作:记录名 100,2 个通道,360 Hz,每段 650000 个采样点。650000 ÷ 360 ≈ 1805.6 秒,即约 30 分 5.6 秒——官方页面表述为「约半小时」,与头文件一致。
接下来两行是通道声明。以第一行为例,从右往左读:导联名 MLII;块大小 0(由 wfdb 自动计算);校验和 -22131;初始值 995;ADC 零值 1024;位分辨率 11;增益 200(即 200 个整数值对应 1 毫伏,约 5 微伏/单位);存储格式 212;文件名 100.dat。第二行只是换成了 V5 导联、初始值 1011、校验和 20052。
值得留意的是增益。母库的十二段在本库里增益统一为 200,这比某些多中心库逐记录变动的增益要省心;但存储格式是 212 而不是更常见的 16,意味着每个样本只有 12 位,若用自己写的解析器按 16 位整数读取,整段波形会错位。实际使用时应直接用 wfdb 读取,而不是手写二进制解析。
后面两行注释是患者上下文:69 岁男性,记录时用药为 Aldomet 与 Inderal。第三行出现的两个数字是母库内部的编号字段,官方页面没有逐项解释,本文不做推测(§10)。
读取信号与 P 波标注的标准写法:
import wfdb
#-- pn_dir 指向 PhysioNet 上的库名;annotator 用 pwave
rec = wfdb.rdrecord('100', pn_dir='pwave')
ann = wfdb.rdann('100', 'pwave', pn_dir='pwave')
print(rec.fs, rec.sig_len, rec.sig_name) #-- 360 650000 ['MLII', 'V5']
print(rec.p_signal.shape) #-- (650000, 2) 已换算成毫伏
print(len(ann.sample), set(ann.symbol)) #-- 标注条数与类型码集合
print(ann.sample[:5]) #-- 前五个 P 波峰的采样点序号
p_signal 是已按增益与 ADC 零值换算过的浮点毫伏值;若要原始整数,用 d_signal。ann.sample 是采样点序号,除以 360 即得秒数。
2.4 十二条记录清单
官方页面给出的对应关系与受试者信息如下。导联名、头文件体积与注释体积来自文件目录。
| 注释文件 | 对应记录 | 性别 | 年龄 | 上通道 | 下通道 | .hea 体积 |
.pwave 体积 |
|---|---|---|---|---|---|---|---|
| 100.pwave | 100 | 男 | 69 | MLII | V5 | 143 B | 4.4 KB |
| 101.pwave | 101 | 女 | 75 | MLII | V1 | 131 B | 3.6 KB |
| 103.pwave | 103 | 男 | 未记录 | MLII | V2 | 142 B | 4.1 KB |
| 106.pwave | 106 | 女 | 24 | MLII | V1 | 158 B | 3.0 KB |
| 117.pwave | 117 | 男 | 69 | MLII | V2 | 127 B | 3.0 KB |
| 119.pwave | 119 | 女 | 51 | MLII | V1 | 158 B | 3.2 KB |
| 122.pwave | 122 | 男 | 51 | MLII | V1 | 221 B | 4.8 KB |
| 207.pwave | 207 | 女 | 89 | MLII | V1 | 546 B | 2.9 KB |
| 214.pwave | 214 | 男 | 53 | MLII | V1 | 270 B | 3.9 KB |
| 222.pwave | 222 | 女 | 84 | MLII | V1 | 333 B | 2.8 KB |
| 223.pwave | 223 | 男 | 73 | MLII | V1 | 258 B | 4.1 KB |
| 231.pwave | 231 | 女 | 72 | MLII | V1 | 333 B | 3.9 KB |
两点可以直接从这张表读出来。第一,上通道全部是 MLII(改良肢体 II 导联),这是母库采集时的固定配置,因此跨记录比较时上通道是同质的。第二,下通道并不统一:九条是 V1,两条是 V2,一条是 V5。做「单导联算法评测」时,若混用下通道而不加说明,等于把不同观察方向的数据拼在一起(§5.6)。
头文件体积的差异也说明问题:最大的 207 号头文件有 546 字节,因为它附了六行官方文字描述;最小的 117 号只有 127 字节,只有记录声明与两行患者信息。这些描述是官方提供的定性上下文,做难例筛选时比任何自动指标都直接。
2.5 与同类资源的字段差异
| 对比项 | 本库(pwave) | MIT-BIH 心律失常库 | QT 数据库 | BUT PDB |
|---|---|---|---|---|
| 记录数 | 12 | 48 | 105 | 50 |
| 受试者数 | 12 | 47 | 未统一公布 | 未统一公布 |
| 单段时长 | 约 30 分钟 | 约 30 分钟 | 15 分钟 | 2 分钟 |
| 通道数 | 2 | 2 | 2 | 2 |
| 采样率 | 360 Hz | 360 Hz | 250 Hz | 未统一公布 |
| 标注对象 | P 波峰 | 心搏类型 + 节律 + 信号质量 | P/QRS/T 起止边界 | P 波峰 |
| 标注粒度 | 峰位置 | 心搏级 / 节律级 | 波形边界级 | 峰位置 |
| 是否与母库重叠 | 是,即母库子集 | — | 部分 | 是,取自三个公开库 |
| 许可 | ODC-BY 1.0 | ODC-BY 1.0 | ODC-BY 1.0 | 公开 |
这张表要说清的一件事是:本库与 BUT PDB 在任务上高度接近(同为 P 波峰人工标注),但两者是不同时间、不同规模、不同记录集合的独立资源,不是同一份数据的两个版本。挑选时看的不是「哪个更好」,而是「你要长段还是多段」(§6.3)。
2.6 两个通道的物理含义
每段记录只有两路信号,选哪一路直接决定 P 波能不能看清。
| 导联 | 安放位置 | 观察方向 | 对 P 波的意义 | 主要失真来源 |
|---|---|---|---|---|
| MLII | 右臂—左腿(改良肢体 II) | 左下方向 | P 波电轴多与之接近,幅度较稳定,是常规判读首选 | 呼吸与体位变化引起的基线摆动 |
| V1 | 胸骨右缘第 4 肋间 | 前后偏右 | 心房活动在 V1 常呈双向波,有助于区分房性与交界性 | 呼吸起伏最明显 |
| V2 | 胸骨左缘第 4 肋间 | 前后偏右 | 与 V1 相邻,常作为 V1 的替代 | 同上 |
| V5 | 左腋前线第 5 肋间 | 左外侧 | P 波幅度通常偏低,心房细节弱 | 心尖搏动造成的运动伪迹 |
上通道统一为 MLII 这一点,让跨记录的横向比较有了共同的基准;下通道的多样性则提醒:把十二条记录的下通道当成同一种信号来处理,是不成立的。
§3 它是谁的数据
3.1 贡献者与机构
数据库由捷克布尔诺理工大学(Brno University of Technology)生物医学工程系的四位研究者贡献:Andrea Němcová、Radovan Smíšek、Martin Vítek、Lukáš Smital。页面显示四位作者同属该系的同一研究组(UBMI),这是一个长期从事心电信号分析与 Holter 数据处理的团队,其相关工作还包括 P 波检测、心电信号质量评估与压缩后信号质量评价等方向。
官方在方法部分对标注者资质给出了明确说明:两位标注者均从事心电处理与分析工作,具有五年以上 Holter 心电分析经验,并持有布尔诺理工大学生物医学工程与生物信息学硕士学位。这类信息在公开数据集中并不常见——多数心电库只写「由专家标注」而不写经验年限与学科背景,本库把它写进了方法节,这对判断标注可信度是有用的。
3.2 时间线
| 时间 | 事件 | 说明 |
|---|---|---|
| 1975–1979 | 母库原始记录在波士顿贝斯以色列医院采集 | 本库不重新采集,沿用母库波形 |
| 1980 | MIT-BIH 心律失常库首次发行 | 本库信号的来源 |
| 1999-09 / 2005-02 | 母库全部记录经 PhysioNet 免费开放 | 使二次标注成为可能 |
| 2016 | 标注所用工具 SignalPlant 发表 | Plesinger 等,Physiological Measurement |
| 2018-01-09 | 本库在 PhysioNet 上线,版本 1.0.0 | 首次公开,含 36 个记录文件 |
| 2018-01-30 | 补入 RECORDS 与 ANNOTATORS |
便于批量读取与注释器识别 |
| 2019-02-20 | 补入 SHA256SUMS.txt |
提供下载后的完整性校验 |
文件目录里的修改时间印证了这条线:.dat 与 .hea 的时间戳是 1992-07-30,说明它们是母库原样复制过来的文件;.pwave 的时间戳是 2018-01-09,与发布日一致。
3.3 采集场景与纳入口径
采集场景完全继承自母库:原始记录来自波士顿贝斯以色列医院心律失常实验室,1975–1979 年间约四千份 24 小时动态心电记录中的一部分,其中约六成来自住院患者、四成来自门诊患者。数字化参数为 360 Hz、11 位分辨率、10 mV 量程。
纳入口径是本库自己定义的部分。官方页面写明:选取这些记录,是因为它们包含会使 P 波检测更困难的病理特征;同时也纳入了用于评价窦性心律下检测表现的记录。配套研究进一步说明,含室性早搏的记录为 106、119、214、223,用于生理节律验证的记录为 100、101、103、117、122。
这里的口径值得强调:这不是随机抽样,而是按难度定向挑选。它的好处是把难例集中起来,让评测有区分度;代价是任何在它上面得到的绝对指标都不能外推。把它当「困难子集」用是对的,把它当「代表性样本」用是错的。
3.4 数据来源的三个层次
理解这份数据要分清三层。
| 层次 | 内容 | 是否公开 | 影响 |
|---|---|---|---|
| 原始采集层 | 1975–1979 年波士顿的 24 小时动态心电记录 | 否 | 无法回溯电极与采集细节 |
| 母库公开层 | MIT-BIH 心律失常库的三文件记录(.hea/.dat/.atr) |
是 | 本库的信号与患者信息直接来自这里 |
| 新增标注层 | 本库的 .pwave 文件 |
是 | 唯一的原创贡献,也是本库存在的理由 |
第一层不可得,意味着一些方法论问题无法回答:比如这十二段在整个病程中的位置、电极的具体安放与皮肤处理、采集当天的活动记录。第二层决定了信号与患者上下文都是母库原样,本库没有做任何重采样或重新滤波,因此把本库的 .dat 与母库同名文件互换不会产生任何差异。第三层是唯一新增的东西,体积小(十二个文件合计约四十余 KB),但它是把「P 波检测在病理记录上到底行不行」从断言变成度量的关键。
这个分层还有一个直接后果:因为波形与患者信息都不是本库原创,本库能提供的证据强度完全取决于标注层。评价本库时看的是标注流程是否可信、标注者是否有资质、官方对完备性的表述是否诚实——而不是看它有多少段记录。
§4 它最独特的东西
4.1 稀缺的不是波形,是 P 波的真值
公开心电数据里,三十分钟的双通道波形并不稀缺,MIT-BIH 心律失常库本身就提供了四十八段。真正稀缺的是 P 波位置的人工真值。原因不复杂:QRS 波群幅度大、边界陡,自动检测器加上人工修正就能得到可靠的心搏标注;P 波幅度小、边界平缓,且与 T 波、噪声在频带上大量重叠,自动方法在这里既容易漏也容易误,人工标注因此无法省。
结果是一个不对称的格局:心搏级标注几乎是所有心电库的标配,而 P 波级标注长期空缺。算法论文想证明自己的 P 波检测器好,只能在窦性心律记录上自证,或者干脆不报 P 波指标。本库的价值就在这个空缺上——它把十二段病理记录里的 P 波峰逐个标出来,让「病理条件下的 P 波检测」第一次有了可以对照的参考。
4.2 差异化证据
| 维度 | 本库的位置 | 对比对象 | 差异在哪 |
|---|---|---|---|
| 标注对象 | P 波峰 | 心搏类型标注库 | 更细一层,直接对应心房活动 |
| 记录选取 | 定向纳入难检病理 | 随机抽样库 | 难度集中,区分度高 |
| 标注流程 | 一人标注、一人复核、疑难会商 | 自动初标加人工修正 | 人工占比更高,但主观性也更高 |
| 与母库关系 | 母库的真子集 | 独立采集库 | 可复用母库原 .atr,但须防重叠泄漏 |
| 单段时长 | 约 30 分钟 | 2 分钟片段库 | 上下文更长,适合节律相关研究 |
| 记录数量 | 12 | 数十至数百 | 明显偏小,不适合训练 |
| 工具链 | SignalPlant + WFDB | 各家自研工具 | 与 PhysioNet 生态完全兼容 |
配套研究还给出了该检测方法在上述记录上的自述指标:含室性早搏的记录上灵敏度为 98.94%、正预测率为 98.30%;无病理的记录上灵敏度为 98.47%、正预测率为 99.99%。这两个数字通常被读成「病理记录上也不差」,但需要注意口径——它们来自论文自己的评测设置,且正预测率一项在两组之间差距明显大于灵敏度,说明病理条件下多出来的主要是误检而非漏检。引用这些数字时应连同记录编号与时间容差一并说明(§10)。
4.3 案例:207 号记录为什么被官方称为「极其困难」
207 号记录的头文件里附了官方的一段描述,原文大意是:这是一份极其困难的记录,主要节律为窦性心律,合并一度房室传导阻滞与左束支阻滞;有若干时段传导阻滞图形会转变为右束支阻滞形态;室性早搏呈多形性;在最长的一段室性扑动之后出现室性自主心律;记录结束时正处于室上性心动过速发作之中。
这段描述把 P 波检测的难点列全了,逐条拆开看:
| 难点 | 对 P 波检测的具体影响 |
|---|---|
| 一度房室传导阻滞 | PR 间期延长且不固定,靠「QRS 前固定窗口」找 P 波的做法会失效 |
| 左束支阻滞 | QRS 增宽,其起始部分与 P 波在时间上更接近,容易混淆 |
| 阻滞图形在左右束支间转换 | 同一段记录内 QRS 形态不恒定,基于模板减法的 P 波提取会出错 |
| 多形性室性早搏 | 室早提前出现,其前的 P 波可能被掩盖或根本不存在,判断「有没有 P 波」本身就成了难题 |
| 室性扑动与室性自主心律 | 心房与心室活动脱节,P 波可能独立存在,也可能被完全淹没 |
| 记录结束于室上性心动过速 | 心率快时 P 波与前一 T 波重叠,视觉上都难以分辨 |
一个算法在这类记录上扣分,扣的不是实现质量,而是「在心房与心室关系被破坏时,还能不能找到心房活动」这个根本问题。这也是为什么只看窦性心律记录上的指标会给出过于乐观的印象。
把这段话与其余几条记录的官方描述放在一起看,选取意图就更清楚了:106 与 223 都注明室性早搏呈多形性,231 注明房室传导明显异常,222 注明阵发性房扑或房颤之后常跟随交界性逸搏,122 注明下通道全程有低幅高频噪声,214 注明有两次伪迹性幅度下降与一次磁带打滑。也就是说,困难既来自心律本身,也来自记录质量——后者恰恰是真实可穿戴场景里最难回避的部分(§7.3)。
4.4 标注的粒度:只有峰,没有边界
本库提供的是 P 波峰的位置,不是 P 波的起点与终点。这个区别决定了任务的边界。
| 你想做的事 | 需要什么 | 本库给不给 |
|---|---|---|
| 评测 P 波检测器「找没找到」 | 峰位置 + 匹配容差 | 给 |
| 评测检测器的时间误差分布 | 峰位置 | 给 |
| 算 P 波时限 | 起点与终点 | 不给 |
| 算 P 波离散度(各导联时限差) | 各导联起止点 | 不给 |
| 算 PR 间期 | P 起点 + QRS 起点 | 只给 P 峰,还需母库心搏标注 |
| 做 P 波形态聚类 | 波形片段 | 可自行切窗,但需自己定窗长 |
评测时还要处理一个官方明确指出的问题:未标注的区间不能直接解读为「这里没有 P 波」。官方说明里写得很清楚,并非所有 P 波都一定被标注,部分标注也可能有误。因此把「参考标注」当成完备真值来计算特异度,会低估算法的真实表现。
4.5 边界条件:什么情况下它不再适用
当你的模型已经在母库上训练过。 这十二段是母库的子集,在其上评测等价于在训练集里划出一块做测试,除非你明确按记录把母库中对应编号排除干净。
当你的目标人群不是心律失常人群。 记录来自心律失常实验室,且刻意挑了难例。
当你的任务需要多导联信息。 每段只有两路,做不了 P 波电轴、心房激动顺序一类需要空间维度的研究。
当你需要严格的统计功效。 十二条记录、十二名受试者,做组间比较的样本量不足。
§5 怎么拿到
5.1 目录结构与下载面
版本 1.0.0 的目录是一个扁平结构,没有任何子目录,共三十九个文件。
| 类别 | 文件 | 数量 | 体积 |
|---|---|---|---|
| 信号 | 100.dat–231.dat |
12 | 各约 1.9 MB |
| 头文件 | 100.hea–231.hea |
12 | 127 B–546 B |
| 注释 | 100.pwave–231.pwave |
12 | 2.8 KB–4.8 KB |
| 记录清单 | RECORDS |
1 | 48 B |
| 注释器说明 | ANNOTATORS |
1 | 35 B |
| 校验清单 | SHA256SUMS.txt |
1 | 2.7 KB |
| 合计 | — | 39 | 未压缩 22.4 MB |
官方提供了四种取数方式:整包 ZIP 下载、PhysioNet Python 包命令行、wget 递归、AWS S3 同步。全库只有二十几兆,四种方式里任何一种都不构成负担。
5.2 批量下载
#-- 整包下载,一次拿全三十九个文件
wget -r -N -c -np https://physionet.org/files/pwave/1.0.0/
#-- 或用官方 Python 包,自动带版本号
physionet download pwave --version 1.0.0
#-- 或用 AWS 开放桶,无需账号
aws s3 sync --no-sign-request s3://physionet-open/pwave/1.0.0/ ./pwave
#-- 下载后校验:比对官方 SHA256SUMS.txt
sha256sum -c SHA256SUMS.txt
最后一行不是可选项。波形文件在传输中断时不会报错,只会静默截断,而截断的信号在多数下游管线里仍然「能跑」,只是结果无意义。
5.3 用 wfdb 流式读取
import wfdb
#-- 从 RECORDS 直接取记录名,无需手写列表
names = wfdb.get_record_list('pwave')
print(len(names), names)
#-- 逐段流式读取,不落盘
for name in names:
rec = wfdb.rdrecord(name, pn_dir='pwave')
ann = wfdb.rdann(name, 'pwave', pn_dir='pwave')
assert rec.fs == 360
print(name, rec.sig_name, rec.sig_len, len(ann.sample))
get_record_list 直接解析 RECORDS,避免手写记录名时漏掉某一条。远程读取的好处是不占磁盘,代价是每段都要重新走网络;全库过一遍时间不长,但如果要做多次遍历,落盘更省事。
5.4 转成通用的表结构
下游若是常规深度学习管线,通常需要把 P 波峰标注转成定长片段或逐搏表:
import wfdb
import numpy as np
import pandas as pd
FS = 360
PRE, POST = 180, 180 #-- 峰前 0.5 秒到峰后 0.5 秒
rows = []
for name in ['100', '101', '103']:
rec = wfdb.rdrecord(name, pn_dir='pwave', physical=True)
ann = wfdb.rdann(name, 'pwave', pn_dir='pwave')
for s, sym in zip(ann.sample, ann.symbol):
if s - PRE < 0 or s + POST > rec.sig_len:
continue
seg = rec.p_signal[s - PRE:s + POST, :] #-- (360, 2)
rows.append({'record': name, 'peak_sample': int(s),
'peak_sec': s / FS, 'symbol': sym,
'mlII': seg[:, 0].astype('float32')})
df = pd.DataFrame(rows)
print(df.shape, df['record'].value_counts().to_dict())
这段代码有三个地方在正式实验时必须改:一是窗长 PRE/POST 要按你的检测器设计来定,写死 0.5 秒只是演示;二是只留了上通道一列,做多通道模型要把两列都留住;三是要显式处理与母库 .atr 心搏标注的对应关系,否则无法区分「这次搏动有没有 P 波」。
5.5 与母库心搏标注对齐
本库只标 P 波峰,母库的 .atr 标心搏。把两者对齐,才能回答「这一次心搏前面有没有 P 波」:
import numpy as np
import wfdb
rec_name = '100'
beats = wfdb.rdann(rec_name, 'atr', pn_dir='mitdb')
pw = wfdb.rdann(rec_name, 'pwave', pn_dir='pwave')
TOL = int(0.05 * 360) #-- 50 毫秒容差
SEARCH = int(0.40 * 360) #-- 只在该心搏前 0.4 秒内找 P 波
matched = 0
for b in beats.sample:
lo, hi = b - SEARCH, b - TOL
if lo < 0:
continue
if np.any((pw.sample >= lo) & (pw.sample <= hi)):
matched += 1
print(matched, len(beats.sample))
对齐逻辑里最容易被忽略的不是算法,而是容差。rdann 的时间基准是采样点,而「检测成功」的判定完全依赖你设定的时间窗:窗放宽一点,灵敏度就涨一截;窗收紧一截,正预测率就掉一截。官方在使用说明中明确要求,报告评测结果时应一并说明使用了哪些记录、排除了哪些区间、以及用多大的时间容差来匹配检测结果与参考标注。缺了这三项,别人无法复现你的数字。
若要进一步构建「每次心搏是否有前置 P 波」的标签表,可在同一循环里把 beats.symbol 带出,与心搏类型一并落表。
5.6 五个最容易出错的地方
| 位置 | 错误写法 | 后果 | 正确做法 |
|---|---|---|---|
| 注释器名 | 用 .atr 读 .pwave |
读不到或读到母库标注 | rdann 指定 pwave |
| 时间基准 | 把采样点当毫秒 | 时间轴错 360 倍 | 除以 360 得秒 |
| 存储格式 | 按 16 位整数解析 .dat |
波形错位、幅值失真 | 用 wfdb 读取,格式是 212 |
| 完备性假设 | 未标注即无 P 波 | 特异度被系统性低估 | 把参考标注当非完备真值 |
| 数据集划分 | 母库训练、本库测试但不排除同编号 | 泄漏,指标虚高 | 母库中排除对应编号的记录 |
§6 与库内其他数据集的关系
6.1 关系图谱
本库在心电类数据集里的位置,可以用「标注粒度 × 记录来源」两个轴摆出来。
| 相关数据集 | 标注粒度 | 与本库的关系 |
|---|---|---|
| MIT-BIH 心律失常库 | 心搏级 + 节律级 | 母库,本库信号与患者信息的直接来源 |
| BUT PDB | P 波峰 | 同一团队的后续资源,任务相同、记录更短更多 |
| QT 数据库 | 波形边界级 | 唯一给出 P 波起止点的公开库,长程互补 |
| MIT-BIH 室上性心律失常库 | 心搏级 | 同为母库家族,偏室上性心律失常 |
| MIT-BIH 房颤库 | 节律级 | 长时程房颤,P 波消失的典型场景 |
| 长期房颤数据库 | 节律级 | 日级负荷,P 波研究的对照端 |
| NSTDB 噪声压力测试库 | 信号质量 | 噪声叠加源,可与本库组合做鲁棒性评测 |
| European ST-T 数据库 | 波形边界级 | 缺血标注,两小时长程 |
| BUT QDB 信号质量库 | 信号质量 | 同一团队,先判数据能不能用 |
| ECG-Arrhythmia 大规模库 | 诊断标签 | 规模端,本库是精度端 |
| IAFDB 心内房颤库 | 心搏级 | 心内电图,心房活动的侵入式对照 |
| AF 终止挑战赛库 | 节律级 | 房颤终止预测,临床端任务 |
6.2 检索路径
| 你要找的东西 | 检索词 | 会落到哪里 |
|---|---|---|
| 本库信号的来源与患者信息 | mitdb、MIT-BIH Arrhythmia |
MIT-BIH 心律失常库词条 |
| 同一批作者的 P 波后继资源 | BUT PDB、P wave annotation |
BUT PDB 词条 |
| P 波起止边界 | qt-database、delineation |
QT 数据库词条 |
| 噪声鲁棒性评测方法 | nstdb、noise stress test |
NSTDB 词条 |
| 大规模心电预训练 | ecg-arrhythmia、12-lead |
ECG-Arrhythmia 词条 |
| 心房活动的侵入式对照 | iafdb、intracardiac AF |
IAFDB 词条 |
6.3 与其他数据集的分工判据
| 任务 | 该用谁 | 本库的位置 | 原因 |
|---|---|---|---|
| P 波检测算法的客观比较 | 本库 + BUT PDB | 主力之一 | 两者是少数提供 P 波峰人工真值的资源 |
| 长段节律背景下的 P 波研究 | 本库 | 主力 | 每段约 30 分钟,BUT PDB 只有 2 分钟 |
| 多记录、多病理类型的统计 | BUT PDB | 辅助 | 五十条记录,覆盖面更广 |
| P 波时限与离散度 | QT 数据库 | 不适用 | 只有 QT 库给出起止边界 |
| 大规模心电表征预训练 | 大规模十二导联库 | 不适用 | 本库合计约六小时 |
| 房颤检测与终止预测 | 房颤库与挑战赛库 | 不适用 | 房颤时 P 波本就消失 |
| 噪声鲁棒性评测 | NSTDB + 长时程库 | 可组合 | 用 NSTDB 噪声叠到本库波形上 |
§7 质量评估与局限性
7.0 阅读本节前的一个前置校正
先纠正一个常见的误判:把小样本库的问题当成「质量差」。本库的十二条不是采集能力不足,而是「逐个人工标出 P 波峰」这件事本身成本高、可投入的规模有限(§4.1)。评价它的时候不能套用「越大越好」的尺子,而应该问:在它设计要回答的那个问题上,它的样本够不够、流程可不可信。
7.1 五维评分
每项 1–5 分,分数针对「作为 P 波检测算法评价数据」这个用途。
| 维度 | 分数 | 理由 |
|---|---|---|
| 任务匹配度 | 5 | 标注对象就是 P 波峰,与任务一一对应 |
| 标注可信度 | 4 | 双人流程、资质公开;但官方不保证完备与正确 |
| 规模 | 1 | 十二段、约六小时、十二名受试者 |
| 元数据完整度 | 3 | 有年龄、性别、用药、困难描述;无随访、无结局、无完整诊断列表 |
| 复用便利度 | 5 | WFDB 标准格式,与 PhysioNet 工具链完全兼容 |
7.2 标注质量的两层
第一层是完备性。 官方明确说,并非每一个存在的 P 波都一定被标注。原因可以推断:在室性早搏、束支阻滞、室性扑动等情况下,P 波是否存在本身就存在判断困难,标注者可能选择跳过而不是硬标。
第二层是正确性。 官方同时说明,部分标注可能不正确。这与第一层是不同性质的问题:完备性缺失导致特异度被低估,正确性缺失则同时污染灵敏度与特异度。
对使用者的实际含义是:把这份标注当成下限参考而不是绝对真值。报告结果时,把「未标注区间」的处理方式写清楚,比追求一个漂亮的数字更重要。
7.3 已知的、可枚举的偏差
| 偏差 | 具体表现 | 影响 |
|---|---|---|
| 难度定向选择 | 官方有意纳入难检病理记录 | 绝对指标偏悲观,不能外推到一般人群 |
| 受试者数量 | 仅 12 名,且各 1 段 | 无法做人群层面推断,置信区间宽 |
| 年代偏差 | 采集于 1975–1979 年 | 采集设备与当代设备存在差异 |
| 单中心 | 波士顿贝斯以色列医院 | 无法评估跨中心泛化 |
| 通道数 | 每段仅两路 | 无法做空间维度分析 |
| 与母库重叠 | 十二段是母库真子集 | 若母库用于训练则评测泄漏 |
| 标注粒度 | 只有峰位置 | 无法支撑 P 波时限类研究 |
7.4 外部验证矩阵
| 维度 | 本库能验证 | 本库不能验证 |
|---|---|---|
| P 波检测灵敏度 | 能,需声明时间容差 | 跨中心泛化 |
| 病理 vs 生理节律的性能差 | 能,论文给出了两组对照 | 病种覆盖面 |
| P 波峰定位时间误差 | 能 | P 波起止边界精度 |
| 检测器的漏检模式 | 能,可逐段人工复核 | 人群层面的负荷估计 |
| 噪声鲁棒性 | 能,叠加标准噪声后测 | 真实可穿戴场景的伪迹谱 |
7.5 它为何持续:稀缺的不是数据量,是那个组合
一个 P 波标注库要成立,需要三个条件同时满足:有一个被广泛使用的母库提供波形、有一批具备 Holter 判读经验的人愿意做标注、有一个足够通用的格式让所有人都能读。本库三者齐备,因此即使只有十二条记录、四十余 KB 的注释,它仍然被持续引用。反过来也说明它的上限:规模受制于人工标注的成本,而这个成本不会因为数据需求增长而下降。
§8 生态位与历史
8.1 历史沿革
| 时间 | 阶段 | 说明 |
|---|---|---|
| 1975–1979 | 母库采集 | 波士顿贝斯以色列医院心律失常实验室 |
| 1980 | 母库首次发行 | 首个公开可用的心律失常评测记录集 |
| 1999 / 2005 | 母库完整开放 | 全部 48 段经 PhysioNet 免费提供 |
| 2016 | 标注工具就绪 | SignalPlant 发表 |
| 2018-01-09 | 本库发布 | 十二条记录的 P 波峰人工标注 |
| 2018–2019 | 配套元数据补齐 | 记录清单、注释器说明、校验清单 |
| 2021-01-19 | 后继资源发布 | 同一团队发布 BUT PDB,五十条两分钟记录 |
8.2 与挑战赛及后继资源的关系
本库本身不是任何一届 PhysioNet/CinC 挑战赛的官方数据集,它是一项独立发布的标注补充。它与挑战赛生态的连接是间接的:母库是心律失常检测类赛题长期使用的来源,而本库给母库补上了原先没有的 P 波维度。
同一团队在 2021 年发布了 BUT PDB,收录五十条两分钟双通道记录,来源为 MIT-BIH 心律失常库、MIT-BIH 室上性心律失常库与长期房颤数据库。两者不是替代关系:本库段长、记录少;BUT PDB 段短、记录多、来源更广。做 P 波检测评测时,按「要不要长程上下文」来选,而不是按发布时间来选。
8.3 生态位:病理条件下的度量工具
把它放进整个心电数据生态看,它占据的是一个很窄但很清晰的格子:
| 生态位 | 代表资源类型 | 本库是否在位 |
|---|---|---|
| 大规模预训练 | 万级十二导联诊断库 | 否,规模差几个数量级 |
| 心搏分类基准 | 母库、INCART 类 | 否,标注对象不同 |
| 节律分类与负荷 | 房颤长程库 | 否 |
| 波形边界金标准 | QT 数据库 | 否,只标峰不标边界 |
| 病理条件下的 P 波真值 | — | 是 |
8.4 谁在用它,用来做什么
| 使用者 | 用法 | 依赖的库特性 |
|---|---|---|
| P 波检测算法研究者 | 作为评测真值,报告灵敏度与正预测率 | 双人人工标注、P 波峰位置 |
| 心电信号处理方法研究者 | 用相量变换一类方法做检测后在本库上对照 | 含室早与生理节律两组记录 |
| 可穿戴设备算法工程师 | 单通道条件下评测 P 波能力 | 下通道多为 V1/V2 |
| 标注质量研究者 | 研究人工标注的一致性与完备性 | 官方公开标注流程与资质 |
| 心电图教学人员 | 用官方描述的困难片段做教学案例 | 头文件附带的定性描述 |
§9 使用指引
9.1 三种角色的路径
| 角色 | 第一步 | 第二步 | 第三步 |
|---|---|---|---|
| 算法研究者 | 按 §5.2 下载全库 | 用 §5.3 远程读取确认参数 | 按 §5.5 与母库 .atr 对齐后评测 |
| 工程师 | 只取需要的记录号 | 按 §2.4 表挑病理类型 | 只用一个通道跑,记录用了哪一路 |
| 教学人员 | 按 §2.4 挑困难记录 | 读 .hea 里的官方描述 |
用 §5.3 导出波形做图 |
9.2 一条最短的可用流程
import wfdb
#-- 1) 取记录清单
names = wfdb.get_record_list('pwave')
#-- 2) 逐段读出信号与 P 波峰
data = {}
for name in names:
rec = wfdb.rdrecord(name, pn_dir='pwave')
ann = wfdb.rdann(name, 'pwave', pn_dir='pwave')
data[name] = (rec, ann)
#-- 3) 打印每段的基本信息,先确认没有异常
for name, (rec, ann) in data.items():
print(f'{name:>3} fs={rec.fs} len={rec.sig_len} '
f'leads={rec.sig_name} pwave={len(ann.sample)}')
跑通这三步之后,再进入真正的评测逻辑。很多人在第 2 步就出问题——比如把注释器名写错,或者没注意到 pn_dir 要指向库名而不是记录名。
9.3 引用方式
官方要求同时引用资源本身与配套研究,并包含 PhysioNet 的标准引用。
| 引用对象 | 内容 |
|---|---|
| 资源 | Nemcova, A., Smisek, R., Vitek, M., and Smital, L. (2018). MIT-BIH Arrhythmia Database P-Wave Annotations (version 1.0.0). PhysioNet. https://doi.org/10.13026/C2108F |
| 配套研究 | Maršánová L, Němcová A, Smíšek R, Goldmann T, Vítek M, Smital L. Automatic Detection of P Wave in ECG During Ventricular Extrasystoles. World Congress on Medical Physics and Biomedical Engineering 2018. Springer, Singapore; 2018. p. 381–385. DOI: 10.1007/978-981-10-9038-7_72 |
| 母库 | Moody GB, Mark RG. The impact of the MIT-BIH Arrhythmia Database. IEEE Engineering in Medicine and Biology Magazine. 2001;20(3):45–50. doi:10.1109/51.932724 |
| 标注工具 | Plesinger F, Jurco J, Halamek J, Jurak P. SignalPlant: an open signal processing software platform. Physiological Measurement. 2016;37(7):N38–N48. doi:10.1088/0967-3334/37/7/N38 |
| 平台 | Pollard, T., Moody, B. E., Lehman, L., Gow, B., Fernandes, C., Xie, C., Johnson, A., Mark, R. G., and Heldt, T. (2026). PhysioNet as a global platform for biomedical research. Nature Health. https://doi.org/10.1038/s44360-026-00096-z |
§10 AI 使用声明
| 项目 | 说明 |
|---|---|
| 文本生成 | 本文由 AI 辅助撰写,编辑负责结构、事实与措辞把关 |
| 数字来源 | 规模、结构、边界三类数字来自 PhysioNet 官方页面与文件目录;论文数字来自公开摘要 |
| 文件核验 | RECORDS、ANNOTATORS、SHA256SUMS.txt 与全部十二份 .hea 经直接访问确认 |
| 不一致说明 | 官方页列出十二条记录,配套研究摘要自述的评测集为九条(含室早四条:106、119、214、223;生理节律五条:100、101、103、117、122),207、222、231 不在该自述评测列表内;使用时需按记录号核对 |
| 论文信息 | 配套研究仅依据公开摘要与出版信息,未读全文;灵敏度与正预测率为论文自述值 |
| 未核验内容 | 全部十二份 .pwave 的标注条数、各条记录的 P 波峰总数、漏标与错标的具体规模、头文件注释行中母库内部编号字段的确切含义 |
| 图像 | 无真实心电图配图;封面为生成式提示词产物,不含任何真实波形 |
| 免责 | 本文不构成临床建议;数据使用须遵守 ODC-BY 1.0 的署名要求 |
常见误读(避坑清单)
| 说法 | 实际 | 证据 |
|---|---|---|
| 「它和 MIT-BIH 心律失常库是两个数据集」 | 它是母库十二段记录之上的一层标注,信号完全来自母库 | 官方页写明取自 MIT-BIH 心律失常库 |
| 「它是自动检测器的输出」 | 一位专家人工标注、另一位复核、疑难共同会商 | 官方方法节 |
| 「它标了 P 波的起点和终点」 | 只标峰位置 | 官方页称 P-wave annotations,注释类型码为 p |
| 「十二条记录是随机抽的」 | 有意纳入让检测变难的病理特征 | 官方方法与背景节 |
| 「没标注的地方就没有 P 波」 | 官方明确说并非所有 P 波都被标注 | 官方使用说明 |
| 「标注一定正确」 | 官方明确说部分标注可能有误 | 官方使用说明 |
| 「可以在母库上训练、在本库上评测」 | 两者记录重叠,必须排除同编号记录 | 官方使用说明提醒 |
| 「每段三十分钟整」 | 650000 ÷ 360 ≈ 1805.6 秒,约 30 分 5.6 秒 | 头文件第 1 行 |
| 「十二条记录的下通道都一样」 | 十条 V1、两条 V2、一条 V5 | 各记录 .hea 信号行 |
| 「采样率是 250 Hz」 | 360 Hz | 头文件第 1 行第 3 字段 |
| 「它有十二个患者,因为记录有十二段」 | 恰好一一对应,但这是母库编号决定的,不代表任何抽样设计 | 官方记录—受试者对应表 |
FAQ
Q1:它和 MIT-BIH 心律失常库是什么关系?是不是重复收录?
不是重复收录,是叠加关系。它的十二条记录全部取自母库,.dat 与 .hea 是母库原样文件,唯一新增的是 .pwave 注释。因此它不能脱离母库单独理解:波形、采样参数、患者信息都继承自母库,原创贡献只有那一层 P 波峰标注。这也直接带来使用上的约束——若训练时用过母库,必须排除对应编号的记录,否则评测不是外部验证(§5.6)。
Q2:能不能用它训练一个 P 波检测模型?
技术上能,但不推荐把它当主训练集。十二条记录、合计约六小时、十二名受试者,任何有容量的模型都能在几轮内记全,验证集上的指标会与真实泛化能力脱节。更合适的用法是:在大规模库上预训练或直接用无监督方法,把本库留作评测集;或者只用本库做方法对比,比较不同检测器在相同难例上的相对表现。
Q3:论文里报的九条记录和库里的十二条,我该用哪一组?
看你目的。若你要与那篇配套研究的数字直接对比,就只用其摘要自述的那九条(106、119、214、223 为含室性早搏组;100、101、103、117、122 为生理节律组),并在方法节写明记录号。若你要做一次独立的完整评测,用全部十二条,并同样逐条列出记录号。两种口径在论文里都必须显式说明——官方在自己的使用说明里就把「报告纳入了哪些记录、排除了哪些区间、用了多大时间容差」列为要求。
Q4:标注里只有 P 波峰位置,够用吗?
取决于任务。评测「检测器找没找到 P 波」以及「定位误差有多大」完全够用,这也是本库的设计目标。但若你要做 P 波时限、P 波离散度、PR 间期一类需要起点与终点的形态学指标,就不够——这类研究应使用 QT 数据库那类给出波形起止边界的资源。把「峰位置」当成「边界」来用,是本库最常见也最难在审稿阶段被发现的错误之一。
Q5:十二条记录怎么挑?有没有优先级建议?
按你要检验的难点挑。想看心房与心室关系被破坏时的表现,106(多形性室早)、223(多形性室早合并慢速双向室速)、231(异常房室传导,含 2:1 与莫氏 II 型阻滞、心率相关右束支阻滞)是最直接的三条。想看节律层面的干扰,222 官方描述提到阵发性房扑或房颤后常跟随交界性逸搏、且两通道均有高频噪声或伪迹。想看记录质量造成的困难,122 的下通道全程存在低幅高频噪声,214 有两次伪迹性幅度下降与一次磁带打滑。207 是官方自己标注为「极其困难」的一条,通常作为压力测试而非基线。
术语表
| 术语 | 解释 |
|---|---|
| P 波 | 心心电图上对应心房除极的波形,幅度小、时限短 |
| QRS 波群 | 对应心室除极的波形群,幅度大、边界陡,是多数自动检测器的基准 |
| T 波 | 对应心室复极的波形,常与 P 波在时频上重叠 |
| PR 间期 | P 波起点到 QRS 起点的时间间期,用于判断房室传导 |
| 窦性心律 | 由窦房结主导的正常心律,节律规整 |
| 室性早搏 | 心室提前除极产生的心搏,其前通常无相关 P 波 |
| 多形性 | 同一记录内早搏形态不一致,提示多个起源点 |
| 束支阻滞 | 左右束支传导受阻,QRS 增宽且形态改变 |
| 一度房室传导阻滞 | 房室传导延迟但每个心房激动都能下传,PR 间期延长 |
| 莫氏 II 型阻滞 | 二度房室阻滞的一种,间歇出现不能下传的心房激动 |
| 2:1 房室阻滞 | 每两个心房激动只有一个能下传至心室 |
| 室上性心动过速 | 起源于心室以上的快速心律,P 波常与 T 波重叠 |
| 室性自主心律 | 心室自身起搏点主导的缓慢心律,心房与心室活动脱节 |
| 交界性逸搏 | 房室交界区发出的代偿性搏动 |
| Holter | 便携式长时程心电监护,患者随身记录 |
| WFDB | PhysioNet 使用的波形数据库格式,含头文件、信号、注释 |
.hea |
纯文本头文件,声明采样率、增益、患者信息 |
.dat |
二进制信号文件 |
.pwave |
本库的 P 波峰注释文件,WFDB 标准格式 |
rdann |
WFDB 软件包中读取注释文件的函数 |
| SignalPlant | 布尔诺理工大学开发的开源信号标注与处理软件 |
| 时间容差 | 判定检测结果与参考标注是否匹配的允许时间偏差 |
| ODC-BY | 开放数据共享署名许可 |
| PhysioNet | 由 MIT 等机构维护的生物医学信号数据平台 |
附录 A:核心数字核对表
| 项 | 值 | 出处 |
|---|---|---|
| 记录数 | 12 段 | 官方页面;RECORDS 共 12 行 |
| 受试者数 | 12 名 | 官方记录—受试者对应表 |
| 单段采样点数 | 650000 | 全部 12 份 .hea 第 1 行第 4 字段 |
| 采样率 | 360 Hz | 官方页面;.hea 第 1 行第 3 字段 |
| 通道数 | 2 | 官方页面;.hea 第 1 行第 2 字段 |
| 单段时长 | 约 30 分钟 | 官方页面称 approximately half an hour |
| 存储格式 | 212 | .hea 信号行第 2 字段 |
| 增益 | 200 ADC 单位/毫伏 | .hea 信号行第 3 字段 |
| 位分辨率与量程 | 11 位,10 mV | 母库官方页面;.hea 信号行第 4 字段 |
| ADC 零值 | 1024 | .hea 信号行第 5 字段 |
| 注释文件类型码 | p |
.pwave 文件经 rdann 读取后的 symbol |
| 注释器说明 | pwave reference P-wave annotations |
ANNOTATORS 文件 |
| 标注者人数 | 2(一人标注、一人复核) | 官方方法节 |
| 标注者经验 | 5 年以上 Holter 分析经验 | 官方方法节 |
| 全库未压缩体积 | 22.4 MB | 官方页面文件区 |
| 文件总数 | 39(含 SHA256SUMS.txt) |
官方页面文件清单 |
| 校验清单行数 | 38 | SHA256SUMS.txt |
| 版本 | 1.0.0 | 官方页面版本区 |
| 发布日期 | 2018-01-09 | 官方页面 |
| DOI(本版本) | 10.13026/C2108F | 官方页面 |
| 许可 | ODC-BY 1.0 | 官方页面许可区 |
| 母库记录数 | 48 段 / 47 名受试者 | MIT-BIH 心律失常库官方页面 |
附录 B:数字的来源分层
第一层:官方页面与官方文件。 记录数、受试者数、采样点数、采样率、通道数、增益、ADC 零值、许可、版本与日期,均来自项目页面的摘要、数据描述与文件目录,以及直接访问 RECORDS、ANNOTATORS 与十二份 .hea的结果。
第二层:论文公开摘要。 配套研究的方法概述、评测记录编号、灵敏度与正预测率,来自公开摘要与出版信息页,未读全文。摘要可支撑「论文自述了什么」,不能支撑「该方法在其他数据上表现如何」。
第三层:母库官方页面。 关于信号采集背景(1975–1979 年、波士顿贝斯以色列医院、数字化参数)的描述来自 MIT-BIH 心律失常库官方页面,因为本库沿用母库波形而不重新采集。
第四层:未核实。 各 .pwave 文件的标注条数、漏标与错标规模、头文件注释行中母库内部编号字段的含义。这些需要逐文件下载统计或查阅母库文档,本文只做定性表述(§10)。
附录 C:完整参考文献
| 编号 | 文献 | 链接 | 用途 |
|---|---|---|---|
| 1 | MIT-BIH Arrhythmia Database P-Wave Annotations v1.0.0 | https://physionet.org/content/pwave/1.0.0/ | 全部规模、结构、边界数据 |
| 2 | 本库文件目录 | https://physionet.org/files/pwave/1.0.0/ | RECORDS、ANNOTATORS、.hea |
| 3 | Maršánová L, et al. Automatic Detection of P Wave in ECG During Ventricular Extrasystoles. IFMBE Proceedings 68/2, Springer, 2018, p. 381–385 | https://doi.org/10.1007/978-981-10-9038-7_72 | 配套研究、评测记录与指标 |
| 4 | Moody GB, Mark RG. The impact of the MIT-BIH Arrhythmia Database. IEEE EMB Magazine 2001;20(3):45–50 | https://doi.org/10.1109/51.932724 | 母库背景 |
| 5 | Plesinger F, et al. SignalPlant: an open signal processing software platform. Physiological Measurement 2016;37(7):N38–N48 | https://doi.org/10.1088/0967-3334/37/7/N38 | 标注工具 |
| 6 | MIT-BIH Arrhythmia Database v1.0.0 | https://physionet.org/content/mitdb/1.0.0/ | 母库参数与采集背景 |
| 7 | Brno University of Technology ECG Signal Database with Annotations of P Wave (BUT PDB) | https://physionet.org/content/but-pdb/ | 后继资源对照 |
| 8 | Pollard T, et al. PhysioNet as a global platform for biomedical research. Nature Health, 2026 | https://doi.org/10.1038/s44360-026-00096-z | 托管模式与引用规范 |
附录 D:任务代码
任务一:批量读取十二条记录并导出基本信息表
import wfdb
import pandas as pd
names = wfdb.get_record_list('pwave')
rows = []
for name in names:
hdr = wfdb.rdheader(name, pn_dir='pwave')
ann = wfdb.rdann(name, 'pwave', pn_dir='pwave')
rows.append({
'record': name,
'fs': hdr.fs,
'sig_len': hdr.sig_len,
'n_sig': hdr.n_sig,
'leads': ','.join(hdr.sig_name),
'n_pwave_ann': len(ann.sample),
'symbols': ''.join(sorted(set(ann.symbol))),
'comments': ' | '.join(hdr.comments),
})
df = pd.DataFrame(rows)
df.to_csv('pwave_index.csv', index=False)
print(df[['record', 'leads', 'n_pwave_ann']].to_string(index=False))
任务二:以固定容差评测一个检测器输出
import numpy as np
import wfdb
TOL_MS = 50 #-- 判定命中允许的时间偏差,单位毫秒
FS = 360
def evaluate(record, det_samples, tol_ms=TOL_MS):
#-- 参考标注来自 .pwave,检测输出来自你自己的算法
ref = wfdb.rdann(record, 'pwave', pn_dir='pwave').sample
tol = int(tol_ms * FS / 1000)
used = np.zeros(len(ref), dtype=bool)
hits = 0
for d in np.sort(det_samples):
#-- 每个参考标注至多匹配一次,避免重复计数
idx = np.where((~used) & (np.abs(ref - d) <= tol))[0]
if len(idx):
used[idx[0]] = True
hits += 1
se = hits / len(ref) * 100 if len(ref) else float('nan')
pp = hits / len(det_samples) * 100 if len(det_samples) else float('nan')
return {'record': record, 'ref': len(ref), 'det': len(det_samples),
'hits': hits, 'Se': round(se, 2), 'PP': round(pp, 2)}
print(evaluate('100', []))
附录 E:如果只记五件事
| 序号 | 记住什么 | 为什么 |
|---|---|---|
| 1 | 12 段、约 30 分钟、2 导联、360 Hz | 这四个数字定义了全部用法与限制 |
| 2 | 它是母库之上的一层 P 波峰标注,不是独立采集的数据集 | 决定了与母库的重叠与泄漏风险 |
| 3 | 一位专家标注、一位复核、疑难会商 | 流程可信,但官方不保证完备与正确 |
| 4 | 只有峰位置,没有起止边界 | P 波时限类研究不能用它 |
| 5 | 它是尺子不是粮仓 | 拿它评测最有价值,拿它训练会过拟合 |
编辑说明
本文的核验时间为 2026 年 10 月 29 日。核对方式为直接访问 PhysioNet 项目页与文件目录,逐一确认 RECORDS、ANNOTATORS、SHA256SUMS.txt 与全部十二份 .hea 的可访问性与内容;信号文件只确认了目录体积,未逐字节读取。配套研究仅依据公开摘要与出版信息,未读全文,其报告的灵敏度与正预测率均为论文自述值。官方页面列出十二条记录,而配套研究摘要自述的评测集为九条,这一差异已在 §10 与 FAQ 第 3 问中说明。未覆盖的内容包括:各 .pwave 文件的标注条数、漏标与错标的具体规模、以及头文件注释行中母库内部编号字段的确切含义。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- mit-bih-arrhythmia — 共享标签:生理信号 / 心电信号 / 心血管疾病 / 人工标注
- but-pdb — 共享标签:生理信号 / 心电信号 / 人工标注
- qt-database — 共享标签:生理信号 / 心电信号 / 心血管疾病 / 人工标注
- svdb — 共享标签:生理信号 / 心电信号 / 心血管疾病 / 人工标注
- mit-bih-afdb — 共享标签:生理信号 / 心电信号 / 心血管疾病
- ltafdb — 共享标签:生理信号 / 心电信号 / 心血管疾病
- nstdb — 共享标签:生理信号 / 心电信号
- edb — 共享标签:生理信号 / 心电信号 / 心血管疾病 / 人工标注
- butqdb — 共享标签:生理信号 / 心电信号 / 人工标注
- ecg-arrhythmia — 共享标签:生理信号 / 心电信号 / 心血管疾病
- iafdb — 共享标签:生理信号 / 心电信号 / 心血管疾病
- aftdb — 共享标签:生理信号 / 心电信号 / 心血管疾病
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

