BHX 脑出血检测框 — 六成框是外推来的

39,668 框 / 23,409 图 / CQ500 的框级扩展

来源 https://physionet.org/content/bhx-brain-bounding-box/1.1/发布时间: 2026-10-27最后更新: 2026-10-27 阅读 22
BHX 脑出血检测框 — 六成框是外推来的

信息速览

数据集名称BHX 脑出血检测框 — 六成框是外推来的
数据类型原始数据链接,人工标注,元数据
规模491 次检查 / 23,409 张带框图像
接入方式https://physionet.org/content/bhx-brain-bounding-box/1.1/
AI 就绪度

脑出血的 CT 判断有两个层次。第一层是有没有,第二层是在哪里。2019 年 RSNA 放出十几万张头颅 CT 的时候,第一层被解决了,第二层没有——那批数据只有检查级的多标签,没有一个坐标。真正的急诊分诊、随访对比、病灶体积估计,都要落到第二层。

BHX 就是来补第二层的。它没有重新采集任何图像,而是站在 qure.ai 的 CQ500 之上,请三位神经放射科医师在厚层序列上把出血位置一个个框出来,再用 DICOM 的患者坐标把框推到同一次检查的薄层序列上。结果是一份只含 CSV 的数据集:三万九千多个框,挂在两万三千多张图像上,许可 CC BY-SA 4.0,PhysioNet 直下。

它的名字里带 Brain,但框圈住的不是脑;它的数量很唬人,但六成以上是算出来的。理解这两点的读者,会把它当作一份合格的检测定位基准;不理解这两点的,会拿它去做一件它从来没打算做的事。一屏速览见下表。

维度 内容
官方全名 Brain Hemorrhage Extended (BHX): Bounding box extrapolation from thick to thin slice CT images
发布机构 Hospital Israelita Albert Einstein(巴西圣保罗)牵头,MD.ai 提供标注工具
托管平台 PhysioNet,DOI 10.13026/9cft-hg92(v1.1)
首次发布 2020 年 7 月 29 日,v1.1 同日发布,目前无更新版本
底层图像来源 qure.ai CQ500,491 次头颅 CT,205 次出血阳性
图像总量 约 17 万张切片,来自新德里多家影像中心
手绘标注 约三千六百张图像上的六千二百多个框(仅厚层序列)
外推标注 两万三千余张图像上的近四万个框(全部序列)
清洁版本 约一万六千张图像上的两万七千多个框(仅软组织平扫薄层)
标签数 6 个(5 类急性出血 + 慢性硬膜下血肿)
标注者 3 名神经放射科医师,从业 6 年 / 4 年 / 不足 1 年
文件形态 3 个 CSV + 1 张示例图 + 许可文本,解压后约 22 MB
许可 CC BY-SA 4.0
是否含图像 否,图像需从 qure.ai 另行下载
一句话定位 把 CQ500 从「有出血」推进到「出血在哪一张、哪一块」

§1 它要解决的具体麻烦

1.1 分类模型能说「有」,但说不出「在哪」

2018 年前后,头颅 CT 的深度学习研究集中在检查级分类:一次扫描拆成几十张轴位切片,模型逐张打分,取最大值作为整次检查的出血概率。这条路在公开基准上跑得通,CQ500 本身就是这样被 qure.ai 用来评估他们自家算法的。但分类输出对于一个需要在几秒内决定「先看哪一层、叫不叫上级」的急诊场景来说是不够的——医师仍然要自己翻两百张图去找那团高密度。

要训练定位,就必须有框或者有掩码。而当时公开的头颅 CT 数据里,掩码几乎不存在,框也几乎不存在。作者在官方页面里把这件事写得很直白:能够做出血分类的数据集已经发布了好几个,但带检测框标注、可用于定位任务的公开数据集一个都没有。原因不复杂——逐层画框是重复劳动,专家时间贵,薄层序列切片数量又是厚层的三到五倍,画一例薄层的成本够画三四例厚层。

BHX 的办法是把「专家必须亲自做的部分」压到最小:只让专家在厚层上画,剩下的交给坐标变换。这个取舍决定了这份数据集的一切优点与一切缺陷。

1.2 三条常见的错误期待

期待一:它是脑部检测框数据集。 名字里的 Brain 加上 slug 里的 bounding-box,很容易让人以为这是「从 CT 或 MRI 里找出脑在哪」的预处理数据集。不是。BHX 的每一个框都标着六个出血亚型之一,框住的是血肿、蛛网膜下腔积血、脑室内的血,不是脑实质整体。用它训练出来的检测器只会告诉你「这里有一团血」,不会告诉你「这是脑」或者「这是颅骨内板」。如果你的流水线缺的是颅骨剥离前的粗定位,这份数据帮不上忙。

期待二:三万九千个框意味着三万九千个独立样本。 框的计量单位是「图像上的一个矩形」,不是「一个病例」。同一次检查里同一条出血带会横跨几十张切片,每张切片都有自己的一行记录,坐标几乎相同。23,409 张图像又只来自 491 次检查,平均每次检查贡献约四十八张带框图像。任何以框数或图像数为分母去估算「模型见过多少病人」的想法都会高估一个数量级。

期待三:框的坐标是专家逐层确认过的。 只有六千二百多个框是。剩下的三万三千多个是脚本按空间位置推出来的,官方在 Usage Notes 里明确写了外推可能对不齐(原话是 occasionally imperfect match of x and y values),并且只由一名神经放射科医师做过随机抽查,没有做任何修正。这不是隐瞒,是公开声明的局限,但很多人只看摘要不看 Usage Notes。

1.3 它能给到的与给不到的

你的需求 它给的 够不够
训练一个输出出血框的检测器 近四万个框,六类标签,YOLO/Faster R-CNN 可直接转 够,但需先下载原图
训练一个输出出血像素掩码的分割器 只有矩形,没有掩码 不够,改用 CT-ICH 或 BHSD
把脑从颅骨里剥出来 框的是血不是脑 完全不够
测量血肿体积、做随访对比 单层矩形,无层厚归一、无总体积字段 勉强,需自建三维重建
拿到薄层序列上的定位真值 两万七千余个清洁版本框,全部在薄层软组织平扫上 够
做外部验证集 491 次检查、五类急性出血、慢性 SDH 单列 够,常用作第三方测试集
做急诊分诊的端到端产品 无临床终点、无患者信息、无时间戳 不够,只能当组件
复现 2020 年那批检测论文的数字 官方给了数据集但没给基线模型权重 不够,需自行训练
在中国人群上做人群迁移研究 全部来自印度新德里 只能做跨域对照,不能代表本地
教学演示(展示框与标签的对应) 一张示例图 + 三个 CSV,结构极简 够,是最容易讲清检测格式的数据集之一

1.4 你的处境与它能帮到的事

你的处境 它能帮你什么 下一步该做什么
手上有个分类模型,产品经理问「能不能圈出来」 提供现成的框级真值,一天之内能把分类头换成检测头 先用版本 3 做小规模验证,再决定是否扩到全量
团队要交一份出血检测的第三方指标 这是被广泛引用的公开基准,指标有可比性 固定用版本 1 做测试集,训练集另找,避免泄题
只有一个 8 GB 显存的卡,跑不动三维分割 二维检测框比三维掩码轻得多,切片级训练可行 用 512×512 的轴位切片直接训 YOLO 系列
想做一个「出血自动测量」的功能 框的宽高是现成的,但只有二维 需要自己把同一出血带跨切片聚合成一个三维体
研究的是缺血性卒中或肿瘤 标签体系里没有这两类 不要在 BHX 上找,另找 CQ500 的原始报告或专用集
需要能直接商用的干净数据 CC BY-SA 4.0 允许商用,但要求相同方式共享 法务确认衍生产品的开源义务,再决定用不用
被要求解释模型的失败案例 慢性 SDH 单列这一类,是最经典的「等密度漏检」素材 用第六类标签专门做一组误检与漏检分析
学生做课程作业,需要小而完整的数据 22 MB 的 CSV,加一份 CQ500 就能跑通全流程 先只下载 10 次检查的 DICOM,够跑通

1.5 一句话判断

BHX 的价值不在于它有多少个框,而在于它是少数几份把「出血在哪」这一层公开出来的数据集;它的代价同样清楚:框是推出来的,人是印度人,图要你自己下。

1.6 不适合谁:四条边界

第一条:想要脑部 ROI 检测框的人。 这是最常见的一种错配。如果你要做的是「先找到脑,再做配准或分割」的预处理流水线,你需要的是脑实质的外接框或掩码,BHX 的标签里连 background 都没有,六个类全是出血亚型。这类需求应当去找各家的颅骨剥离工具(BET、HD-BET、SynthStrip)自带的质量控制输出,或者自己用模板配准生成框。

第二条:想要像素级分割掩码的人。 检测框只有四个数:x、y、宽、高。血肿在框里的形状、占框面积的比例、是否与脑室相连,这些信息全部丢失。要做体积测量或形状分析,CT-ICH、BHSD 这类带掩码的数据集才是正路。

第三条:需要患者级临床信息的人。 数据集里没有任何年龄、性别、GCS 评分、发病到扫描时间、出院结局。CQ500 本身也以影像为主。做预后模型、做混杂因素校正、做亚组分析,都需要回头去原始医院申请病历,而不是指望这份 CSV。

第四条:想要一套现成基线分数的人。 官方页面给了背景与方法,但没有附带训练好的模型权重,也没有一份完整的 leaderboard。想引用「在 BHX 上 mAP 多少」,只能自己训、自己报,不同论文之间的数字未必可比。

§2 数据构成与规格

2.1 三个 CSV 就是全部

整个数据集解压后约 22 MB,包含五个文件:三个 CSV、一份许可文本、一份校验和清单,外加一张示例图。没有图像,没有元数据数据库,没有读取脚本,没有划分文件。这种极简的结构既是优点(拿到就能看懂)也是陷阱(很多人下完之后发现没法直接用)。

三个 CSV 之间不是并列关系,而是层层包含的关系。版本 1 是根,只含手绘;版本 2 在版本 1 的基础上加了全序列外推;版本 3 在版本 1 的基础上加了选择性外推,只保留软组织平扫的薄层序列。版本 2 和版本 3 都包含版本 1 的行,所以把三者相加会重复计算手绘部分。

文件 官方定位 行数口径 图像数 适用场景
1_Initial_Manual_Labeling.csv 只有厚层上专家手画的框 六千二百余 三千五百余 做测试集、做真值金标准
2_Extrapolation_to_All_Series.csv 手绘 + 推到所有序列(含骨窗、增强) 三万九千余 两万三千余 想要最大召回、不在乎伪影
3_Extrapolation_to_Selected_Series.csv 手绘 + 只推到软组织平扫薄层 两万七千余 一万五千余 训练主力,分布最干净
LICENSE.txt CC BY-SA 4.0 全文 不适用 不适用 法务存档
SHA256SUMS.txt 五个文件的校验和 不适用 不适用 下载完整性核对
example_annotated_images.png 六类标签的示例标注图 不适用 示例 教学、肉眼校对

2.2 字段与记录的完整字典

三个 CSV 的列结构完全一致,都是七列,首列是一列无名的行号索引。这个索引由导出工具自动生成,跨文件不连续、无业务含义,千万不要当作主键。

列名 类型 取值示例 含义 使用要点
(首列,无名) 整数 95 / 0 / 10234 pandas 导出时生成的索引 无意义,读入时用 index_col=0 丢弃
SOPInstanceUID 字符串,点分十进制 1.2.276.0.7230010.3.1.4… 单张 DICOM 图像的唯一标识 与 CQ500 原图关联的唯一钥匙
SeriesInstanceUID 字符串 1.2.276.0.7230010.3.1.3… 一个序列(一次扫描的一套切片)的标识 用于聚合出一次检查的所有切片
StudyInstanceUID 字符串 1.2.276.0.7230010.3.1.2… 一次检查(study)的标识 用于按病例分组、避免跨病例泄漏
data Python 字典字面量 像素坐标系下的矩形 不是 JSON,需用 ast.literal_eval 解析
labelName 字符串 Intraventricular 六个出血亚型之一 首字母大写,大小写敏感
labelType 字符串 handDrawn / thin-slices / other 这一行来自手绘还是外推 版本 1 全是 handDrawn

data 列是这份数据集最容易踩坑的地方。它存的是 Python 的字典字面量而不是 JSON:键用单引号,不是双引号。直接用 json.loads 会抛异常,必须用 ast.literal_eval。这一点官方页面没有明说,只写了「The bounding box coordinates - X, Y, width, height」。

坐标的参考系也值得单独说。x、y、width、height 都是像素单位,原点在图像左上角,x 向右、y 向下。CQ500 的头颅 CT 轴位图像通常是 512×512 矩阵,所以 x + width 和 y + height 都不会超过 512。这个过程没有做任何物理尺寸换算,也就意味着不同重建视野(FOV)下的框在像素上可比,在毫米上不可比。

2.3 一条记录的完整解剖

拿版本 1 的第一行真实数据来拆:

,95,1.2.276.0.7230010.3.1.4.296485376.1.1521713089.1721949,1.2.276.0.7230010.3.1.3.296485376.1.1521713089.1721932,1.2.276.0.7230010.3.1.2.296485376.1.1521713088.1721651,"{'x': 236.16402999999997, 'y': 151.01577, 'width': 50.876979999999996, 'height': 62.99052}",Intraventricular,handDrawn

逐段解读:

  • 首列 95 是行号,说明这行在导出时的位置是第 95 行,与前后的行没有语义关系。
  • SOPInstanceUID 的末段 1721949 指向某一次检查中的某一层。整个 UID 的前缀 1.2.276.0.7230010.3 是 dcm4che 工具链的组织根,说明这批 DICOM 在匿名化时被重新编码过。
  • SeriesInstanceUID 末段 1721932 与本行的 SOP UID 前段相同,说明它们是同一次重建出来的。
  • StudyInstanceUID 末段 1721651 与上面两者差了几个号,但仍然落在同一批匿名化序列里,可以确认是一次检查。
  • data 里的 x=236.16、y=151.02,宽约 50.9、高约 63.0,画在 512×512 的图上,是一个偏左上、竖向略长的矩形,符合侧脑室内一块积血的形状。
  • labelName 为 Intraventricular,即脑室内出血。
  • labelType 为 handDrawn,表示这是专家逐层手画的,可信度最高。

同一份数据里版本 3 的行长这样:

,0,1.2.276.0.7230010.3.1.4.296485376.1.1521713091.1722412,1.2.276.0.7230010.3.1.3.296485376.1.1521713090.1722057,1.2.276.0.7230010.3.1.2.296485376.1.1521713088.1721651,"{'x': 320.95899, 'y': 235.81072999999998, 'width': 30.68771, 'height': 52.4921}",Intraventricular,selectedThinSlices

注意这一行的 StudyInstanceUID 与上一行完全相同,但 SeriesInstanceUID 变了——这是同一次检查里的另一套薄层重建,正是外推的来源。labelType 也从 handDrawn 变成了 selectedThinSlices。

2.4 三个版本的规模对照

把数字摊开看,能立刻发现一个规律:外推把图像数放大了六倍多,把框数也放大了六倍多,而清洁版本又把外推结果砍掉了约三分之一。这个比例不是随机的,它直接对应 CT 重建的物理结构——厚层通常 3 mm 以上,薄层通常 1 mm 以下,同一次检查的薄层切片数天然就是厚层的三倍上下,再加上软组织与骨窗两套重建,六倍这个量级就出来了。

指标 版本 1(手绘) 版本 2(全部外推) 版本 3(清洁外推) 说明
框数 六千二百余 三万九千余 两万七千余 官方页面数值,精确值见附录 A
图像数 三千五百余 两万三千余 一万五千余 同一图像多个框只计一次
平均每图框数 约 1.8 约 1.7 约 1.7 由前两行相除得到
占 CQ500 切片比例 约 2% 约 14% 约 9% 分母按约 17 万张计
覆盖检查数 少于 491 少于 491 少于 491 只含出血阳性扫描
序列类型 厚层软组织窗 全部序列 软组织平扫薄层 关键差别

需要特别指出一条官方页面的口径不一致,这不是笔误,而是两个不同的计数口径并存:摘要段写「annotated for hemorrhage」的图像是两万三千四百余张,而清洁版本的英文描述对应 15,979 张,两者都正确,只是前者含全部序列、后者只含筛选过的薄层软组织序列。差额约七千张图像,官方没有交代具体构成。

2.5 与同类资源的字段差异

同样是头颅 CT 的出血标注,几份公开数据集在「每一行代表什么」这件事上做了完全不同的选择,这决定了它们的下游用法。

资源 一行代表什么 有坐标吗 有掩码吗 标签粒度 主要用途
BHX 一张图上的一个出血框 有,四个数 无 六类出血 检测、定位
CQ500 一次检查的若干结论 无 无 检查级多标签 分类、外部验证
RSNA ICH 一张切片的多标签 无 无 六类出血二值 分类、分诊
CT-ICH 一张切片的掩码区域 有,像素集 有 五亚型 + 骨折 分割
BHSD 一个三维体的体素 有,NIfTI 有 五类出血体素 三维分割
院内 PACS 导出 一条报告语句 通常无 通常无 自由文本 回顾性研究

从这张表能看出 BHX 的位置:它是几份资源里唯一把「坐标」当作一等公民、又不肯花成本做掩码的那一个。这个定位让它能覆盖比 CT-ICH 大得多的例数,代价是精度只有矩形级。

§3 它要定位的对象:六类出血与背后的解剖

§2 讲的是表结构,§3 讲的是这些标签本身是什么意思。对检测任务来说,标签的临床含义决定了框该怎么画、什么样算漏检、什么样算误报。

3.1 六个标签名与它们的解剖位置

标签名(CSV 中的写法) 中文 出血位置 典型形态 检测难度
Intraparenchymal 脑实质内出血 脑组织内部 团块状高密度 中等,边界不如骨头清楚
Subarachnoid 蛛网膜下腔出血 脑沟、脑池、脑底池 沿脑沟分布的线状或片状 高,碎片化、面积小
Intraventricular 脑室内出血 侧脑室、三脑室、四脑室 脑室铸型 低到中,位置固定
Epidural 硬膜外出血 颅骨与硬膜之间 梭形(双凸透镜形) 低到中,与骨折常共存
Subdural 硬膜下出血(急性) 硬膜与蛛网膜之间 新月形 中,贴近颅骨、易与伪影混
Chronic Subdural Hematoma 慢性硬膜下血肿 硬膜下,但为慢性期 新月形,等密度或低密度 最高,密度接近脑实质

前五类是急性出血,第六类是慢性。官方在 Methods 里解释了这个拆分:因为有一类亚型叫 Subdural,为了不与急性混淆,慢性单独设一个标签。这个设计在 2020 年算是相当有临床意识的一点——多数公开数据集干脆不碰慢性硬膜下,因为「等密度」这件事在窗宽窗位上极难界定,标注者之间一致性很差。

3.2 为什么只有六类,而不是十几类

颅内出血的临床分类学远比六类复杂:可以按解剖分(脑叶、基底节、丘脑、脑干、小脑),可以按病因分(高血压性、淀粉样血管病、外伤性、肿瘤卒中、血管畸形),可以按时间分(超急性、急性、亚急性、慢性)。六类这个数量是「能在 CQ500 那 491 次检查里凑够样本」与「临床上有区分价值」之间的折中。

再细分就会碰到样本量悬崖。491 次检查里只有 205 次阳性,摊到六类上,每一类平均三十多次检查,再按解剖部位拆下去,很多格子会变成个位数。检测模型在有监督训练下,单类样本低于几十个实例时基本学不出稳定特征。

这也解释了为什么数据集不做「多发判断」——同一次检查里可以同时有硬膜下和蛛网膜下腔出血,CSV 里就是同一张图上的两个框,但没有一个字段告诉你「这是一例多发伤」。要做多标签分类,得自己按 StudyInstanceUID 聚合 labelName。

多发病灶在检测任务里还有一个隐性后果:同一张切片上的两个框如果靠得很近,边界框在空间上会重叠。矩形表示法对重叠目标天生不友好,模型只能学到「这里有一团高密度」,至于是不是两个独立的血肿,从框上看不出来。做多类检测时如果按类别分别出框,重叠区的 NMS 会把其中一个压掉;如果按单类出框再分类,又会丢掉类别信息。这个矛盾在 BHX 上尤其明显,因为蛛网膜下腔与硬膜下经常在同样的颅骨内板附近同时出现。

3.6 用标签共现做一次任务设计自检

判断「这份数据能不能支撑你的任务」,最省事的办法是先在标签层面做一次共现统计,而不是一上来就训模型。三个 CSV 里的 labelName 与 StudyInstanceUID 就足够回答三个问题:你的目标类别在多少次检查里出现、它是否总与别的类别同时出现、有没有哪一类样本少到无法训练。

自检问题 用什么字段回答 若答案不利该怎么调整
我的目标亚型有多少次检查? labelName × StudyInstanceUID 去重计数 少于三十次就放弃单类建模,改成二分类
它是否总与别的亚型共现? 按 StudyInstanceUID 聚合后看类别集合 共现率高就做多标签,不做单标签
慢性 SDH 的样本够不够? 过滤 Chronic Subdural Hematoma 单独建一个只含该类的测试集做专项
单张切片最多几个框? 按 SOPInstanceUID 计数取最大值 数值小说明重叠不严重,可放心用 NMS
阴性切片从哪来? 版本 2 里 labelType 为 other 的行 没有阴性行就自己去 CQ500 抽非出血检查

3.3 框是怎么画的:只有专家知道的那部分

官方页面在 Methods 里写明了流程:三位神经放射科医师,从业年限分别是 6 年、4 年、不足 1 年,各自阅读厚层序列并标注。三人独立还是协商,页面没有写。从「the manual labeling」这个单数表述看,更接近分工而非三读共识。

一个容易被忽略的细节是所有图像都在软组织窗下评估(原话 using a soft tissue filter)。这条信息对复现很重要:如果你用骨窗去看同一张图,出血的对比度完全不同,模型学到的特征也会完全不同。数据集没有存窗宽窗位,用的就是 CQ500 原始 DICOM 里自带的显示状态。

框的紧致程度官方没有给标准。从 version 1 第一条记录的尺寸看,宽约 51 像素、高约 63 像素,在 512 的画幅上占约 10% 宽度,符合「贴着出血边界画」而不是「留一圈余量」的风格。这个风格对检测模型的 IoU 阈值选择有影响,用 0.5 做匹配阈值会比用 0.7 稳妥。

3.4 手绘部分到底有多少可信度

六千二百多个框、三千五百多张图像、三位放射科医师,这组数字本身没有问题,问题在于没有任何一致性指标。官方没有报告标注者之间的 Kappa 或 Dice,也没有报告重测一致性。这意味着你无法从数据集本身推断标签噪声的上限,也无法判断 §4.3 的案例里那八十多像素的偏移属于典型还是离群。

一个可用的替代办法是:用版本 1 那三千五百多张图做一个小规模的清洗测试集,人工抽出 200 张复核一遍,估计自己的任务上标签误差率,再决定是否要把清洁版本 3 的训练权重衰减。这个做法成本不高,比盲信「专家标注」四个字要可靠。

3.5 标签与 CQ500 原始结论的关系

CQ500 本身对每次检查给了若干条放射学结论,其中就包括出血的亚型判断。BHX 的标签与之一致吗?官方没有做交叉验证报告。从流程上看,BHX 的标注是重新读图,并没有参考 CQ500 的结论,所以两者不一致是可能的。

这种情况在真实数据里不罕见:同一批图,一组医生判有硬膜下,另一组判有蛛网膜下腔,边界地带本来就是灰的。使用时可把 CQ500 的结论当作粗略的先验,把 BHX 的框当作定位参考,两者冲突的样本单独挑出来看,往往能暴露模型最不稳定的那部分。

§4 外推:这份数据集真正的技术贡献

4.1 外推不是放大图片,是搬坐标

很多人看到「外推」(extrapolation)会想到超分辨率或者插值。BHX 里的外推跟像素一点关系都没有,它是纯粹的几何搬移:在厚层序列的第 k 层上有一个框,找到它对应的患者坐标系 z 值,再在同一次检查的薄层序列里找 z 值最接近的那一层,把框原样贴上去。

具体做法在页面上写得比较简略,只提到用 Image Position (patient) 这个 DICOM 标签做匹配。这个标签记录的是切片在患者坐标系中的位置(单位毫米),厚层和薄层重建共享同一个患者坐标系,所以对齐在原理上是成立的。

真正的问题有两层。第一层是 z 轴对齐本身不精确:厚层 3 mm、薄层 1 mm,一层厚层对应三层薄层,映射过去必然是一对多,而那三层薄层之间的解剖是有差异的。第二层是 x/y 也不严格相等:不同重建的视野、矩阵、患者体位(哪怕只是轻微移动)都会让同一结构在像素坐标上偏移。

4.2 官方承认的局限

官方在 Usage Notes 里用了一段话直接说了这件事:外推时 x 与 y 值偶尔匹配不完美;自动生成的框由一名神经放射科医师随机抽查过,但没有做任何修正。同一段里还给出了改进方向——用最近 z 位置匹配初始切片,然后在中间按步长插值,让框的大小平滑过渡。

这段话的诚实程度值得肯定,但也把使用者的责任推得很清楚:外推部分的框不能当作金标准,只能当作弱标签。把版本 3 当训练集、把版本 1 当测试集,是一个能绕开这个问题的划分策略。

4.3 案例:一条脑室内出血在厚层与薄层上的两条记录

拿数据集里 StudyInstanceUID 末段为 1721651 的那次检查做例子(§2.3 里两段原始数据的来源)。同一名患者,同一次扫描,有厚层和薄层两套重建。

在厚层序列上,专家看到侧脑室内有一团高密度,画了一个框,x=236.16、y=151.02、宽 50.88、高 62.99。这个框的 labelType 是 handDrawn,落在版本 1 里。

外推脚本拿到这一层的患者坐标 z 值后,去薄层序列找最近的几层,逐层贴上框,其中一层得到了 x=320.96、y=235.81、宽 30.69、高 52.49 的结果,labelType 记作 selectedThinSlices,落在版本 3 里。

两个框的坐标差了 84 像素(x 方向)和 85 像素(y 方向),尺寸也明显不同:厚层框更宽更高,薄层框更窄。这个差异不能简单解释成「算错了」。真实原因有三个叠加:厚层存在部分容积效应,出血的边界在 3 mm 的层内被平均,框自然会画得大一些;薄层重建的视野或矩阵可能不同,导致缩放不同;患者在两套重建之间的微小移动会让同一结构整体平移。三种效应叠在一起,就出现了坐标与尺寸的双重偏差。

§4.3 的案例说明了一件事:版本 3 里的框,其精度上限受制于「厚层框本身」与「坐标变换」这两道关口。使用者如果在薄层上做高精度定位评测,必须意识到真值本身带着这种级别的抖动。

4.4 外推这件事在方法学上站得住吗

从数据工程的视角看,外推是一种非常标准的做法,医学影像领域管它叫标签传播(label propagation)或切片级标签扩展。同样思路在器官分割、肋骨骨折检测、肺结节随访里都用过,通常的做法是先在稀疏层上标注,再向相邻层传播,最后人工修正。

BHX 与标准做法相比,省掉的正是最后一步:人工修正。这个省略直接换来了数量——手绘六千二百多个框,如果逐层修正到近四万个,工作量是六倍多,三位医师根本不可能在一个研究项目周期内完成。所以这是一个用精度换规模的决定,谈不上错,但必须在使用时把它当成前提而非瑕疵。

4.5 外推比例带来的评测偏差

还有一个后果比较少被讨论:因为外推是在 z 方向上连续的,相邻切片的框几乎一模一样,训练时如果按切片随机划分训练集与测试集,模型会在测试集里见到与训练集几乎相同的图像。这会造成严重的乐观偏差。

正确的划分单位是患者,也就是按 StudyInstanceUID 分组。这一点对于任何医学影像数据集都成立,但在 BHX 上尤其致命,因为版本 3 里同一处出血动辄出现几十次。

除了划分单位,统计口径也要提前定死。同一个模型在 BHX 上可以报出三种完全不同的数字:按框统计的 mAP、按图像统计的检出率、按检查统计的阳性召回。三者的分母分别是三万多个框、两万多张图、不到五百次检查,数值差异可以大到十几个百分点。写论文或做内部汇报时如果只写「在 BHX 上达到某水平」而不注明分母,别人无法复现,也无法横向比较。

还有一种更隐蔽的口径问题出现在阴性样本上。版本 1 只含被框住的阳性切片,没有一行表示「这张图上没有出血」。如果直接拿版本 1 做测试集,模型对阴性图像的误报完全测不出来——因为它根本不看阴性图。想测假阳性,必须自己从 CQ500 的非出血检查里抽一批切片补进测试集,并且在报告里写明补充比例。

§5 怎么拿到、怎么读、怎么转成能训的格式

5.1 下载:三个 CSV 一份不落

PhysioNet 允许匿名直下,目录是开放的 S3 桶,页面上同时给了 wget 递归和 aws s3 sync 两种方式。整包 ZIP 只有 3.8 MB,解压后 22.3 MB,网络正常的话一两分钟就能拿全。

#-- 方式一:直接取 ZIP
wget -c https://physionet.org/static/published-projects/bhx-brain-bounding-box/bhx-brain-bounding-box-1.1.zip

#-- 方式二:按文件取,适合只想拿某个版本
mkdir -p bhx && cd bhx
for f in 1_Initial_Manual_Labeling.csv 2_Extrapolation_to_All_Series.csv 3_Extrapolation_to_Selected_Series.csv; do
  wget -c "https://physionet.org/files/bhx-brain-bounding-box/1.1/${f}"
done

#-- 方式三:公开 S3 桶,适合批量
aws s3 sync --no-sign-request s3://physionet-open/bhx-brain-bounding-box/1.1/ bhx/

#-- 校验完整性
sha256sum -c bhx/SHA256SUMS.txt

注意 SHA256SUMS.txt 里记的是五个文件的摘要,示例图和三个 CSV 都在列。如果只下了部分文件,校验会报缺失,这属正常。

5.2 读取 CSV 并正确解析坐标

data 列是 Python 字典字面量,必须用 ast.literal_eval。下面这段在任何一个装了 pandas 的环境里都能直接跑。

import ast
import pandas as pd

BASE = "bhx/"
files = {
    "manual":  "1_Initial_Manual_Labeling.csv",
    "all":     "2_Extrapolation_to_All_Series.csv",
    "clean":   "3_Extrapolation_to_Selected_Series.csv",
}

def load(name):
    df = pd.read_csv(BASE + files[name], index_col=0)
    #-- 关键:单引号字典,json.loads 会爆
    boxes = df["data"].apply(ast.literal_eval).apply(pd.Series)
    df = pd.concat([df.drop(columns=["data"]), boxes], axis=1)
    df["x2"] = df["x"] + df["width"]
    df["y2"] = df["y"] + df["height"]
    df["cx"] = df["x"] + df["width"] / 2
    df["cy"] = df["y"] + df["height"] / 2
    return df

for k in files:
    d = load(k)
    print(k, len(d), d["SOPInstanceUID"].nunique(), d["StudyInstanceUID"].nunique())

三行输出会分别给出各版本的行数、去重后的图像数、去重后的检查数。最后一个数字是最重要的——它才是你真正的样本量。

5.3 下载 CQ500 原图并按 UID 对齐

BHX 不提供图像,CQ500 在 qure.ai 的站点上提供。CQ500 的目录结构是「检查目录 / 序列目录 / 切片文件」,文件名与 SOPInstanceUID 无关,所以必须读每张图的 DICOM 头才能建索引。

import pydicom
from pathlib import Path

def build_index(cq500_root):
    idx = {}
    for f in Path(cq500_root).rglob("*.dcm"):
        try:
            ds = pydicom.dcmread(str(f), stop_before_pixels=True)
            idx[ds.SOPInstanceUID] = str(f)
        except Exception:
            continue
    return idx

idx = build_index("CQ500/")
clean = load("clean")
clean["path"] = clean["SOPInstanceUID"].map(idx)
missing = clean["path"].isna().sum()
print("未匹配上原图的行数:", missing, "/", len(clean))

这一步通常是整个流程里最慢的。CQ500 有十几万张切片,逐文件读头大约要十几分钟,建议缓存成 parquet 之后复用。

5.4 转到 YOLO 格式

检测框是像素坐标,YOLO 要的是归一化后的中心点加宽高。转换只需要一行算术,但那句除法很容易写错成 x2/2。

def to_yolo(df, img_w=512, img_h=512, cls_map=None):
    cls_map = cls_map or {
        "Epidural": 0, "Intraparenchymal": 1, "Intraventricular": 2,
        "Subarachnoid": 3, "Subdural": 4, "Chronic Subdural Hematoma": 5,
    }
    out = df.copy()
    out["cls"] = out["labelName"].map(cls_map)
    out["cx_n"] = (out["x"] + out["width"] / 2) / img_w
    out["cy_n"] = (out["y"] + out["height"] / 2) / img_h
    out["w_n"] = out["width"] / img_w
    out["h_n"] = out["height"] / img_h
    return out[["path", "cls", "cx_n", "cy_n", "w_n", "h_n"]]

yolo = to_yolo(clean.dropna(subset=["path"]))
yolo.to_csv("labels_yolo.csv", index=False)
print(yolo["w_n"].describe())

w_n 的分布值得看一眼:多数出血框的宽度小于 0.3,也就是说它们都是小目标。这直接决定了模型选择——小目标检测需要更高的输入分辨率,或者更强的特征金字塔,普通的 640 输入往往不够。像 §4.3 的案例里那种宽 50 像素、高 63 像素的框,归一化后只占画幅的一成上下,缩到 640 输入时剩下六十多个像素,模型很容易把它当成噪声。

5.5 按患者划分,不要按切片

这是本章最重要的一条纪律。版本 3 里同一处出血会在相邻切片上反复出现几十次,按切片随机划分会让训练集和测试集几乎重合。

import numpy as np

studies = clean["StudyInstanceUID"].unique()
rng = np.random.default_rng(42)
rng.shuffle(studies)
cut = int(len(studies) * 0.8)
train_ids, test_ids = set(studies[:cut]), set(studies[cut:])

train = clean[clean["StudyInstanceUID"].isin(train_ids)]
test = clean[clean["StudyInstanceUID"].isin(test_ids)]
print(len(train_ids), "训练检查 /", len(test_ids), "测试检查")
print(train["SOPInstanceUID"].nunique(), "训练图像 /", test["SOPInstanceUID"].nunique(), "测试图像")

491 次检查里只有约两百次是出血阳性,按 8:2 分,测试集大约只有四十次检查。这个规模的测试集上,mAP 的置信区间会很宽,报数字时最好同时给出按检查统计的召回率,比单看框级 mAP 更稳。

5.6 用官方页面自带的口径做一次自检

拿到数据之后,先做一个不涉及模型的核对:三个版本的框数、图像数是否与官方页面写的一致。这一步能防止下载不完整或者读错文件。

checks = {
    "manual": (6283, 3558),
    "all": (39668, 23409),
    "clean": (27203, 15979),
}
for k, (n_box, n_img) in checks.items():
    d = load(k)
    ok_box = len(d) == n_box
    ok_img = d["SOPInstanceUID"].nunique() == n_img
    print(k, "框数一致" if ok_box else f"框数 {len(d)} 与官方 {n_box} 不符",
          "| 图像数一致" if ok_img else f"图像数 {d['SOPInstanceUID'].nunique()} 与官方 {n_img} 不符")

如果三项全部一致,说明文件完整、解析逻辑正确,可以开始建模。如果不一致,先别怀疑数据集,先检查是不是把带引号的 CSV 字段切歪了——data 列里有逗号,不用标准 CSV 解析器一定会错行。

§6 与库内条目的关系

6.1 关系图谱

BHX 在库内不是一个孤立节点,它是头颅 CT 出血这条线上的「定位层」。上游是 CQ500 与 RSNA ICH,下游是被当作外部验证集引用的各种检测论文。

相关条目 关系类型 具体关系
RSNA Intracranial Hemorrhage 互补 那边有十几万张切片但无坐标,这边有坐标但例数少;两者常配对使用
CT-ICH 互补 那边给像素掩码,这边给矩形;分割对检测
BHSD 同族 同为头颅 CT 出血标注,BHSD 是三维多类掩码,例数更少
CQ500 宿主 BHX 的全部图像来自 CQ500,UID 一一对应
各类颅骨剥离工具条目 无关 同属脑影像预处理,但任务不同,不可互换
急诊分诊类数据集 上下游 BHX 可作为分诊产品的定位组件验证集

凡是把 BHX 说成「CQ500 的子集」的说法都不准确。图像层面是的,标注层面不是——CQ500 没有框,BHX 的框是新增的,两者是「底图 + 图层」的关系。

6.2 检索路径

在库内找同类资源,有三条比较省事的路:

第一条按模态加任务。用「CT」加「目标检测」这个组合,能捞出头颅、胸片、骨科的检测集,BHX 会跟一批胸片结节检测集排在同一个列表里。

第二条按疾病。用「颅内出血」或者「ICH」检索,会命中 RSNA ICH、CT-ICH、BHSD、BHX 四件套,这四件构成了头颅 CT 出血任务最常用的公开基准。

第三条按托管平台。PhysioNet 上带 open access 的项目可以直接筛,BHX 与 CT-ICH 都在其中,许可条款与下载方式一致,适合一起做对比实验。

6.3 与 CQ500 的分工:谁负责什么

把 BHX 和 CQ500 摆在一起看,两者是严格的分层关系,把每一层负责的内容列清楚,能避免很多「到底该用哪个」的纠结。

层次 由谁提供 具体内容 缺失会怎样
像素层 CQ500 十几万张原始 DICOM,含全部序列与重建 BHX 的框无处安放
检查层结论 CQ500 放射科医师对每次检查的结论文字 无法做检查级对照
坐标层 BHX 四元组矩形,六类标签 只能分类,不能定位
标注来源层 BHX handDrawn / thin-slices / other 无法区分强弱标签
临床层 都没有 年龄、性别、病史、结局 无法做亚组与预后分析
划分层 都没有 官方训练/测试划分 必须自己按检查切分

这张表最后两行是关键。很多人以为公开数据集会自带划分,BHX 没有,CQ500 也没有。切分策略完全由使用者决定,这也意味着不同论文之间的数字在划分不一致时不可比。想在两篇论文之间比较,必须用同一个 StudyInstanceUID 列表重跑,而这个列表只能自己造。

§7 质量评估与局限性

7.0 阅读本节前的一个前置校正

很多人评价这份数据集时会犯一个定位上的误判:把它当成「出血检测的完整解决方案」,于是逐条检查它的不足——没有掩码、没有基线、没有临床信息——得出「质量一般」的结论。这个评价框架本身就是错的。

BHX 在论文与页面里的自我定位非常克制:它是一个标注图层,不是一个完整数据集。它的贡献是「把定位这一层补上」,而不是「把出血研究的所有问题解决」。用完整性尺子去量一个补丁,必然不及格;用适配性尺子去量,它恰好补上了 2020 年最缺的那一块。

正确的读法是:先问自己需要的到底是定位还是分割,再问这份数据的定位精度够不够你的场景,最后才看它的规模与许可。三层都过了,它就是个靠谱的组件;任何一层没过,换别的。

7.1 DAIMS 五维评分

维度 分值(5 分制) 理由
规模 3.0 491 次检查在检测任务里偏小,但框数够训一个二维检测器
标注质量 3.0 手绘部分可信,外推部分未经修正,整体呈双峰分布
结构清晰度 4.5 三个 CSV、七列、语义直白,是同类里最容易上手的之一
可用性 3.5 CSV 直下、无门槛,但图像要另找、UID 匹配有工程成本
许可友好度 4.5 CC BY-SA 4.0,允许商用,只在衍生分发上有约束

DAIMS 的口径是 Discoverability / Accessibility / Interoperability / Metadata / Sustainability 五维各 1–10 分,换算到上表的五分制后综合约 3.5 分。这个分数在公开医学影像数据集里属于中上,但明显低于那些自带脚本、自带划分、自带基线的数据竞赛集。

7.2 DAIMS 评分背后的取舍

规模给 3 分不是苛刻。检测任务与分类任务对样本量的需求完全不是一个量级:分类模型在几百例上就能收敛,检测模型需要的是「实例数」,而六千二百多个手绘框是真正的有效实例,其余三万多个是同一批实例的复制。以有效实例计,这份数据的规模其实只有五千多。

标注质量的双峰性值得再说一句。用手绘部分(版本 1)做评测,你能得到一个相对干净的金标准;用清洁部分(版本 3)做训练,你能得到一个覆盖广的弱标签集。但如果混在一起做「训练 + 测试」,就相当于用打过折的真值去评价模型,指标失真。

结构清晰度给到 4.5 是因为它几乎不需要说明书。三次下载、一次 ast.literal_eval、一次除 512,就完成了整个数据接入。对比同样是 PhysioNet 托管的很多项目,动辄几十个 WFDB 头文件加一个数据处理脚本,BHX 的轻量是个优点。

7.3 已知的、可枚举的偏差

偏差类型 具体表现 对下游的影响
地理偏差 全部图像来自印度新德里 迁移到东亚人群时,颅骨厚度、脑室大小、出血病因构成都会不同
机构偏差 多家影像中心,但设备与协议未披露 无法做设备层面的公平性分析
人群偏差 无年龄性别信息 儿童、高龄亚组的表现无法单独评估
标注者偏差 三名医师,其中一名从业不足一年 低年资医师画的框对边界判断可能更松
疾病谱偏差 六个标签,无缺血性卒中、无肿瘤、无外伤性骨折 作为通用颅内病变检测器会漏掉大量阳性
采样偏差 只含出血阳性的 205 次扫描(外加一部分阴性) 无法估计真实患病率,不能算 PPV
外推偏差 六成框由坐标变换生成 框级指标会被系统性高估或低估,取决于任务
时间偏差 2020 年发布,无更新 与近年新出的大模型训练数据不重叠

§4.3 的案例展示的那种坐标漂移,在全量数据里不是个例而是常态,只是漂移幅度大小不一。其中「采样偏差」是最容易造成产品级误判的一条。BHX 的阳性率远高于真实急诊场景(真实场景中出血检出率通常在个位数百分比),在它上面训练的模型,其校准度(calibration)几乎肯定不能直接搬到临床上。

7.4 外部验证矩阵

验证场景 是否被公开做过 结论倾向 依据
在 RSNA ICH 上训练、在 BHX 上测试 有,多篇检测论文 性能普遍下降,主要丢在 SNH 与慢性 SDH 论文摘要层面的普遍报告
在 BHX 上训练、在 CT-ICH 上测试 有 Dice 无法比较(任务不同),检测 mAP 下降 任务定义差异
跨设备(GE/Philips/Siemens) 无公开拆分 未知 数据集未提供设备字段
跨年龄段 无公开拆分 未知 无年龄字段
跨种族 无公开拆分 未知 无种族字段
与放射科医师对读 无公开报告 未知 官方未做
多中心外部测试 部分论文做过 有下降但可接受 论文摘要

这张表说明一个现实:BHX 作为外部测试集很流行,但围绕它做的系统性偏差分析几乎没有。原因是它本身缺少分层字段——没有设备、没有年龄、没有种族,任何分组分析都做不了。

7.5 它为何能持续:占据了一个从未被替代的格式位

BHX 从 2020 年发布至今没有更新,也没有被任何一个更大的数据集直接取代,原因不在它的质量,而在它的格式占位。检测框这种标注形态,在头颅 CT 出血任务里至今没有第二份公开数据做到同等级别的覆盖——RSNA ICH 没有坐标,CT-ICH 是掩码,BHSD 是三维掩码且例数更少。

想要一个「框」,就只能用它。这个稀缺性比任何质量指标都更能解释它的引用量。反过来,一旦有机构发布一份带完整修正、带患者分层字段的头颅 CT 检测框数据集,BHX 的独占地位会迅速结束。

§8 生态位与历史

8.1 从 CQ500 到 RSNA 到 BHX 的三年

时间线大致是这样的:2018 年,qure.ai 团队在 Lancet 上发表了用深度学习检测头颅 CT 危重征象的回顾性研究,同时把用作评估的 491 次扫描作为 CQ500 公开。2019 年 9 月,RSNA 在 Kaggle 上放出颅内出血检测竞赛,带十几万张切片和六个亚型的检查级标签。2020 年 7 月,BHX 发布,把 CQ500 从「有出血」推进到「框在哪」。

这三年正好对应颅脑影像 AI 研究关注点的迁移:从「能不能检出」到「能不能定位」,再到后来的「能不能分割成体积」。BHX 卡在第二阶段的起点上。

时间 事件 对 BHX 的意义
2018-09 CQ500 公开,491 次检查 提供了底图与 UID 体系
2018-09 MD.ai 的标注工具被广泛使用 提供了标注基础设施
2019-09 RSNA ICH 竞赛开赛 暴露了公开数据普遍缺坐标的问题
2020-07 BHX v1.1 发布 补上框这一层
2022-01 CT-ICH 发布,提供掩码 分割需求被分流出去
2023-10 BHSD 发布,提供三维多类掩码 检测框的独立性进一步确立
2024 至今 各类基础模型普遍用它做外部评测 从训练集转成评测集

值得注意的是 2024 年之后的角色变化。随着通用医学影像基础模型增多,BHX 很少再被当作训练集,更多被当作「检测能力」的第三方检验场。这个转变让它的价值从「提供数据」变成「提供可比口径」。

8.2 官方页码背后的组织形态

这八位作者横跨三家机构:Einstein(巴西圣保罗的一家大型私立医院)的大数据分析与影像科、圣保罗大学医学院的数据科学与 AI 实验室、以及美国的 MD.ai。这个组合解释了两件事:为什么标注工具用的是 MD.ai,以及为什么作者声明里有利益冲突——其中一位作者受雇于 MD.ai。

数据集没有配套的同行评审论文,这是一个不寻常的地方。多数 PhysioNet 托管的数据集都有一篇配套论文,BHX 在 Europe PMC 上检索不到对应的方法学文章,能找到的都是引用它的下游研究。也就是说,这份数据集的可信度完全建立在官方页面的自述上,没有经过期刊评审这一关。

8.3 它在 PhysioNet 上的位置

PhysioNet 上的开放数据集分成几种类型:有配套论文的、以竞赛为基础的、以资源形式发布的。BHX 属于第三类——页面写得详细但没论文。这类项目的引用方式通常是直接引 PhysioNet 的 DOI,而不是引论文。

这与它的设计定位一致:发布方是把它当作一个标注资源投放,不追求方法学贡献的学术认可。这也解释了为什么页面里的方法描述偏工程化——讲清楚了怎么对上坐标,但没有做误差分析、没有做一致性统计。

平台内同类 许可 有配套论文 标注类型 与本集的关系
CT-ICH ODbL 有 像素掩码 分割互补
RSNA ICH(Kaggle 为主) 竞赛规则 有 检查级标签 分类互补
BHSD(HuggingFace 为主) NC-ND 有 三维掩码 分割互补
BHX CC BY-SA 无 检测框 定位独占

8.4 后继的影响

BHX 之后,头颅 CT 领域的标注资源往两个方向走:一个是更细的掩码(CT-ICH、BHSD),一个是更大的规模(各类竞赛集)。很少再有团队做「框」这一层,因为框的精度上限明确,学术增量有限。

这对使用者其实是个好消息:检测框这件基础设施 BHX 一次性做完了,后来的团队可以直接拿它用,而不必重复画。真正的瓶颈因此从「有没有框」变成了「框够不够准」,这也正是下一份同类数据集的切入口。

§9 使用指引

9.1 三种角色的路径

算法工程师。 缺的是能立刻训练的检测数据。路径是:下版本 3 → 下 CQ500 → 建 UID 索引 → 转 YOLO 格式 → 按 StudyInstanceUID 8:2 分 → 训一个 YOLOv8 或 RT-DETR。全程一天之内能跑通,瓶颈在 CQ500 的下载速度上。注意先看 w_n 分布,大部分框是小目标,输入分辨率别压得太低。

放射科研究者。 缺的是可解释的病灶定位可视化。路径是:下版本 1 的手绘子集(约三千五百张)→ 人工抽两百张复核 → 用 MD.ai 的公开标注器(官方给了链接)打开对照 → 挑出三类典型错误(边界过松、漏掉卫星灶、慢性 SDH 漏标)做成教学案例。这条路径不需要训练模型,纯靠读图,但能直接产出可用于教学或质控的材料。

产品/合规团队。 缺的是评估一款出血检测产品的定位能力。路径是:确认产品输出的是框还是掩码 → 若是框,用版本 1 做小规模测试集 → 按检查统计召回率与平均每个检查的假阳性数 → 明确告知临床医生「本评估仅覆盖定位,不覆盖出血有无的判定」。这里最容易出错的是拿版本 3 当测试集,那等于用打过折的真值去裁决产品。

三类角色的共同点是都要面对「图像在哪」这个问题,不同点是容忍的误差不同。工程师能容忍框的抖动,研究者不能容忍标签的系统性偏差,产品团队不能容忍指标口径不清。

9.2 一条最短的可用流程

从零到能训,下面这条路是够用的。全程只用开源工具,不需要任何账号。

#-- 1) 取标注
wget -c https://physionet.org/static/published-projects/bhx-brain-bounding-box/bhx-brain-bounding-box-1.1.zip
unzip -q bhx-brain-bounding-box-1.1.zip -d bhx

#-- 2) 取原图(体积较大,先试试只在目录层面探测结构)
wget -c http://headctstudy.qure.ai/dataset/batch.zip -O cq500-batch.zip

#-- 3) 环境
python3.11 -m venv venv && source venv/bin/activate
pip install pandas pydicom numpy
#-- 4) 建索引 + 生成 YOLO 标签
import ast, pandas as pd, pydicom
from pathlib import Path

df = pd.read_csv("bhx/3_Extrapolation_to_Selected_Series.csv", index_col=0)
box = df["data"].apply(ast.literal_eval).apply(pd.Series)
df = pd.concat([df.drop(columns="data"), box], axis=1)

idx = {}
for f in Path("CQ500").rglob("*.dcm"):
    ds = pydicom.dcmread(str(f), stop_before_pixels=True)
    idx[ds.SOPInstanceUID] = str(f)
df["path"] = df["SOPInstanceUID"].map(idx)
df = df.dropna(subset=["path"])

cls = {"Epidural":0,"Intraparenchymal":1,"Intraventricular":2,
       "Subarachnoid":3,"Subdural":4,"Chronic Subdural Hematoma":5}
df["cls"] = df["labelName"].map(cls)
df["cx"] = (df["x"]+df["width"]/2)/512
df["cy"] = (df["y"]+df["height"]/2)/512
df["w"] = df["width"]/512
df["h"] = df["height"]/512
df[["path","cls","cx","cy","w","h"]].to_csv("labels.csv", index=False)

#-- 5) 按病例切分,避免泄漏
from sklearn.model_selection import GroupShuffleSplit
gss = GroupShuffleSplit(n_splits=1, test_size=0.2, random_state=42)
tr, te = next(gss.split(df, groups=df["StudyInstanceUID"]))
print("训练行", len(tr), "测试行", len(te))

到这一步,labels.csv 加上原图路径就是一个标准的 YOLO 数据集。后续训练用 ultralytics 的默认配置即可,唯一需要调的是 imgsz,建议不小于 1024。

9.3 引用方式

官方给的引用格式是把作者、年份、标题、版本、DOI 全部写明:

Reis, E. P., Nascimento, F., Aranha, M., Mainetti Secol, F., Machado, B.,
Felix, M., Stein, A., & Amaro, E. (2020). Brain Hemorrhage Extended (BHX):
Bounding box extrapolation from thick to thin slice CT images (version 1.1).
PhysioNet. RRID:SCR_007345. https://doi.org/10.13026/9cft-hg92

如果同时用了图像,还需要引 CQ500 的原始论文(Chilamkurthy 等 2018 年 Lancet 那篇)。只引 BHX 而不引 CQ500,在方法学上是不完整的——BHX 本身不含任何图像。

§10 AI 使用声明

项目 说明
本文写作方式 由 AI 辅助撰写,经人工核对官方页面原文
信息来源等级 一级:PhysioNet 官方项目页;二级:无(本数据集无配套论文)
数字口径 全部取自官方页面 Abstract、Data Description、Files 三处
未核实内容 CQ500 切片总数(约 17 万)为官方页面转述,未逐例复核
示例代码 在 Python 3.11 + pandas 2.x + pydicom 3.x 下验证逻辑,未对全量数据跑通
医学建议 本文不构成任何诊断或治疗建议,不替代执业医师判断
更新时间 2026-10-27
利益关系 无,与作者团队、MD.ai、qure.ai 均无关联

常见误读(避坑清单)

常见说法 实际 证据
「这是脑部检测框数据集,用来找脑」 框的是出血,不是脑 官方摘要:bounding box annotations for 5 types of acute hemorrhage
「三万九千多个框,样本量很足」 有效手绘实例只有六千二百多个 官方 Data Description:manual labeling resulted in 6,283 bounding boxes
「下载 CSV 就能训练」 数据集不含图像,需另下 CQ500 官方 Usage Notes:original images are hosted by qure.ai
「所有框都是专家逐层画的」 六成三是脚本外推,未经修正 官方 Usage Notes:no corrections were made on them
「可以拿来做出血分割」 只有矩形,无掩码 文件清单只有三个 CSV,无 NIfTI
「只有五类出血」 第六类慢性 SDH 单独存在 官方 Methods:an extra sixth label for Chronic Subdural Hematoma
「CC BY-SA 不能商用」 可以商用,但衍生物须同许可分发 LICENSE.txt 为 CC BY-SA 4.0 全文
「可以直接估患病率」 采样偏阳性,无真实人群代表性 205/491 为阳性,远高于急诊真实阳性率
「三个 CSV 加起来是独立的三份数据」 版本 2、3 都包含版本 1 的行 官方 Data Description 描述为 i/ii/iii 三种版本形式
「它有一篇配套论文可以引」 无配套论文,只有 PhysioNet DOI Europe PMC 检索无对应方法学文章

FAQ

Q1:BHX 是不是通用的脑部检测框数据集?
不是。BHX 的框只圈出血区域,不圈整个脑。它解决的是出血在哪,不是脑在哪。如果你的流水线需要「先找到脑」的粗定位,这份数据帮不上忙。

Q2:下载 PhysioNet 上的三个 CSV 就能训练模型了吗?
不能。CSV 只有坐标,图像要另行从 qure.ai 下载 CQ500 原始 DICOM,再按 SOPInstanceUID 做匹配。这一步通常比下载 CSV 本身耗时多得多。

Q3:为什么外推的框数量是手画框的六倍多?
手画框只在厚层序列上做,一次检查的厚层切片数远少于薄层;把厚层的框按患者坐标映射到薄层后,同一处出血会在更多切片上各得到一个框。这不是数据增强,是标注传播。

Q4:BHX 可以直接用于商业产品吗?
许可为 CC BY-SA 4.0,允许商用但要求署名并以相同许可分发衍生作品。医疗产品是否合规还要看所在辖区的法规与 CQ500 原始条款,务必让法务过一遍。

Q5:它和 CT-ICH 有什么区别?
CT-ICH 给的是像素级掩码,例数少但精度高;BHX 给的是检测框,例数多但只有矩形。分割任务用 CT-ICH,定位任务用 BHX。两者不冲突,可以一起做级联。

Q6:为什么第六类标签要单独设慢性硬膜下血肿?
慢性硬膜下血肿在 CT 上多呈等密度或低密度,与急性出血的高密度相反,多数数据集的阳性定义会把它排除。BHX 明确单列,便于单独评测这类最容易漏检的病变。

Q7:标签名为什么首字母大写?可以直接用吗?
CSV 里就是 Intraparenchymal 这样的驼峰写法,没有数字编码。可以直接用,但转换到 YOLO 或 COCO 时需要自己建一张名称到整数的映射表,建议固定下来写进配置文件。

Q8:data 列为什么不能直接 json.loads?
因为它是 Python 字典字面量,键用单引号。json.loads 会抛 JSONDecodeError,必须用 ast.literal_eval。这是最常见的接入报错原因。

Q9:可以用版本 2 训练、版本 1 测试吗?
可以,但要注意版本 2 包含版本 1 的所有行,必须先按图像 ID 把重叠部分从训练侧剔除,否则测试集的内容训练时已经见过。更稳妥的做法是用版本 3 训练、版本 1 测试。

Q10:框的坐标单位是毫米还是像素?
像素。x、y、width、height 都是像素单位,原点在左上角。没有做物理尺寸换算,所以不同重建视野下的框在像素上可比、在毫米上不可比。

Q11:官方提到的抽查是怎么做的?抽了多少?
官方页面只说「randomly spot-checked by one neuroradiologist」,没有给抽样比例、也没有给抽查结果。这意味着无法量化外推误差的分布,只能把它当作已知的未知。

Q12:有没有更新的版本?
截至核验时点,PhysioNet 上只有 v1.1(2020 年 7 月 29 日),没有更新版本。DOI 10.13026/7br9-xy10 指向 latest,实际解析到的仍是这一版。

术语表

术语 英文 含义
BHX Brain Hemorrhage Extended 本文所述数据集的全称
CQ500 - qure.ai 公开发布的 491 次头颅 CT 检查集合
检测框 bounding box 用矩形四元组描述目标位置,本文中即 x/y/width/height
手绘标注 handDrawn labelType 取值之一,表示专家逐层手动框选
选择性薄层 selectedThinSlices labelType 取值之一,表示外推到软组织平扫薄层的结果
外推 extrapolation 本数据集中指按患者坐标把厚层框移植到薄层
厚层 thick-slices 官方定义:层厚 3 mm 及以上的序列
薄层 thin-slices 官方定义:层厚 1 mm 及以下的序列
SOPInstanceUID - 单张 DICOM 图像的唯一标识
SeriesInstanceUID - 一个 DICOM 序列的唯一标识
StudyInstanceUID - 一次检查的唯一标识
Image Position (patient) - DICOM 标签,记录切片在患者坐标系中的位置
软组织窗 soft tissue filter 一种重建卷积核,突出软组织对比度
骨窗 bone filter 突出骨骼的卷积核,官方认为不适合评估出血
部分容积效应 partial volume effect 一个体素混合多种组织导致密度平均
硬膜外出血 Epidural 颅骨与硬膜之间的出血
硬膜下出血 Subdural 硬膜与蛛网膜之间的出血
蛛网膜下腔出血 Subarachnoid 脑沟脑池内的出血
脑实质内出血 Intraparenchymal 脑组织内部的出血
脑室内出血 Intraventricular 脑室内的出血
慢性硬膜下血肿 Chronic Subdural Hematoma 亚急性或慢性期的硬膜下积血,密度接近脑实质
IoU Intersection over Union 检测中衡量两个框重合度的指标
mAP mean Average Precision 检测任务的主指标
弱标签 weak label 精度不完全可靠的标注,本集中指外推部分
标签传播 label propagation 把稀疏标注扩展到相邻切片的通用做法
CC BY-SA 4.0 - 署名 + 相同方式共享的国际许可
PhysioNet - 美国国立卫生研究院支持的开源生理与医学数据平台
RRID Research Resource Identifier 科研资源的统一标识,PhysioNet 为 SCR_007345

附录 A:核心数字核对表

项 值 来源 来源层级
手绘框数 6,283 官方 Data Description 官方页面
手绘图像数 3,558 官方 Data Description 官方页面
全外推框数 39,668 官方 Abstract + Key Points 官方页面
全外推图像数 23,409 官方 Abstract + Key Points 官方页面
清洁版框数 27,203 官方 Data Description 官方页面
清洁版图像数 15,979 官方 Data Description 官方页面
CQ500 检查数 491 官方 Methods 官方页面
CQ500 阳性检查数 205 官方 Methods 官方页面
CQ500 切片总数 约 170,000 官方 Abstract 官方页面(约数)
标注医师数 3 官方 Methods 官方页面
从业年限 6 年 / 4 年 / 不足 1 年 官方 Methods 官方页面
标签类别数 6 官方 Methods 官方页面
版本号 1.1 官方页面标题 官方页面
发布日期 2020-07-29 官方页面 官方页面
解压后体积 22.3 MB 官方 Files 区 官方页面
压缩包体积 3.8 MB 官方 Files 区 官方页面
DOI 10.13026/9cft-hg92 官方页面 官方页面
许可 CC BY-SA 4.0 官方 Access 区 官方页面

附录 B:数字的来源分层

第一层:官方页面直接给出。 上表除「切片总数」外全部属于这一层。这些数字来自 PhysioNet 项目页的 Abstract、Key Points、Methods、Data Description、Usage Notes、Files 六个区块,可以逐条在页面上找到对应原句。核验时间 2026-10-27。

第二层:论文摘要。 本文没有使用这一层。原因是 BHX 没有配套的方法学论文,Europe PMC 上检索「brain bounding box」「BHX brain」「BHSD」等关键词,命中的全部是引用它的下游研究,而非作者本人的方法文章。

第三层:未核实。 包括以下几项:一是 CQ500 的约 17 万张切片,官方页面用的是约数,没有给出精确值;二是外推误差的实际分布,官方只做了抽查,没有给出统计;三是三个版本各自的检查覆盖数,官方只给了框数与图像数。这三项在本文中均已明确标注为「约」或「未说明」。

附录 C:完整参考文献

  1. Reis E P, Nascimento F, Aranha M, Mainetti Secol F, Machado B, Felix M, Stein A, Amaro E. Brain Hemorrhage Extended (BHX): Bounding box extrapolation from thick to thin slice CT images (version 1.1). PhysioNet. 2020. DOI: 10.13026/9cft-hg92.
  2. Chilamkurthy S, Ghosh R, Tanamala S, Biviji M, Campeau N, Venugopal V, et al. Deep learning algorithms for detection of critical findings in head CT scans: a retrospective study. The Lancet. 2018;392(10162):2388-2396.
  3. van Asch C, Luitse M, Rinkel G, van der Tweel I, Algra A, Klijn C. Incidence, case fatality, and functional outcome of intracerebral haemorrhage over time, according to age, sex, and ethnic origin: a systematic review and meta-analysis. The Lancet Neurology. 2010;9(2):167-176.
  4. Heit J, Iv M, Wintermark M. Imaging of Intracranial Hemorrhage. Journal of Stroke. 2017;19(2):11-27.
  5. Chang P, Kuoy E, Grinband J, Weinberg B, Thompson R, Homo R, et al. Hybrid 3D/2D Convolutional Neural Network for Hemorrhage Evaluation on Head CT. American Journal of Neuroradiology. 2018;39(9):1609-1616.
  6. Kuo W, Häne C, Mukherjee P, Malik J, Yuh E. Expert-level detection of acute intracranial hemorrhage on head computed tomography using deep learning. PNAS. 2019.
  7. Weiss K, Cornelius R, Greeley A, Sun D, Chang I, Boyce W, et al. Hybrid Convolution Kernel: Optimized CT of the Head, Neck, and Spine. American Journal of Roentgenology. 2011;196(2):403-406.
  8. Wu B, Xie Y, Zhang Z, Ge J, Yaxley K, Bahadir S, Wu Q, Liu Y, To M-S. BHSD: A 3D Multi-class Brain Hemorrhage Segmentation Dataset. MLMI 2023, LNCS, pp. 147-156. DOI: 10.1007/978-3-031-45673-2_15.
  9. DICOM Standard. https://www.dicomstandard.org.
  10. PhysioNet 项目页:https://physionet.org/content/bhx-brain-bounding-box/1.1/

附录 D:任务代码对照

任务 应使用的版本 评估单位 推荐指标 需额外准备
二维出血检测 版本 3 训练 / 版本 1 测试 检查(StudyInstanceUID) mAP@0.5、按检查召回 CQ500 原图
出血定位可视化 版本 1 图像 人工复核 MD.ai 标注器链接
弱监督分割 版本 2 检查 Dice(需先转掩码) 自建框转掩码逻辑
检测模型外部验证 版本 1 检查 按亚型召回、假阳性/检查 待测模型
慢性 SDH 专项分析 三个版本中以 labelName 过滤 图像 该类单独召回 无
教学演示 版本 3(含三个 labelType) 无 无 示例标注图

附录 E:如果只记五件事

第一,BHX 是 CQ500 的出血检测框图层,不是新的图像集,图像要另外下载。

第二,六成三的框是坐标外推得来的,官方承认未逐一修正,手绘的只有六千二百多个。

第三,六个标签是五类急性出血加慢性硬膜下血肿,没有脑部整体框、没有掩码、没有临床信息。

第四,划分必须按 StudyInstanceUID 走,同一次检查的切片会高度相似,按切片随机分会严重高估指标。

第五,许可 CC BY-SA 4.0,可商用,但衍生产品须同许可分发。

编辑说明

核验时间:2026-10-27。核验方式:直接抓取 PhysioNet 项目页 HTML 并提取六个正文区块;下载三个 CSV 的首行以确认列结构与 data 字段的 Python 字典格式;Europe PMC 多关键词检索确认无配套方法学论文;Zenodo、Figshare、OpenNeuro、HuggingFace 检索确认无同名实体,slug 中的 BHX 确指 Brain Hemorrhage Extended。未覆盖内容:CQ500 的逐例检查清单与精确切片总数未做复核,官方页面以约数给出;外推误差的分布未做统计,官方未提供;三个版本各自的检查覆盖数未做统计,官方未提供。

关于分量口径:文中「六成三」「约 17 万」等为概数写法,用于避免同一精确数字反复出现。精确值以附录 A 与官方页面为准。


相关数据集导航

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

  • deeplesion — 共享标签:医学影像 / CT / 目标检测
  • fdtooth — 共享标签:医学影像 / CT / 目标检测
  • luna16 — 共享标签:医学影像 / CT / 目标检测
  • chestpathct5-s100 — 共享标签:医学影像 / CT / 目标检测
  • cervical-spine-fracture — 共享标签:医学影像 / CT / 目标检测
  • ct-bench — 共享标签:医学影像 / CT / 目标检测
  • lidc-idri — 共享标签:医学影像 / CT / 目标检测
  • medpelvis3d — 共享标签:医学影像 / CT / 目标检测
  • ct-lymph-nodes — 共享标签:医学影像 / CT / 目标检测
  • vindr-cxr — 共享标签:医学影像 / 目标检测

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

返回 AI-Ready 数据集