信息速览
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光影像 / 医学图像分割
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

