乳腺断层摄影筛查库 BCS-DBT — 五千零六十例

5,060 例 · 22,032 个重建体 · 四级分组与病灶框

来源 美国杜克大学医院 2014-08 至 2018-01 的筛查 DBT 检查,经 TCIA 去标识后发布发布时间: 2026-10-29最后更新: 2026-10-29 阅读 8
乳腺断层摄影筛查库 BCS-DBT — 五千零六十例

信息速览

数据集名称乳腺断层摄影筛查库 BCS-DBT — 五千零六十例
数据类型DICOM 三维体,病灶矩形框,四级分组标签,病例-检查-视角索引,CC BY-NC 4.0
规模5,060 名受试者(5,610 次检查,22,032 个重建三维体)
接入方式美国杜克大学医院 2014-08 至 2018-01 的筛查 DBT 检查,经 TCIA 去标识后发布
AI 就绪度

乳腺 X 线筛查是放射科体量最大的读片任务之一,全球每年执行超过三千九百万次检查。二维钼靶把三维的腺体压成一张投影,致密组织里的病灶容易被正常结构遮住;数字乳腺断层摄影(digital breast tomosynthesis,DBT)让球管在有限弧度内扫过并重建出一叠薄层,把重叠拆开。代价是数据形态从一张图变成一个三维体,公开可用的 DBT 数据因此长期比二维稀少一个量级。

BCS-DBT 是这条技术路线上规模最大的开源筛查集合。它由杜克大学放射科团队构建、经美国国家癌症研究所的癌症影像档案库(TCIA)托管,收录五千零六十名受试者的二万二千零三十二个重建三维体,合计 1.63 TB。每一次检查按筛查随访结局归入癌症、活检证实良性、需处理、正常四组之一,活检病例另附病灶矩形框。

它的分量来自三件事:规模足以支撑训练而不只是演示,分组直接对应筛查流程的真实分岔,许可证明确写死了非商业。第三件事同时是它最硬的边界——CC BY-NC 4.0 不允许商用,要进产品的模型不能拿它做训练集。另一处更容易被跳过的边界是,四级标签是分组而不是诊断,把它们当成严重度序数来用,下游所有结论都会立在错误的假设上。一屏速览见下表。

项目 内容
官方名称 Breast Cancer Screening – Digital Breast Tomosynthesis(BCS-DBT)
简称与 slug BCS-DBT / breast-cancer-screening-dbt
数据 DOI 10.7937/E4WT-CD02
构建机构 杜克大学医学中心放射科(北卡罗来纳州达勒姆)
托管平台 The Cancer Imaging Archive(TCIA)
首次发布 v1,2020-12-14
当前版本 v5,2024-01-18(补齐验证集与测试集的标签与框)
许可 CC BY-NC 4.0,禁止商业性使用
模态 数字乳腺断层摄影(DICOM 中的 MG)
受试者 5,060 名
检查数 5,610 次
重建三维体 22,032 个
体积 1.63 TB
切分 训练 4,362 / 验证 280 / 测试 418(受试者)
分组 正常、需处理、活检证实良性、活检证实癌症
空间标注 单层中心切片上的矩形框,仅活检病例
主键 PatientID + StudyUID(框表另加 View 与 Slice)
基线论文 JAMA Network Open 2021;4(8):e2119100
挑战赛 DBTex(2020—2021)、DBTex2(2021)
库内近邻 3d-mammogram(942)、cbis-ddsm(541)、vindr-mammo(543)、inbreast(542)、emory-embed(1726)

§1 它是什么:一个用筛查结局切出来的三维检测基准

§1.1 一句话定义

BCS-DBT 是一份以「一次筛查检查」为组织单元、把每次检查按随访结局归入四个分组、并只为活检病例提供单层矩形框的数字乳腺断层摄影集合。它不是分割数据集,不是诊断数据集,也不是患病率样本;它是一份为「在三维体里找病灶」这件事准备的大规模评测底座。

它最容易说错的地方在于规模。五千零六十是受试者,五千六百一十是检查,二万二千零三十二是三维体——三个数字都对,指的是三个不同的东西。把二万二千零三十二说成「二万多例患者」,是这份数据最常见的一句错话。

§1.2 为什么它不是普通的钼靶数据集

二维钼靶库的样本单位是一张图,标签往往落在图级(有无病灶、BI-RADS 分级),读者拿到手的是一叠 PNG 或 DICOM 单帧。BCS-DBT 的样本单位是一个三维体,标签落在检查级,空间标注落在「第几层上的一个矩形」。

对照项 二维钼靶库(如 CBIS-DDSM、MIAS) 本集合
最小单位 一张图 一个重建三维体(一个文件)
标签层级 图像级或病灶级 检查级(一次检查一个分组)
空间标注 掩膜或精确轮廓常见 单层中心切片上的矩形
分组语义 影像印象(BI-RADS 等) 随访结局(是否活检、活检结果)
典型输入 二维张量 三维张量,层数随设备与重建变化
能否直接套二维流程 能 不能,须处理层方向与层间距

这张表解释了为什么把在二维库上训练好的模型直接搬到 BCS-DBT 上,通常不是「掉几个点」,而是「完全跑不动」:通道数、层间距、方向约定、体素物理尺寸全都不同。DBT 的层厚在毫米级,一个体动辄几十到上百层,网络的第一层就要重新设计。

§1.3 三十秒决策卡

你的处境 这个集合能帮你什么
手上有二维钼靶检测模型,想验证它在三维上的表现 提供同任务、不同维度的最大规模外部测试床
要做三维病灶检测,但找不到够大的公开训练集 一万九千余个带分组标签的训练体,是当前最大的一份
想复现一个公开基线,好写对比表 有官方基线(JAMA 2021)与两届挑战赛成绩可引
想研究「召回但未活检」这类中间结局 Actionable 组是独立可分的一组,这类标签在公开库里很少见
想训练分割模型 给不了,只有单层矩形
想估算人群患病率 给不了,分组比例由筛查流程与入组决定
想把模型做成商用产品 给不了授权,CC BY-NC 4.0 禁止商用
想要多中心、多厂商的泛化评估 给不了,全部来自单一医学中心

§1.4 不适合谁

如果要训练分割模型,这个集合给不了你掩膜。 官方只提供单层中心切片上的矩形,评估时按体积层数 25% 的跨度做近似。这个近似对「检出定位」够用,对「勾画边界」远远不够。需要轮廓的任务应转向有专家勾画的库,本集合只能作为预训练或推理目标。

如果要估算筛查人群的癌症检出率,这个集合给不了你。 分组是在既有筛查流程里切出来的,正常组占了绝大多数,癌症组只有极小一部分。这个比例反映的是杜克那套流程在那些年里的分岔结果,不反映任何人群的患病率。任何基于它算出的阳性率都只是一句关于流程的描述。

如果要做出可商业交付的产品,这个集合给不了你授权。 CC BY-NC 4.0 的 NC 条款是禁止性条款,不是提示性条款。把权重在它上面训练过再声称「仅用于研究」但实际进入商业服务,同样落在禁止范围内。

如果要一份均衡的三向切分,这个集合给不了你。 训练、验证、测试的受试者数是四千三百六十二、二百八十、四百一十八,量级差了一个数量级。测试集小到只能支撑粗粒度的置信区间,做跨库比较时必须把这一点写进限制。

§1.5 它在乳腺影像数据谱系里的位置

库内已有的乳腺数据集大致分三档:二维钼靶的经典评测集(CBIS-DDSM、INbreast、MIAS、BCDR)、二维筛查的大规模商业来源集(VinDr-Mammo、EMBED)、以及三维方向的少量样本(3d-mammogram 的数百例)。BCS-DBT 填的是第三档的规模缺口。

位置 代表数据集 规模量级 与 BCS-DBT 的关系
二维病理金标准 CBIS-DDSM(541)、INbreast(542) 百至千例 任务同源、维度不同,可作迁移的源域
二维筛查基准 VinDr-Mammo(543)、EMBED(1726) 千至百万图 分组语义不同,前者是 BI-RADS,后者是筛查队列
三维小样本 3d-mammogram(942) 数百例 标注更细(分割),规模小两个量级
三维大规模 本集合 二万余体 唯一够规模的开源三维筛查基准

一句话的操作规则:要二维的病理确诊与掩膜,去 CBIS-DDSM;要三维的规模与官方基线,来这里;要三维的精细分割标注,去 3d-mammogram 或自建。

§2 数据构成与规格

§2.1 三级计数:受试者、检查、视角

官方的计数是三层嵌套的,任何一层单独拿出来都会失真。下表是 v5 的完整口径。

层级 训练 验证 测试 合计
受试者(PatientID) 4,362 280 418 5,060
检查(StudyUID) 4,838 312 460 5,610
视角/三维体(SeriesUID) 19,148 1,163 1,721 22,032
影像体积 1.42 TB 84.71 GB 135.14 GB 1.63 TB

三层之间的关系是:一名受试者可以有多次检查(随访年份不同),一次检查通常有四个视角(左右各 CC 与 MLO)。用受试者数除以检查数,得到平均每人约一点一次检查;用视角数除以检查数,得到平均每次检查约三点九个视角——不到四,说明有一部分检查缺视角。这个「不到四」本身就是一条边界:任何假定「每例恰好四视角」的批处理脚本都会在少数样本上崩掉。

§2.2 一个文件就是一个三维体

这是读取这份数据时最先要建立的心智模型。TCIA 的 DICOM 分发把每个视角的重建结果打包成一个文件,文件内部是多帧像素数据,帧序即层序。用普通的二维 DICOM 阅读器打开,看到的会是第一帧,或者一个「不支持多帧」的报错。

直觉 实际
一个 DICOM 文件 = 一张图 一个 DICOM 文件 = 一叠图(一个三维体)
一个序列 = 一个文件夹里若干文件 一个序列 = 一个文件
层号靠文件名排序 层号靠文件内的帧序
Rows/Columns 就是图像尺寸 还要读 NumberOfFrames 才是深度

这条结构决定了三件事:下载的文件数远小于图像数;解压后的内存占用远大于压缩包;切片索引(Slice)指的是文件内部的帧号,而不是文件编号。

§2.3 三张 CSV 各管什么

DICOM 之外有三类表,粒度各不相同,混接会错位。

表 粒度 主键 回答什么
分组标签表 一次检查一行 PatientID + StudyUID 这次检查属于哪一组(四列 one-hot)
病灶框表 一个病灶一行 PatientID + StudyUID + View + Slice 病灶在哪一层的哪个矩形里
路径表 一个视角一行 PatientID + StudyUID + View 文件在磁盘上的相对路径

关键的不对称在第二张表:它的行数远小于检查数,因为只有活检病例才有框。训练集的框表只覆盖一百零一名受试者,而训练集有四千三百六十二名受试者——也就是说,百分之九十七以上的训练样本只有分组标签,没有任何空间标注。

这个不对称不是缺陷,是设计。检测模型的正样本来自那一百零一人的框,负样本来自其余人的分组标签。如果误以为「每个人都有框」,会在数据加载阶段就崩。

§2.4 目录形态

官方路径表同时给出两套列:descriptive_path 与 classic_path,对应 NBIA Data Retriever 的两种目录命名选项。两套路径指向同一批文件,只是目录名不同。下载前选定一种,之后所有脚本按同一套路径拼接,不要混用。

#-- 描述式目录(descriptive)的典型形态
Breast-Cancer-Screening-DBT/
  BCS-DBT-Training/
    <PatientID>/
      <StudyUID>/
        <SeriesUID>/
          <SOPInstanceUID>.dcm      #-- 一个文件 = 一个视角 = 一个三维体
  BCS-DBT-Validation/
  BCS-DBT-Test/
  BCS-DBT-labels-train-v2.csv
  BCS-DBT-boxes-train-v2.csv
  BCS-DBT-file-paths-train-v2.csv

经典式目录把患者与检查压成一层数字目录,层级更浅但可读性差。选哪一种只影响路径拼接字符串,不影响内容。

§2.5 一条框记录逐行解剖

框表的一行是一个病灶,字段不多但每个都有坑。

字段 含义 读的时候注意什么
PatientID 受试者标识 与路径表同名同格式,可直接连接
StudyUID 检查标识 一人多次检查时,只靠 PatientID 会连错
View 视角名(LCC / RMLO / LMLO / RLL) 与文件名里的视角一致才可信
Subject 标注医师编号 是标注者编号,不是受试者编号
Slice 病灶中心层号 层号,不是切片文件序号
X / Y 框左上角坐标 0 起始,原点在左上
Width / Height 框的宽高 单位是像素,不是毫米
Class benign 或 cancer 只有两种取值,没有 actionable
AD 结构扭曲标记,1 表示有 与 Class 正交,可同时出现
VolumeSlices 该体数据的总层数 评估时用它与 Slice 算 25% 跨度

Subject 这一列的名字最容易骗人。它看起来像受试者,实际是读片医师的编号。用它做分组或去重会得到完全错误的结论。

§2.6 与同类库的规格差异

维度 本集合 3d-mammogram(942) CBIS-DDSM(541)
维度 三维 三维 二维
规模 二万余体 数百例 数千图
分组语义 随访结局四级 恶性/良性/召回/活检良性 病理良性/恶性
空间标注 单层矩形 分割轮廓 掩膜与 ROI
官方切分 有 无 有
官方基线 有 无 有
许可 CC BY-NC 4.0 研究协议 CC BY 3.0

三者的差别不在大小,在「给你什么层次的答案」。CBIS-DDSM 给像素级的病理答案,3d-mammogram 给三维的精细轮廓,本集合给的是「这次检查最后发生了什么」加上「病灶在哪一层的哪个框里」。

§2.7 切分口径:四千三百六十二、二百八十、四百一十八

三个子集的受试者数是四千三百六十二、二百八十、四百一十八,加起来正好五千零六十。这个加法成立,是口径自洽的最好证据。

这里必须拆掉一个流传很广的误读:把测试集说成四十例。四十是验证集里带病灶框的受试者数,六十是测试集里带病灶框的受试者数。两个数字都在框表的元信息里,与切分规模无关。测试集的真实规模是四百一十八名受试者、四百六十次检查、一千七百二十一个三维体。

切分的不均衡是结构性的:测试集占全部受试者的比例不到十分之一。以活检病灶为分母时,测试集的阳性样本只有六十例,这意味着任何在测试集上报出的敏感度,置信区间都很宽。官方基线在测试集上的结果是 65%(39/60,95% CI 56%–74%)——区间宽度接近二十个百分点,这就是小测试集的直接代价。

§2.8 一次检查怎么被拆开

把一次检查摊开看,结构就清楚了:它由若干视角组成,每个视角一个文件,每个文件一个三维体,每个体有若干层。层是最终的像素平面,也是框的落点。

视角代码 常见含义 读的时候注意
LCC 左乳头尾位 压迫方向自上而下
RMLO 右内外斜位 视野含胸肌
LMLO 左内外斜位 与对侧镜像
RLL 侧位一类 命名与常见体位缩写不完全一致,以路径表里的实际字符串为准

最后一行值得单独说。四个代码里前三个是行业通用缩写,第四个在不同文档里的写法不统一。看到 RLL 时不要按字面推断它是「右侧」还是「左侧」,也不要假设它一定存在——正确的做法是先统计路径表里 View 列的实际取值集合,再按集合写分支逻辑。

视角数也不是固定的。多数检查有四个视角,但官方的总量数据显示平均不到四个,说明有一部分检查缺视角。写批处理脚本时,「每例四视角」不能当断言,只能当期望值。

§3 分组层:四级标签是处置分岔,不是严重度刻度

§3.1 四级从哪来

四组的划分逻辑来自筛查流程本身。一次筛查之后,放射科医师面临三个连续的岔路口:要不要召回加拍?加拍之后要不要活检?活检结果是什么?四组就是这三个岔路口的组合,而不是对病灶本身做严重度打分。

组 判据 是否活检 标签表列名
正常 Normal 筛查阴性,无需额外处理 否 Normal
需处理 Actionable 需要加拍等进一步影像,但未做活检 否 Actionable
活检证实良性 Benign 做了活检,病理为良性 是 Benign
活检证实癌症 Cancer 做了活检,病理为恶性 是 Cancer

四列在标签表里是 one-hot:每行只有一个 1,其余为 0。这既保证了互斥,也保证了穷尽——每一次检查必然落到且只落到一组。

§3.2 为什么不能当严重度序数用

把四组排成「正常 < 需处理 < 良性 < 癌症」或「正常 < 良性 < 需处理 < 癌症」,都会立刻遇到反例。

Actionable 不是「轻症」。 它指的是影像上发现了需要进一步评估的东西,但临床上没有走到活检。它既可能是一个后来证明没事的叠加影,也可能是一个当时被判断为良性表现、后来在随访中被证实为癌的病灶。它没有病理答案,因此它在「良恶性」这条轴上根本没有坐标。

Normal 不是「健康保证」。 筛查阴性只说明这一次读片没有发现需要处理的东西。筛查的间期癌是常态,不是异常。把 Normal 当阴性金标准,会把间期癌算成假阴性,从而系统性低估模型难度。

Benign 不是「低危」。 活检证实良性意味着这一个人在这一次走到了有创诊断,其影像表现足以让医师决定穿刺。它的人群构成与 Normal 完全不同。

Cancer 是「这一次被确诊」,不是「严重度最高」。 四组之间不存在单调的进展关系,任何把标签当回归目标训练的做法,都是在拟合一个不存在的刻度。

§3.3 one-hot 的读法

标签表用四列 one-hot 而不是一列类别名,好处是不用猜拼写,坏处是容易在读取时把列顺序弄反。

#-- 读取分组标签表并把 one-hot 折回单个类别名
import pandas as pd

LABELS = ["Cancer", "Benign", "Actionable", "Normal"]

df = pd.read_csv("BCS-DBT-labels-train-v2.csv")
assert set(LABELS).issubset(df.columns), "列名与 v5 口径不符"
assert (df[LABELS].sum(axis=1) == 1).all(), "存在非 one-hot 行"

df["group"] = df[LABELS].idxmax(axis=1)
print(df["group"].value_counts())
print(df[["PatientID", "StudyUID", "group"]].head())

第二行的断言值得保留在正式代码里。它检查的是「每行恰好一个 1」,一旦上游改了编码方式,脚本会立刻停下,而不是静默产出一批错误标签。

§3.4 分组比例说明的是流程,不是疾病谱

四组在全体检查里的占比是:正常约占九成一,需处理约占百分之五,活检证实良性约占百分之二,活检证实癌症约占百分之一点六。三个非正常组加起来不到百分之九。

这组数字最容易被误读成「筛查人群的癌症患病率约百分之一点六」。它不能这么读。分母是杜克健康系统在某段年份里、满足「至少有一个重建视角可用」且未含异物、未做点压加拍的检查;分子是这套流程最终确诊的癌症。换一家医院、换一段年份、换一套召回阈值,这个比例就会变。它是一条关于流程的描述,不是一条关于疾病的描述。

真正的用法是把它当「类别先验」:在构建训练批次时按这个比例配平,或者故意不配平。两种选择都合理,但都必须知道自己在选什么。

§4 标注层:矩形框能回答什么,不能回答什么

§4.1 框的粒度

一个框由六个数字定位:哪一次检查、哪个视角、哪一层、左上角的 x 与 y、宽与高。它是一个二维矩形,落在一个三维体的一张切片上。

官方对评估的约定是:假定病灶在层方向上也占据一定跨度,取该体数据总层数的 25% 作为上下延展的范围。这是一个为了计算命中率而设的工程约定,不是解剖学测量。它让「预测框落在中心层附近」这件事有了一个可计算的判定,但也意味着不同层数的体数据,其容忍区间在绝对厚度上并不相同。

§4.2 框只覆盖活检病例

框表里 Class 只有两个取值,benign 与 cancer。Actionable 组和 Normal 组没有框。这不是遗漏,是逻辑必然:没有活检就没有病灶的病理定位,标注医师也就没有可靠的靶子可框。

由此产生一个训练上的结构性事实:正样本有空间位置,负样本只有检查级标签。这决定了检测任务只能做「弱监督的负样本 + 强监督的正样本」,而不能做全监督的稠密检测。任何声称在 BCS-DBT 上做了逐层全监督检测的工作,都需要解释它的负样本框是从哪来的。

§4.3 结构扭曲是独立标记

框表里有一列 AD,取 1 表示该病灶伴随结构扭曲(architectural distortion)。结构扭曲在 DBT 上比在二维钼靶上更容易看见,因为层间结构被拆开了;但它也是检出最难的一类,形态上没有明确边界,常常只表现为正常腺体走向的轻微牵拉。

官方把 AD 做成与 Class 正交的一列,而不是单独一类,说明它描述的是「这个病灶长什么样」,不是「这个病灶是什么」。把 AD=1 当成一个独立类别去训练分类头,会与 Class 的语义打架。

§4.4 方向缺陷:官方自己承认的那个坑

这是使用这份数据时最实在的一个坑,官方在数据集页面上直接写明了:部分文件的 DICOM 头中,侧别(laterality)和/或图像方向不正确;而参考标准的真值框是定义在校正后的图像方向上的。

拆开来看这句话的四层含义:

其一,问题在头信息,不在像素。像素数据本身是对的,错的是描述它的元数据。

其二,错的是「侧别与方向」这两类字段,也就是左右、以及行列方向。这两类错误恰好是叠加矩形框时最致命的——框的坐标是相对于像素矩阵的,矩阵一旦翻转,框的位置就整体错位。

其三,真值框是按校正后的方向定义的。也就是说,官方在标注时已经把方向摆正了,而使用者如果不摆正,看到的就是一个镜像或转置的图像,配上原始坐标的框,框会落在错误的位置。

其四,官方给了修复路径:代码库里的 Python 函数负责按视角读取并把图像摆到与真值框一致的坐标系。这不是可选项,是必选项。

这条缺陷的连带影响很广。它意味着任何「自己写一个通用 DICOM 读取器然后批处理」的方案都会踩坑,而且踩得很隐蔽:图像看起来完全正常,乳腺形态、皮肤线、胸肌都在位,只有左右反了。模型能训,指标能算,结论是错的。

§4.5 微小钙化没有被标

官方明确说明:数据集中包含微小钙化,但它们未被标注,也不是导致召回或活检的原因。

这一句对任务定义的收窄作用很大。在二维钼靶的语境里,钙化是最重要的恶性征象之一,很多公开库把钙化作为独立标注对象。在这里,钙化的存在被承认、被排除在真值之外。因此任何以「钙化检出」为目标的工作都不能用这份数据做监督,只能把它当干扰项来源。

§4.6 标注医师与一致性

病灶由两名有经验的放射科医师标注。官方未公布标注者间一致性统计,也未公布分歧的裁决流程。这不是致命问题,但在做严格的标注质量分析时,缺一致性数字就只能定性描述。

§4.7 框的坐标核验

在把框喂给模型之前,最值得花十分钟做的一件事是核验坐标是否落在体数据范围内,并按官方约定算出层跨度。这一步能同时挡住两类错误:方向没校正导致的越界,以及 VolumeSlices 与真实层数不一致。

#-- 核验框是否落在体内,并复算官方 25% 层跨度
import pandas as pd
from duke_dbt_data import dcmread_image

BOXES = pd.read_csv("BCS-DBT-boxes-train-v2.csv")
bad = []
for _, r in BOXES.head(50).iterrows():
    vol = dcmread_image(r["descriptive_path"], r["View"])
    n, h, w = vol.shape
    inside = (r["Y"] >= 0 and r["Y"] + r["Height"] <= h
              and r["X"] >= 0 and r["X"] + r["Width"] <= w
              and 0 <= r["Slice"] < n)
    span = int(round(r["VolumeSlices"] * 0.25))
    if not inside or span < 1:
        bad.append((r["PatientID"], r["View"], bool(inside), span))

print(len(bad), "条待复核")
print(bad[:3])

如果有大量记录越界,几乎一定是方向或坐标原点搞错了,而不是标注错了。这个判断顺序很重要:先怀疑自己的读取链路,再怀疑官方标注。

§5 取数层:从 1.63 TB 到可训练张量

§5.1 三条取数路径

路径 适合谁 代价
TCIA 网页 + NBIA Data Retriever 要完整目录结构、要按官方清单下载 需要 Java 客户端,大体积下载耗时长
IDC 门户(Imaging Data Commons) 要按 SQL 筛子集、要与其它 TCIA 集合混查 需要熟悉 IDC 的索引表结构
挑战赛历史包 要复现挑战赛设置 只覆盖当时发布的阶段性子集

三条路拿到的是同一批影像,差别在「怎么挑」和「怎么命名目录」。做全量训练用第一条,做子集实验用第二条,做历史对照用第三条。

§5.2 许可:CC BY-NC 4.0,禁商用

这一条要单独写死,因为它决定了这份数据能进哪条流水线。

许可是 Creative Commons 署名—非商业性使用 4.0 国际(CC BY-NC 4.0)。BY 要求署名,NC 要求不得用于商业目的。在数据集语境里,NC 的边界比很多人以为的宽:

用法 是否落在 NC 禁止范围 说明
学术论文的实验与发表 否 属于非商业研究
课堂教学与课程作业 否 非商业
内部技术验证、不对外收费 通常否 需按机构法务判断
训练一个对外收费的模型 是 直接商业使用
用它在商业产品上做微调 是 派生使用同样受限
用它做蒸馏的教师模型 是 商业产品的训练链条上游
用它做商业模型的第三方评测报告 是 属于商业服务的一部分
把数据转发给合作方 视许可条款 再分发须保留许可与署名

最容易被忽略的是第三行以下的几条:很多人以为「我只在研发阶段用一下,产品上线前会换数据」就没问题。这个理解站不住——如果最终产品的权重里含有在这份数据上训练得到的参数,商业使用就已经发生。

需要商用的路径只有一条:联系权利方另行取得授权。不要指望「改个名字」「只用了子集」「只是验证」能绕过去。

§5.3 下载:按 IDC 索引筛子集

做子集实验时,用 IDC 的索引表比拉全量再删快得多。下面这段按集合标识筛出全部序列,并把元数据落到本地表。

#-- 用 IDC 索引筛出 BCS-DBT 的全部序列,先看规模再决定下多少
from idc_index import IDCClient

client = IDCClient()
sql = """
SELECT collection_id, PatientID, StudyInstanceUID, SeriesInstanceUID,
       SeriesDescription, SeriesInstanceUID AS series_uid
FROM index
WHERE collection_id = 'breast_cancer_screening_dbt'
"""
df = client.sql_query(sql)
print(df.shape)
print(df["SeriesDescription"].value_counts().head(10))
df.to_csv("bcs_dbt_series_index.csv", index=False)

先看 SeriesDescription 的取值分布,再决定下载哪一批。DBT 的重建体与合成的二维图在描述字段上通常能区分开,这一步能挡掉大量不需要的文件。

§5.4 读取与方向校正

官方代码库 MaciejMazurowski/duke-dbt-data 提供了读取函数,作用是把某个视角的三维体解码成像素数组,并摆到与真值框一致的坐标系。把它复制进项目后直接用,不要自己写。

#-- 用官方函数读取,坐标系与真值框对齐;不要用裸 pydicom 直接取 pixel_array
import sys
sys.path.insert(0, "third_party/duke-dbt-data")

import numpy as np
import pandas as pd
from duke_dbt_data import dcmread_image

BOXES = pd.read_csv("BCS-DBT-boxes-train-v2.csv")

row = BOXES.iloc[0]
vol = dcmread_image(row["descriptive_path"], row["View"])
print(vol.shape)                     #-- (层数, 行, 列)
print(vol.min(), vol.max())          #-- 位深与灰度范围

sl = int(row["Slice"])
patch = vol[sl,
            int(row["Y"]):int(row["Y"]) + int(row["Height"]),
            int(row["X"]):int(row["X"]) + int(row["Width"])]
print(sl, patch.shape, patch.mean())

第三行的路径列需要按实际路径表补上;框表本身不带路径,这是使用前必须做的一次连接。取出的 vol 是三维数组,第一维是层。

如果一定要用裸 pydicom,至少要读三个字段并自己实现方向校正:ImageOrientationPatient、ImagePositionPatient、Laterality。这三者中任意一个不可信,就得回退到官方函数。多数团队的结论是:不值得自己写。

§5.5 把三张表接起来

连接的正确顺序是「路径表 → 标签表 → 框表」,因为路径表最全、标签表按检查、框表最稀。

#-- 按 PatientID + StudyUID 连接,不做一对多笛卡尔积
import pandas as pd

paths = pd.read_csv("BCS-DBT-file-paths-train-v2.csv")
labels = pd.read_csv("BCS-DBT-labels-train-v2.csv")
boxes = pd.read_csv("BCS-DBT-boxes-train-v2.csv")

key = ["PatientID", "StudyUID"]
views = paths.merge(labels, on=key, how="left", validate="many_to_one")
assert views["Cancer"].notna().all(), "有视角没配上分组标签"

hit = views.merge(
    boxes[["PatientID", "StudyUID", "View", "Slice", "Class"]],
    on=key + ["View"], how="left", validate="many_to_one")

print(views.groupby(["PatientID", "StudyUID"]).size().value_counts().head())
print(hit["Class"].notna().sum(), "个视角带病灶框")

validate="many_to_one" 不是装饰。它会在「检查在标签表里出现两次」这类上游问题时直接抛错,而这正是最难靠肉眼发现的一类错。

§5.6 存储与显存预算

项 量级 备注
全量下载 1.63 TB 实际落盘还要留解压与缓存余量
单个三维体 数十至数百 MB 取决于层数与重建矩阵
解码后单体的内存 通常数百 MB 至 1 GB 按 int16 估算
随机采样策略 必须 不能整包读入内存
推荐做法 预先把每个体降采样成 npz/npy 训练时按需 mmap 读取

直接把 DICOM 放进 __getitem__ 里解,会在第一个 epoch 就暴露 IO 瓶颈。可行的做法是离线把每个视角解码成定尺寸的体积文件,训练时只读体积文件。

§5.7 离线缓存

缓存这一步看起来笨,但它把「每个 epoch 重新解一次 JPEG 2000」变成「一次解码、多次读取」,在二万多个体的规模上,差别是数小时与数天。

#-- 每个视角解码一次,落成压缩 npz;训练时只读缓存
import pathlib

import numpy as np
import pandas as pd
from duke_dbt_data import dcmread_image

OUT = pathlib.Path("cache")
OUT.mkdir(exist_ok=True)

paths = pd.read_csv("BCS-DBT-file-paths-train-v2.csv")
for _, r in paths.iterrows():
    dst = OUT / (r["PatientID"] + "_" + r["StudyUID"] + "_" + r["View"] + ".npz")
    if dst.exists():
        continue
    vol = dcmread_image(r["descriptive_path"], r["View"]).astype(np.int16)
    np.savez_compressed(dst, vol=vol)

print(len(list(OUT.glob("*.npz"))), "个视角已缓存")

断点续跑靠 dst.exists() 这一行。全量解码中途被打断是常态,没有这一行就得从头再来。缓存体积通常只有原始 DICOM 的几分之一,因为解压后的像素用 int16 存,去掉了元数据开销。

§6 与库内条目的关系

§6.1 关系图谱

条目 关系 具体怎么配用
3d-mammogram(942) 同模态、不同侧重 它给分割轮廓,本集合给规模与分组;可先在本集合预训练、在它上面做分割微调
CBIS-DDSM(541) 同任务、不同维度 二维的病理金标准,可作为三维模型的源域或对照基线
VinDr-Mammo(543) 同为筛查来源 它的标签是 BI-RADS,本集合的标签是结局;两者可构成「印象 vs 结局」的对照
INbreast(542) 高精度标注的二维集 用于验证框级定位能力,规模小但标注细
MIAS(801) 经典小库 只适合做教学与快速冒烟测试
BCDR(800) 多源病案 可用于跨库泛化的阴性对照
EMBED(1726) 大规模筛查队列 人口学分层丰富,可与本集合的单一中心局限互补
对侧乳腺 MRI(1701) 不同模态 用于多模态融合的另一条输入臂

§6.2 检索路径

站内检索时,BCS-DBT、DBT、断层合成、数字乳腺断层摄影、Duke DBT、DBTex 都能命中。要注意 DBT 这个缩写在不同领域有别的含义,与甲状腺库的缩写相近,检索时带上 乳腺 或 mammo 更稳。

§7 质量评估与局限性

§7.0 前置认知校正:别用「标注密度」评价一个筛查基准

在给这份数据打分之前,需要先拆掉一个评价框架的错位:这是一份筛选用例集,不是一份标注密集型数据集。

用标注密度来衡量它,会得出「只有百分之一的人有框,质量很差」的结论。这个结论错在把「数据集的用途」和「标注的形态」混为一谈。BCS-DBT 的设计目标是让算法在接近真实筛查分布的条件下被测试:绝大多数检查是阴性的,少数是召回的,极少是确诊的。如果它给每一个体都配上密集标注,它就不再是筛查的真实切片,而变成了一个平衡的教学集。

由此可以推出两条使用纪律:

其一,不要要求它提供分割级标注。它提供的是「在这一次检查里,病灶大概在哪一层的哪个位置」,这件事对检出评估足够,对勾画不够。

其二,不要用它的类别比例去推断人群。这份数据的类别比例首先是一个流程参数,其次才是一个统计量。

§7.1 DAIMS 评分

下表按八个维度打分,每项满分五分。打分依据全部来自官方公开材料。

维度 得分 依据
描述层身份与边界 5 名称、DOI、机构、版本、四组定义、引用格式齐备,页面直接说明方向缺陷
描述层文档完备度 4 三张表的列名与含义有说明,评估约定(25% 跨度)写明;设备型号、层厚、重建参数未随数据发布
结构层标识体系 5 PatientID 与 StudyUID 两级主键稳定,路径表与框表可无损连接
结构层层级一致性 5 受试者、检查、视角三层计数可加和,三个子集相加等于全量
结构层模态配对 5 每个视角一个文件,标签在检查级、框在病灶级,三级粒度各自有明确归属
访问层开放程度 3 开放下载、无需申请,但 CC BY-NC 4.0 的 NC 条款把一整类使用者排除在外;全量需客户端下载
访问层可复现性 4 有官方切分、官方基线、两届挑战赛成绩与公开代码;但小测试集使复现的方差偏大
访问层许可清晰度 5 许可类型、署名要求、引用格式三件事在一处写明,无歧义

八项平均四点五分。扣分集中在两处:访问层的开放程度被非商业条款压到三分,这是所有 CC BY-NC 数据的共同代价;可复现性被测试集规模压到四分,一千七百余个体里只有六十个带框阳性,重跑一次换个随机种子,指标就会动。这两处扣分都不是「做得不好」,而是「这类数据的天花板就在这」。

§7.2 已知局限逐条

许可限制是硬约束,不是软提示。 CC BY-NC 4.0 的 NC 条款决定了这份数据无法进入任何商业训练链条。它把使用者切成了两半:学术机构可以全额使用,企业只能用于内部研究且必须评估法务风险。这是本集合与 CC BY 4.0 类数据最本质的差别。

单一中心。 全部影像来自杜克健康系统。设备、采集协议、体位摆放、读片习惯同源。跨中心泛化能力无法从数据内部评估,只能靠外部集。

测试集小。 四百一十八名受试者、四百六十次检查、一千七百二十一个体,其中带活检病灶框的只有六十人。以活检病灶为分母的敏感度,置信区间宽到接近二十个百分点。做显著性检验时,这个宽度会直接决定结论能不能立住。

验证集更小。 二百八十名受试者,带框的四十人。它的作用是早停与调参,不适合作为最终报告的来源。

方向缺陷需要上游修复。 官方承认部分文件头信息错误,并把修复责任交给了代码库。这意味着任何不经过官方函数的读取路径都是不可靠的,而这个不可靠是静默的。

标注只有两个人。 两名有经验的放射科医师,未公布一致性统计。做标注质量分析时只能定性。

没有阴性病例的空间标注。 正常组与需处理组没有框,这是逻辑必然,但也意味着无法做「全阴性体的假阳性密度」的精细分析——只能按体统计误报数,无法定位误报到哪个解剖区域。

层厚与重建参数未公开成表。 每个体的层数记在框表的 VolumeSlices 里,但只对带框的体有记录;不带框的体的层数需要自己从 DICOM 头里读。做跨体归一化时,这是一项必须先做的功课。

版本仍在推进。 v5 补齐了验证集与测试集的标签与框,未来是否会有 v6 未可知。任何引用了具体数字的工作都应记录版本号与下载日期。

§7.3 外部可比性:切分的不均衡怎么处理

跨库比较时,最常被忽略的是切分口径的差异。三个子集的规模差了一个数量级,这带来三个具体后果。

后果 表现 处理办法
置信区间宽 测试集阳性样本只有六十例 报区间而非点估计,或做自助法重采样
早停不稳定 验证集只有二百八十人 用交叉验证替代单次验证,或固定随机种子并报多次结果
与其它库不可直接比 别人在数千例上测,你在一千七百体上测 明确写出分母,不要把两个敏感度直接相减

还有一条更隐蔽的:测试集的定义在 v1 到 v5 之间变过。早期版本只发布了阶段性子集,测试集规模与现在不同。引用任何「测试集上的敏感度」时,必须同时说明版本。

§7.4 与官方文字的三处口径差异

官方材料之间并非处处一致,以下三处需要在使用时明确取值。

项 说法 A 说法 B 采用
受试者性别 数据集页称五千零六十人 论文称五千零五十九名女性(100.0%) 按五千零六十名受试者计,性别字段存在一人未被计入女性的差额,官方未解释
影像单位 数据集页称二万二千零三十二次断层扫描 论文称二万二千零三十二个重建体 按「重建三维体」理解,与「一文件一体」的结构一致
测试集规模 部分二手材料称四十例 官方表格为四百一十八名受试者、四百六十次检查 按四百一十八计;四十是验证集带框人数,六十是测试集带框人数

第三行的误读传得很广,原因不难理解:框表元信息里的「Subjects 40」与「Subjects 60」就在页面上,紧挨着切分表,稍不留神就会被当成切分规模。

§7.5 三条可以先做的自查

拿到数据的第一天,有三件事值得先做,它们的成本很低,但能挡掉后面绝大多数返工。

第一,计数对账。 用路径表按 PatientID 去重得受试者数,按 StudyUID 去重得检查数,按行得视角数,三个数与官方表逐个比。对不上,通常是因为只下了一个子集,或者下载中断导致文件缺失。

第二,标签与框的一致性核对。 框表里出现的每一个 StudyUID,其分组应当只落在 Benign 或 Cancer 上。若出现 Actionable 或 Normal 带框,说明连接键用错了,最常见的原因是把 PatientID 单独当连接键——一个人有多次检查时,会把另一次检查的框挂到这一次上。

第三,方向抽检。 随机取十个带框样本,把框画在图上肉眼确认。框落在病灶上,说明读取链路正确;框整体偏在一侧或上下颠倒,说明方向校正被跳过了。这一步不能靠指标间接判断,因为模型在错位的框上同样能收敛,只是学的是错的东西。

§8 版本与生态

§8.1 五个版本

版本 日期 变化
v1 2020-12-14 初始发布,只含训练集的一部分,配合挑战赛第一阶段
v2 2021-01-04 补验证集影像与路径表;框表新增 VolumeSlices 列
v3 2021-01-15 补测试集影像与路径表
v4 2021-06-08 补齐第二阶段影像与表,此前版本归为第一阶段
v5 2024-01-18 补验证集与测试集的分组标签表与病灶框表

版本线里最值得记的是 v5。在 v5 之前,验证集与测试集只有影像、没有标签——它们的用途是「提交预测、等主办方打分」,不是「本地自评」。v5 把标签补齐之后,这份数据才真正变成一个可以离线复现的基准。任何在 2024 年之前做的实验,其评估方式与今天不同,这一点在复现旧论文时必须考虑。

§8.2 DBTex 与 DBTex2

这份数据的公开史与两届挑战赛绑定。第一阶段在 2020 年 12 月至 2021 年 1 月进行,向参赛队提供七百个训练扫描、一百二十个验证扫描、一百八十个测试扫描;第二阶段在 2021 年 5 月至 7 月,直接开放完整数据集。共有八支队伍参赛。

评估指标是活检病灶的平均敏感度,只在含活检病灶的影像上计算;并列时用全部影像做判定。冠军队伍的平均敏感度为零点九五七(95% CI 0.924–0.984),全部提交的汇总值为零点八七九。

这里有一个容易被忽略的反差:挑战赛冠军能到零点九五七,而 2021 年论文里的基线模型在测试集上只有 65%。两个数字并不矛盾——它们的度量对象不同:前者是「在已知有病灶的影像里能不能找到」,后者是「在全部测试影像里按每个体两个假阳性的预算能做到多少」。把这两个数放在一张表里比较,是这类文献里最常见的误读之一。

§8.3 它为何能持续

一份 2020 年发布、2024 年还在更新的数据集,靠的不是情怀。三个结构性因素支撑它。

第一,它占住了一个无法回避的位置。 三维乳腺筛查的公开数据长期稀缺,而 DBT 在临床上的装机量持续上升。任何要做三维检测的团队,绕不开这份数据,因为替代品要么太小,要么不开放。

第二,它有机构承载。 杜克放射科团队持续维护,TCIA 提供长期托管与 DOI 注册。这意味着即使原作者团队解散,数据仍然可寻址、可引用。DOI 是这里的关键:它把「一份网盘上的文件」变成了一条可被引文体系追踪的记录。

第三,它被下游引用形成了刚性。 挑战赛的成绩、后续论文的对比表、教学课程的例子,都在反复引用同一份切分。切分一旦被广泛引用,就变成了事实标准,后来者即使想改也改不动。

§8.4 生态位

在乳腺影像的开源版图里,这份数据的位置可以用一句话概括:二维有 CBIS-DDSM 与 VinDr-Mammo,三维只有它够规模。 这个位置带来的好处是被引用,带来的坏处是没有竞争压力——没有第二份同量级的三维筛查集来交叉验证它的结论,所以它的局限(单一中心、方向缺陷、小测试集)会原样传递给所有基于它的工作。

§9 使用指引

§9.1 三种使用者的路径

做方法研究的:先读 §3 与 §4,把标签语义与框的粒度弄清楚,再决定任务定义。关键动作是把「分组」与「诊断」在论文的方法节里分开写,避免审稿人误以为你把 Actionable 当成了中间严重度。

做工程的:先跑通 §5.4 的读取与 §5.5 的连接,用一百个体做一次端到端冒烟,再上全量。关键动作是在数据加载层就把方向校正做掉,不要让错误流到训练循环里。

做合规的:只读 §5.2 与 §10。关键动作是确认使用场景不落在 NC 的禁止范围内,并把许可与引用写进项目的第三方清单。

§9.2 最小实现:一个能跑的采样器

下面这段把「读体、取层、裁框、缩放到固定尺寸」四步串起来,够跑通一个检测基线。

#-- 最小可用采样器:按层采样、按框裁正样本、按体裁负样本
import numpy as np
import pandas as pd
import torch
from torch.utils.data import Dataset
from duke_dbt_data import dcmread_image

class DBTPatch(Dataset):
    def __init__(self, index_csv, boxes_csv, size=224, pos_ratio=0.5):
        self.views = pd.read_csv(index_csv)
        self.boxes = pd.read_csv(boxes_csv)
        self.size = size
        self.pos_ratio = pos_ratio
        self.pos = self.boxes.reset_index(drop=True)
        self.neg = self.views[~self.views["StudyUID"].isin(self.boxes["StudyUID"])]

    def __len__(self):
        return len(self.views)

    def _crop(self, img, cy, cx):
        h = self.size // 2
        y0 = max(0, min(img.shape[0] - self.size, cy - h))
        x0 = max(0, min(img.shape[1] - self.size, cx - h))
        out = img[y0:y0 + self.size, x0:x0 + self.size]
        if out.shape != (self.size, self.size):
            out = np.pad(out, ((0, self.size - out.shape[0]),
                               (0, self.size - out.shape[1])))
        return out

    def __getitem__(self, i):
        if np.random.rand() < self.pos_ratio and len(self.pos):
            r = self.pos.sample(1).iloc[0]
            vol = dcmread_image(r["descriptive_path"], r["View"])
            sl = int(np.clip(r["Slice"], 0, vol.shape[0] - 1))
            cy = int(r["Y"] + r["Height"] // 2)
            cx = int(r["X"] + r["Width"] // 2)
            y = 1.0
        else:
            r = self.neg.sample(1).iloc[0]
            vol = dcmread_image(r["descriptive_path"], r["View"])
            sl = int(np.random.randint(0, vol.shape[0]))
            cy, cx = np.random.randint(0, vol.shape[1]), np.random.randint(0, vol.shape[2])
            y = 0.0
        img = self._crop(vol[sl].astype(np.float32), cy, cx)
        img = (img - img.mean()) / (img.std() + 1e-6)
        return torch.from_numpy(img)[None], torch.tensor([y])

print("dataset ready")

这里的负样本是随机层随机位置,这是最容易做的做法,也是最容易把模型带偏的做法——随机裁到的负样本里,绝大多数是均匀的脂肪与腺体,模型会学到「有结构 = 阳性」。改进方向是按解剖先验采样,或者引入难负样本挖掘。

§9.3 在 AI 流程中的位置

流程环节 这份数据能承担什么 不能承担什么
预训练 大规模三维输入的表示学习 高质量的分割监督
检测训练 弱监督正样本 + 检查级负样本 逐层全监督的稠密标注
内部验证 官方验证集早停 稳定的模型选择(样本太少)
外部验证 作为别人的外部测试床 作为自己模型的最终证据
上线前评估 不适用 许可不允许

§10 使用声明

项 内容
性质 公开研究用数据集词条,非医学建议
来源 官方数据集页面、官方论文、官方代码库
适用用途 学术研究、方法开发、基准评测、教学
不建议用途 商业产品训练、临床决策、患病率估计、分割任务
伦理 已去标识;禁止再识别;图像中可能残留烧录标记
许可 CC BY-NC 4.0,禁商用;引用须含 DOI 与版本号
版本 v5(2024-01-18)
状态 开放下载,维护中

常见误读

常见说法 实际情况 证据
「四级是严重度,可以当有序标签回归」 四组来自处置分岔,不构成单调刻度;Actionable 没有病理答案,在良恶性轴上没有坐标 官方四组定义 + 论文 2.1 节
「CC BY-NC 只是要求署名」 NC 是禁止商业使用,不是署名即可;商业训练、微调、蒸馏、评测都被排除 许可页 CC BY-NC 4.0 原文
「测试集只有四十例」 测试集是四百一十八名受试者的四百六十次检查;四十是验证集带框人数 官方 v5 数据表
「一万九千是患者数」 一万九千一百四十八是训练集的视角数;患者是四千三百六十二 官方 v5 数据表
「标注框就是分割掩膜」 单层中心切片上的矩形,评估时按层数 25% 延展,是命中判定的近似 官方评估约定 + 代码库
「DICOM 头可以直接信」 官方承认部分文件侧别与方向错误,真值框定义在校正后的方向 数据集页面的显著提示
「微小钙化有标注」 钙化存在但未标注,也不是召回或活检的原因 数据集页面说明
「Actionable 就是可疑恶性」 它是「需要加拍但未活检」,既非良性也非恶性 官方四组定义
「每个人都有一个框」 框只覆盖活检病例,训练集仅一百零一名受试者有框 框表元信息
「冠军零点九五七,说明任务已解决」 那是已知有病灶影像内的敏感度;全体影像上按每体两假阳性的基线只有 65% 挑战赛论文 + 2021 基线论文

FAQ

Q1:这份数据和 3d-mammogram 是什么关系?
同模态、不同侧重。3d-mammogram 规模小两个量级但标注到分割;本集合规模大、带官方切分与基线,标注只到矩形。两者不是替代关系,常见组合是先在本集合预训练、在它上面微调分割头。

Q2:为什么分组里没有「可疑」这一档?
因为分组不是影像印象分级。可疑与否属于读片阶段的主观判断,而四组记录的是随访结束后客观发生的事:有没有召回、有没有活检、活检结果是什么。想要影像印象,得看 BI-RADS 类的数据集。

Q3:能不能只用 Cancer 和 Normal 两组做二分类?
可以,而且很常见。但要知道这等于把 Actionable 与 Benign 从样本里剔掉,得到的先验与全集不同。如果只是做一个干净的对照实验,这样处理没问题;如果要报告「在本数据集上的性能」,必须说明剔除了多少。

Q4:Actionable 到底该不该算负样本?
看任务。做「是否需要召回」的模型时,Actionable 是正样本;做「是否恶性」的模型时,它是必须剔除或单独建模的一组。把它直接当负样本,会让模型学到「有异常但没活检 = 阴性」,而这个等价关系并不成立。

Q5:为什么框只在中心层?
标注成本与任务定义共同决定。三维勾画一个病灶的成本是二维的数倍,而检出任务只需要「大概在哪」,中心层加一个矩形已经够定位。官方用 25% 层跨度的约定把定位转成命中判定,是在精度与成本之间取的折中。

Q6:怎么处理方向错误?
用官方代码库的读取函数,按视角读取,让返回的数组与真值框处在同一坐标系。不要自己根据 ImageOrientationPatient 推,官方已经把这个逻辑写好了。自己实现的版本必须在带框样本上做可视化核对,确认框落在病灶上。

Q7:验证集和测试集能拿来调参吗?
验证集可以,测试集不行。但在 v5 之前,验证集连标签都没有,很多人是把训练集再切一刀。现在标签补齐了,正确做法是用官方验证集调、官方测试集只报一次。

Q8:可以把它和别的库合并训练吗?
技术上可以,许可上要小心。合并后的模型如果进入商业链条,本集合的 NC 条款会污染整个合并集。学术用途下合并是常见做法,注意维度对齐与标签语义对齐——别的库的「良性」未必等同于这里的「活检证实良性」。

Q9:为什么基线只有 65%,是不是模型太弱?
不弱。度量是「每个体两个假阳性的预算下、按乳腺计的敏感度」,这是一个很严的预算。挑战赛里零点九五七那个数字的度量方式不同,两者不能直接比。

Q10:数据里有没有合成二维图?
DBT 设备通常同时输出重建体与合成的二维图,但本集合分发的是重建体。做二维对照实验时不要假设合成图也在包里,需要自己从体重建或另找数据。

Q11:层数不一致怎么办?
按体归一化,不要按固定层数切。常见做法是重采样到固定层数,或者按物理层厚插值到统一间距。直接用「取中间若干层」的做法会在层厚不同的体上引入系统偏差。

Q12:引用要引哪一篇?
数据本身引 TCIA 的 DOI(10.7937/E4WT-CD02)并注明版本号;方法与基线引 2021 年那篇 JAMA Network Open;用了挑战赛成绩或预测结果,再补 2023 年那篇。

术语表

术语 解释
DBT 数字乳腺断层摄影,球管在有限弧度内扫描后重建出薄层序列
CC 头尾位(craniocaudal),乳腺上下压迫的投影体位
MLO 内外斜位(mediolateral oblique),沿胸肌走行的斜位投影
重建体 由多个角度投影重建出的三维像素阵列,本集合中一个文件即一个体
视角(view) 一次曝光对应的重建结果,通常每侧乳腺两个视角
中心层 病灶在层方向上的正中切片,框表 Slice 列即指它
结构扭曲 正常腺体结构被牵拉变形而无可辨肿块,DBT 上较二维更易见
Actionable 需进一步影像评估但未做活检的一组,无病理答案
弱监督 只有检查级或病灶级粗标签、没有像素级真值的学习设定
FROC 自由响应受试者工作特征曲线,横轴为每幅/每体的平均假阳性数
每体假阳性 一个三维体内误报的病灶数,是三维检测的常用预算单位
活检金标准 以组织病理作为最终判定依据的参考标准
间期癌 筛查阴性之后、下一次筛查之前被发现的癌症
one-hot 用多列 0/1 表示互斥类别,每行恰有一个 1
去标识 移除或偏移可识别个体的信息,保留研究所需的结构
NBIA TCIA 的影像归档与检索系统,配套桌面下载客户端
IDC Imaging Data Commons,用索引表按 SQL 检索 TCIA 影像的开放平台
DOI 数字对象标识符,给数据集一个可长期寻址的编号
源域/目标域 迁移学习里训练数据所在的域与要应用到的域
难负样本 外观接近阳性、容易被误报的阴性样本

附录 A 速查卡

键 值
数据集 BCS-DBT
DOI 10.7937/E4WT-CD02
版本 v5,2024-01-18
规模 5,060 受试者 / 5,610 检查 / 22,032 体
体积 1.63 TB
切分 4,362 / 280 / 418
许可 CC BY-NC 4.0(禁商用)
主键 PatientID + StudyUID
框粒度 单层 + 矩形
评估约定 层数 25% 跨度
官方代码 MaciejMazurowski/duke-dbt-data
基线 65%(39/60)@ 2 FP/体

附录 B 文件清单

文件 内容 用途
训练影像 DICOM,一文件一体 训练
验证影像 DICOM 早停
测试影像 DICOM 最终报告
分组标签表 四列 one-hot 检查级类别
病灶框表 十二列 病灶定位
路径表 descriptive_path 与 classic_path 路径拼接
挑战赛预测包 各队提交结果 历史对照

附录 C 外部资源对照

资源 类型 与本集合的关系
TCIA 数据集页 官方入口 下载、版本、许可的唯一权威
数据 DOI 永久标识 引用时必填
JAMA Network Open 2021 数据集与基线论文 四组定义、基线数字的出处
JAMA Network Open 2023 挑战赛论文 成绩与评测协议的出处
duke-dbt-data 代码库 官方代码 读取与方向校正
IDC 门户 检索平台 按 SQL 筛子集

附录 D 口径差异登记

项 差异 采用
性别计数 五千零六十名受试者 vs 五千零五十九名女性 按受试者计,差额未解释
影像单位 「断层扫描」vs「重建体」 按重建体
测试集规模 四十 vs 四百一十八 按四百一十八;四十为验证集带框人数
训练集规模 一万九千一百四十八 视角数,非受试者数
基线成绩 65% vs 95.7% 度量不同,不可直接比

附录 E 使用前检查清单

检查项 通过标准
许可适用性 已确认使用场景不落在 NC 禁止范围
版本记录 已记录 v5 与下载日期
读取函数 用官方函数,未自行实现方向校正
坐标系核验 抽十个带框样本,可视化确认框落在病灶上
标签语义 方法节已区分「分组」与「诊断」
负样本来源 已说明负样本是检查级标签而非密集标注
切分使用 测试集只报一次,未参与调参
引用完整 DOI、版本、方法论文、挑战赛论文四者齐备
局限声明 已写入单一中心、小测试集、方向缺陷三条

编辑说明

核验时间:2026-10-29。核验方式:用取页工具读取 TCIA 数据集页正文与数据存取表,并通过欧洲 PMC 接口取回 2021 年数据集与基线论文、2023 年挑战赛论文的摘要字段,交叉核对四组定义、切分计数与基线成绩。沙箱命令行出网白名单不含档案库域名,未做直连抓取与后端接口调用。

未覆盖内容:CSV 的实际列序与逐行内容未逐格核验,正文列名以页面文字说明为据;框表与路径表的行数只取了官方表格中的受试者数,未统计病灶条数;设备型号、层厚与重建参数官方未成表公布,文中未作估计;标注者间一致性未公开,未补充推断。

口径处理:测试集规模按官方 v5 数据表取四百一十八名受试者,与部分材料流传的「四十例」不同,差异原因已在正文 §2.7 与附录 D 写明。分级标签一律称「分组」,全文未使用「严重度」「分级」等表述描述四组关系。

本页只收录规模、结构与边界三类数字,不含分布类统计。凡涉及临床机制(召回、活检、间期癌)的陈述来自公开文献,用于解释标签语义,不代表官方立场。

免责:本页为数据集词条,不构成医学建议。任何基于本集合训练的模型在用于临床前,须经独立的前瞻性验证与监管审查;商业使用须另行取得权利方授权。


相关数据集导航

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

  • oasbud — 共享标签:医学影像 / 乳腺影像 / 肿瘤学 / 评测基准
  • tdsc-abus-2023 — 共享标签:医学影像 / 乳腺影像 / 肿瘤学
  • breast-diagnosis — 共享标签:医学影像 / 乳腺影像 / 肿瘤学
  • tn-mammo-breast-density — 共享标签:医学影像 / 乳腺影像 / 肿瘤学
  • dmr-ir — 共享标签:医学影像 / 乳腺影像 / 肿瘤学
  • b-mode-and-ceus-liver — 共享标签:医学影像 / 肿瘤学 / 评测基准
  • herlev-pap — 共享标签:医学影像 / 肿瘤学 / 评测基准
  • sipakmed — 共享标签:医学影像 / 肿瘤学 / 评测基准
  • camelyon17 — 共享标签:医学影像 / 肿瘤学 / 评测基准
  • unitopatho — 共享标签:医学影像 / 肿瘤学 / 评测基准

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

返回 AI-Ready 数据集