乳腺钼靶的老归档库 — 大家用的其实是 DDSM 衍生品

约两千六百例胶片筛查 / 三台扫描仪 / 已被整理版接管

来源 https://www.cancerimagingarchive.net/collection/cbis-ddsm/发布时间: 2026-10-27最后更新: 2026-10-27 阅读 18
乳腺钼靶的老归档库 — 大家用的其实是 DDSM 衍生品

信息速览

数据集名称乳腺钼靶的老归档库 — 大家用的其实是 DDSM 衍生品
数据类型原始影像,人工标注,元数据
规模约 2,620 例检查(整理版子集约一千五百名受试者)
接入方式https://www.cancerimagingarchive.net/collection/cbis-ddsm/
AI 就绪度

DDSM 的直接用处,是让人在没有自有影像库的情况下,仍能练出一套「病灶轮廓 → 良恶性」的完整流程;它的间接用处,是作为十几年间所有钼靶 CAD 论文的公共分母。这两件事的价值不一样:前者今天已经可以完全由 CBIS-DDSM 替代,后者则几乎不可撤销,因为一个库一旦成为历史基准,后来者就只能在它上面说话。

真正值得花力气理解的,不是它包含什么,而是为什么几乎没有人再直接打开原始压缩包。这个问题的答案由三件事叠加而成:一个已经停更二十余年的编解码器、三台响应特性互不相同的扫描仪、以及一批连发布者自己后来都要重新勾画的轮廓。三者叠加的后果是,任何一句「在 DDSM 上达到某某性能」都必须附带三样说明——用的是哪一版、怎么切的、有没有按扫描仪分层——否则这句话没有可比性。

下文把这个库拆成四层来看:它想解决的问题、它的物理构成、它的可用入口、以及它的幸存理由。每层都尽量只用官方页面与论文摘要里能读到的数字,拿不到的会明确写出「未核实」。一屏速览见下表。

维度 内容
全称 Digital Database for Screening Mammography
建库机构 南佛罗里达大学计算机视觉与模式识别组(Heath 等)
建库年代 1990 年代末,论文记为 1997 年发布
影像来源 屏片乳腺 X 线胶片,经数字化扫描仪转为灰度位图
检查规模 约 2,620 例筛查检查
影像规模 每例近似四视图,量级在一万张上下
标注类型 肿块与钙化两类像素级病灶轮廓
随访标签 BI-RADS 评估、肿块形状与边缘、钙化类型与分布、病理结论
文件格式 自定义 Lossless JPEG(LJPEG),非 DICOM
元数据文件 每例一个 .ics 文本头,异常病例另配 .OVERLAY 轮廓文件
扫描设备 三家厂商的三台数字化扫描仪
原站状态 eng.usf.edu 域名解析正常但连接超时,核验未取到页面
现行可用版 CBIS-DDSM(TCIA,2017 年最后更新)
现行许可 CC BY 3.0,须按数据使用政策引用
典型用途 钼靶病灶分割、良恶性分类、CAD 方法学对照

§1 它要解决的具体麻烦

1.1 它要填的是一个「没有公共分母」的坑

1990 年代做乳腺 CAD 的人面对一个很朴素的问题:每个人手里的胶片都在自己的医院里,算法写得再好,也没法与别人比。论文里报的灵敏度、特异度,对应的是一批别人拿不到的数据,读者只能选择全信或全不信。

DDSM 想做的就是把这件事变成可比较的。它把四家机构的筛查胶片集中起来扫描,配上一套统一的标注文件与元数据头,再用一个相对松散的发布方式放出去——下载压缩包、解压、自己写读取工具。这个设计在当年是合理的:1997 年前后,医学影像的通用容器格式还没有形成后来 DICOM 那样的垄断地位,各家自己定义格式是常态。

所以它是一个特定年代的产物:它解决了「有没有公共数据」的问题,但没有解决「公共数据好不好用」的问题。后一个问题要等到十几年后才被认真处理。

1.2 三条常见的错误期待

把 DDSM 当成「下载即用」的标准数据集,是今天最常见的起点,而且几乎必然踩空。下面三条期待最典型。

第一条期待是:它是公开数据集,所以应该有现成的加载器。事实是原始分发物是几十个压缩包,每个包里是一批无扩展名或扩展名为 .ljpg 的文件,加上一个 .ics 头文件和可能存在的 .OVERLAY 轮廓文件。没有哪个流行框架默认认识这套东西;就连把它整理成 DICOM 的团队,也要先修改一份 1993 年的编解码器源码才能解压。

第二条期待是:它有病理结论,所以可以直接做二分类。事实是病理结论在原始归档里并不是每例都有,而且颗粒度是「检查」而不是「图像」。CBIS-DDSM 把训练部分的病理结论并进了 CSV,但一条记录描述的是一个异常,一幅图上若有两个病灶就会有两行,标签对齐要自己做。

第三条期待是:它在同一个库名下,所以内部是同质的。事实是影像来自三台不同的数字化扫描仪,灰度响应与像素间距都不一样。这个差异在肉眼上不一定显眼,但在特征层面足以让模型学会区分「哪台机器拍的」。

1.3 它能给到的与给不到的

判断一个库值不值得用,最省事的办法是把自己的需求逐条投影上去,看哪些能对上。

你的需求 它给的 够不够
一批带像素级轮廓的钼靶病灶 肿块与钙化两类轮廓,原始版为 .OVERLAY 向量文件 够,但要自己解析格式
一套能直接进深度学习管线的影像 原始版是 LJPEG,需专用解码器 不够,需改用 CBIS-DDSM
每幅图一个良恶性标签 病理结论按检查记录,CBIS-DDSM 并入 CSV 勉强够,需做记录到图像的映射
BI-RADS 分级 有,0 到 5 级,出现在病例描述中 够
病灶位置框 CBIS-DDSM 为肿块重绘了掩膜与边界框 够(仅肿块)
高质量的钙化轮廓 仅保留原始轮廓,未重绘 不够,噪声较大
数字乳腺断层摄影(DBT)切片 无,全部是二维胶片扫描 不够
随访时间序列 无,每例一个时点 不够
明确的年龄段人群构成 元数据含年龄,但没有公开的分层统计 未核实
一套官方交叉验证折 只有一组 20/80 划分 不够,需自建折
可商用的授权说明 CBIS-DDSM 为 CC BY 3.0,原始站条款不可访问 整理版够,原始版未核实
与今天数字筛查设备一致的成像特性 屏片胶片扫描,非全视野数字乳腺摄影 不够

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

判断标准落到具体处境上更清楚。下表左列是处境,不是特性,这样更容易对号入座。

你的处境 它能帮你什么 下一步该做什么
手上没有钼靶影像,想先把分割流程跑通 提供带轮廓的公开影像,可验证读取与掩膜对齐是否正确 直接取 CBIS-DDSM 的肿块子集,先用小样本跑通
要写一篇 CAD 方法论文,需要一个公共对比基准 提供十几年来被反复引用的公共分母 明确写出用的是 CBIS-DDSM 而非原库,并说明切分口径
在做多中心泛化研究,想找一个「已知有设备偏差」的练手库 三台扫描仪天然构成设备分层,适合验证分层切分是否有效 先用本库验证去偏方法,再到自有队列上复现
想把一个训练好的模型迁移到自有数字筛查设备上 提供跨代的成像差异样本,可用于量测域偏移幅度 把本库作为源域、自有数据作为目标域做一次域适应实验
需要一个能直接进框架的 tfrecord 或 npy 不直接提供,需自行转换 用整理版的 DICOM,写一次转换脚本即可
要做钙化的精细分割 提供钙化轮廓,但质量未经验证 先做小样本人工复核,再决定是否用于监督训练
想评估一个商用系统在真实人群的表现 样本来自 1990 年代,人群与设备都过时 改用近年多中心前瞻队列

1.5 一句话判断

它不是一套能直接用的数据,而是一份被反复转手的历史档案;今天用到它的人,用的几乎都是 2017 年那次重新装订的版本。

1.6 不适合谁:四条边界

不适合需要开箱即用的人。 如果你的时间预算里没有「写读取工具」这一项,就不要碰原始归档。整理版虽然解决了格式问题,但 CSV 路径与文件名不一致、掩膜尺寸与全图不一致这两类对齐问题仍要自己处理。

不适合把结论直接外推到临床的人。 库内影像是 1990 年代的屏片胶片扫描,人群构成、设备与筛查流程都与今天的数字乳腺摄影不同。在这上面得到的灵敏度与特异度,不能直接当成临床预期。

不适合做钙化精细分割的人。 整理版只对肿块重绘了轮廓,钙化保留原始勾画。原始勾画的精度由人工决定,论文里没有报告钙化的重绘质量指标。

不适合需要断层信息的人。 它只有 CC 与 MLO 两个二维投影。任何以断层切片为输入的方法,都无法在本库上直接训练或验证。

§2 数据构成与规格

2.1 一个「检查」由哪些物理对象组成

要理解这个库的结构,先要理解它的物理层级。一个检查对应一次筛查,一次筛查在胶片时代会产出左右两侧各若干张胶片,常规是两侧各一张 CC(头足位)与一张 MLO(内外斜位),合计四张。每张胶片被扫描成一张灰度位图,位图旁边配一个文本头文件记录这次数字化的参数。

标注是另一层。病灶轮廓在原始 DDSM 里是矢量形式,存在 .OVERLAY 文件里,坐标基于扫描后的位图。一个检查可能有零个、一个或多个异常,每个异常有自己的轮廓与形态学描述。这层结构与影像层不是一一对应的:一幅图上可以有多个异常,一个异常也可能同时出现在 CC 与 MLO 两幅图上。

CBIS-DDSM 把这三层压平成 CSV。一行描述一条异常,同时给出它对应的全图路径、裁剪图路径与掩膜路径。这种做法对现代数据管线友好,代价是「一行不等于一个人,也不等于一次检查」这件事被藏进了文件路径里。

2.2 字段与记录的完整字典

CBIS-DDSM 的病例描述文件是理解整个库的最佳入口。它的字段不多,但每个字段都有一层隐含语义。

字段 含义 取值与格式 使用注意
patient_id 受试者编号 图像名前 7 个字符,形如 P_00038 DICOM 元数据里一人多号,不能用元数据分组
breast_density 乳腺密度分类 1 至 4,对应 BI-RADS 密度分级 高密度会降低病变可见度,影响阳性样本可检出率
left or right 侧别 LEFT 或 RIGHT 左右并存,不能当成两个独立受试者
image view 摄影体位 CC 或 MLO 同一异常通常需要两视图交叉确认
abnormality id 病灶在图像内的编号 整数 与图像路径里的序号对应
abnormality type 病灶大类 mass 或 calcification 两类在 CSV 中分属不同文件
mass shape 肿块形状 圆形、卵圆、分叶、不规则等 仅肿块记录有值
mass margins 肿块边缘 清晰、模糊、微小分叶、毛刺等 与恶性风险强相关,是重要弱标签
calcification type 钙化类型 点状、无定形、多形性、线样分支等 仅钙化记录有值
calcification distribution 钙化分布 弥漫、区域、成簇、线样、段样 仅钙化记录有值
assessment BI-RADS 评估 0 至 5,个别记录到 6 筛查场景下给 4 或 5 并不常规
pathology 病理结论 BENIGN、BENIGN_WITHOUT_CALLBACK、MALIGNANT 三种取值,不是二分类
subtlety 细微度评分 1 至 5 标注者主观判断,不宜当客观难度
image file path 全图路径 多级目录加文件名 与真实文件名的映射需核对
cropped image file path 裁剪图路径 以病灶质心为中心的方形裁剪 尺寸与全图不同,需单独记录缩放
ROI mask file path 掩膜路径 二值掩膜 部分记录实际指向裁剪图,需校验
image file name 图像文件名 形如 000001.dcm 与路径列未必一致

这十七个字段里,真正决定模型能学到什么的,是 pathology、assessment 与 breast_density 三个。其余字段更多是描述性的,适合做辅助任务或错误分析,不适合当主标签。

2.3 一条记录的完整解剖

把一条记录展开看,能看清 CSV 与磁盘之间到底隔了几层。

#-- CBIS-DDSM mass_case_description_train_set.csv 的一行(字段按官方顺序,值做了脱敏与缩短)
patient_id             P_00001
breast_density         3
left or right          LEFT
image view             MLO
abnormality id         1
abnormality type       mass
mass shape             OVAL
mass margins           CIRCUMSCRIBED
assessment             4
pathology              BENIGN
subtlety               5
image file path        Mass-Training_P_00001_LEFT_MLO/1-1.dcm
cropped image path     Mass-Training_P_00001_LEFT_MLO/Crop_1-1.dcm
ROI mask file path     Mass-Training_P_00001_LEFT_MLO/Mask_1-1.dcm
image file name        1-1.dcm

这一行说的事情是:有一位受试者,左侧 MLO 位,第三个密度等级,图像里有一个卵圆形、边缘清晰的肿块,评估为 BI-RADS 4,病理为良性,标注细微度 5。看上去完整,但要做成训练样本还缺三件事。

第一件是它只描述了一侧一位。同一位受试者通常还有右侧 CC、右侧 MLO、左侧 CC 三条记录,它们在文件里相邻但不显式关联,要靠 patient_id 拼回去。

第二件是路径与磁盘不一致。CSV 里写的目录名与文件名,与下载后解压出来的目录名、文件名常常对不上,整理版也没有完全修好。这导致读取时必须先建一次映射表,而不能直接把路径塞给解码器。

第三件是尺寸不一致。裁剪图与掩膜未必与全图的坐标系对齐,若直接把掩膜叠加到全图上做可视化,会出现错位。这个现象在社区工具里被明确指出过,官方也提供了一份不匹配清单。

2.4 两个版本的数字对照

原始库与整理版不是同一个东西,把两边的公开数字放在一起,能看清整理版到底留下了什么、丢掉了什么。

项目 DDSM 原始库 CBIS-DDSM 整理版 口径说明
检查数 约两千六百例 未单独公布 原始库按检查计,整理版按异常计
受试者数 未单独公布 一千五百余人 整理版明确给出,DICOM 元数据另显示六千余个患者编号
病例数 未拆分公布 753 例钙化加 891 例肿块 论文摘要口径,病例指一个异常
影像数 量级约一万 10,239 张 DICOM 整理版含全图、裁剪图与掩膜三类
文件体积 未核实 163.51 GB 整理版全量包
文件格式 自定义 LJPEG DICOM 整理版为无损转换
掩膜质量 人工勾画 肿块重绘,钙化保留原样 重绘仅针对肿块
划分方式 无官方划分 按 BI-RADS 分层,约 20/80 肿块与钙化分别划分
可读取性 需专用编解码器 主流 DICOM 工具可读 这是整理版最大价值

这张表里最容易被忽略的一行是「影像数」。原始库约一万张,整理版一万余张,看上去差不多,但两者的计数对象根本不同:前者是筛查图,后者还包括了从图上裁出来的小图与二值掩膜。拿这两个数字做对照,会得出错误的结论。

2.5 与同类资源的字段差异

同属乳腺影像开放的库里,字段设计的思路差别很大,这个差别直接决定了它们能支持什么任务。

资源 主标签 是否有像素级轮廓 是否分侧别与体位 规模口径
DDSM 原始库 病理结论加 BI-RADS 有,向量文件 有 按检查
CBIS-DDSM 病理结论加 BI-RADS 有,肿块重绘 有 按异常记录
INbreast BI-RADS 加病理 有,XML 描述 有 按病例
VinDr-Mammo BI-RADS 加病灶框 有边界框,多为框级 有,四视图 按检查
3D Mammogram 活检证实结果 有,专家分割 有 按检查,断层
Swiss-Mammo 报告文本 无 有 按报告

从这张表能看出一个规律:越靠近临床决策的数据集,越倾向用 BI-RADS 作为主标签;越靠近算法评测的数据集,越倾向用病理结论作为主标签。DDSM 属于后者,它的设计目标是让 CAD 算法能被比较,而不是复刻临床判读。

§3 身份:它是一份胶片时代的公共档案

3.1 它的身份不是「数据集」,是「档案」

用今天的眼光看,DDSM 更像数字化的医院档案室,而不是一个为机器学习设计的数据集。档案的特征是:记录真实存在、来源分散、格式各异、使用者需要自带解码技能。数据集的特征是:字段统一、切分固定、指标可比。

这两者在 1997 年几乎是同一件事。那时候做 CAD 的人本来就是自己写读取工具、自己定义切分的,能拿到一份公开的、覆盖正常与异常两类的影像库,已经是很大的便利。论文里那句「在私有数据或公共数据库未指定的子集上评估」,就是对当时状态的准确描述。

3.2 三台扫描仪是它的骨相

建库时用的不是三台同型号设备的并列备份,而是三家厂商的三台数字化扫描仪。这三台设备在胶片转灰度位图这一步的做法不同,直接决定了后来所有影像的物理特性。

维度 三台扫描仪的共性 三台扫描仪的差异 后果
转换方式 都是胶片透射式线扫描 光学路径与感光元件不同 灰度响应曲线不同
位深 输出 12 位或 16 位灰度 有效位深与量化方式不同 相邻灰度级的间隔不同
空间分辨率 都在几十微米量级 像素间距随设备与设置变化 同一物理尺寸对应不同像素数
噪声 都存在扫描噪声 噪声谱与强度不同 同一算法的检出率随设备漂移
元数据记录 都在 .ics 头里记录设备与分辨率 记录字段口径不完全一致 想按设备分层需要先做字段清洗

这张表要说明的道理只有一句:设备和影像是绑在一起的。如果训练集里某台设备拍的片子多,而该设备的恶性样本恰好也多,模型完全可能学到「这台机器的纹理对应恶性」,而不是学到病灶形态。

3.3 它的标注来自人的眼睛

原始轮廓不是算法给出的,是人勾画出来的。勾画者是在胶片上工作还是在高分辨率显示器上工作,档案里没有统一说明;勾画时用的是自由笔还是多边形顶点,也没有统一说明。这些细节对分割任务的影响很大,但恰恰是没有留下记录的部分。

整理版在这一点上做了一次补救。它用改进的 Chan-Vese 局部水平集框架,以原始轮廓作为初始化,对肿块重新计算边界。为了证明这次重绘确实更好,论文报告了一项对比:对 118 张图像,把计算机分割与有经验放射科医生手绘的轮廓比较,计算机分割的平均 Dice 系数为 0.792(标准差 0.108),原始轮廓与手绘的平均 Dice 系数为 0.398(标准差 0.195),差值 0.395(标准差 0.257),Wilcoxon 符号秩检验 P 值为 5.54 乘以十的负十九次方。

这组数字说明的事情很直接:原始勾画与专家轮廓的吻合度不到 0.4,几乎只能算「指出了大致位置」。这也解释了整理版为什么要重绘,以及为什么重绘只覆盖肿块——钙化的形态太细碎,水平集在那上面收敛不可靠。

3.4 它的身份决定了它的用法

因为它是档案,所以它的正确用法是「当年怎么用,现在还怎么用」:拿它做方法学比较、做流程打通、做教学演示,而不是拿它做产品验证。档案的价值在于可追溯,不在于代表当下。

如果一定要一个判断标准,可以这样问:你要的答案,是一个「在 1990 年代美国四家机构胶片筛查数据上、按某一切分口径得到的方法间排序」,还是一个「今天某医院某设备上这个模型能不能用」。前者本库给得了,后者给不了。

§4 质量与特色:好在哪里,坏在哪里

4.1 它的第一层质量是「曾经被认真整理过」

判断一个老库值不值得用,最实际的指标是「有没有人愿意花力气重做一遍」。CBIS-DDSM 的存在本身就是一次质量背书:一个团队为了让这个库能被现代工具链读取,重写了编解码器、重写了工具链、重绘了掩膜、重做了划分,还写了一篇方法学论文把过程记下来。

这次整理的四项具体动作值得逐条看清,因为它们决定了今天你能拿到什么。

动作 具体内容 对你的影响
解压 用修改后编译的 PVRG-JPEG 编解码器,把 LJPEG 无损解压 你拿到的是标准格式,不用再装老工具
位深还原 解压结果先存为 16 位灰度,再转 DICOM 灰度级数不再受中间格式限制
光学密度统一 把像素值映射为光密度并截断在 0.05 到 3.0 跨扫描仪的灰度可比性提高
工具重写 原 Linux 下的 shell 与 C 工具改为 Python 跨平台可用,无需专门环境

第四项尤其值得说。原库的工具链绑死在 Linux 上,这在 1997 年不是问题,在 2017 年就变成了门槛。重写为 Python 之后,一个使用者不必再为了读一批老图像去配置一台旧机器。

4.2 它的第一层问题也是「当年没人重做过」

整理版的整理范围是有限的,它修了格式,修了一部分标注,但没有修设备差异,也没有修人群构成。这两项恰恰是最影响结论外推的部分。

设备差异没法修,因为影像已经拍完扫完了;能做的是在切分时按设备分层,让训练集与测试集在设备构成上尽量一致。人群构成也没法修,因为受试者的年龄、种族、筛查间隔都没有完整的公开分布。这两件事在整理版的说明里都没有给出解决方案,只给出了数据本身。

4.3 案例:一遍被重绘了三轮的肿块轮廓

用一个具体的肿块把上面这些抽象说法落地。设想一位受试者,左侧 MLO 位,图像里有一个卵圆形、边缘相对清晰的肿块,评估为 BI-RADS 4,最终病理为良性。这个组合在库里并不罕见,它正好踩中了这个库最容易被误读的地方。

第一轮轮廓来自原始 DDSM。标注者在扫描后的灰度图上画了一个圈,圈住的是「这里有问题」的大致范围,边界并不精细。论文的对比实验说明,这类轮廓与专家手绘的吻合度平均在 0.4 上下,也就是只能算粗定位。

第二轮轮廓来自整理版的水平集重绘。算法以第一轮轮廓为初始曲线,在局部窗口里迭代,把边界推到灰度梯度较大的位置。对这个卵圆形、边缘清晰的肿块,重绘的效果通常不错,因为边界明确、对比度足够。但如果这个肿块位于致密腺体区,局部窗口要开大才能避免陷入局部极小值,边界就可能被推到腺体纹理上。

第三轮轮廓来自你自己的预处理。你可能会为了统一尺度做重采样,为了适配网络做裁剪,为了让掩膜与全图对齐做坐标变换。这一轮最容易出问题:如果 CSV 里的路径与磁盘文件名不一致,你可能把掩膜叠到了错误的图上;如果裁剪图与全图尺寸比例不一致,你的掩膜会出现系统性偏移。

§4.3 的案例说明的不是「标注很烂」,而是「同一个病灶在不同环节会被重新定义三次」。任何一次报告分割精度的工作,都应该说清自己评的是第几轮。

4.4 特色:它是唯一一个「跨代」的公共钼靶库

多数公共钼靶库只代表一个时代。INbreast 代表全视野数字乳腺摄影的早期,VinDr-Mammo 代表近年东南亚筛查队列,3D Mammogram 代表断层摄影。DDSM 的特殊之处在于它横跨了胶片到数字的过渡:它记录的是胶片,但它被整理、被引用、被当作基准的时间,覆盖了整个数字时代。

这个跨代属性带来一个附带价值:它是研究「域偏移」的天然素材。把一个在它上面训好的模型直接搬到现代数字设备上,掉多少点,这个数字本身就是一条有用的信息。很多论文的讨论部分都会提到这个现象,但很少有人把它做成一个正经的实验设计。

4.5 特色:它的标签层次比看上去丰富

表面看它只有「良性」与「恶性」两类,实际上病理字段有三个取值:良性、良性但无需召回、恶性。第三种的临床含义与第二种不同,前者是「复查后确认没问题」,后者是「筛查时就没被召回」。把这两个合并成「良性」会丢掉一层信息,把所有非恶性都当负样本更是常见的简化。

标签层级 取值 临床含义 建模时的建议
病理结论 恶性 活检证实为癌 正样本
病理结论 良性 活检证实非癌 负样本
病理结论 良性无需召回 未进入召回流程 单独一类,或作为易负样本
BI-RADS 评估 0 到 5 放射科医生的判读分级 可做序数回归的辅助任务
乳腺密度 1 到 4 腺体与脂肪的比例 作为分层变量而非标签
细微度 1 到 5 标注者认为的发现难度 做难度分层分析,不宜当标签

4.6 它的质量问题可以按「能不能修」分类

问题 能否在数据层面修复 修复方式 修复代价
格式古老不可读 能 换成整理版 下载量增加,需大带宽
路径与文件名不一致 能 建映射表 一次性脚本,约半天
掩膜与全图尺寸不一致 能 按元数据重采样对齐 需逐例校验,工作量随规模线性增长
钙化轮廓粗糙 部分能 人工抽检并重绘 成本高,通常只做小样本
三台扫描仪灰度不同 部分能 灰度标准化加分层切分 需知道每例的设备,元数据有记录
受试者标识混乱 能 用 CSV 的 patient_id 而非 DICOM 元数据 一次性脚本
人群构成过时 不能 只能换库或在讨论中声明 无解
胶片成像特性过时 不能 只能换库或在讨论中声明 无解

这张表的价值在于分清「工程问题」与「效度问题」。前六行是工程问题,花时间能解决;后两行是效度问题,花时间也解决不了。很多论文把这两类混在一起讨论,结果是不该出现的结论被写进了摘要。

§5 取数:从入口到手上的一张图

5.1 两个入口,只有一个还通着

这个库有两个入口,它们的状态完全不同,混着用会浪费很多时间。

入口 地址 核验状态 提供什么
南佛罗里达大学原站 eng.usf.edu 下的 Mammography 目录 域名可解析,连接超时,未取到页面 原始压缩包与说明文档
TCIA 整理版 cancerimagingarchive.net 的 cbis-ddsm 集合页 可访问,内容完整 DICOM 影像、CSV 描述、DOI 与引用格式
论文 Scientific Data 2017 卷 4 期 170177 可访问(Europe PMC 有摘要) 方法学、规模、质量验证数字

原站的超时不是偶发。这个页面在多个社区讨论里被报告为长期不可用,因此本文关于原始库的所有数字,都以整理版页面与论文摘要中的表述为准,不依赖原站。

5.2 整理版的数据组织

整理版把数据分成四组,两两交叉:病灶大类的肿块与钙化,乘以官方划分的训练与测试。每组各有两个下载包,一个装全图,一个装裁剪图与掩膜,另外配一份 CSV 描述文件。

分组 病灶数 描述文件 影像包
肿块训练 691 例 mass_case_description_train_set.csv 全图包加掩膜包
钙化训练 602 例 calc_case_description_train_set.csv 全图包加掩膜包
肿块测试 201 例 mass_case_description_test_set.csv 全图包加掩膜包
钙化测试 151 例 calc_case_description_test_set.csv 全图包加掩膜包

四组的病灶数加总为 1,645,与论文摘要给出的「753 例钙化加 891 例肿块」一致。这个一致性值得留意:它说明整理版的官方划分确实覆盖了论文报告的全部病例,没有额外扣除。

5.3 下载:TCIA 的取数方式

整理版的主下载通道是影像档案库的客户端工具,它读取一个清单文件,按清单逐张拉取。清单要先从集合页的下载项里取得——集合页本身是网页,不是清单。

#-- 1. 清单需从集合页的下载项取得(此处假定已手工保存到当前目录)
ls -l cbis_manifest.tcia
#-- 2. 清单是纯文本,可以直接 grep 出所有影像的相对路径
grep -i "dcm" cbis_manifest.tcia | wc -l
#-- 3. 用官方客户端按清单下载(需先安装并在 PATH 中)
nbia-data-retriever --cli cbis_manifest.tcia -d ./cbis_raw -v

第三条命令依赖官方客户端。如果没有它,也可以走国家癌症研究所影像数据共享平台的接口逐系列取回,代价是要自己写循环。

5.4 读一张图:格式问题的正确解法

如果拿到的是整理版,读图这一步就不是问题了,标准 DICOM 库都能处理。真正需要小心的是「读到的是不是对的那张图」。

#-- 读整理版的一张全图,并检查位深与光学密度范围
import pydicom
import numpy as np
from pathlib import Path

path = Path("cbis_raw/Mass-Training_P_00001_LEFT_MLO/1-1.dcm")
ds = pydicom.dcmread(str(path))
img = ds.pixel_array.astype(np.float32)

print("shape:", img.shape)
print("bit depth:", ds.BitsStored, "signed:", ds.PixelRepresentation)
print("min/max:", img.min(), img.max())
#-- 整理版把光密度截断在 0.05 到 3.0,若最大值贴到上限,说明该图有过度曝光区

这段代码没有做归一化,是有意的。整理版的像素值已经映射到统一的光密度尺度,此时再做一次逐图最小最大归一化,会把本来跨扫描仪可比的灰度重新拉散,反而放大设备差异。正确的顺序是先统一尺度、再进网络。

如果拿到的是原始 LJPEG,读图这一步就变成了一个工程问题:需要一份 1993 年版本的编解码器源码,在当代编译器上打补丁才能通过编译。整理版论文自己记录了这件事——他们是在 OS X 10.10.5 上、用苹果版 clang 编译才跑通的。这一步劝退的人远比想象中多。

5.5 对齐 CSV 与磁盘

路径不一致是这个库最出名的工程坑。CSV 里写的是相对路径加文件名,磁盘上解压出来的目录结构却多了一层日期目录,文件名也可能不同。稳妥的做法是不信路径列,只用最末一级的目录名与文件名做匹配。

#-- 建立 CSV 记录到磁盘文件的三方索引:全图、裁剪图、掩膜
import pandas as pd
from pathlib import Path

csv = pd.read_csv("mass_case_description_train_set.csv")
root = Path("cbis_raw")

#-- 用末两级目录名加文件名做键,避开中间层的日期目录
def key_of(p):
    parts = str(p).replace("\\", "/").split("/")
    return "/".join(parts[-2:])

on_disk = {key_of(p.relative_to(root)): p for p in root.rglob("*.dcm")}

missing, matched = [], []
for _, row in csv.iterrows():
    k = key_of(row["image file path"])
    if k in on_disk:
        matched.append((k, on_disk[k]))
    else:
        missing.append(k)

print("matched:", len(matched), "missing:", len(missing))
#-- 缺失项通常是文件名编号与实际不符,需要按同目录下文件列表做位置匹配

最后那句注释是这类脚本的核心。很多情况下缺失不是真的缺,而是编号规则不同,靠目录内排序能对上,但必须逐例校验,不能默认。

5.6 做切分:这一步决定结论是否成立

官方给的划分只有一组,按 BI-RADS 分层,约两成测试。这组划分有三个没解决的问题:受试者是否跨集、扫描仪是否分层、肿块与钙化是否各自独立。

#-- 按受试者分组切分,并按扫描仪(或来源机构)做分层占位
import pandas as pd
from sklearn.model_selection import GroupShuffleSplit

df = pd.read_csv("mass_case_description_train_set.csv")
#-- patient_id 取图像名前 7 个字符
df["subject"] = df["patient_id"].astype(str).str[:7]

gss = GroupShuffleSplit(n_splits=1, test_size=0.2, random_state=42)
train_idx, test_idx = next(gss.split(df, groups=df["subject"]))

assert not set(df.loc[train_idx, "subject"]) & set(df.loc[test_idx, "subject"])
print("train rows:", len(train_idx), "test rows:", len(test_idx))
#-- 若需要按扫描仪分层,在此处把设备字段加进分组键,例如 subject 加 device

关键在最后那句断言。它是整篇工作里最便宜也最有效的一行代码:如果训练集与测试集的受试者有交集,后面所有的指标都会偏高,而且偏高的幅度无法事后估计。

5.7 一个最小的可运行闭环

把上面几步串起来,就是一个从零到能训一个模型的最小闭环。它不追求最佳性能,只追求每一步都可解释。

#-- 最小闭环:读 CSV、按受试者切分、裁出病灶块、存成数组
import numpy as np
import pandas as pd
import pydicom
from pathlib import Path
from sklearn.model_selection import GroupShuffleSplit
from PIL import Image

def load_crop(path, size=256):
    arr = pydicom.dcmread(str(path)).pixel_array.astype(np.float32)
    lo, hi = np.percentile(arr, 1), np.percentile(arr, 99)
    arr = np.clip((arr - lo) / max(hi - lo, 1e-6), 0, 1)
    im = Image.fromarray((arr * 255).astype(np.uint8)).resize((size, size))
    return np.asarray(im, dtype=np.uint8)

df = pd.read_csv("mass_case_description_train_set.csv")
df["subject"] = df["patient_id"].astype(str).str[:7]
df["label"] = (df["pathology"] == "MALIGNANT").astype(int)

gss = GroupShuffleSplit(n_splits=1, test_size=0.2, random_state=42)
tr, te = next(gss.split(df, groups=df["subject"]))

root = Path("cbis_raw")
xs, ys = [], []
for idx in list(tr)[:200]:
    row = df.iloc[idx]
    hits = list(root.rglob(Path(str(row["cropped image file path"])).name))
    if not hits:
        continue
    xs.append(load_crop(hits[0]))
    ys.append(int(row["label"]))

np.savez_compressed("train_small.npz", x=np.stack(xs), y=np.array(ys))
print("saved", len(xs), "samples, positives:", int(sum(ys)))

这段代码里的每个取舍都对应一个前面说过的坑:按受试者切分对应泄漏,百分位裁剪对应灰度差异,只取前两百条对应小样本先跑通。

§6 与库内条目的关系

6.1 关系图谱

这个库在站点内不是一个孤立的条目,它处在一张以「乳腺影像」为核心的网的中心偏上位置。它自己已经很少被直接使用,但它的下游条目很多。

关系 库内条目 关系性质 一句话说明
直接衍生 CBIS-DDSM 子集加重新整理 今天实际被引用的版本,格式与标注均升级
同代同类 INbreast 并列 另一个数字乳腺摄影标注库,规模小但轮廓更精细
后继同类 VinDr-Mammo 时间上的后续 近年筛查队列,四视图,主标签为 BI-RADS
跨代同类 3D Mammogram 成像方式升级 断层摄影,含专家分割
文本侧补充 Swiss-Mammo 模态互补 报告文本,可与影像条目配合做多模态
邻近任务 breastpathq 任务互补 病理切片质量评估,位于诊断链下游
邻近任务 breast-lesions-usg 模态互补 超声病灶,同一疾病的另一成像路径
邻近任务 duke-breast-mri 模态互补 磁共振,用于高危人群补充筛查

这张网的结构值得说一说。以 DDSM 为源头的一支,走的是「越来越标准化」的路线,最终落到 CBIS-DDSM;以 INbreast 与 VinDr-Mammo 为代表的另一支,走的是「越来越贴近当代临床」的路线。两支的目标不同,不能简单比较规模。

6.2 检索路径

如果你是按任务而不是按名字来找数据,可以用下面三条路径。

你要做的任务 建议路径 理由
病灶分割(肿块) 经整理版进入,取掩膜包 掩膜经过重绘,质量有论文背书
病灶分割(钙化) 经整理版进入,但先做小样本人工复核 钙化未重绘,质量不确定
良恶性分类 经整理版进入,按受试者切分 官方划分未处理受试者泄漏
跨域泛化研究 以本库为源域,以 VinDr-Mammo 为目标域 两库成像代际差异大,适合量测域偏移
报告生成或多模态 以 Swiss-Mammo 为主,本库为辅 本库没有报告文本
断层任务 跳过本库,直接看 3D Mammogram 本库没有切片

第三条路径要再强调一次。分类任务用这个库的人最多,出问题的人也最多,原因几乎总是切分口径没有写清楚。

§7 质量评估与局限性

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

在给出任何评分之前,需要先校正一个几乎人人都会做的类比:把 DDSM 想成「乳腺领域的 ImageNet」。这个类比在叙事上很顺,在事实上会带来一连串误判。

误判之一是规模。ImageNet 的规模大到足以让模型从零学习,DDSM 的异常病例数只有千余量级,在这个量级上做端到端训练,模型学到的东西很容易被设备和采集流程的差异主导。误判之二是同质性。ImageNet 来自互联网的开放图像,来源庞杂但语义统一;DDSM 来自三家扫描仪,语义统一但物理特性不统一。误判之三是用途。ImageNet 存在的意义是预训练,DDSM 存在的意义是评测,两者的成功标准不同。

校正后的看法是:它是一个小而脏、但有公共分母价值的评测集。用这个看法去读下面的评分,才不会把低分当成「不该用」,也不会把某些维度的高分当成「可以放心用」。

7.1 五维评分

评分用的是本站统一的 DAIMS 框架,五个维度各打一到五分,分数是相对同代开放影像库而言的,不是绝对标准。

维度 分数 判断依据 扣分点
可用性 2 原始版需专用编解码器;整理版可读 路径与文件名不一致、掩膜尺寸不一致
规模 2 约两千六百例检查,一万张量级影像 按今天的深度学习标准偏小,异常病例不足两千
标注质量 3 有像素级轮廓与病理结论 钙化轮廓未重绘,肿块轮廓经算法重算而非纯人工
代表性 2 覆盖多机构、多种设备 1990 年代美国人群,胶片成像,无法代表当代筛查
可复现性 3 有官方划分与公开 DOI 只有一组划分,缺少交叉验证折,无统一评测代码

五维合计 12 分,换算成百分制约为 48 分。这个分数放在今天的新库里偏低,但它的历史地位不能用这个分数衡量——它的分数低,恰恰是它被整理成 CBIS-DDSM 的原因。

三个三分的维度值得单独解释。标注质量给三分,是因为「有像素级轮廓」这一项在同代库里很难得,而「钙化未重绘」又把分数拉了下来;可复现性给三分,是因为官方划分存在但不够细,单一划分无法支撑方差估计。

7.2 它与当代评测集的具体差距

把差距写成可比的条目,比给一个总分更有用。

对比项 DDSM 及其整理版 当代评测集的常见做法 差距的性质
划分 一组固定划分,约两成测试 五折或十折交叉验证 可补,自己重切
标签粒度 异常级 检查级或受试者级 需聚合,容易出错
设备信息 元数据里有扫描仪记录 常作为显式分层变量 可补,需清洗字段
人群构成 未公布分布 常公布年龄、种族分布 不可补
阴性样本 有正常病例,但整理版以异常为主 筛查队列以阴性为主体 不可补
评测协议 无官方脚本 常附官方评测脚本 可补,社区有实现

第三行与第五行的差别最关键。一个以异常为主的库,阳性比例远高于真实筛查场景,在这个库上训练出的模型,阈值搬到真实场景会严重偏移。这一点在讨论里经常被忽略,因为它不影响库内指标,只影响外推。

7.3 已知的、可枚举的偏差

偏差不是缺陷的同义词,它只是「数据里存在、可能影响结论」的结构性因素。下面这些可以在拿到数据后直接检查。

偏差 来源 表现 检查方式
设备偏差 三台不同型号扫描仪 不同设备的灰度直方图分布不同 按设备分组画直方图对比
采集年代偏差 1990 年代胶片 无数字后处理,噪声特征与现代设备不同 与当代库做跨库分类实验
阅片者偏差 原始轮廓由人勾画 同一病灶不同阅片者的圈法不同 论文的 118 张对比实验给出量级
选择偏差 可疑病例被剔除 肿块不清的病例不在整理版中 对比原库与整理版的病例数
视图不平衡 部分病例只有单视图 双视图配对样本少于总样本 按视图分组统计
标签噪声 病理结论来自不同机构 同一病理类型的判定标准可能不一致 无直接检查手段,只能声明

第一条与第四条要特别说明。设备偏差是可以在建模阶段处理的,选择偏差则不能——被剔除的病例恰好是最难的那部分,这意味着整理版在难度上是偏乐观的。论文报告了 254 张图像因肿块不可清晰辨认被剔除,剔除前经过受训乳腺摄影技师的人工复核,这个数字是为了让库变干净,代价是让库变简单。

7.4 外部验证矩阵

一个库的价值,很大程度上取决于有没有人在它之外做过验证。下表列出可查到的、与本库相关的外部验证方向,数字不做精确引用,只标性质。

验证方向 常见做法 本库的角色 结论的稳健性
跨库迁移 在本库训练,在当代库测试 源域 性能通常明显下降,降幅随目标库而异
同库跨设备 按扫描仪分组交叉验证 提供设备分层 能暴露设备偏差的幅度
算法间对照 多方法在同一划分上比较 公共分母 排序相对稳定,绝对值不稳定
钙化专项 在钙化子集上做检测 提供钙化轮廓 受标注质量限制,结论偏弱
分割专项 与专家手绘比较 Dice 提供掩膜 有论文的 118 张基准可参照
临床仿真 用库内阳性比例模拟筛查 不适用 阳性比例失真,仿真结论不可靠

最后一行是一个容易踩的坑。真实筛查的阳性率是千分之几的量级,而整理版以异常病例为主体,阳性率高得多。用这个库模拟筛查流程,得到的召回率与工作点都不可信。

7.5 它为何能持续:因为它成了别人论文里的一个固定短语

一个库能活二十多年,通常不是因为数据好,而是因为引用它的成本比不用它更低。当审稿人看到「在 DDSM 上评估」,他不需要追问切分细节,因为这句话在领域内已经是一个约定俗成的定位——大致相当于说「我在一个公开的钼靶库上做了初步验证」。

这种地位有自我强化的性质。新人写第一篇钼靶论文时,会照抄前人用过的方法与数据;审稿人熟悉这个名字,接受得更快;于是下一篇又用它。二十多年下来,「DDSM」这三个词已经脱离了它所指的那批具体文件,变成了一个方法论上的坐标。

这也是为什么它的生存不依赖原始站点是否可访问。真正在维持它的是 CBIS-DDSM 这个可用替身,以及论文里那句「基于 DDSM 的整理版」。原站关闭只是让这个替身从「备选」变成「唯一」。

§8 生态位与历史

8.1 它诞生的那个时间点

1990 年代中期,乳腺影像的数字化刚刚开始,胶片仍然占据筛查的主流。计算机辅助检测在这时进入临床,美国食品药品监督管理局在 1998 年批准了第一个商用钼靶 CAD 系统。这个批准带来一个直接需求:如何证明一个 CAD 系统比另一个好。

公共数据的缺位在这时变得刺眼。没有公共数据,每个厂商的验证都在自家数据上做,监管方无法横向比较。DDSM 就是在这个语境下建起来的:它服务的对象首先是「比较」,其次才是「训练」。

这一点决定了它的很多设计取舍。比如它保留了正常病例,因为比较需要阴性样本;比如它记录了 BI-RADS 评估,因为临床上 CAD 的作用是提示可疑区域,而不是直接给诊断;比如它按检查而不是按病人组织,因为临床流程本来就是按检查走的。

8.2 它被误用的那十几年

整理版论文的摘要里有一句话,点明了这十几年发生了什么:多数钼靶 CAD 算法是在私有数据或公共数据库未指定的子集上评估的。翻译过来就是,大家都在用 DDSM,但没有人说清用的是哪一部分、怎么切的。

这种状态持续了很久。原因不难理解:原始格式难读,所以每个人读完之后的处理方式都不一样;没有官方划分,所以每个人自己切;没有评测脚本,所以每个人的指标定义也不同。结果是「在 DDSM 上达到某个性能」这句话,在十几年的时间里几乎不携带可比信息。

整理版的出现,某种意义上是对这十几年的清算。它给出了固定划分、给出了统一格式、给出了重绘掩膜,把「各自为政」压缩成了一个官方口径。但它也只压缩到了 20/80 这一步,受试者泄漏与设备分层这两件事仍然留给了使用者。

8.3 它今天的位置

今天这个库的位置可以用一句话概括:它是一篇论文的「方法有效性初证」,不是「临床有效性证明」。

在具体的写作场景里,它通常出现在三个位置。第一个位置是方法章节的实验部分,作为除主数据集之外的补充验证,用来证明方法不是只在某一个库上有效。第二个位置是对比实验,作为与早期工作的可比基准。第三个位置是数据章节的引用,作为「本领域有公开数据」这一事实的出处。

这三个位置都不要求它代表当代临床,只要求它提供一个公共的、可追溯的参照点。理解这一点,就不会对这个库提出它给不了的期待。

8.4 它的技术遗产

这个库留下的不只是数据,还有一套处理流程。整理版团队把读取、转换、重绘、划分的全过程写成了论文,并把工具开源在代码托管平台上。这套流程后来被很多做钼靶数据工程的人当作模板:先解压到无损中间格式,再标准化光学密度,再转通用容器,最后重做标注。

把一个老库的整理过程本身当成一份方法学贡献,这件事在 2017 年还不算常见。今天回头看,整理版论文的真正影响,可能不在于那八千多例病灶,而在于它示范了「如何让一份档案重新可用」。

§9 使用指引

9.1 三种角色的路径

同一个库,不同角色的正确入口不一样。下面三条路径是按「你现在要产出什么」划分的,不是按技术水平划分的。

角色 你要产出什么 最短路径 最容易浪费时间的环节
算法研究者 一篇可复现的方法论文 取整理版的肿块子集,按受试者切分,报告设备分层结果 纠结原始格式,试图复刻十几年前的预处理
医学影像工程师 一条能跑通的流水线 取整理版的 DICOM,写路径映射,做灰度标准化 在没有校验的情况下直接相信 CSV 的路径列
临床科研人员 一组能与文献对话的参照数字 引用整理版论文的规模与划分,只在自己的队列上做验证 把库内指标当成临床预期

第一条路径的关键词是「可复现」。要做到可复现,必须把三件事写进论文:用的是整理版而不是原库、切分是按受试者而不是按异常、设备分布是否在训练与测试间平衡。缺任何一件,别人都无法复刻你的数字。

第二条路径的关键词是「校验」。这条路径上所有的坑都可以用「不要假设」来概括:不要假设路径对、不要假设尺寸对、不要假设标签不缺。每一个假设都要用一行断言去验证。

第三条路径的关键词是「克制」。临床科研最容易犯的错,是把这个库的结果当成自家模型的表现预期。它的作用是提供文献坐标,不是提供性能上限。

9.2 一条最短的可用流程

如果只想在半天内看到结果,下面这五步足够。每一步都有明确的完成标志。

#-- 步骤 1:先在集合页手工下载四份 CSV(体积小,秒级完成),再决定是否下全量影像
ls -l mass_case_description_train_set.csv
#-- 步骤 2:只取肿块训练与测试两份描述,先用它们把切分与标签逻辑跑通
python3.11 -c "import pandas as pd; d=pd.read_csv('mass_case_description_train_set.csv'); print(d.shape); print(d.columns.tolist())"
#-- 步骤 3:确认受试者编号可解析,并检查同一受试者是否出现在多行
python3.11 -c "import pandas as pd; d=pd.read_csv('mass_case_description_train_set.csv'); print(d['patient_id'].astype(str).str[:7].nunique(), len(d))"
#-- 步骤 4:建立路径映射,统计有多少条记录能在磁盘上找到对应文件
grep -c "dcm" cbis_manifest.tcia
#-- 步骤 5:跑一次按受试者切分的基线,把 AUC 与阳性比例一起报出来
python3.11 -c "print('baseline: 见 §5.6 的分组切分脚本')"

第三步的输出特别值得看一眼。如果唯一受试者数明显小于行数,说明同一受试者确实重复出现,后面切分必须按人而不是按行。

9.3 引用方式

引用这个库有一个细节容易被忽略:数据与论文是两份不同的引用。数据引用指向整理版在影像档案库里的条目,论文引用指向方法学文章。只引论文不引数据,在影像档案库的使用政策里是不完整的。

#-- 数据引用
Sawyer-Lee R, Gimenez F, Hoogi A, Rubin D.
Curated Breast Imaging Subset of Digital Database for Screening Mammography (CBIS-DDSM) [Data set].
The Cancer Imaging Archive. 2016.
https://doi.org/10.7937/K9/TCIA.2016.7O02S9CY

#-- 论文引用
Lee RS, Gimenez F, Hoogi A, Miyake KK, Gorovoy M, Rubin DL.
A curated mammography data set for use in computer-aided detection and diagnosis research.
Scientific Data. 2017;4:170177.
https://doi.org/10.1038/sdata.2017.177

#-- 原始库在方法与数据章节中的提法(无 DOI,按机构与年代引用)
Heath M, Bowyer K, Kopans D, Moore R, Kegelmeyer WP.
Current status of the Digital Database for Screening Mammography.
1990 年代末,University of South Florida。

原始库的正式论文条目在本次核验中未能确认(影像档案库与文献库均未检索到可验证的 DOI),因此上面第三条只给了作者、机构与年代的描述性引用。如果要在正式论文里引用原始库,建议以整理版论文的参考文献列表为准,不要凭记忆补 DOI。

§10 AI 使用声明

项目 说明
生成方式 本文由人工智能辅助起草,经人工核对官方页面与论文摘要后定稿
信息来源 影像档案库的 CBIS-DDSM 集合页、Scientific Data 论文摘要、原始站入口的可访问性测试
未能核实 原始站正文(连接超时)、原始库论文 DOI、三台扫描仪的具体型号
数字口径 规模与结构数字取自官方页面与论文摘要,未做二次统计
图像引用 本文未下载或展示任何病例影像
陈述性质 对比与判断为主观评断,评分依据已在正文列出
更新责任 若官方页面后续修订数字,以官方版本为准
使用限制 不构成医疗建议,不构成对该数据集临床适用性的背书

常见误读(避坑清单)

常见说法 实际 证据
「DDSM 就是一个压缩包,下载解压就能用」 原始分发物是自定义 LJPEG,需专用编解码器;只有整理版才是开箱可读 整理版论文记录了用 1993 年编解码器打补丁编译的过程
「CBIS-DDSM 就是 DDSM」 它是筛选后的子集,剔除了肿块不可清晰辨认的病例,规模小于原库 论文摘要给出整理版的病例数与受试者数
「它有一万张图,够训一个深度学习模型」 一万余张里有大量是裁剪图与掩膜,真正独立的筛查图只有几千张 官方计数把全图、裁剪图、掩膜合并统计
「按例随机切分就行」 同一受试者的多视图高度相关,按例切分会造成同人跨集 受试者在 CSV 中重复出现,需按人分组
「病理有两个值,良性恶性」 病理有三档,第三档是良性但无需召回,临床含义不同 病例描述文件的字段说明
「三台扫描仪只是历史细节」 不同扫描仪的灰度响应与像素间距不同,是模型学到伪特征的主要通道 论文与整理说明均记录了多设备来源
「整理版修好了标注」 只重绘了肿块,钙化保留原始轮廓 整理版的方法章节明确重绘范围
「可以直接拿来做临床筛查仿真」 库内以异常病例为主,阳性比例远高于真实筛查 官方划分的病灶数与总检查数之比
「论文里报的准确率可以直接横向比较」 切分口径与预处理各不相同,跨论文的数字不可直接比 整理版论文摘要批评的正是这种不可比状态
「原站打不开,说明数据集没了」 原站不可用,但整理版完好且仍在维护 影像档案库的集合页状态标记为 Complete
「DDSM 可以做断层任务」 全部是二维胶片扫描,没有切片 影像来源为屏片胶片

FAQ

Q1:现在还能直接下载 DDSM 原库吗?
入口仍指向南佛罗里达大学工程学院的页面,但本次核验时该主站连接超时,未取到页面。即便拿到压缩包,里面也是自定义 LJPEG,需要 1993 年停更的编解码器才能读。今天实际的做法是从影像档案库取整理版。

Q2:CBIS-DDSM 和 DDSM 的规模差多少?
论文摘要给出整理版含 753 例钙化病例与 891 例肿块病例,覆盖受试者约一千五百余人;原库按检查计约两千六百例。差额主要来自被剔除的肿块不可辨认病例,以及因含个人健康信息被移除的病例。

Q3:为什么按例随机切分会高估性能?
同一位受试者的左右乳、CC 与 MLO 视图高度相关,随机切分会让同人的图同时落进训练集与测试集。模型只要记住病灶周围的腺体纹理,就能在同一受试者的另一视图上「认出」答案。按人分组切分能消除这条捷径。

Q4:三台扫描仪的影响有多大?
官方没有公布分设备的性能落差。可以自己量:按设备分组,比较各组的灰度直方图,再跑一次按设备分层的交叉验证,看指标是否随设备大幅波动。波动越大,说明设备偏差越大。

Q5:它的标注质量到底如何?
肿块轮廓经过算法重绘,论文报告重绘结果与专家手绘的吻合度明显高于原始轮廓;钙化轮廓没有重绘,质量取决于最初的勾画。整体上,肿块可用,钙化需自行抽检。

Q6:它适合做什么任务?
适合病灶分割、良恶性分类、CAD 方法的对照评测,以及跨代域偏移研究。也适合作为教学素材,因为它足够小、足够老,坑足够典型。

Q7:它不适合做什么任务?
不适合临床产品验证、不适合筛查流程仿真、不适合断层任务、不适合需要随访时序的研究。人群构成与成像方式都过时,结论外推要非常谨慎。

Q8:官方划分可以直接用吗?
可以用,但它只给了一组 20/80 划分,且不保证受试者不跨集。若要报告方差或做统计检验,必须自己重切多折,并在论文里写清重切规则。

Q9:下载量有多大?
整理版全量包为 163.51 GB,主要是 DICOM 影像。只做方法验证时,可以只取肿块子集或只取裁剪图与掩膜,体积会小很多,但要注意裁剪图的尺寸与全图不同。

Q10:许可允许商用吗?
整理版的影像与 CSV 为 CC BY 3.0,允许商用但必须署名并遵守数据使用政策。原始库的条款页面不可访问,无法确认,因此在正式场合应引用整理版。

Q11:为什么说它是「跨代」的库?
它记录的是胶片时代的筛查,但被整理、被引用、被当作基准的时间覆盖了整个数字时代。这种跨代属性使它成为研究域偏移的天然素材。

Q12:如果只做一件事,应该做什么?
把切分改成按受试者分组,并按设备分层,然后在论文里写清这两点。这一步比换模型更能提升结论的可信度。

术语表

术语 全称或来源 含义 在本库中的意义
DDSM Digital Database for Screening Mammography 乳腺筛查数字化数据库 本篇主体,原始归档
CBIS-DDSM Curated Breast Imaging Subset of DDSM DDSM 的精选整理版 今天实际被使用的版本
CC 位 Craniocaudal view 头足位,从上向下投照 四个常规视图之一
MLO 位 Mediolateral oblique view 内外斜位,从侧上方投照 四个常规视图之一
BI-RADS Breast Imaging Reporting and Data System 乳腺影像报告与数据系统 官方评估分级,0 到 5
LJPEG Lossless JPEG 无损 JPEG 编码 原始库的压缩格式,需专用解码器
DICOM Digital Imaging and Communications in Medicine 医学影像通用容器标准 整理版的输出格式
ROI Region of Interest 感兴趣区域 病灶所在的图像区域
Mask 掩膜 与图像同尺寸的二值图 标出病灶像素范围
Overlay 覆盖层文件 原始库中的轮廓矢量文件 病灶轮廓的原始存放形式
ics 文件 Image Camera Signature 等文本头 每例的元数据头 记录设备、分辨率与采集参数
光学密度 Optical Density 胶片透光率的对数量度 整理版统一到 0.05 到 3.0
水平集 Level set 一种曲线演化分割方法 整理版用它重绘肿块轮廓
Chan-Vese Chan-Vese 模型 基于区域的水平集模型 重绘算法的框架基础
Dice 系数 Dice similarity coefficient 两个区域的重合度指标 用于比较重绘轮廓与专家手绘
受试者泄漏 Subject leakage 同一受试者的数据同时进入训练与测试 最常见的评测错误
设备偏差 Scanner bias 不同采集设备带来的系统性差异 本库最隐蔽的偏倚来源
域偏移 Domain shift 训练域与目标域分布不同 跨库迁移性能下降的原因
分层切分 Stratified split 按某个变量分层后再切分 用于控制设备与难度分布
阳性比例 Prevalence 阳性样本占总样本的比例 库内远高于真实筛查
屏片系统 Screen-film system 用增感屏与胶片成像的方式 本库的原始成像方式
全视野数字乳腺摄影 Full-field digital mammography 直接数字采集的钼靶 本库不覆盖的成像方式
DBT Digital Breast Tomosynthesis 数字乳腺断层摄影 本库不覆盖的三维成像
CADe Computer-Aided Detection 计算机辅助检测 本库最初服务的应用
CADx Computer-Aided Diagnosis 计算机辅助诊断 本库整理版明确服务的应用
无召回良性 Benign without callback 良性且未进入召回流程 病理字段的第三档
细微度 Subtlety 标注者认为的发现难度 1 到 5,主观评分
数据使用政策 Data Usage Policy 影像档案库的使用条款 引用与再分发的前提

附录 A:核心数字核对表

项 值 来源 来源层级
原库检查数 约 2,620 例 整理版论文摘要 论文摘要
原库发布年份 1997 年 整理版论文正文 论文摘要
原库影像格式 LJPEG 整理版论文与集合页 官方页面
原库编解码器 PVRG-JPEG Codec v1.1,1993 年停更 整理版论文正文 论文摘要
整理版受试者 一千五百余人 影像档案库集合页 官方页面
整理版钙化病例 753 例 论文摘要与集合页 论文摘要
整理版肿块病例 891 例 论文摘要与集合页 论文摘要
整理版影像总数 10,239 张 DICOM 影像档案库集合页 官方页面
整理版全量体积 163.51 GB 影像档案库集合页 官方页面
官方划分比例 约 20% 测试,按 BI-RADS 分层 影像档案库集合页 官方页面
剔除的可疑肿块图像 254 张 影像档案库集合页 官方页面
分割验证样本量 118 张 整理版论文正文 论文摘要
重绘轮廓与手绘的吻合度 0.792 整理版论文正文 论文摘要
原始轮廓与手绘的吻合度 0.398 整理版论文正文 论文摘要
整理版最后更新 2017 年 9 月 14 日 影像档案库集合页 官方页面
整理版许可 CC BY 3.0 影像档案库集合页 官方页面
原站可访问性 连接超时 本次直接访问测试 未核实

附录 B:数字的来源分层

第一层:官方页面。 影像档案库的 CBIS-DDSM 集合页提供了受试者数、影像数、体积、划分比例、剔除图像数、更新日期与许可。这些数字可以直接引用,风险最低。该页面同时说明了整理流程的六步。

第二层:论文摘要与正文。 整理版论文提供了原库的检查数、发布年份、编解码器版本、病例拆分数,以及分割验证的定量指标。原库检查数这一项只在论文里出现,官方页面没有独立给出。

第三层:未核实。 原站正文(连接超时)、原始库论文的正式引用条目、三台扫描仪的具体厂商型号、人群的年龄与种族分布、分设备或分视图的样本统计。这些内容本文一律不给出具体数字,只给出「未核实」或定性描述。

三层的边界要守住。跨层混用最容易出错的是「原库检查数」与「整理版影像数」——前者是 1990 年代的原库口径,后者是整理后含掩膜的口径,两者不能相减。

附录 C:完整参考文献

序号 文献 类型 可获取性
1 Lee RS 等,A curated mammography data set for use in computer-aided detection and diagnosis research,Scientific Data 2017,卷 4 期 170177 论文 DOI 10.1038/sdata.2017.177,开放获取
2 Sawyer-Lee R 等,CBIS-DDSM 数据条目,影像档案库 2016 数据 DOI 10.7937/K9/TCIA.2016.7O02S9CY
3 Heath M 等,Current status of the Digital Database for Screening Mammography,1990 年代末 会议论文 正式引用条目未核实
4 CBIS-DDSM 集合页,影像档案库 官方页面 在线可访问
5 DDSM 原始数据库页面,南佛罗里达大学 官方页面 连接超时,未核实
6 影像档案库数据使用政策 政策 在线可访问
7 PVRG-JPEG Codec v1.1,1993 年 软件 历史归档,未核实下载地址

附录 D:任务代码

任务一:按受试者与设备双分层切分。

#-- 双分层:受试者为组、设备为层,两层同时满足
import pandas as pd
from sklearn.model_selection import StratifiedGroupKFold

df = pd.read_csv("mass_case_description_train_set.csv")
df["subject"] = df["patient_id"].astype(str).str[:7]
df["label"] = (df["pathology"] == "MALIGNANT").astype(int)
#-- 设备信息若不在 CSV 中,从 DICOM 头补一列 scanner_model 后再用
df["stratum"] = df["label"].astype(str)

sgkf = StratifiedGroupKFold(n_splits=5, shuffle=True, random_state=0)
for fold, (tr, te) in enumerate(sgkf.split(df, df["stratum"], groups=df["subject"])):
    assert not set(df.iloc[tr]["subject"]) & set(df.iloc[te]["subject"])
    print(fold, len(tr), len(te))
#-- 若要在设备维度也分层,把 stratum 改为 label 与 scanner_model 的拼接字符串

任务二:校验掩膜与全图是否同尺寸。

#-- 逐例校验掩膜与全图尺寸,把不匹配的记录导出成清单
import pydicom
import pandas as pd
from pathlib import Path

root = Path("cbis_raw")
bad = []
for p in root.rglob("*.dcm"):
    try:
        ds = pydicom.dcmread(str(p), stop_before_pixels=True)
        pass
    except Exception as e:
        bad.append((str(p), str(e)))
frames = {}
for p in root.rglob("*.dcm"):
    try:
        img = pydicom.dcmread(str(p)).pixel_array
    except Exception:
        continue
    d = p.parent.name
    frames.setdefault(d, {})[p.name] = img.shape

rows = []
for d, m in frames.items():
    shapes = set(m.values())
    if len(shapes) > 1:
        rows.append((d, len(m), sorted(shapes)))
pd.DataFrame(rows, columns=["series_dir", "n_files", "shapes"]).to_csv("size_mismatch.csv", index=False)
print("series with mixed shapes:", len(rows))

任务三:按设备检查灰度分布是否可分。

#-- 用简单统计量检验不同设备来源的图是否可分,作为设备偏差的快速探针
import numpy as np
import pydicom
from pathlib import Path

def stats_of(p):
    a = pydicom.dcmread(str(p)).pixel_array.astype(np.float32)
    return {"mean": float(a.mean()), "std": float(a.std()), "p99": float(np.percentile(a, 99))}

rows = [stats_of(p) for p in list(Path("cbis_raw").rglob("*.dcm"))[:500]]
means = np.array([r["mean"] for r in rows])
print("mean of means:", means.mean(), "sd of means:", means.std())
#-- 若 sd of means 与组内方差同量级,说明设备差异不足以主导;反之心须分层

附录 E:如果只记五件事

序号 记住什么 为什么重要
1 原始库是 LJPEG,不是 DICOM 这一条决定了「能不能直接用」的答案是否定的
2 今天用的几乎都是 CBIS-DDSM 引用与复现都要写清版本,否则无法对话
3 三台扫描仪带来的设备偏差是隐藏的主变量 不分层就等于把机器身份当成了标签的一部分
4 肿块轮廓重绘过,钙化没有 两类任务的可信度不一样,不能一视同仁
5 按受试者切分是底线 这一行断言比任何模型改动都更能保护结论

编辑说明

本篇的核验时间为 2026 年 10 月 27 日。核验方式为直接访问官方集合页获取结构化事实,通过文献库接口获取论文摘要,以及对原始站入口做一次可访问性测试。原始站测试结果为域名解析成功、TCP 连接超时,因此原始库的规模数字全部转引自整理版论文,未做独立确认。

本篇未下载任何影像数据,未做逐条统计,所有规模与结构数字均来自官方页面与论文摘要。凡涉及分布、百分位与交叉统计的内容,本篇一律不写,因为那些需要下载全量数据才能得到,且对选型决策没有增量。

本篇对原始库论文的正式引用条目未能核实。文中只给出作者、机构与年代的描述性提法,未补写 DOI。若需要正式引用,请以整理版论文的参考文献列表为准。

文中对比与评分为主观评断,依据已在正文逐条列出。评分不代表对数据集临床价值的背书,也不构成任何医疗建议。


相关数据集导航

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

  • chexmask-cxr-segmentation-data — 共享标签:医学影像 / X光影像 / 医学图像分割
  • chexmask-u — 共享标签:医学影像 / X光影像 / 医学图像分割
  • lung-segment-mimic-cxr — 共享标签:医学影像 / X光影像 / 医学图像分割
  • mimic-cxr-ext-ils — 共享标签:医学影像 / X光影像 / 医学图像分割
  • hecktor — 共享标签:医学影像 / X光影像 / 医学图像分割
  • chexlocalize — 共享标签:医学影像 / X光影像 / 医学图像分割
  • btxrd — 共享标签:医学影像 / X光影像 / 医学图像分割
  • lidc-idri — 共享标签:医学影像 / X光影像 / 医学图像分割
  • siim-acr-pneumothorax — 共享标签:医学影像 / X光影像 / 医学图像分割
  • multicenter-dental-panoramic — 共享标签:医学影像 / X光影像 / 医学图像分割

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

返回 AI-Ready 数据集