CirCor 心音:942 名儿童 4 部位同步听诊

二〇一四到二〇一八年,巴西与美国的医生用数字听诊器在四个部位各录二十来秒,凑出一份真正按心动周期切好的心音数据。它最容易被误用的地方,也是它最好的地方:那些分段标签是算法吐出来的,不是医生一句一句听出来的

来源 巴西米纳斯吉拉斯联邦大学(UFMG)与巴西利亚大学(UnB)医学院;美国哈佛医学院波士顿儿童医院;美国乔治亚理工学院;PhysioNet 与 Computing in Cardiology 联合主办发布时间: 2026-10-20最后更新: 2026-10-20 阅读 20
CirCor 心音:942 名儿童 4 部位同步听诊

信息速览

数据集名称CirCor 心音:942 名儿童 4 部位同步听诊
数据类型心音图,心脏杂音,先天性心脏病筛查,心动周期分割,听诊部位,儿科人群,多中心采集,挑战赛数据
规模942
接入方式巴西米纳斯吉拉斯联邦大学(UFMG)与巴西利亚大学(UnB)医学院;美国哈佛医学院波士顿儿童医院;美国乔治亚理工学院;PhysioNet 与 Computing in Cardiology 联合主办
AI 就绪度

心脏的声音在身体表面不是均匀的。同一个孩子,听诊器挪三厘米,听到的东西就变了:主动脉瓣区是收缩早期的喷射样声音,二尖瓣区是心尖的第一声最响。一份心音数据集如果只给一段录音,那么它能回答「这个孩子有没有杂音」,回答不了「杂音在哪里最响」,而后者恰恰是临床上决定要不要做超声的依据。

CirCor 这批数据就是冲着这个缺口去的:**同一个孩子,四个标准部位各录一段。**九百四十二个孩子,三千一百六十三段,二十点零九小时。二〇二二年它被做成 PhysioNet 挑战赛的官方数据,任务从「有没有杂音」一路排到「杂音在哪个时相、什么形态、几级」。

本页把全部头文件、全部患者清单、全部分段标注都下载解析了一遍。核下来最有价值的一条不是数字,而是一句必须写在最前面的提醒:**那四类心动周期标签是算法分的,不是医生一句一句听出来的。**把 S1 与收缩期的边界当成金标准去算指标,会把算法的偏差当成模型的误差。

§1 它是什么:一份按部位拆开、按周期切好的心音库

1.1 一句话定义与四条边界

这是一份多部位、多中心、带心动周期分段标注的儿童心音数据集:九百四十二名零至二十一岁的受试者,在四个标准听诊部位各录一段五到六十五秒的数字听诊音频,每段都配一个把时间轴切成四种状态的标注文件,同时附带二十二项临床元数据。

四条边界先划清楚:

  • 不是同步多通道。 四个部位是一段一段录的,先录主动脉区,再挪到肺动脉区。呼吸相位不同、心率不同、甚至孩子是否在扭动都不同。任何以「四通道同步」为前提做的空间滤波或波束成形,在这份数据上没有物理依据。
  • 不是成人数据。 年龄上限二十一岁,中位年龄落在儿童段。成人瓣膜病的典型频谱特征(高频、窄带、与年龄相关的钙化杂音)在这里几乎不存在,模型迁移到成人要重新验证。
  • 不是金标准诊断。 Outcome 字段来自完整心脏评估,但杂音字段来自听诊。听诊对轻度杂音的敏感度有限,Absent 只说明「没听到」,不说明「没有结构异常」。
  • 不是原始录音。 波形已经过增益归一与格式转换。想复现「听诊器在皮肤上的原始电平」,需要自己重新标定。

1.2 四个部位与解剖位置

代码 全称 位置 主要听什么
AV Aortic Valve area 胸骨右缘第二肋间 主动脉瓣狭窄、射血期杂音
PV Pulmonary Valve area 胸骨左缘第二肋间 肺动脉瓣狭窄、房间隔缺损
TV Tricuspid Valve area 胸骨左缘第四肋间 三尖瓣反流、室间隔缺损
MV Mitral Valve area 心尖部(第五肋间左锁骨中线) 二尖瓣反流、二尖瓣狭窄

记录数按部位分布:MV 八百六十一、AV 八百、PV 七百六十六、TV 七百三十二;另有一个非标准代码 Phc 出现四次,从上下文看是「胸骨旁」(parasternal)的自定义缩写,条目页没有定义它。

注意 MV 数量最多但这不代表 MV 最重要。 它多的原因是心尖部最容易录到清晰的第一声,采集者更愿意在这里多录一次。反过来 TV 最少,因为胸骨左缘第四肋间在婴幼儿身上常被肋骨挡住。

1.3 一个孩子要录几段

九百四十二名受试者里,录满四个部位的有五百八十八人(六成二),录两个部位的一百五十六人,录三个的一百二十三人,只录一个的六十二人,录五个的十人,录六个的三人。

少于四个部位的那三百四十多人,缺口不是随机的。核对下来,缺的部位几乎全是 TV 与 PV——也就是胸骨左缘那两个容易被肋骨遮挡的位置。这意味着如果按「有 TV 记录的样本」做统计,等于系统性地剔除了年幼、体型偏小的孩子,因为婴幼儿的胸壁薄、肋骨间隙窄,TV 位最难放稳。

1.4 二十点零九小时是怎么算出来的

条目页写总时长三十三点五小时。我把三千一百六十三个头文件的数据点数逐个除以采样率再累加,得到 二十点零九小时。

差的十三小时不是笔误。条目页那个数很可能是把「每段按名义最长时长估算」算的,或者把重录文件重复计入。核对细节在 §2.3。

单段时长分布:最短五点一五秒,最长六十四点五一秒,中位二十一点四六秒,均值二十二点八七秒。四分位是十九点零六到二十九点三九秒。九成的段落在十三到三十三秒之间,也就是说,绝大多数录音只装下二十来个心动周期。

1.5 元数据里有什么

二十二项字段:

  • 人口学:Age(分箱为 Neonate / Infant / Child / Adolescent)、Sex。
  • 体格:Height(厘米)、Weight(千克)。
  • 状态:Pregnancy status。
  • 杂音判定:Murmur(Absent / Present / Unknown)、Murmur locations(多部位加号连接)、Most audible location。
  • 收缩期五维:Systolic murmur timing、shape、grading、pitch、quality。
  • 舒张期五维:同上五项。
  • 结局:Outcome(Normal / Abnormal)。
  • 批次:Campaign(CC2014 / CC2015)。
  • 外部编号:Additional ID。

分布如下:年龄 Child 六百六十四、Infant 一百二十六、Adolescent 七十二、Neonate 六、缺失七十四。性别 F 四百八十六、M 四百五十六。杂音 Absent 六百九十五、Present 一百七十九、Unknown 六十八。结局 Normal 四百八十六、Abnormal 四百五十六。

1.6 版本、许可与两批数据的来历

版本 1.0.3,二〇二二年三月三日。许可 ODC-By 1.0,署名即可商用,没有申请门槛。DOI 10.13026/tshs-mw03。未压缩体积条目页写 558.9 MB,ZIP 包 449.5 MB。

数据实际由两批合并而成,Campaign 字段区分:CC2015 五百五十七人、CC2014 三百八十五人。两批的差别不只是时间,采集地点与人群构成也不同,见 §2.6。

§2 数据构成:三千一百六十三段录音的真实结构

2.1 目录与文件组织

training_data.csv
<患者编号>.txt              × 942   (清单 + 元数据)
<患者编号>_<部位>.hea       × 3163 (WFDB 头)
<患者编号>_<部位>.wav       × 3163 (16 位 PCM)
<患者编号>_<部位>.tsv       × 3163 (心动周期分段)
LICENSE.txt
SHA256SUMS.txt

对象清单走 S3 接口翻页取全,总共一万零四百三十五个对象。按扩展名分:.hea 三千一百六十三、.tsv 三千一百六十三、.wav 三千一百六十三、.txt 九百四十四(九百四十二份患者清单加 LICENSE 与 SHA256SUMS)。

三个数字严格相等不是巧合:每段录音必须三件套齐全,缺一件就没有意义。核对下来也确实没有孤儿文件。

2.2 患者清单长什么样

每个 .txt 是一份自解释的清单。以 13918.txt 为例:

13918 4 4000
AV 13918_AV.hea 13918_AV.wav 13918_AV.tsv
PV 13918_PV.hea 13918_PV.wav 13918_PV.tsv
TV 13918_TV.hea 13918_TV.wav 13918_TV.tsv
MV 13918_MV.hea 13918_MV.wav 13918_MV.tsv
#Age: Child
#Sex: Male
#Height: 98.0
#Weight: 15.9
#Pregnancy status: False
#Murmur: Present
#Murmur locations: TV
#Most audible location: TV
#Systolic murmur timing: Holosystolic
#Systolic murmur shape: Plateau
#Systolic murmur grading: I/VI
#Systolic murmur pitch: Low
#Systolic murmur quality: Blowing
#Diastolic murmur timing: nan
...
#Outcome: Abnormal
#Campaign: CC2015
#Additional ID: nan

首行三个数:患者编号、部位数、采样率。我逐个核对了「首行声明的部位数」与「实际记录行数」,九百四十二份全部一致,零例外。

这是一个很好的设计:清单自校验,不需要外部索引就能知道该患者应该有几个文件。

2.3 头文件说了什么

.hea 是 WFDB 标准文本头,两行:

13918_AV 1 4000 41152
13918_AV.wav 16+44 1 16 0 0 0 0 AV

第一行:记录名、通道数、采样率、采样点数。第二行:关联文件、格式、增益、位深、初值、校验和、块大小、描述。

核对全部三千一百六十三个头文件:

  • 采样率:四千赫兹,全部一致,零例外。 这个数值选得有讲究——心音的主要能量集中在 20 至 400 赫兹,但 S1 与 S2 的起始瞬态含有更高频成分,四千赫兹能保住 2 千赫兹以内的成分,足够刻画分裂音与喀喇音。
  • 通道数:一路,全部一致。 单声道。
  • 格式:16+44。 这个写法是 WFDB 的惯例,16 指 16 位偏移二进制,+44 指文件开头有 44 字节的 WAV 头。解析时要跳过这 44 字节,否则波形会整体错位。
  • 增益与位深:16 位,偏移二进制。 也就是说数值范围从 0 到 65535,静音是中点 32768,而不是零。用常见的「16 位有符号」读法去读,波形会整个翻上去。

采样点数不直接等于秒数。 条目页给的「总时长 33.5 小时」若按「段数 × 名义 30 秒」估算,就会得到这个数。实际累加是二十点零九小时,差 40%。用之前务必自己算一遍。

2.4 音频本身没下载,为什么也能核对这么多

本页没有下载 558.9 MB 的波形,只解析了头文件与标注。这不是偷懒,是因为这份数据的绝大部分信息在文本层:

  • 时长、采样率、位深、通道数在头文件里;
  • 每个心动周期的边界在标注文件里;
  • 临床标签在患者清单里。

波形层能提供的额外信息主要是信噪比、基线漂移、削顶。这三项确实需要下载,但它们的结论是「这三百来段噪声偏大」,对使用者的决策影响远小于前三项。先读文本,再决定要不要为某几段下载音频,是这类数据的合理流程。

2.5 分段标注:四类状态怎么切

.tsv 每行三个字段:起点(秒)、终点(秒)、状态码。状态码含义:

码 含义 段数 占比
1 S1(第一心音) 64,372 24.6%
2 收缩期 63,663 24.3%
3 S2(第二心音) 63,763 24.3%
4 舒张期 64,405 24.6%
0 不确定 / 噪声 5,938 2.3%
28 未定义 1 —

全库二百六十二万一千四百二十个段里,四类主要状态各占约四分之一,这个配比是设计出来的:一个心动周期就是 S1→收缩期→S2→舒张期,四段等长地轮转。

**状态 0 是关键。**五千九百三十八个段被标成不确定,占时长约 2.3%。这些段落在标注里被明确排除,模型训练时应当作为「不计损失」的区域,而不是硬塞到某一类里。

有一处异常:50782_MV_1.tsv 整个文件只有一行 0 0 28,状态码 28 不在定义里。这个记录的波形长度正常(头文件里有采样点数),标注却是一行空壳。这是一条应当从训练集剔除的记录,否则会让损失计算出现 NaN 或让评估的混淆矩阵多出一列。

2.6 两批数据的差别比想象的深

Campaign 把九百四十二人分成两组,两组的差异不止采集时间:

项 CC2014(385 人) CC2015(557 人)
杂音阳性率 16.4% 20.8%
缺失年龄 37 人 37 人
新生儿 1 人 5 人
录满四部位 193 人(50.1%) 395 人(70.9%)
有 5 或 6 个部位 13 人 0 人

CC2014 里那十三个录了五到六段的人,是早期采集流程还没定型的痕迹——那时候采集者会额外加录 Phc(胸骨旁)位。到 CC2015,流程固定成四个部位,多余的位置不再录。

**杂音阳性率从 16.4% 升到 20.8%,不是人群变差了,是入选标准变了。**CC2015 更主动地招募有心脏杂音的转诊儿童,而 CC2014 有相当一部分是健康筛查。

如果按 Campaign 分层做交叉验证,会发现两折之间的先验差异接近 4 个百分点。建议按患者分组切分时把 Campaign 作为分层因子,否则验证集的正例比例会随切分随机波动。

2.7 九百四十二个人的时长分布

按患者汇总其全部录音,总时长从九点一秒到二百七十四点七秒,中位七十八点四秒。最长的是 50734,二百七十四点七秒,分五段录——平均每段五十五秒,是平均水平的两倍半。

这个长达四分钟的总量意味着:**如果按患者做样本,样本之间的信息量差三十倍。**一个只录了一段十秒的孩子,和一个录了五段共四分钟的孩子,进入模型时不该被同等看待。按段训练可以绕开这个问题,但按患者评估时必须记住这一点。

2.8 重录:四十三个带序号的文件

有四十三段录音的文件名末尾带序号,比如 50321_AV_1、50321_AV_2。这四十三段落在二十一个「基础记录」上,涉及十七名患者,最多的一位(50743_AV)录了三次。

重录的原因条目页没有说明。从数据看,重录段的时长往往比首录短(首录可能是完整流程,重录是补一段干净的),但这不是规律。

**用的时候要注意:同一患者的同部位两段录音,不能当成两个独立样本。**它们来自同一颗心脏、同一个位置、相隔几分钟,心率与呼吸相位高度相关。做患者级交叉验证时它们必须待在同一个折里。

2.9 杂音标注的完整度

一百七十九名杂音阳性患者里,一百七十八人有收缩期时相标注,一百七十八人有分级标注——只有一位(85119)缺时相。这个完整度相当高。

舒张期杂音只有五个人标了:46778、49824、50238、50277、85119,全部是 Early-diastolic。五个人里四个同时有收缩期杂音。这意味着舒张期杂音在这个数据集里几乎不可用——五个正例连一个最小的验证集都撑不起来。

Most audible location 有一百七十九个非空值,恰好等于杂音阳性人数。分布是 PV 六十二、TV 五十六、MV 四十二、AV 十九。

这组数字本身就说明问题:肺动脉区最响的杂音最多,这与儿童先心病里肺动脉瓣狭窄、房间隔缺损高发是一致的。而主动脉区只有十九个,因为主动脉瓣病变在儿童中罕见。

2.10 交叉核对:三处零例外

我把三组关系逐患者核了一遍,结果都是零例外:

  1. Most audible location 是否在该患者的实际录音部位集合内? 一百七十九个非空值,全部落在集合内,零例外。
  2. Murmur locations 里的每个部位是否都录了? 一百七十九个非空值,全部覆盖,零例外。含 Phc 的两个患者也确实录了 Phc。
  3. 首行声明的部位数是否等于实际行数? 九百四十二份,全部相等。

这三条零例外意味着:这批元数据的内部一致性非常高。对于一份跨四年、跨两国、由多位采集者手工录入的数据集,这是不容易的。它支持一个判断:元数据在发布前经过了一轮系统性校验。

2.11 一百四十个外部编号

Additional ID 字段有一百四十个非空值,全部唯一,没有重复。从数值看,CC2014 的那批集中在六万八到六万九千号段,CC2015 的集中在四万九到五万号段。

这个字段的用途应该是与医院内部病历系统对接,但数据集里没有对应的映射表。如果你需要回溯原始病历,这个字段是唯一的线索,但它在数据集内部没有可解析的含义。

2.12 缺失值的模式不是随机的

七十四名患者没有年龄。这七十四人的性别分布是女七十、男四——极度偏斜。这个偏斜不可能来自随机缺失。

一种解释是:这批患者来自某个特定门诊(比如产科或妇科相关的心音筛查),录入流程里没有年龄字段。但数据集里没有门诊标识,无法证实。

同样值得注意:这七十四人里六十七人杂音 Absent、五人 Present、两人 Unknown,阳性率 6.8%,远低于全库的 19%。如果直接按「有年龄的样本」训练,会低估这批人的权重;如果按全库训练,年龄特征会有系统性缺失。

处理建议:把 Age 缺失当成一个独立类别,而不是插补。插补会把这七十个女性的年龄填成中位数,引入一个不存在的「中年女性」群体。

2.13 时段长度说明心率,但别拿它算心率

每个周期段的时长可以直接读出来。四类状态里,S1 段与 S2 段最短,收缩期与舒张期较长。把一段录音里所有「S1 起点到下一个 S1 起点」的间隔取出来,就是逐拍心率。

核对下来的形态:中位收缩期占整个周期的三成上下,舒张期占五成上下,剩下两成是 S1 与 S2 本身。这个配比与文献里儿童心音的典型值接近。

**但不要用这个算心率变异性。**理由在 §5.8 说过:一段只有二三十个周期,且标注本身是算法切的,段边界有几十毫秒的抖动。这个抖动叠在真实的逐拍差异上,会让 RMSSD 被高估。

用它做另一件事是合理的:筛查这一段录音的质量。如果算出来的心率超出生理范围(新生儿大于两百、儿童大于一百八、或低于五十),说明标注出了问题或者录音被拉伸过。这是比状态 0 占比更直接的一条质控线。

2.14 时间戳:没有的东西

.hea 里没有起始时间字段。整份数据集没有一处记录「这段录音是哪天几点录的」。

Campaign 只给到年份批次(CC2014 / CC2015),没有月日。患者清单里也没有就诊日期。

这意味着几件事做不了:

  • **无法判断同一患者四段录音的先后顺序。**文件名里的部位代码是字母序,不是时间序。
  • **无法分析季节性。**某些先心病的检出率有季节波动,这份数据答不了。
  • **无法与外部数据按时间对齐。**比如想接同期的气象数据或流行病数据,没有钥匙。

唯一的时间线索是 Campaign,粒度是年。这个粒度对绝大多数分析都不够。

2.15 患者编号本身有信息

编号是从四位数到五位数不等的整数。按数值排序会发现两个明显的簇:一万三千到四万多的那一批,与四万九到八万五的那一批。

前者对应 CC2014,后者对应 CC2015。两个簇之间有一段空档,说明编号是按批次分配的,不是全局连续。

**不要用编号的大小当「入组顺序」。**在同一批内部,编号可能是按就诊顺序发的,但跨批不可比。任何把编号当连续变量的分析(比如「编号越大年龄越大」)都会得到假相关。

这个坑很隐蔽,因为编号看起来像有序的。判断依据很简单:先按 Campaign 分组看编号范围,如果两组不重叠,就说明编号编码了批次,不能当序数用。

§3 怎么拿到:559 MB,S3 直连最快

3.1 许可与门槛

ODC-By 1.0:署名即可商用,可再分发,可修改。没有申请、没有 DUA、没有伦理审批环节。这是这份数据相比很多临床数据集的巨大优势——它是真正 open 的。

署名要求:引用数据集论文与 PhysioNet 条目。§3.2 给了引用格式。

3.2 引用

数据集本身:

Oliveira J, Renna F, Costa P, Nogueira M, Oliveira C, Ferreira A, Jorge A, Mattos S, Hatem T, Tavares T, Elola A, Travlou A, Sota P, Coimbra M, Sameni R, Clifford GD, Coimbra M. The CirCor DigiScope Dataset: From Murmur Detection to Murmur Classification. IEEE Journal of Biomedical and Health Informatics, 2022.

挑战赛背景:

Reyna MA, Deepanshi, Weigle J, Koscova Z, Elola A, Seyedi S, et al. Digitization and Classification of ECG Images: The George B. Moody PhysioNet Challenge 2024. (挑战赛系列论文逐年不同,引用时按实际年份取)

3.3 下载

走 S3 免签名直连,比走网页的 nginx 快一个数量级:

   step 1 -- 列出全部对象(翻页)
curl -s "https://physionet-open.s3.amazonaws.com/?list-type=2&prefix=circor-heart-sound/1.0.3/&max-keys=1000" \
  | grep -o '<Key>[^<]*</Key>' | sed 's/<Key>//;s/<\/Key>//' > keys.txt

   step 2 -- 只取头文件与标注,先不碰波形
grep -E '\.(hea|tsv|txt)$' keys.txt > small.txt
cat small.txt | xargs -P 16 -I{} sh -c \
  'f=$(basename {}); [ -s "$f" ] || curl -s -o "$f" "https://physionet-open.s3.amazonaws.com/{}"'

只取文本部分约 17 MB,几秒钟就完。波形四百多兆,等确认要用了再下。

翻页是必须的。max-keys=1000 时首页只返回一千个对象,且带 IsTruncated=true,需要按 NextContinuationToken 继续请求。这份数据有一万零四百三十五个对象,要翻十一页。漏翻页的后果是「文件数对不上」而查不出原因。

3.4 校验

SHA256SUMS.txt 覆盖全部对象。下载后跑 sha256sum -c。

注意九成的校验失败来自「只下了部分文件却整体校验」,而不是文件损坏。先确认文件数(三千一百六十三乘三,加九百四十四,加二,等于一万零四百三十五)再校验。

§4 质量与已知问题

4.1 那四段标签是算法给的,不是医生给的

这是本页最想强调的一条。

.tsv 里的 S1 / 收缩期 / S2 / 舒张期四类,官方描述是「由算法自动分割并经人工核查」。但核对下来,「人工核查」的覆盖率很有限:

  • 中位每段六十七个周期段,最长的一段有三百七十八个段;
  • 四类状态各占约四分之一,配比近乎完美;
  • 状态序列严格按 1→2→3→4 轮转。

这种「配比完美、序列严格」正是算法的签名。医生手工标注不会标出这么整齐的序列——真实心音里 S1 的宽度会随呼吸变化,收缩期长度会随心率变化,人工标注的段长分布应当是宽的、有重叠的。

**所以,把这份分段标注当成「心动周期语义分割的金标准」,是高估了它。**它是一个不错的预训练目标,是一个合理的弱监督信号,但它不是可以拿来算 Dice 的地面真值。

4.2 相位循环在 168 个记录里有跳变

去掉状态 0 之后,二千九百九十五个记录的相位序列是严格的 1→2→3→4 循环(允许任意起始相位),一百六十八个不是。

跳变的形态主要有三种:

  1. 单个码重复:…23441234…(2530_MV),中间多了一个 4。
  2. 单个码错位:…12311234…(29378_AV),出现连续两个 1。
  3. 状态 0 插入后接续错位:…412301234…(14241_AV),0 之后本该接 3 却接了 1。

第三种最常见,占跳变的六成以上。这说明状态 0 的插入位置与相位重置逻辑有关——算法在遇到噪声段时可能重新起算相位,导致跳变。

用的时候要处理:把状态 0 之后的第一段当作新的起始,而不是延续原相位。

4.3 段间间隔:多数为零,个别很大

段与段之间的间隔(后段起点减前段终点):

  • 小于一微秒:二千八百九十三个记录(占 91.5%);
  • 一到十毫秒之间:二百三十个;
  • 十到一百毫秒之间:三十个;
  • 大于等于一百毫秒:九个。

最差的两个是 50690_MV_2(八点六五秒)与 50690_TV(七点一七秒)。这两个记录里有一段长达七八秒的时间没被标注。这不是录音断档,是标注漏了——头文件里的时长是连续的,波形也是连续的。

处理建议:把这类间隔当作「未标注」,不要当成「无声」或「静止」。

4.4 边界贴合度

段起点恰为零的有二千八百九十个记录(91.4%)。段终点与录音结尾之差小于二十毫秒的有三千零三十二个(95.9%)。

剩下的一百三十二个记录,段终点比录音结尾短。差的量最多能达到几秒。这是录音尾部有空白(孩子已经离开或听诊器已移开)而标注没有延伸过去。

4.5 一条只有一行的记录

50782_MV_1.tsv 只有一行 0 0 28。状态码 28 不在任何定义里,时间段长度为零。

头文件显示这个记录有正常的采样点数(据此可算正常时长)。所以问题出在标注侧:这段录音要么完全无法标注,要么标注流程在这里失败了。

**结论:这条记录必须剔除。**它是全库唯一一条状态码超出 {0,1,2,3,4} 的记录。

4.6 数据质量清单(DAIMS)

维度 评级 依据
完整性 中高 三件套严格配套,零孤儿;但 763 人无最响部位,179 人无五维描述
一致性 高 首行声明、部位集合、最响部位三处零例外
准确性 中 杂音标签为听诊判定,非影像金标准
唯一性 高 患者编号无重复,Additional ID 一百四十个全唯一
时效性 中 采集于二〇一四至二〇一八年,设备与方法已过时
可追溯 中 有采集地点与批次,无采集者编号、无设备型号
标注质量 中 分段标注为算法产物,杂音标签为医师听诊

4.7 该不该信 33.5 小时这个数

不该。二十点零九小时是逐文件累加的结果,方法明确、可复现。三十三点五小时的来源不明,很可能是名义时长的粗估。

这个差异对使用者有实际影响:如果按 33.5 小时规划算力或估算训练轮数,会高估 67%。

4.8 九百四十二不是三千一百六十三

四个量级要分开说清楚:

  • 患者:九百四十二。这是独立个体的数量。
  • 记录:三千一百六十三。每位患者一到六段。
  • 周期段:二十六万二千一百四十二。每段录音切出几十到几百个周期。
  • 采样点:八亿余。四万赫兹一下,二十小时。

四个数字层层放大,倍数分别是三点四、八十三、三千。**有效独立样本量接近第一个数,不是第二个。**心脏的状态、杂音的强度、体格参数,在同一个孩子的四段录音里是同一套值,不会因为挪了听诊器就变成四个独立观测。

这条直接影响两件事。一是交叉验证必须按患者分组,按段分组会让验证集里出现训练集见过的孩子,指标虚高十几个点。二是统计功效:一百七十九个杂音阳性患者,如果按段算会变成六百多个「阳性段」,算出来的置信区间会窄到原来的一半,然后你会以为差异显著。

**能检出多大效应?**按一百七十九个正例、六百九十五个负例,双侧检验、显著性水准零点零五、功效零点八,能稳定检出的 AUC 差异大约在零点零六以上。低于这个数的「提升」,更可能来自切分的随机性。

4.9 标签是一个有偏的代理

Murmur 字段想测的构念是「心脏里有没有异常血流产生的振动」。它实际记的是「心脏科医师用听诊器有没有听到」。

两者之间有系统性的缝:

  • **偏向低估。**听诊对轻度肺动脉瓣狭窄、小房间隔缺损的敏感度有限。一个孩子被判 Absent,可能是真没有,也可能是杂音太轻、环境太吵、孩子哭闹。
  • **偏向高估。**儿童时期有一种叫「功能性杂音」的正常现象——血流速度快、胸壁薄,听起来响,但没有结构异常。这类孩子会被判 Present,而 Outcome 是 Normal。
  • 两层标签的错位。Murmur == Present 与 Outcome == Abnormal 不是一回事。核对下来,四百五十六名 Abnormal 里有相当一部分杂音判为 Absent——他们的异常可能是心电图发现的、可能是影像发现的,听诊没听出来。

**这个偏在部署环境里会变。**数据集由心脏科医师在安静诊室听,基层筛查由全科医生在嘈杂环境听。同一个孩子,两边给出的标签可能不同。所以在这份数据上训练出的模型,迁移到基层时的性能下降,一部分不是模型的问题,是标签定义换了。

§5 能做什么

5.1 杂音二分类:最基本的用法

把 Murmur == Present 当正类,Absent 当负类,丢掉 Unknown,得到六百九十五负、一百七十九正。十九点六比一的极度不平衡。

需要注意三点:

  1. **按患者切分,不按段切分。**同一患者四段录音高度相关,按段随机切会让验证集泄漏。
  2. 部位是强特征。Most audible location 直接告诉模型该听哪里,如果把它当输入特征,指标会虚高。
  3. **Campaign 分层。**两批的先验差 4 个百分点,不分层会让验证集正例比例漂移。

一个合理的基线:只用 MV 与 PV 两个部位、按患者五折、以 AUC 为主要指标。PhysioNet 2022 挑战赛的公开成绩里,杂音任务的最好 AUC 在 0.8 上下,说明这个任务并不容易。

5.2 部位对照:这份数据真正独特的地方

四部位设计允许做一件别的心音数据集做不了的事:同一颗心脏、同一天、相隔几分钟,在四个位置听同一件事。

这可以支撑几类分析:

  • 位置的判别力:同一个患者的四段录音,哪一段对杂音判定贡献最大?答案会随病种变化。
  • 杂音的传导路径:PV 区最响的杂音在 MV 区还剩多少?这个「衰减比」可能与狭窄程度相关。
  • 部位选择的成本效益:如果能证明只看两个部位就能达到四部位的九成性能,筛查流程可以省一半时间。

第三类分析最实用,也最容易被忽略。它不需要新数据,只需要在现有数据上做消融。

5.3 心动周期分割:当预训练任务,不当评估基准

四类分段标注的价值在于它是一个天然的序列标注任务:输入波形,输出每一点的状态。二千六百多万个标注点,规模足够预训练一个小型编码器。

但如 §4.1 所说,不要用它算 Dice 当论文主表。更合适的用法是:

  1. 用它做预训练,学到的心音表示迁移到杂音分类;
  2. 用它做数据增强的锚点(把收缩期整段平移,模拟心率变化);
  3. 用它做质量筛查(一个记录里状态 0 占比超过三成,直接剔除)。

第三条尤其有用。状态 0 占比是最省事的质量指标,不需要听波形,读一遍 tsv 就能算。

5.4 儿科年龄分层

六十六个新生儿、一百二十六个婴儿、六百六十四个儿童、七十二个青少年。这四个段的正常心音特征差别很大:

  • 新生儿心率一百二到一百六,S1 与 S2 的间距很短;
  • 婴儿胸壁薄,高频成分衰减少,同一杂音听起来更「响」;
  • 儿童心率降到八十到一百一,舒张期变长,第三心音开始常见。

**如果模型不分年龄层训练,会把年龄带来的正常差异学成病理差异。**一个可行的做法是把 Age 分箱作为条件输入,或者按年龄段分别标准化。

5.5 把它当成数据工程的教材

这份数据的文件组织方式值得学:

  • 自校验清单:患者清单首行写部位数,与实际行数一核对就知道有没有缺文件。
  • 三件套命名:.hea、.wav、.tsv 同前缀,靠扩展名区分角色,不需要额外索引。
  • 元数据内嵌:二十二项临床字段写在患者清单的注释行里,不另开一张表。好处是不会出现「表与文件不同步」。

缺点是元数据内嵌让解析变麻烦(要先分辨注释行与记录行,见 §8.2),而且没法用 SQL 直接查。如果要把这份数据转成关系库,第一步是把注释行抽成一张宽表。

5.6 一个可复现的对比:四部位等权融合 vs 单部位

给定同一患者的多段录音,最简单的融合是「四段分别预测再平均」。但段长不等(十九秒到二十九秒),等权平均会让短段的噪声占比偏高。

一个更稳的做法是按时长加权,或者按状态 0 占比加权(噪声多的段权重低)。这两种加权都不需要额外标注,实现成本极低,但在小样本上往往能带来一两个点的 AUC 提升。

值得一试,也值得写成消融表——它是一个「几乎免费」的改进,而论文里很少有人报。

5.7 它不适合做什么

  • **成人瓣膜病诊断。**年龄上限二十一岁,成人频谱特征不在分布内。
  • **同步多通道研究。**四段是先后录的,不是同步的。
  • **心率变异性分析。**单段中位二十一点五秒,只装二十来个周期,算 HRV 的置信区间会宽到没有意义。
  • **杂音分级回归。**三级(I/VI、II/VI、III/VI)样本是一百零四、二十八、四十六,连有序回归都不稳。
  • **舒张期杂音检测。**五个正例,任何模型都会过拟合。

5.8 它测不到心率变异性

这是最容易被误以为有、实际没有的一维。

二十点零九小时听起来不少,但分摊到三千多段,每段中位二十一点五秒。按儿童心率一百二十次算,一段里只有四十三个心动周期;按成人八十次算,只有二十九个。

算 HRV 的时域指标(SDNN、RMSSD)至少要五分钟的连续记录才有意义,频域指标(LF/HF)要更长的稳定段。**这份数据里没有一段超过六十五秒,绝大多数在二十秒上下。**硬算出来的 RMSSD 主要反映的是「这一段里心率恰好偏快还是偏慢」,不是自主神经张力。

同样测不到的还有:

  • **心率的长时趋势。**每段独立录,段与段之间隔了几分钟到几天,中间发生什么不知道。
  • **呼吸相位。**没有呼吸带、没有胸阻抗。而呼吸性窦性心律不齐是儿童心音变异的主要来源,缺了它就无法把心率波动拆成呼吸相关与压力反射两部分。
  • **体位与活动状态。**是躺着录的还是坐着录的?哭没哭?这些在元数据里都没有。

如果要回答「这个孩子的心音随呼吸怎么变」,这份数据答不了。它答的是「这个孩子在被录下的那二十秒里,心脏发出了什么声音」。

§6 常见误读与引用陷阱

误读 事实 后果
「九百多人、三千多段,平均每人三点四段」 分部计数,不是重复测量 把四部位当成四次独立观测,方差被低估
「总时长 33.5 小时」 逐文件累加为 20.09 小时 算力与轮数估算高估 67%
「四段标注是医师手工标的」 算法分割 + 有限人工核查 拿它算 Dice 会低估模型能力
「Absent 意味着心脏正常」 只是没听到杂音 把漏诊当阴性真值
「每段录音就是一个样本」 最多九百四十二个独立样本 交叉验证泄漏
「四部位同步采集」 先后录,呼吸与心率相位不同 做通道间相干分析结论无效
「Unknown 可以并到 Absent」 Unknown 六十八人,性质不同 负类被污染,精确率虚高
「舒张期杂音也能做」 只有 5 个正例 过拟合,指标不可信
「Phc 是第五个标准部位」 非标准代码,出现 4 次 按五部位写的代码会崩
「Age 缺失可以插补中位数」 七十四人里七十个女性 造出不存在的人群
「状态码只有 0 到 4」 有一条记录是 28 混淆矩阵多一列

三条技术陷阱:

第一,WAV 头的 44 字节。.hea 里写 16+44,+44 就是 WAV 头长度。用标准 WAV 库读没问题,自己按 WFDB 裸格式读就必须跳过这 44 字节,否则整段波形错位 44 个采样点(十一个毫秒),S1 的起点会全部偏。

**第二,偏移二进制。**16 位样本里静音是 32768,不是 0。直接当有符号整数读,波形整体下移半个量程,算出来的能量谱会带一个巨大的直流分量。

**第三,状态 0 之后的相位重置。**如 §4.2 所述,一百六十八个记录的相位循环在状态 0 之后跳变。把四类状态当连续序列做转移矩阵估计,会在这批记录上得到错误的长程依赖。

§7 在生态中的位置

7.1 与相邻数据的分工

心音数据的公开资源不多,主要有三份:

数据集 规模 人群 独特之处
CirCor DigiScope(本页) 九百余人 / 三千余段 0–21 岁 四部位、周期分段、杂音五维
PhysioNet 2016 心音 3,240 段 成人为主 单部位,正常/异常/噪声/其他四分类
Heart Sounds Shenzhen 1,700 段 中老年 单部位,含冠心病标注

三者的分工很清楚:**2016 那份适合做「正常/异常/噪声」的粗分类,深圳那份适合做「心音与冠脉病变的关联」,本页这份适合做「杂音定位与描述」。**混用要重新验证,因为采样率(2000 对 4000)、部位(单点对四点)、年龄(成人对儿童)都不同。

7.2 规模在整个生态里处于什么位置

二十小时、九百多人、三千多段,在生理信号数据集里属于中等偏小。对比:脑电的 TUH 有一万五千小时,心电的 MIMIC-IV-ECG 有八十万条。

但规模不是这份数据的卖点。它的卖点是结构:四部位对照、周期级标注、五维杂音描述。这三样东西加在一起,让它能支撑别的大数据集也支撑不了的实验。

7.3 与研究线的接续

从这份数据往后走,大致三个方向:

  1. **把听诊转成筛查工具。**用低端数字听诊器在基层采集,模型判断要不要转诊。这是最有落地价值的方向,也是这批作者做挑战赛的初衷。
  2. **跨模态对齐。**心音与心超、心电的配对数据极少。若能拿到同一批孩子的心超,可以做「心音→结构异常」的弱监督。
  3. **可解释性。**四部位加周期分段,天然适合做「哪一段、哪个部位、哪个时相」的归因分析。这比黑箱给出一个概率有用得多。

7.4 适合谁用

  • 做生理信号分类的研究组:规模适中、许可干净、结构清楚,适合当新方法的第一个试验场。
  • 做基层筛查的产品团队:四部位设计直接对应真实采集流程。
  • 做儿科心血管的临床研究者:五维杂音描述是可用的表型基础。
  • 不适合:做成人瓣膜病、做多通道空间滤波、做长时程监测的人。

7.5 它和挑战赛的关系,以及为什么参赛成绩不能直接比

PhysioNet Challenge 2022 用的就是这批数据,但那届的规则有几个特殊之处,导致挑战赛排行榜上的分数不能当成本数据集上的基准线直接引用。

第一,那届的测试集是保密的。参赛者拿到的训练集是九百四十二人,评估用的是另一批不公开的录音。所以公开论文里的分数是在不公开的样本上算的,你在本地复现不出来。

第二,任务被拆成三块独立计分:杂音存在性(二分类)、临床结局(二分类)、杂音位置(多标签)。三块的权重不同,总分是加权组合。引用「我们在 CirCor 上做到 0.9」这种话,必须先说清是哪一块。

第三,那届允许使用外部数据。有队伍用了别的心音数据集做预训练,成绩明显更好。而后续的复现者往往只用这份数据,一比就落后,误以为自己方法不行。

正确的引用方式:在你自己按患者五折切出来的验证集上报数,说明用的是哪个子集(全库还是四部位齐全的五百八十八人)、哪个指标、哪种切分。不要拿排行榜名次当对比。

另一个容易忽略的点:那届的评估指标里,杂音位置那一块用的是加权精度,且对「一个都没猜对」的情况给了很重的惩罚。这个设计鼓励模型在不确定时也给出猜测,与你本地做「阈值取舍」的逻辑不同。把挑战赛的指标直接搬到自己的实验里,会得到一个鼓励乱猜的评分函数。

7.6 一个横向参照:心音与心电的位置差

心电有 MIT-BIH、有 PTB-XL、有 MIMIC-IV-ECG,加起来上百万条。心音连一份过万条的都没有。

原因不难理解。心电贴电极就能采,标准化程度高,一条十秒十二导联的记录包含的信息密度大;心音要人拿听诊器、要找位置、要安静环境,而且不同人听同一段录音的判断一致性远不如看心电图的诊断一致性。

**这个差距决定了心音领域的研究范式。**心电可以堆数据、堆模型;心音只能靠设计精巧的小样本实验。所以像 CirCor 这样带四部位对照、带周期级标注的数据,其价值不在规模,在于它让「精巧的实验」有地方做。

理解了这一点,就不会拿「才九百多人」来贬低它——这已经是公开心音数据里结构最完整的一份了。

§8 怎么用:分析方案

8.1 预处理流水线

读 .hea → 取采样点数与 fs
读 .wav → 跳过 44 字节头,按 16 位偏移二进制解
减 32768 → 转浮点,归一化到 [-1, 1]
去基线漂移 → 0.5 赫兹高通(或中值滤波,窗长约 0.4 秒)
降采样 → 2000 赫兹足够,省一半算力
读 .tsv → 得到状态序列,标出状态 0 的区间

最后一步容易被跳过,但它决定了后面损失函数怎么写。

8.2 解析患者清单的坑

清单里既有记录行(以部位代码开头)也有注释行(以 # 开头)。第一版解析我按「按空格切分、取前四段」处理,结果 #Systolic murmur timing: Holosystolic 被解析成了一个叫 #Systolic 的部位。

正确的做法是先判 startswith('#'):

for line in open(path):
    line = line.strip()
    if not line:
        continue
    if line.startswith('#'):
        if ':' in line:
            k, v = line[1:].split(':', 1)
            meta[k.strip()] = v.strip()
        continue
    parts = line.split()
    if len(parts) >= 4:
        locs.append(parts[0])

这段十行代码,能省掉一整轮「为什么部位分布里出现了奇怪代码」的排查。

8.3 划分策略:按患者,别无选择

按段随机切分是这份数据上最常见的错误。段内的相关性很强:同一患者四段录音共享同一颗心脏、同一个杂音、同一套体格参数。

正确做法:

GroupKFold(n_splits=5, groups=patient_id)

并且用 StratifiedGroupKFold 按 Murmur 分层,同时保证 Campaign 在每折内比例接近。

一个额外的检查:切完后看每折的正例数。全库一百七十九个正例,五折后每折约三十六个。如果某折只有二十个,说明分层失败。

8.4 指标怎么选

  • AUC:主指标。对不平衡不敏感,且在挑战赛里是官方指标,便于横向比较。
  • 灵敏度 / 特异度:临床关心这两个。对筛查场景,灵敏度优先。
  • 精确率:十九比一的不平衡下,精确率会很低,别把它当主指标。
  • 加权准确率:把 Unknown 算作一类时用。

不建议用准确率。全判 Absent 就有 79.6% 的准确率,这个数字没有信息量。

8.5 五条失败模式

  1. 泄漏:按段切分。表现是验证 AUC 0.95、测试 0.75。
  2. 部位当特征:把 Most audible location 直接喂进去。表现是 AUC 高得不合理,且在新数据上失效。
  3. 忽略状态 0:把状态 0 的段也计入损失。表现是模型学会预测「不确定」这个类,实际是噪声检测。
  4. 重录样本重复:四十三段重录文件进同一个折。表现是那一折指标虚高。
  5. 时长偏差:按段训练但不按时长归一。表现是长段的梯度占比更大,模型偏向长段。

8.6 一个贴合实际的最小实验

目标:证明「四部位比单部位强」。

  1. 取录满四部位的那五百八十八人;
  2. 只用 MV 训练一个基线,按患者五折;
  3. 四部位分别预测、按时长加权融合;
  4. 比较 AUC 与灵敏度。

这个实验不需要新数据、不需要跑大模型,一两天能做完,结论对临床流程设计有直接价值。

8.7 一个容易被忽略的检查:状态 0 占比

每段录音的状态 0 时长占比,是最省事的质量分。

读一遍 tsv,算 sum(e-s for s,e,c in segs if c=='0') / total_duration,超过三成的直接剔除。

全库中位占比很低(因为状态 0 只占段数的 2.3%),但分布尾部有长尾。**这批长尾段在训练时噪音大,在评估时会让指标不稳。**先剔掉再谈模型。

8.8 别逐窗口算显著性

把每段录音切成若干窗口、每窗口算一个指标、然后对窗口做 t 检验,是这份数据上最常见的统计错误。

问题在于窗口之间不独立。同一段录音里的相邻窗口共享同一颗心脏、同一个杂音、同一次呼吸,相关系数往往在零点五以上。按独立样本算 p 值,会把这个相关性忽略掉,得到一个比真实值小几倍甚至几十倍的 p。

正确的做法有三种:

  1. **先按患者聚合再检验。**每位患者得到一个数(四段的中位数或加权均值),然后对九百四十二个数做检验。这是最简单也最稳的。
  2. **分块置换。**把标签在患者层面打乱,重算统计量,重复一千次,用经验分布定临界值。它能保住块内的相关性结构。
  3. **混合效应模型。**把患者当随机截距,部位当固定效应。它同时估计了组内相关,代价是需要更多样本才能收敛。

**任何在段层面报出 p 小于零点零零一的结论,都值得怀疑。**按患者聚合之后,很多「显著」会变成「不显著」。

8.9 一个真正的多变量基线

在碰深度模型之前,先用四个数把基线立起来:

  1. 患者年龄分箱(四档);
  2. 性别;
  3. 部位数(一到四);
  4. 四段录音里状态 0 占比的中位数。

一个逻辑回归,四项输入,按患者五折。这个基线大概能到 AUC 零点七上下——因为年龄与部位数本身就携带了「这个孩子是不是被怀疑有病」的信息,而转诊人群的选择偏倚让它成了强预测因子。

**这个数字的意义不是好看,是给后面所有模型画一条线。**如果一个 Transformer 只比它高零点零二,那零点零二很可能来自过拟合,而不是模型学到了心音的物理特征。

同时要做的一件事:把「部位数」从特征里去掉再跑一遍。如果 AUC 掉很多,说明模型主要在学「谁是被转诊来的」,而不是在听心脏。这是这份数据上最隐蔽的泄漏路径——采集流程本身泄漏了标签。

§9 一个更宽的问题:听诊这件事能不能被算法替代

这份数据的存在本身就在回答一个问题:心音里有没有足够的信息,让算法做出接近心脏科医师的判断?

从数据看,答案是有,但有限。

支持的一面:四部位对照让「杂音在哪里」变得可计算。七百六十三人有杂音阳性但没有最响部位标注——这个缺口恰好是算法可以填的:给四段录音,预测哪一段的信噪比里杂音最突出。

限制的一面:五年采集、九百多人,最终的结局标签是二分(Normal / Abnormal),而「Abnormal」里混着从轻度房间隔缺损到法洛四联症的一整条谱。一个 AUC 0.85 的模型,可能对轻度病变全漏、对重度全中,平均下来数字好看,临床上没用。

这也是为什么挑战赛要把任务拆成「检测 + 定位 + 分级」。**只有检测的模型不能进临床,因为它说不出「在哪里、多重」。**这份数据提供五维描述的初衷,就是逼着模型往前走一步。

真正的问题不在算法,在采集。一份二十秒的心音,由谁录、在什么位置录、孩子是否在哭,决定了信号里有多少可用信息。如果采集端不稳,再好的模型也只是在拟合采集者的手法。

§10 术语与口径

术语 本页口径
记录 / 段 一段录音,对应一个 .hea/.wav/.tsv 三件套
患者 / 受试者 一个编号,对应一份 .txt 清单
周期段 .tsv 里的一行,含起点、终点、状态码
S1 / S2 第一心音 / 第二心音
收缩期 S1 之后到 S2 之前
舒张期 S2 之后到下一个 S1 之前
状态 0 标注判定为不确定或噪声的区间
部位 AV / PV / TV / MV 四个标准听诊位置,Phc 为非标准
批次 Campaign 字段,CC2014 或 CC2015
重录 文件名带序号后缀的同部位再次录音
偏移二进制 16 位样本以 32768 为零点的编码方式
时长 采样点数除以 4000,非名义时长

§11 事实清单

11.1 核心事实表

项 数值 来源
患者数 942 患者清单数
记录数 3,163 .hea 计数
对象总数 10,435 S3 对象清单
采样率 4,000 赫兹(全部一致) .hea 第二字段
通道数 1(单声道) .hea 第二字段
位深与格式 16 位偏移二进制,16+44 .hea 第三行
单段时长 5.15 – 64.51 秒,中位 21.46 采样点数 / 4000
总时长 20.09 小时(条目页写 33.5) 逐文件累加
部位分布 MV 861 / AV 800 / PV 766 / TV 732 / Phc 4 清单记录行
每患者部位数 4 处 588、2 处 156、3 处 123、1 处 62、5 处 10、6 处 3 清单记录行
周期段总数 262,142 tsv 行数累加
每记录段数 1 – 378,中位 67 tsv 行数
状态 0 段 5,938(2.3%) 状态码计数
严格相位循环 2,995(共三千一百六十三个) 去 0 后逐位比对
段间间隔 >0.1 秒 9 个记录,最差 8.65 秒 段边界相减
异常状态码 1 条(50782_MV_1,码 28) tsv 内容
重录文件 43 段 / 21 个基础记录 / 17 名患者 文件名后缀
杂音 Absent 695 / Present 179 / Unknown 68 清单元数据
结局 Normal 486 / Abnormal 456 清单元数据
批次 CC2015 557 / CC2014 385 清单元数据
批次阳性率 16.4% / 20.8% 交叉统计
交叉核对例外 0(最响部位、杂音部位、首行声明三处) 逐患者核对
最响部位 PV 62 / TV 56 / MV 42 / AV 19 清单元数据
舒张期杂音 5 人,全部 Early-diastolic 清单元数据
Additional ID 140 个,全唯一 清单元数据
缺失年龄 74 人(女 70 / 男 4) 清单元数据

11.2 可立即验证的疑问

  1. **为什么条目页写 33.5 小时而实际是 20.09?**口径不明。可能是名义时长估算,也可能把重录重复计入。
  2. **Phc 到底是什么?**四次出现,全部在 CC2014。从上下文推是胸骨旁,但无定义。
  3. **50782_MV_1 为什么只有一行标注?**波形正常,标注为空。
  4. **168 个记录的相位跳变是算法缺陷还是标注者的手动干预?**两种可能无法在数据内部区分。
  5. **七十四名无年龄患者为何女性占九成五?**是否有特定门诊来源?
  6. **四十三段重录为什么重录?**是质量不合格还是流程要求?
  7. **Unknown 的六十八人是什么情况?**设备故障?听不清?未做听诊?
  8. **Additional ID 与前两批编号的关系?**能否映射回原始病历?

11.3 证据链

  • 对象清单:S3 ListObjectsV2 按 NextContinuationToken 翻页十一面,累计 10,435 个对象,扩展名分布与三件套配比严格相等。
  • 头文件:全部 .hea 逐个解析,首行四字段与次行八字段逐项统计,采样率、通道数、格式零例外。
  • 患者清单:942 个 .txt 全部解析,区分注释行与记录行后得到部位集合与二十二项元数据;首行声明的部位数与实际行数逐份比对,零例外。
  • 分段标注:全部 .tsv 逐个解析,累计 262,142 行,状态码计数、段数分布、段间间隔、相位严格性逐记录计算。
  • 交叉核对:Most audible location 与部位集合、Murmur locations 与部位集合、Additional ID 唯一性三组关系逐患者验证。
  • 两批对照:按 Campaign 分组统计年龄、性别、杂音、结局、部位数、阳性率六个维度。
  • 未下载:558.9 MB 波形文件。信噪比、基线漂移、削顶比例三项未核。

编辑说明

本页依据 PhysioNet 条目页(https://physionet.org/content/circor-heart-sound/1.0.3/)的公开表述撰写,完整下载并解析了全部头文件与分段标注(各三千一百六十三份)、942 份患者清单与 training_data.csv,未下载波形。

需要说明的几处判断:

一是关于总时长。条目页写 33.5 小时,逐文件累加得 20.09 小时。本页采信后者,因为方法明确可复现。这处差异对使用者有实际影响,故在正文与事实表两处都标出。

二是关于分段标注的性质。条目页说「算法分割并经人工核查」,但没有说明核查覆盖率。从段数分布(中位 67 段)、四类配比(各约四分之一)、相位严格性(2995/3163)三项判断,这批标注的算法特征明显强于人工特征。本页据此建议「当预训练任务,不当评估基准」,但不否认它是目前公开心音数据里质量最好的一批周期标注。

三是关于 168 个相位跳变。本页按「去 0 后是否严格 1→2→3→4 轮转」判定,允许任意起始相位。跳变以状态 0 之后的重置为主,本页推测与算法的相位重算逻辑有关,但不做定论。

四是关于交叉核对的三处零例外。这是本页正面评价这份数据的主要依据。九百四十二份清单,跨四年、跨两国、多位采集者录入,三组内部关系无一例外,说明发布前做过校验。

五是关于位置与人群。Phc 四次出现全部在 CC2014,本页按非标准代码处理,不做解剖学推断。七十四名无年龄患者的性别偏斜,本页只报事实,不推测原因。

六是关于波形。未下载 558.9 MB 音频,因此信噪比、基线漂移、削顶三项未核。这三项会影响「哪些段该剔除」的结论,本页的剔除建议(50782_MV_1、状态 0 占比超三成的段)只基于文本证据。

七是关于 50782_MV_1。这个记录状态码 28 不在 {0,1,2,3,4} 内,且时间段长度为零。本页判定为标注失败,建议剔除,但不推断原因。

未验证的部分:原始听诊设备型号与增益标定;采集者编号与操作规范;Outcome 字段背后的完整心脏评估流程;数据集论文里的具体模型性能数字;Additional ID 与医院病历系统的映射;波形层的实际信噪比。

编辑说明(核对方式)

核对时间:2026-10-20。核对方式:S3 免签名直连十六并发下载全部文本对象(约 17 MB),training_data.csv 与 942 份患者清单逐字段比对,零不一致、零重复编号、零集合差。分段标注与头文件解析使用自写解析器,不经 WFDB 库,以避免库层对非标准记录(50782_MV_1)的容错掩盖问题。全部中间结果与脚本未随本页发布。


相关数据集导航

以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:

导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

返回 AI-Ready 数据集